From 2de9abc5c9d40b3c716307d67d16146f823fd554 Mon Sep 17 00:00:00 2001 From: Richard Maw Date: Tue, 17 Jan 2012 14:43:55 +0000 Subject: add the output of bootstrap --- gnulib | 1 - gnulib/lib/.cppi-disable | 41 + gnulib/lib/.cvsignore | 20 + gnulib/lib/Makefile | 6 + gnulib/lib/README | 3 + gnulib/lib/_Exit.c | 27 + gnulib/lib/accept.c | 52 + gnulib/lib/accept4.c | 129 + gnulib/lib/acl-internal.h | 256 + gnulib/lib/acl.h | 27 + gnulib/lib/acl_entries.c | 75 + gnulib/lib/acosf.c | 26 + gnulib/lib/acosl.c | 238 + gnulib/lib/alignof.h | 51 + gnulib/lib/alloca.c | 478 + gnulib/lib/alloca.in.h | 56 + gnulib/lib/allocator.c | 5 + gnulib/lib/allocator.h | 58 + gnulib/lib/alphasort.c | 28 + gnulib/lib/amemxfrm.c | 180 + gnulib/lib/amemxfrm.h | 48 + gnulib/lib/anytostr.c | 55 + gnulib/lib/arcfour.c | 77 + gnulib/lib/arcfour.h | 50 + gnulib/lib/arctwo.c | 228 + gnulib/lib/arctwo.h | 63 + gnulib/lib/areadlink-with-size.c | 104 + gnulib/lib/areadlink.c | 39 + gnulib/lib/areadlink.h | 33 + gnulib/lib/areadlinkat-with-size.c | 132 + gnulib/lib/areadlinkat.c | 65 + gnulib/lib/argmatch.c | 277 + gnulib/lib/argmatch.h | 103 + gnulib/lib/argp-ba.c | 34 + gnulib/lib/argp-eexst.c | 30 + gnulib/lib/argp-fmtstream.c | 435 + gnulib/lib/argp-fmtstream.h | 354 + gnulib/lib/argp-fs-xinl.c | 42 + gnulib/lib/argp-help.c | 1954 + gnulib/lib/argp-namefrob.h | 157 + gnulib/lib/argp-parse.c | 952 + gnulib/lib/argp-pin.c | 27 + gnulib/lib/argp-pv.c | 34 + gnulib/lib/argp-pvh.c | 31 + gnulib/lib/argp-version-etc.c | 38 + gnulib/lib/argp-version-etc.h | 40 + gnulib/lib/argp-xinl.c | 42 + gnulib/lib/argp.h | 645 + gnulib/lib/argv-iter.c | 111 + gnulib/lib/argv-iter.h | 42 + gnulib/lib/argz.c | 407 + gnulib/lib/argz.in.h | 160 + gnulib/lib/arpa_inet.in.h | 141 + gnulib/lib/array-mergesort.h | 274 + gnulib/lib/asinf.c | 26 + gnulib/lib/asinl.c | 232 + gnulib/lib/asnprintf.c | 35 + gnulib/lib/asprintf.c | 40 + gnulib/lib/assert.in.h | 28 + gnulib/lib/astrxfrm.c | 181 + gnulib/lib/astrxfrm.h | 47 + gnulib/lib/at-func.c | 131 + gnulib/lib/at-func2.c | 282 + gnulib/lib/atan2f.c | 26 + gnulib/lib/atanf.c | 26 + gnulib/lib/atanl.c | 236 + gnulib/lib/atexit.c | 13 + gnulib/lib/atoll.c | 34 + gnulib/lib/backupfile.c | 355 + gnulib/lib/backupfile.h | 59 + gnulib/lib/base32.c | 588 + gnulib/lib/base32.h | 61 + gnulib/lib/base64.c | 575 + gnulib/lib/base64.h | 61 + gnulib/lib/basename-lgpl.c | 75 + gnulib/lib/basename.c | 58 + gnulib/lib/bcopy.c | 23 + gnulib/lib/binary-io.h | 52 + gnulib/lib/bind.c | 49 + gnulib/lib/bitrotate.h | 126 + gnulib/lib/btowc.c | 39 + gnulib/lib/byteswap.in.h | 44 + gnulib/lib/c-ctype.c | 396 + gnulib/lib/c-ctype.h | 295 + gnulib/lib/c-stack.c | 330 + gnulib/lib/c-stack.h | 44 + gnulib/lib/c-strcase.h | 57 + gnulib/lib/c-strcasecmp.c | 57 + gnulib/lib/c-strcaseeq.h | 184 + gnulib/lib/c-strcasestr.c | 77 + gnulib/lib/c-strcasestr.h | 36 + gnulib/lib/c-strncasecmp.c | 57 + gnulib/lib/c-strstr.c | 32 + gnulib/lib/c-strstr.h | 44 + gnulib/lib/c-strtod.c | 112 + gnulib/lib/c-strtod.h | 37 + gnulib/lib/c-strtold.c | 2 + gnulib/lib/calloc.c | 73 + gnulib/lib/canon-host.c | 90 + gnulib/lib/canon-host.h | 29 + gnulib/lib/canonicalize-lgpl.c | 378 + gnulib/lib/canonicalize.c | 296 + gnulib/lib/canonicalize.h | 41 + gnulib/lib/careadlinkat.c | 175 + gnulib/lib/careadlinkat.h | 72 + gnulib/lib/ceil.c | 111 + gnulib/lib/ceilf.c | 20 + gnulib/lib/ceill.c | 37 + gnulib/lib/chdir-long.c | 266 + gnulib/lib/chdir-long.h | 30 + gnulib/lib/chdir-safer.c | 82 + gnulib/lib/chdir-safer.h | 20 + gnulib/lib/check-version.c | 43 + gnulib/lib/check-version.h | 26 + gnulib/lib/chown.c | 156 + gnulib/lib/classpath.c | 122 + gnulib/lib/classpath.h | 33 + gnulib/lib/clean-temp.c | 782 + gnulib/lib/clean-temp.h | 142 + gnulib/lib/cloexec.c | 83 + gnulib/lib/cloexec.h | 38 + gnulib/lib/close-stream.c | 78 + gnulib/lib/close-stream.h | 2 + gnulib/lib/close.c | 69 + gnulib/lib/closedir.c | 67 + gnulib/lib/closein.c | 112 + gnulib/lib/closein.h | 32 + gnulib/lib/closeout.c | 124 + gnulib/lib/closeout.h | 36 + gnulib/lib/concat-filename.c | 73 + gnulib/lib/concat-filename.h | 41 + gnulib/lib/config.charset | 683 + gnulib/lib/connect.c | 56 + gnulib/lib/copy-acl.c | 644 + gnulib/lib/copy-file.c | 137 + gnulib/lib/copy-file.h | 34 + gnulib/lib/copysign.c | 26 + gnulib/lib/copysignf.c | 26 + gnulib/lib/copysignl.c | 72 + gnulib/lib/cosf.c | 26 + gnulib/lib/coshf.c | 26 + gnulib/lib/cosl.c | 116 + gnulib/lib/count-one-bits.h | 77 + gnulib/lib/crc.c | 103 + gnulib/lib/crc.h | 47 + gnulib/lib/creat-safer.c | 31 + gnulib/lib/csharpcomp.c | 573 + gnulib/lib/csharpcomp.h | 40 + gnulib/lib/csharpexec.c | 345 + gnulib/lib/csharpexec.h | 43 + gnulib/lib/ctype.in.h | 58 + gnulib/lib/cycle-check.c | 85 + gnulib/lib/cycle-check.h | 52 + gnulib/lib/des.c | 668 + gnulib/lib/des.h | 121 + gnulib/lib/dev-ino.h | 13 + gnulib/lib/di-set.c | 259 + gnulib/lib/di-set.h | 19 + gnulib/lib/diacrit.c | 161 + gnulib/lib/diacrit.h | 27 + gnulib/lib/diffseq.h | 523 + gnulib/lib/dirchownmod.c | 141 + gnulib/lib/dirchownmod.h | 2 + gnulib/lib/dirent--.h | 23 + gnulib/lib/dirent-private.h | 40 + gnulib/lib/dirent-safer.h | 22 + gnulib/lib/dirent.in.h | 249 + gnulib/lib/dirfd.c | 32 + gnulib/lib/dirname-lgpl.c | 86 + gnulib/lib/dirname.c | 38 + gnulib/lib/dirname.h | 46 + gnulib/lib/dosname.h | 53 + gnulib/lib/dprintf.c | 70 + gnulib/lib/dtoastr.c | 2 + gnulib/lib/dtotimespec.c | 69 + gnulib/lib/dummy.c | 42 + gnulib/lib/dup-safer-flag.c | 40 + gnulib/lib/dup-safer.c | 34 + gnulib/lib/dup.c | 61 + gnulib/lib/dup2.c | 157 + gnulib/lib/dup3.c | 102 + gnulib/lib/duplocale.c | 102 + gnulib/lib/eealloc.h | 79 + gnulib/lib/errno.in.h | 233 + gnulib/lib/error.c | 400 + gnulib/lib/error.h | 65 + gnulib/lib/euidaccess.c | 218 + gnulib/lib/exclude.c | 578 + gnulib/lib/exclude.h | 52 + gnulib/lib/execute.c | 278 + gnulib/lib/execute.h | 44 + gnulib/lib/exitfail.c | 24 + gnulib/lib/exitfail.h | 18 + gnulib/lib/expf.c | 26 + gnulib/lib/expl.c | 147 + gnulib/lib/fabsf.c | 26 + gnulib/lib/faccessat.c | 44 + gnulib/lib/fatal-signal.c | 286 + gnulib/lib/fatal-signal.h | 76 + gnulib/lib/fbufmode.c | 85 + gnulib/lib/fbufmode.h | 36 + gnulib/lib/fchdir.c | 208 + gnulib/lib/fchmodat.c | 53 + gnulib/lib/fchown-stub.c | 16 + gnulib/lib/fchownat.c | 114 + gnulib/lib/fclose.c | 110 + gnulib/lib/fcntl--.h | 32 + gnulib/lib/fcntl-safer.h | 27 + gnulib/lib/fcntl.c | 311 + gnulib/lib/fcntl.in.h | 325 + gnulib/lib/fd-hook.c | 116 + gnulib/lib/fd-hook.h | 119 + gnulib/lib/fd-safer-flag.c | 52 + gnulib/lib/fd-safer.c | 49 + gnulib/lib/fdatasync.c | 27 + gnulib/lib/fdopen.c | 69 + gnulib/lib/fdopendir.c | 204 + gnulib/lib/fdutimensat.c | 57 + gnulib/lib/fflush.c | 218 + gnulib/lib/ffs.c | 56 + gnulib/lib/ffsl.c | 4 + gnulib/lib/ffsl.h | 67 + gnulib/lib/ffsll.c | 4 + gnulib/lib/file-has-acl.c | 839 + gnulib/lib/file-set.c | 74 + gnulib/lib/file-set.h | 15 + gnulib/lib/file-type.c | 71 + gnulib/lib/file-type.h | 29 + gnulib/lib/fileblocks.c | 74 + gnulib/lib/filemode.c | 180 + gnulib/lib/filemode.h | 44 + gnulib/lib/filename.h | 54 + gnulib/lib/filenamecat-lgpl.c | 88 + gnulib/lib/filenamecat.c | 41 + gnulib/lib/filenamecat.h | 27 + gnulib/lib/filevercmp.c | 181 + gnulib/lib/filevercmp.h | 42 + gnulib/lib/findprog-lgpl.c | 20 + gnulib/lib/findprog.c | 138 + gnulib/lib/findprog.h | 37 + gnulib/lib/float+.h | 148 + gnulib/lib/float.c | 33 + gnulib/lib/float.in.h | 188 + gnulib/lib/flock.c | 220 + gnulib/lib/floor.c | 99 + gnulib/lib/floorf.c | 20 + gnulib/lib/floorl.c | 37 + gnulib/lib/fma.c | 887 + gnulib/lib/fmaf.c | 20 + gnulib/lib/fmal.c | 37 + gnulib/lib/fmodf.c | 26 + gnulib/lib/fnmatch.c | 351 + gnulib/lib/fnmatch.in.h | 68 + gnulib/lib/fnmatch_loop.c | 1220 + gnulib/lib/fopen-safer.c | 63 + gnulib/lib/fopen.c | 110 + gnulib/lib/forkpty.c | 73 + gnulib/lib/fpending.c | 30 + gnulib/lib/fpending.h | 34 + gnulib/lib/fprintf.c | 77 + gnulib/lib/fprintftime.c | 2 + gnulib/lib/fprintftime.h | 29 + gnulib/lib/fpucw.h | 107 + gnulib/lib/fpurge.c | 142 + gnulib/lib/freadable.c | 47 + gnulib/lib/freadable.h | 42 + gnulib/lib/freadahead.c | 89 + gnulib/lib/freadahead.h | 38 + gnulib/lib/freading.c | 70 + gnulib/lib/freading.h | 53 + gnulib/lib/freadptr.c | 111 + gnulib/lib/freadptr.h | 39 + gnulib/lib/freadseek.c | 139 + gnulib/lib/freadseek.h | 42 + gnulib/lib/free.c | 30 + gnulib/lib/freopen-safer.c | 103 + gnulib/lib/freopen.c | 51 + gnulib/lib/frexp.c | 168 + gnulib/lib/frexpf.c | 26 + gnulib/lib/frexpl.c | 35 + gnulib/lib/fseek.c | 30 + gnulib/lib/fseeko.c | 143 + gnulib/lib/fseterr.c | 76 + gnulib/lib/fseterr.h | 37 + gnulib/lib/fstat.c | 82 + gnulib/lib/fstatat.c | 135 + gnulib/lib/fstrcmp.c | 271 + gnulib/lib/fstrcmp.h | 45 + gnulib/lib/fsusage.c | 279 + gnulib/lib/fsusage.h | 40 + gnulib/lib/fsync.c | 78 + gnulib/lib/ftell.c | 37 + gnulib/lib/ftello.c | 77 + gnulib/lib/ftoastr.c | 138 + gnulib/lib/ftoastr.h | 144 + gnulib/lib/ftruncate.c | 43 + gnulib/lib/fts-cycle.c | 160 + gnulib/lib/fts.c | 2095 + gnulib/lib/fts_.h | 272 + gnulib/lib/full-read.c | 18 + gnulib/lib/full-read.h | 24 + gnulib/lib/full-write.c | 79 + gnulib/lib/full-write.h | 34 + gnulib/lib/futimens.c | 37 + gnulib/lib/fwritable.c | 47 + gnulib/lib/fwritable.h | 42 + gnulib/lib/fwriteerror.c | 181 + gnulib/lib/fwriteerror.h | 62 + gnulib/lib/fwriting.c | 58 + gnulib/lib/fwriting.h | 53 + gnulib/lib/gai_strerror.c | 93 + gnulib/lib/gc-gnulib.c | 918 + gnulib/lib/gc-libgcrypt.c | 729 + gnulib/lib/gc-pbkdf2-sha1.c | 103 + gnulib/lib/gc.h | 317 + gnulib/lib/gcd.c | 87 + gnulib/lib/gcd.h | 34 + gnulib/lib/gen-uni-tables.c | 9780 +++ gnulib/lib/get-rusage-as.c | 402 + gnulib/lib/get-rusage-data.c | 436 + gnulib/lib/getaddrinfo.c | 444 + gnulib/lib/getcwd-lgpl.c | 125 + gnulib/lib/getcwd.c | 442 + gnulib/lib/getdate.h | 3 + gnulib/lib/getdelim.c | 137 + gnulib/lib/getdomainname.c | 83 + gnulib/lib/getdtablesize.c | 86 + gnulib/lib/getfilecon.c | 87 + gnulib/lib/getgroups.c | 116 + gnulib/lib/gethostname.c | 104 + gnulib/lib/gethrxtime.c | 68 + gnulib/lib/gethrxtime.h | 37 + gnulib/lib/getline.c | 29 + gnulib/lib/getloadavg.c | 1046 + gnulib/lib/getlogin.c | 41 + gnulib/lib/getlogin_r.c | 88 + gnulib/lib/getndelim2.c | 217 + gnulib/lib/getndelim2.h | 42 + gnulib/lib/getnline.c | 36 + gnulib/lib/getnline.h | 47 + gnulib/lib/getopt.c | 1245 + gnulib/lib/getopt.in.h | 253 + gnulib/lib/getopt1.c | 170 + gnulib/lib/getopt_int.h | 135 + gnulib/lib/getpagesize.c | 39 + gnulib/lib/getpass.c | 230 + gnulib/lib/getpass.h | 31 + gnulib/lib/getpeername.c | 49 + gnulib/lib/getsockname.c | 49 + gnulib/lib/getsockopt.c | 79 + gnulib/lib/getsubopt.c | 82 + gnulib/lib/gettext.h | 286 + gnulib/lib/gettime.c | 48 + gnulib/lib/gettimeofday.c | 144 + gnulib/lib/getugroups.c | 125 + gnulib/lib/getugroups.h | 19 + gnulib/lib/getusershell.c | 173 + gnulib/lib/git-merge-changelog.c | 1676 + gnulib/lib/gl_anyavltree_list1.h | 70 + gnulib/lib/gl_anyavltree_list2.h | 809 + gnulib/lib/gl_anyhash_list1.h | 27 + gnulib/lib/gl_anyhash_list2.h | 138 + gnulib/lib/gl_anylinked_list1.h | 48 + gnulib/lib/gl_anylinked_list2.h | 1195 + gnulib/lib/gl_anyrbtree_list1.h | 76 + gnulib/lib/gl_anyrbtree_list2.h | 1028 + gnulib/lib/gl_anytree_list1.h | 41 + gnulib/lib/gl_anytree_list2.h | 940 + gnulib/lib/gl_anytree_oset.h | 297 + gnulib/lib/gl_anytreehash_list1.h | 358 + gnulib/lib/gl_anytreehash_list2.h | 213 + gnulib/lib/gl_array_list.c | 680 + gnulib/lib/gl_array_list.h | 34 + gnulib/lib/gl_array_oset.c | 357 + gnulib/lib/gl_array_oset.h | 34 + gnulib/lib/gl_avltree_list.c | 101 + gnulib/lib/gl_avltree_list.h | 34 + gnulib/lib/gl_avltree_oset.c | 583 + gnulib/lib/gl_avltree_oset.h | 34 + gnulib/lib/gl_avltreehash_list.c | 127 + gnulib/lib/gl_avltreehash_list.h | 34 + gnulib/lib/gl_carray_list.c | 873 + gnulib/lib/gl_carray_list.h | 34 + gnulib/lib/gl_linked_list.c | 64 + gnulib/lib/gl_linked_list.h | 34 + gnulib/lib/gl_linkedhash_list.c | 124 + gnulib/lib/gl_linkedhash_list.h | 34 + gnulib/lib/gl_list.c | 283 + gnulib/lib/gl_list.h | 844 + gnulib/lib/gl_oset.c | 96 + gnulib/lib/gl_oset.h | 289 + gnulib/lib/gl_rbtree_list.c | 102 + gnulib/lib/gl_rbtree_list.h | 34 + gnulib/lib/gl_rbtree_oset.c | 814 + gnulib/lib/gl_rbtree_oset.h | 34 + gnulib/lib/gl_rbtreehash_list.c | 128 + gnulib/lib/gl_rbtreehash_list.h | 34 + gnulib/lib/gl_sublist.c | 479 + gnulib/lib/gl_sublist.h | 49 + gnulib/lib/gl_xlist.c | 128 + gnulib/lib/gl_xlist.h | 179 + gnulib/lib/gl_xoset.c | 46 + gnulib/lib/gl_xoset.h | 67 + gnulib/lib/gl_xsublist.c | 35 + gnulib/lib/gl_xsublist.h | 53 + gnulib/lib/glob-libc.h | 212 + gnulib/lib/glob.c | 1552 + gnulib/lib/glob.in.h | 91 + gnulib/lib/glthread/cond.c | 464 + gnulib/lib/glthread/cond.h | 409 + gnulib/lib/glthread/lock.c | 1058 + gnulib/lib/glthread/lock.h | 928 + gnulib/lib/glthread/thread.c | 232 + gnulib/lib/glthread/thread.h | 401 + gnulib/lib/glthread/threadlib.c | 74 + gnulib/lib/glthread/tls.c | 61 + gnulib/lib/glthread/tls.h | 299 + gnulib/lib/glthread/yield.h | 122 + gnulib/lib/grantpt.c | 123 + gnulib/lib/group-member.c | 124 + gnulib/lib/hard-locale.c | 72 + gnulib/lib/hard-locale.h | 25 + gnulib/lib/hash-pjw.c | 40 + gnulib/lib/hash-pjw.h | 23 + gnulib/lib/hash-triple.c | 77 + gnulib/lib/hash-triple.h | 24 + gnulib/lib/hash.c | 1233 + gnulib/lib/hash.h | 107 + gnulib/lib/hmac-md5.c | 81 + gnulib/lib/hmac-sha1.c | 81 + gnulib/lib/hmac.h | 41 + gnulib/lib/human.c | 470 + gnulib/lib/human.h | 83 + gnulib/lib/i-ring.c | 68 + gnulib/lib/i-ring.h | 44 + gnulib/lib/iconv.c | 450 + gnulib/lib/iconv.in.h | 111 + gnulib/lib/iconv_close.c | 47 + gnulib/lib/iconv_open-aix.gperf | 44 + gnulib/lib/iconv_open-hpux.gperf | 56 + gnulib/lib/iconv_open-irix.gperf | 31 + gnulib/lib/iconv_open-osf.gperf | 50 + gnulib/lib/iconv_open-solaris.gperf | 30 + gnulib/lib/iconv_open.c | 173 + gnulib/lib/iconveh.h | 41 + gnulib/lib/idcache.c | 227 + gnulib/lib/idcache.h | 11 + gnulib/lib/idpriv-drop.c | 129 + gnulib/lib/idpriv-droptemp.c | 204 + gnulib/lib/idpriv.h | 116 + gnulib/lib/ignore-value.h | 62 + gnulib/lib/imaxabs.c | 26 + gnulib/lib/imaxdiv.c | 63 + gnulib/lib/imaxtostr.c | 3 + gnulib/lib/inet_ntop.c | 249 + gnulib/lib/inet_pton.c | 268 + gnulib/lib/ino-map.c | 164 + gnulib/lib/ino-map.h | 19 + gnulib/lib/integer_length.c | 141 + gnulib/lib/integer_length.h | 49 + gnulib/lib/integer_length_l.c | 81 + gnulib/lib/integer_length_ll.c | 20 + gnulib/lib/intprops.h | 319 + gnulib/lib/inttostr.c | 3 + gnulib/lib/inttostr.h | 46 + gnulib/lib/inttypes.in.h | 1112 + gnulib/lib/ioctl.c | 79 + gnulib/lib/isapipe.c | 119 + gnulib/lib/isapipe.h | 6 + gnulib/lib/isblank.c | 33 + gnulib/lib/isdir.c | 33 + gnulib/lib/isdir.h | 1 + gnulib/lib/isfinite.c | 52 + gnulib/lib/isinf.c | 40 + gnulib/lib/isnan.c | 177 + gnulib/lib/isnand-nolibm.h | 33 + gnulib/lib/isnand.c | 19 + gnulib/lib/isnanf-nolibm.h | 33 + gnulib/lib/isnanf.c | 20 + gnulib/lib/isnanl-nolibm.h | 33 + gnulib/lib/isnanl.c | 20 + gnulib/lib/iswblank.c | 27 + gnulib/lib/iswctype-impl.h | 22 + gnulib/lib/iswctype.c | 23 + gnulib/lib/itold.c | 28 + gnulib/lib/javacomp.c | 2355 + gnulib/lib/javacomp.h | 75 + gnulib/lib/javaexec.c | 429 + gnulib/lib/javaexec.h | 50 + gnulib/lib/javaversion.c | 119 + gnulib/lib/javaversion.class | Bin 0 -> 510 bytes gnulib/lib/javaversion.h | 39 + gnulib/lib/javaversion.java | 31 + gnulib/lib/langinfo.in.h | 177 + gnulib/lib/lchown.c | 117 + gnulib/lib/ldexpf.c | 31 + gnulib/lib/ldexpl.c | 89 + gnulib/lib/ldtoastr.c | 2 + gnulib/lib/libunistring.valgrind | 9 + gnulib/lib/linebuffer.c | 103 + gnulib/lib/linebuffer.h | 53 + gnulib/lib/link.c | 212 + gnulib/lib/linkat.c | 343 + gnulib/lib/listen.c | 49 + gnulib/lib/localcharset.c | 547 + gnulib/lib/localcharset.h | 41 + gnulib/lib/locale.in.h | 96 + gnulib/lib/localename.c | 2957 + gnulib/lib/localename.h | 95 + gnulib/lib/log10f.c | 26 + gnulib/lib/logf.c | 26 + gnulib/lib/login_tty.c | 75 + gnulib/lib/logl.c | 273 + gnulib/lib/long-options.c | 88 + gnulib/lib/long-options.h | 26 + gnulib/lib/lseek.c | 64 + gnulib/lib/lstat.c | 97 + gnulib/lib/malloc.c | 57 + gnulib/lib/malloca.c | 139 + gnulib/lib/malloca.h | 134 + gnulib/lib/malloca.valgrind | 7 + gnulib/lib/math.in.h | 1381 + gnulib/lib/mbchar.c | 35 + gnulib/lib/mbchar.h | 350 + gnulib/lib/mbfile.h | 242 + gnulib/lib/mbiter.h | 215 + gnulib/lib/mbmemcasecmp.c | 96 + gnulib/lib/mbmemcasecmp.h | 45 + gnulib/lib/mbmemcasecoll.c | 190 + gnulib/lib/mbmemcasecoll.h | 58 + gnulib/lib/mbrlen.c | 32 + gnulib/lib/mbrtowc.c | 396 + gnulib/lib/mbscasecmp.c | 98 + gnulib/lib/mbscasestr.c | 412 + gnulib/lib/mbschr.c | 52 + gnulib/lib/mbscspn.c | 68 + gnulib/lib/mbsinit.c | 61 + gnulib/lib/mbslen.c | 44 + gnulib/lib/mbsncasecmp.c | 99 + gnulib/lib/mbsnlen.c | 45 + gnulib/lib/mbsnrtowcs-impl.h | 124 + gnulib/lib/mbsnrtowcs.c | 33 + gnulib/lib/mbspbrk.c | 63 + gnulib/lib/mbspcasecmp.c | 94 + gnulib/lib/mbsrchr.c | 49 + gnulib/lib/mbsrtowcs-impl.h | 122 + gnulib/lib/mbsrtowcs-state.c | 37 + gnulib/lib/mbsrtowcs.c | 32 + gnulib/lib/mbssep.c | 61 + gnulib/lib/mbsspn.c | 89 + gnulib/lib/mbsstr.c | 382 + gnulib/lib/mbstok_r.c | 66 + gnulib/lib/mbswidth.c | 193 + gnulib/lib/mbswidth.h | 60 + gnulib/lib/mbtowc-impl.h | 44 + gnulib/lib/mbtowc.c | 26 + gnulib/lib/mbuiter.h | 222 + gnulib/lib/md2.c | 275 + gnulib/lib/md2.h | 85 + gnulib/lib/md4.c | 383 + gnulib/lib/md4.h | 91 + gnulib/lib/md5.c | 462 + gnulib/lib/md5.h | 126 + gnulib/lib/memcasecmp.c | 49 + gnulib/lib/memcasecmp.h | 22 + gnulib/lib/memchr.c | 172 + gnulib/lib/memchr.valgrind | 14 + gnulib/lib/memchr2.c | 164 + gnulib/lib/memchr2.h | 32 + gnulib/lib/memchr2.valgrind | 14 + gnulib/lib/memcmp.c | 363 + gnulib/lib/memcmp2.c | 36 + gnulib/lib/memcmp2.h | 40 + gnulib/lib/memcoll.c | 111 + gnulib/lib/memcoll.h | 28 + gnulib/lib/memcpy.c | 36 + gnulib/lib/memmem.c | 76 + gnulib/lib/memmove.c | 26 + gnulib/lib/mempcpy.c | 29 + gnulib/lib/memrchr.c | 161 + gnulib/lib/memset.c | 30 + gnulib/lib/memxor.c | 35 + gnulib/lib/memxor.h | 31 + gnulib/lib/mgetgroups.c | 195 + gnulib/lib/mgetgroups.h | 22 + gnulib/lib/minmax.h | 61 + gnulib/lib/mkancesdirs.c | 153 + gnulib/lib/mkancesdirs.h | 4 + gnulib/lib/mkdir-p.c | 208 + gnulib/lib/mkdir-p.h | 35 + gnulib/lib/mkdir.c | 93 + gnulib/lib/mkdirat.c | 34 + gnulib/lib/mkdtemp.c | 39 + gnulib/lib/mkfifo.c | 58 + gnulib/lib/mkfifoat.c | 55 + gnulib/lib/mknod.c | 74 + gnulib/lib/mknodat.c | 57 + gnulib/lib/mkostemp.c | 46 + gnulib/lib/mkostemps.c | 54 + gnulib/lib/mkstemp-safer.c | 63 + gnulib/lib/mkstemp.c | 50 + gnulib/lib/mkstemps.c | 54 + gnulib/lib/mktime-internal.h | 4 + gnulib/lib/mktime.c | 737 + gnulib/lib/modechange.c | 385 + gnulib/lib/modechange.h | 30 + gnulib/lib/modff.c | 29 + gnulib/lib/mountlist.c | 951 + gnulib/lib/mountlist.h | 40 + gnulib/lib/mpsort.c | 156 + gnulib/lib/mpsort.h | 2 + gnulib/lib/msvc-inval.c | 130 + gnulib/lib/msvc-inval.h | 223 + gnulib/lib/msvc-nothrow.c | 50 + gnulib/lib/msvc-nothrow.h | 44 + gnulib/lib/nanosleep.c | 274 + gnulib/lib/netdb.in.h | 266 + gnulib/lib/netinet_in.in.h | 48 + gnulib/lib/nl_langinfo.c | 270 + gnulib/lib/nonblocking.c | 153 + gnulib/lib/nonblocking.h | 62 + gnulib/lib/nproc.c | 358 + gnulib/lib/nproc.h | 47 + gnulib/lib/obstack.c | 420 + gnulib/lib/obstack.h | 512 + gnulib/lib/obstack_printf.c | 92 + gnulib/lib/offtostr.c | 3 + gnulib/lib/open-safer.c | 46 + gnulib/lib/open.c | 181 + gnulib/lib/openat-die.c | 62 + gnulib/lib/openat-priv.h | 64 + gnulib/lib/openat-proc.c | 110 + gnulib/lib/openat-safer.c | 46 + gnulib/lib/openat.c | 286 + gnulib/lib/openat.h | 104 + gnulib/lib/opendir-safer.c | 76 + gnulib/lib/opendir.c | 148 + gnulib/lib/openpty.c | 136 + gnulib/lib/pagealign_alloc.c | 197 + gnulib/lib/pagealign_alloc.h | 54 + gnulib/lib/parse-datetime.h | 22 + gnulib/lib/parse-datetime.y | 1617 + gnulib/lib/parse-duration.c | 601 + gnulib/lib/parse-duration.h | 90 + gnulib/lib/passfd.c | 202 + gnulib/lib/passfd.h | 32 + gnulib/lib/pathmax.h | 84 + gnulib/lib/pclose.c | 28 + gnulib/lib/perror.c | 49 + gnulib/lib/physmem.c | 304 + gnulib/lib/physmem.h | 26 + gnulib/lib/pipe-filter-aux.h | 113 + gnulib/lib/pipe-filter-gi.c | 558 + gnulib/lib/pipe-filter-ii.c | 467 + gnulib/lib/pipe-filter.h | 237 + gnulib/lib/pipe-safer.c | 56 + gnulib/lib/pipe.c | 51 + gnulib/lib/pipe.h | 2 + gnulib/lib/pipe2-safer.c | 52 + gnulib/lib/pipe2.c | 169 + gnulib/lib/poll.c | 605 + gnulib/lib/poll.in.h | 104 + gnulib/lib/popen-safer.c | 93 + gnulib/lib/popen.c | 103 + gnulib/lib/posix_openpt.c | 108 + gnulib/lib/posixtm.c | 235 + gnulib/lib/posixtm.h | 36 + gnulib/lib/posixver.c | 54 + gnulib/lib/posixver.h | 1 + gnulib/lib/powf.c | 26 + gnulib/lib/pread.c | 65 + gnulib/lib/printf-args.c | 188 + gnulib/lib/printf-args.h | 159 + gnulib/lib/printf-frexp.c | 190 + gnulib/lib/printf-frexp.h | 23 + gnulib/lib/printf-frexpl.c | 37 + gnulib/lib/printf-frexpl.h | 23 + gnulib/lib/printf-parse.c | 639 + gnulib/lib/printf-parse.h | 194 + gnulib/lib/printf.c | 40 + gnulib/lib/priv-set.c | 142 + gnulib/lib/priv-set.h | 50 + gnulib/lib/progname.c | 92 + gnulib/lib/progname.h | 62 + gnulib/lib/progreloc.c | 377 + gnulib/lib/propername.c | 318 + gnulib/lib/propername.h | 106 + gnulib/lib/pselect.c | 77 + gnulib/lib/pt_chown.c | 162 + gnulib/lib/pthread.in.h | 274 + gnulib/lib/pthread_sigmask.c | 69 + gnulib/lib/ptsname.c | 32 + gnulib/lib/ptsname_r.c | 85 + gnulib/lib/pty-private.h | 46 + gnulib/lib/pty.in.h | 132 + gnulib/lib/putenv.c | 134 + gnulib/lib/pwrite.c | 64 + gnulib/lib/quote.c | 40 + gnulib/lib/quote.h | 20 + gnulib/lib/quotearg.c | 895 + gnulib/lib/quotearg.h | 389 + gnulib/lib/raise.c | 79 + gnulib/lib/random_r.c | 423 + gnulib/lib/rawmemchr.c | 136 + gnulib/lib/rawmemchr.valgrind | 12 + gnulib/lib/read-file.c | 189 + gnulib/lib/read-file.h | 34 + gnulib/lib/read.c | 85 + gnulib/lib/readdir.c | 98 + gnulib/lib/readline.c | 55 + gnulib/lib/readline.h | 34 + gnulib/lib/readlink.c | 74 + gnulib/lib/readlinkat.c | 47 + gnulib/lib/readtokens.c | 203 + gnulib/lib/readtokens.h | 43 + gnulib/lib/readtokens0.c | 99 + gnulib/lib/readtokens0.h | 42 + gnulib/lib/readutmp.c | 161 + gnulib/lib/readutmp.h | 216 + gnulib/lib/realloc.c | 79 + gnulib/lib/recv.c | 49 + gnulib/lib/recvfrom.c | 58 + gnulib/lib/ref-add.sin | 30 + gnulib/lib/ref-del.sin | 25 + gnulib/lib/regcomp.c | 3876 ++ gnulib/lib/regex-quote.c | 216 + gnulib/lib/regex-quote.h | 88 + gnulib/lib/regex.c | 72 + gnulib/lib/regex.h | 675 + gnulib/lib/regex_internal.c | 1741 + gnulib/lib/regex_internal.h | 866 + gnulib/lib/regexec.c | 4417 ++ gnulib/lib/relocatable.c | 496 + gnulib/lib/relocatable.h | 81 + gnulib/lib/relocwrapper.c | 198 + gnulib/lib/remove.c | 43 + gnulib/lib/rename.c | 473 + gnulib/lib/renameat.c | 157 + gnulib/lib/resource-ext.h | 47 + gnulib/lib/rewinddir.c | 49 + gnulib/lib/rijndael-alg-fst.c | 1083 + gnulib/lib/rijndael-alg-fst.h | 67 + gnulib/lib/rijndael-api-fst.c | 521 + gnulib/lib/rijndael-api-fst.h | 207 + gnulib/lib/rint.c | 112 + gnulib/lib/rintf.c | 19 + gnulib/lib/rintl.c | 36 + gnulib/lib/rmdir.c | 53 + gnulib/lib/round.c | 170 + gnulib/lib/roundf.c | 19 + gnulib/lib/roundl.c | 36 + gnulib/lib/rpmatch.c | 173 + gnulib/lib/safe-alloc.c | 121 + gnulib/lib/safe-alloc.h | 121 + gnulib/lib/safe-read.c | 77 + gnulib/lib/safe-read.h | 47 + gnulib/lib/safe-write.c | 18 + gnulib/lib/safe-write.h | 37 + gnulib/lib/same-inode.h | 25 + gnulib/lib/same.c | 123 + gnulib/lib/same.h | 25 + gnulib/lib/save-cwd.c | 99 + gnulib/lib/save-cwd.h | 34 + gnulib/lib/savedir.c | 145 + gnulib/lib/savedir.h | 29 + gnulib/lib/savewd.c | 305 + gnulib/lib/savewd.h | 148 + gnulib/lib/scandir.c | 188 + gnulib/lib/sched.in.h | 57 + gnulib/lib/se-context.in.h | 28 + gnulib/lib/se-selinux.in.h | 97 + gnulib/lib/search.in.h | 207 + gnulib/lib/select.c | 492 + gnulib/lib/selinux-at.c | 72 + gnulib/lib/selinux-at.h | 52 + gnulib/lib/send.c | 49 + gnulib/lib/sendto.c | 50 + gnulib/lib/set-mode-acl.c | 684 + gnulib/lib/setenv.c | 390 + gnulib/lib/sethostname.c | 162 + gnulib/lib/setlocale.c | 938 + gnulib/lib/setsockopt.c | 65 + gnulib/lib/settime.c | 59 + gnulib/lib/sh-quote.c | 107 + gnulib/lib/sh-quote.h | 36 + gnulib/lib/sha1.c | 427 + gnulib/lib/sha1.h | 92 + gnulib/lib/sha256.c | 569 + gnulib/lib/sha256.h | 91 + gnulib/lib/sha512.c | 619 + gnulib/lib/sha512.h | 95 + gnulib/lib/shutdown.c | 49 + gnulib/lib/sig-handler.h | 44 + gnulib/lib/sig2str.c | 345 + gnulib/lib/sig2str.h | 43 + gnulib/lib/sigaction.c | 204 + gnulib/lib/siglist.h | 132 + gnulib/lib/signal.in.h | 447 + gnulib/lib/signbitd.c | 64 + gnulib/lib/signbitf.c | 64 + gnulib/lib/signbitl.c | 64 + gnulib/lib/sigpipe-die.c | 82 + gnulib/lib/sigpipe-die.h | 63 + gnulib/lib/sigprocmask.c | 349 + gnulib/lib/sincosl.c | 907 + gnulib/lib/sinf.c | 26 + gnulib/lib/sinhf.c | 26 + gnulib/lib/sinl.c | 116 + gnulib/lib/size_max.h | 31 + gnulib/lib/sleep.c | 76 + gnulib/lib/snprintf.c | 72 + gnulib/lib/socket.c | 49 + gnulib/lib/sockets.c | 154 + gnulib/lib/sockets.h | 62 + gnulib/lib/spawn-pipe.c | 450 + gnulib/lib/spawn-pipe.h | 147 + gnulib/lib/spawn.c | 33 + gnulib/lib/spawn.in.h | 881 + gnulib/lib/spawn_faction_addclose.c | 59 + gnulib/lib/spawn_faction_adddup2.c | 60 + gnulib/lib/spawn_faction_addopen.c | 63 + gnulib/lib/spawn_faction_destroy.c | 31 + gnulib/lib/spawn_faction_init.c | 56 + gnulib/lib/spawn_int.h | 62 + gnulib/lib/spawnattr_destroy.c | 28 + gnulib/lib/spawnattr_getdefault.c | 34 + gnulib/lib/spawnattr_getflags.c | 32 + gnulib/lib/spawnattr_getpgroup.c | 32 + gnulib/lib/spawnattr_getschedparam.c | 34 + gnulib/lib/spawnattr_getschedpolicy.c | 36 + gnulib/lib/spawnattr_getsigmask.c | 33 + gnulib/lib/spawnattr_init.c | 33 + gnulib/lib/spawnattr_setdefault.c | 33 + gnulib/lib/spawnattr_setflags.c | 45 + gnulib/lib/spawnattr_setpgroup.c | 32 + gnulib/lib/spawnattr_setschedparam.c | 34 + gnulib/lib/spawnattr_setschedpolicy.c | 39 + gnulib/lib/spawnattr_setsigmask.c | 33 + gnulib/lib/spawni.c | 374 + gnulib/lib/spawnp.c | 33 + gnulib/lib/sprintf.c | 80 + gnulib/lib/sqrtf.c | 26 + gnulib/lib/sqrtl.c | 71 + gnulib/lib/stat-macros.h | 3 + gnulib/lib/stat-size.h | 111 + gnulib/lib/stat-time.h | 189 + gnulib/lib/stat.c | 123 + gnulib/lib/stdalign.in.h | 89 + gnulib/lib/stdarg.in.h | 36 + gnulib/lib/stdbool.in.h | 122 + gnulib/lib/stddef.in.h | 87 + gnulib/lib/stdint.in.h | 609 + gnulib/lib/stdio--.h | 41 + gnulib/lib/stdio-impl.h | 110 + gnulib/lib/stdio-read.c | 150 + gnulib/lib/stdio-safer.h | 36 + gnulib/lib/stdio-write.c | 198 + gnulib/lib/stdio.in.h | 1350 + gnulib/lib/stdlib--.h | 36 + gnulib/lib/stdlib-safer.h | 32 + gnulib/lib/stdlib.in.h | 804 + gnulib/lib/stpcpy.c | 49 + gnulib/lib/stpncpy.c | 92 + gnulib/lib/str-kmp.h | 154 + gnulib/lib/str-two-way.h | 453 + gnulib/lib/strcasecmp.c | 63 + gnulib/lib/strcasestr.c | 83 + gnulib/lib/strchrnul.c | 142 + gnulib/lib/strchrnul.valgrind | 12 + gnulib/lib/strcspn.c | 41 + gnulib/lib/strdup.c | 55 + gnulib/lib/streq.h | 176 + gnulib/lib/strerror-override.c | 289 + gnulib/lib/strerror-override.h | 52 + gnulib/lib/strerror.c | 70 + gnulib/lib/strerror_r.c | 327 + gnulib/lib/strftime.c | 1469 + gnulib/lib/strftime.h | 34 + gnulib/lib/striconv.c | 464 + gnulib/lib/striconv.h | 76 + gnulib/lib/striconveh.c | 1199 + gnulib/lib/striconveh.h | 140 + gnulib/lib/striconveha.c | 352 + gnulib/lib/striconveha.h | 95 + gnulib/lib/string.in.h | 1011 + gnulib/lib/strings.in.h | 123 + gnulib/lib/stripslash.c | 45 + gnulib/lib/strncasecmp.c | 63 + gnulib/lib/strncat.c | 33 + gnulib/lib/strndup.c | 37 + gnulib/lib/strnlen.c | 31 + gnulib/lib/strnlen1.c | 35 + gnulib/lib/strnlen1.h | 40 + gnulib/lib/strpbrk.c | 42 + gnulib/lib/strptime.c | 1145 + gnulib/lib/strsep.c | 58 + gnulib/lib/strsignal.c | 200 + gnulib/lib/strstr.c | 83 + gnulib/lib/strtod.c | 367 + gnulib/lib/strtoimax.c | 75 + gnulib/lib/strtok_r.c | 76 + gnulib/lib/strtol.c | 433 + gnulib/lib/strtoll.c | 33 + gnulib/lib/strtoul.c | 19 + gnulib/lib/strtoull.c | 26 + gnulib/lib/strtoumax.c | 2 + gnulib/lib/strverscmp.c | 132 + gnulib/lib/symlink.c | 57 + gnulib/lib/symlinkat.c | 76 + gnulib/lib/sys_file.in.h | 64 + gnulib/lib/sys_ioctl.in.h | 79 + gnulib/lib/sys_select.in.h | 288 + gnulib/lib/sys_socket.in.h | 683 + gnulib/lib/sys_stat.in.h | 674 + gnulib/lib/sys_time.in.h | 200 + gnulib/lib/sys_times.in.h | 81 + gnulib/lib/sys_types.in.h | 40 + gnulib/lib/sys_uio.in.h | 64 + gnulib/lib/sys_utsname.in.h | 109 + gnulib/lib/sys_wait.in.h | 130 + gnulib/lib/sysexits.in.h | 72 + gnulib/lib/t-idcache | 52 + gnulib/lib/tanf.c | 26 + gnulib/lib/tanhf.c | 26 + gnulib/lib/tanl.c | 235 + gnulib/lib/tcgetsid.c | 42 + gnulib/lib/tempname.c | 309 + gnulib/lib/tempname.h | 50 + gnulib/lib/termios.in.h | 76 + gnulib/lib/time.in.h | 249 + gnulib/lib/time_r.c | 45 + gnulib/lib/timegm.c | 39 + gnulib/lib/times.c | 67 + gnulib/lib/timespec-add.c | 71 + gnulib/lib/timespec-sub.c | 72 + gnulib/lib/timespec.h | 82 + gnulib/lib/tmpdir.c | 157 + gnulib/lib/tmpdir.h | 26 + gnulib/lib/tmpfile-safer.c | 69 + gnulib/lib/tmpfile.c | 127 + gnulib/lib/towctrans-impl.h | 22 + gnulib/lib/towctrans.c | 23 + gnulib/lib/trigl.c | 636 + gnulib/lib/trigl.h | 35 + gnulib/lib/trim.c | 129 + gnulib/lib/trim.h | 33 + gnulib/lib/trunc.c | 115 + gnulib/lib/truncf.c | 20 + gnulib/lib/truncl.c | 37 + gnulib/lib/tsearch.c | 687 + gnulib/lib/ttyname_r.c | 86 + gnulib/lib/u64.h | 158 + gnulib/lib/uinttostr.c | 3 + gnulib/lib/umaxtostr.c | 3 + gnulib/lib/uname.c | 268 + gnulib/lib/unicase.in.h | 457 + gnulib/lib/unicase/cased.c | 53 + gnulib/lib/unicase/cased.h | 343 + gnulib/lib/unicase/casefold.h | 22 + gnulib/lib/unicase/caseprop.h | 32 + gnulib/lib/unicase/context.h | 65 + gnulib/lib/unicase/empty-prefix-context.c | 27 + gnulib/lib/unicase/empty-suffix-context.c | 27 + gnulib/lib/unicase/ignorable.c | 71 + gnulib/lib/unicase/ignorable.h | 552 + gnulib/lib/unicase/invariant.h | 45 + gnulib/lib/unicase/locale-language.c | 55 + gnulib/lib/unicase/locale-languages.gperf | 270 + gnulib/lib/unicase/simple-mapping.h | 39 + gnulib/lib/unicase/special-casing-table.gperf | 136 + gnulib/lib/unicase/special-casing.c | 25 + gnulib/lib/unicase/special-casing.h | 60 + gnulib/lib/unicase/tocasefold.c | 27 + gnulib/lib/unicase/tocasefold.h | 567 + gnulib/lib/unicase/tolower.c | 27 + gnulib/lib/unicase/tolower.h | 567 + gnulib/lib/unicase/totitle.c | 27 + gnulib/lib/unicase/totitle.h | 615 + gnulib/lib/unicase/toupper.c | 27 + gnulib/lib/unicase/toupper.h | 615 + gnulib/lib/unicase/u-casecmp.h | 69 + gnulib/lib/unicase/u-casecoll.h | 68 + gnulib/lib/unicase/u-casefold.h | 28 + gnulib/lib/unicase/u-casemap.h | 416 + gnulib/lib/unicase/u-casexfrm.h | 88 + gnulib/lib/unicase/u-ct-casefold.h | 107 + gnulib/lib/unicase/u-ct-totitle.h | 501 + gnulib/lib/unicase/u-is-cased.h | 128 + gnulib/lib/unicase/u-is-invariant.h | 64 + gnulib/lib/unicase/u-prefix-context.h | 92 + gnulib/lib/unicase/u-suffix-context.h | 90 + gnulib/lib/unicase/u-totitle.h | 28 + gnulib/lib/unicase/u16-casecmp.c | 35 + gnulib/lib/unicase/u16-casecoll.c | 32 + gnulib/lib/unicase/u16-casefold.c | 26 + gnulib/lib/unicase/u16-casemap.c | 40 + gnulib/lib/unicase/u16-casexfrm.c | 35 + gnulib/lib/unicase/u16-ct-casefold.c | 35 + gnulib/lib/unicase/u16-ct-tolower.c | 40 + gnulib/lib/unicase/u16-ct-totitle.c | 43 + gnulib/lib/unicase/u16-ct-toupper.c | 40 + gnulib/lib/unicase/u16-is-cased.c | 36 + gnulib/lib/unicase/u16-is-casefolded.c | 30 + gnulib/lib/unicase/u16-is-invariant.c | 34 + gnulib/lib/unicase/u16-is-lowercase.c | 30 + gnulib/lib/unicase/u16-is-titlecase.c | 30 + gnulib/lib/unicase/u16-is-uppercase.c | 30 + gnulib/lib/unicase/u16-prefix-context.c | 33 + gnulib/lib/unicase/u16-suffix-context.c | 32 + gnulib/lib/unicase/u16-tolower.c | 39 + gnulib/lib/unicase/u16-totitle.c | 27 + gnulib/lib/unicase/u16-toupper.c | 39 + gnulib/lib/unicase/u32-casecmp.c | 35 + gnulib/lib/unicase/u32-casecoll.c | 32 + gnulib/lib/unicase/u32-casefold.c | 26 + gnulib/lib/unicase/u32-casemap.c | 40 + gnulib/lib/unicase/u32-casexfrm.c | 35 + gnulib/lib/unicase/u32-ct-casefold.c | 35 + gnulib/lib/unicase/u32-ct-tolower.c | 40 + gnulib/lib/unicase/u32-ct-totitle.c | 43 + gnulib/lib/unicase/u32-ct-toupper.c | 40 + gnulib/lib/unicase/u32-is-cased.c | 36 + gnulib/lib/unicase/u32-is-casefolded.c | 30 + gnulib/lib/unicase/u32-is-invariant.c | 34 + gnulib/lib/unicase/u32-is-lowercase.c | 30 + gnulib/lib/unicase/u32-is-titlecase.c | 30 + gnulib/lib/unicase/u32-is-uppercase.c | 30 + gnulib/lib/unicase/u32-prefix-context.c | 33 + gnulib/lib/unicase/u32-suffix-context.c | 32 + gnulib/lib/unicase/u32-tolower.c | 39 + gnulib/lib/unicase/u32-totitle.c | 26 + gnulib/lib/unicase/u32-toupper.c | 39 + gnulib/lib/unicase/u8-casecmp.c | 35 + gnulib/lib/unicase/u8-casecoll.c | 32 + gnulib/lib/unicase/u8-casefold.c | 107 + gnulib/lib/unicase/u8-casemap.c | 40 + gnulib/lib/unicase/u8-casexfrm.c | 35 + gnulib/lib/unicase/u8-ct-casefold.c | 35 + gnulib/lib/unicase/u8-ct-tolower.c | 40 + gnulib/lib/unicase/u8-ct-totitle.c | 43 + gnulib/lib/unicase/u8-ct-toupper.c | 40 + gnulib/lib/unicase/u8-is-cased.c | 36 + gnulib/lib/unicase/u8-is-casefolded.c | 30 + gnulib/lib/unicase/u8-is-invariant.c | 34 + gnulib/lib/unicase/u8-is-lowercase.c | 30 + gnulib/lib/unicase/u8-is-titlecase.c | 30 + gnulib/lib/unicase/u8-is-uppercase.c | 30 + gnulib/lib/unicase/u8-prefix-context.c | 33 + gnulib/lib/unicase/u8-suffix-context.c | 32 + gnulib/lib/unicase/u8-tolower.c | 120 + gnulib/lib/unicase/u8-totitle.c | 107 + gnulib/lib/unicase/u8-toupper.c | 120 + gnulib/lib/unicase/ulc-casecmp.c | 74 + gnulib/lib/unicase/ulc-casecoll.c | 31 + gnulib/lib/unicase/ulc-casexfrm.c | 64 + gnulib/lib/unicase/unicasemap.h | 52 + gnulib/lib/unicodeio.c | 216 + gnulib/lib/unicodeio.h | 48 + gnulib/lib/uniconv.in.h | 172 + gnulib/lib/uniconv/u-conv-from-enc.h | 91 + gnulib/lib/uniconv/u-conv-to-enc.h | 156 + gnulib/lib/uniconv/u-strconv-from-enc.h | 40 + gnulib/lib/uniconv/u-strconv-to-enc.h | 63 + gnulib/lib/uniconv/u16-conv-from-enc.c | 47 + gnulib/lib/uniconv/u16-conv-to-enc.c | 177 + gnulib/lib/uniconv/u16-strconv-from-enc.c | 34 + gnulib/lib/uniconv/u16-strconv-from-locale.c | 29 + gnulib/lib/uniconv/u16-strconv-to-enc.c | 50 + gnulib/lib/uniconv/u16-strconv-to-locale.c | 29 + gnulib/lib/uniconv/u32-conv-from-enc.c | 46 + gnulib/lib/uniconv/u32-conv-to-enc.c | 49 + gnulib/lib/uniconv/u32-strconv-from-enc.c | 34 + gnulib/lib/uniconv/u32-strconv-from-locale.c | 29 + gnulib/lib/uniconv/u32-strconv-to-enc.c | 49 + gnulib/lib/uniconv/u32-strconv-to-locale.c | 29 + gnulib/lib/uniconv/u8-conv-from-enc.c | 105 + gnulib/lib/uniconv/u8-conv-to-enc.c | 92 + gnulib/lib/uniconv/u8-strconv-from-enc.c | 34 + gnulib/lib/uniconv/u8-strconv-from-locale.c | 29 + gnulib/lib/uniconv/u8-strconv-to-enc.c | 79 + gnulib/lib/uniconv/u8-strconv-to-locale.c | 29 + gnulib/lib/unictype.in.h | 881 + gnulib/lib/unictype/3level.h | 327 + gnulib/lib/unictype/3levelbit.h | 317 + gnulib/lib/unictype/Makefile | 20 + gnulib/lib/unictype/bidi_byname.c | 69 + gnulib/lib/unictype/bidi_byname.gperf | 70 + gnulib/lib/unictype/bidi_longname.c | 53 + gnulib/lib/unictype/bidi_name.c | 41 + gnulib/lib/unictype/bidi_of.c | 58 + gnulib/lib/unictype/bidi_of.h | 909 + gnulib/lib/unictype/bidi_test.c | 33 + gnulib/lib/unictype/bitmap.h | 47 + gnulib/lib/unictype/block_test.c | 31 + gnulib/lib/unictype/blocks.c | 62 + gnulib/lib/unictype/blocks.h | 990 + gnulib/lib/unictype/categ_C.c | 27 + gnulib/lib/unictype/categ_C.h | 926 + gnulib/lib/unictype/categ_Cc.c | 27 + gnulib/lib/unictype/categ_Cc.h | 156 + gnulib/lib/unictype/categ_Cf.c | 27 + gnulib/lib/unictype/categ_Cf.h | 456 + gnulib/lib/unictype/categ_Cn.c | 27 + gnulib/lib/unictype/categ_Cn.h | 1050 + gnulib/lib/unictype/categ_Co.c | 27 + gnulib/lib/unictype/categ_Co.h | 310 + gnulib/lib/unictype/categ_Cs.c | 30 + gnulib/lib/unictype/categ_Cs.h | 156 + gnulib/lib/unictype/categ_L.c | 27 + gnulib/lib/unictype/categ_L.h | 604 + gnulib/lib/unictype/categ_LC.c | 27 + gnulib/lib/unictype/categ_LC.h | 339 + gnulib/lib/unictype/categ_Ll.c | 27 + gnulib/lib/unictype/categ_Ll.h | 335 + gnulib/lib/unictype/categ_Lm.c | 27 + gnulib/lib/unictype/categ_Lm.h | 232 + gnulib/lib/unictype/categ_Lo.c | 27 + gnulib/lib/unictype/categ_Lo.h | 592 + gnulib/lib/unictype/categ_Lt.c | 27 + gnulib/lib/unictype/categ_Lt.h | 160 + gnulib/lib/unictype/categ_Lu.c | 27 + gnulib/lib/unictype/categ_Lu.h | 331 + gnulib/lib/unictype/categ_M.c | 27 + gnulib/lib/unictype/categ_M.h | 532 + gnulib/lib/unictype/categ_Mc.c | 27 + gnulib/lib/unictype/categ_Mc.h | 335 + gnulib/lib/unictype/categ_Me.c | 27 + gnulib/lib/unictype/categ_Me.h | 164 + gnulib/lib/unictype/categ_Mn.c | 27 + gnulib/lib/unictype/categ_Mn.h | 532 + gnulib/lib/unictype/categ_N.c | 27 + gnulib/lib/unictype/categ_N.h | 415 + gnulib/lib/unictype/categ_Nd.c | 27 + gnulib/lib/unictype/categ_Nd.h | 355 + gnulib/lib/unictype/categ_Nl.c | 27 + gnulib/lib/unictype/categ_Nl.h | 311 + gnulib/lib/unictype/categ_No.c | 27 + gnulib/lib/unictype/categ_No.h | 375 + gnulib/lib/unictype/categ_P.c | 27 + gnulib/lib/unictype/categ_P.h | 415 + gnulib/lib/unictype/categ_Pc.c | 27 + gnulib/lib/unictype/categ_Pc.h | 164 + gnulib/lib/unictype/categ_Pd.c | 27 + gnulib/lib/unictype/categ_Pd.h | 184 + gnulib/lib/unictype/categ_Pe.c | 27 + gnulib/lib/unictype/categ_Pe.h | 196 + gnulib/lib/unictype/categ_Pf.c | 27 + gnulib/lib/unictype/categ_Pf.h | 164 + gnulib/lib/unictype/categ_Pi.c | 27 + gnulib/lib/unictype/categ_Pi.h | 164 + gnulib/lib/unictype/categ_Po.c | 27 + gnulib/lib/unictype/categ_Po.h | 395 + gnulib/lib/unictype/categ_Ps.c | 27 + gnulib/lib/unictype/categ_Ps.h | 196 + gnulib/lib/unictype/categ_S.c | 27 + gnulib/lib/unictype/categ_S.h | 443 + gnulib/lib/unictype/categ_Sc.c | 27 + gnulib/lib/unictype/categ_Sc.h | 192 + gnulib/lib/unictype/categ_Sk.c | 27 + gnulib/lib/unictype/categ_Sk.h | 180 + gnulib/lib/unictype/categ_Sm.c | 27 + gnulib/lib/unictype/categ_Sm.h | 331 + gnulib/lib/unictype/categ_So.c | 27 + gnulib/lib/unictype/categ_So.h | 419 + gnulib/lib/unictype/categ_Z.c | 27 + gnulib/lib/unictype/categ_Z.h | 172 + gnulib/lib/unictype/categ_Zl.c | 30 + gnulib/lib/unictype/categ_Zl.h | 156 + gnulib/lib/unictype/categ_Zp.c | 30 + gnulib/lib/unictype/categ_Zp.h | 156 + gnulib/lib/unictype/categ_Zs.c | 27 + gnulib/lib/unictype/categ_Zs.h | 172 + gnulib/lib/unictype/categ_and.c | 45 + gnulib/lib/unictype/categ_and_not.c | 42 + gnulib/lib/unictype/categ_byname.c | 191 + gnulib/lib/unictype/categ_byname.gperf | 116 + gnulib/lib/unictype/categ_longname.c | 106 + gnulib/lib/unictype/categ_name.c | 79 + gnulib/lib/unictype/categ_none.c | 30 + gnulib/lib/unictype/categ_of.c | 81 + gnulib/lib/unictype/categ_of.h | 1213 + gnulib/lib/unictype/categ_or.c | 42 + gnulib/lib/unictype/categ_test.c | 32 + gnulib/lib/unictype/combiningclass.c | 47 + gnulib/lib/unictype/combiningclass.h | 999 + gnulib/lib/unictype/combiningclass_byname.c | 63 + gnulib/lib/unictype/combiningclass_byname.gperf | 66 + gnulib/lib/unictype/combiningclass_longname.c | 130 + gnulib/lib/unictype/combiningclass_name.c | 130 + gnulib/lib/unictype/ctype_alnum.c | 32 + gnulib/lib/unictype/ctype_alnum.h | 616 + gnulib/lib/unictype/ctype_alpha.c | 32 + gnulib/lib/unictype/ctype_alpha.h | 616 + gnulib/lib/unictype/ctype_blank.c | 32 + gnulib/lib/unictype/ctype_blank.h | 172 + gnulib/lib/unictype/ctype_cntrl.c | 32 + gnulib/lib/unictype/ctype_cntrl.h | 160 + gnulib/lib/unictype/ctype_digit.c | 32 + gnulib/lib/unictype/ctype_digit.h | 156 + gnulib/lib/unictype/ctype_graph.c | 32 + gnulib/lib/unictype/ctype_graph.h | 926 + gnulib/lib/unictype/ctype_lower.c | 32 + gnulib/lib/unictype/ctype_lower.h | 327 + gnulib/lib/unictype/ctype_print.c | 32 + gnulib/lib/unictype/ctype_print.h | 926 + gnulib/lib/unictype/ctype_punct.c | 32 + gnulib/lib/unictype/ctype_punct.h | 758 + gnulib/lib/unictype/ctype_space.c | 32 + gnulib/lib/unictype/ctype_space.h | 172 + gnulib/lib/unictype/ctype_upper.c | 32 + gnulib/lib/unictype/ctype_upper.h | 327 + gnulib/lib/unictype/ctype_xdigit.c | 32 + gnulib/lib/unictype/ctype_xdigit.h | 156 + gnulib/lib/unictype/decdigit.c | 49 + gnulib/lib/unictype/decdigit.h | 255 + gnulib/lib/unictype/digit.c | 49 + gnulib/lib/unictype/digit.h | 351 + gnulib/lib/unictype/identsyntaxmap.h | 42 + gnulib/lib/unictype/joininggroup_byname.c | 63 + gnulib/lib/unictype/joininggroup_byname.gperf | 85 + gnulib/lib/unictype/joininggroup_name.c | 55 + gnulib/lib/unictype/joininggroup_name.h | 74 + gnulib/lib/unictype/joininggroup_of.c | 33 + gnulib/lib/unictype/joininggroup_of.h | 183 + gnulib/lib/unictype/joiningtype_byname.c | 63 + gnulib/lib/unictype/joiningtype_byname.gperf | 30 + gnulib/lib/unictype/joiningtype_longname.c | 40 + gnulib/lib/unictype/joiningtype_name.c | 35 + gnulib/lib/unictype/joiningtype_of.c | 54 + gnulib/lib/unictype/joiningtype_of.h | 127 + gnulib/lib/unictype/mirror.c | 49 + gnulib/lib/unictype/mirror.h | 503 + gnulib/lib/unictype/numeric.c | 55 + gnulib/lib/unictype/numeric.h | 710 + gnulib/lib/unictype/pr_alphabetic.c | 35 + gnulib/lib/unictype/pr_alphabetic.h | 612 + gnulib/lib/unictype/pr_ascii_hex_digit.c | 35 + gnulib/lib/unictype/pr_ascii_hex_digit.h | 156 + gnulib/lib/unictype/pr_bidi_arabic_digit.c | 47 + gnulib/lib/unictype/pr_bidi_arabic_digit.h | 291 + gnulib/lib/unictype/pr_bidi_arabic_right_to_left.c | 47 + gnulib/lib/unictype/pr_bidi_arabic_right_to_left.h | 172 + gnulib/lib/unictype/pr_bidi_block_separator.c | 47 + gnulib/lib/unictype/pr_bidi_block_separator.h | 160 + gnulib/lib/unictype/pr_bidi_boundary_neutral.c | 47 + gnulib/lib/unictype/pr_bidi_boundary_neutral.h | 586 + gnulib/lib/unictype/pr_bidi_common_separator.c | 47 + gnulib/lib/unictype/pr_bidi_common_separator.h | 168 + gnulib/lib/unictype/pr_bidi_control.c | 35 + gnulib/lib/unictype/pr_bidi_control.h | 156 + .../lib/unictype/pr_bidi_embedding_or_override.c | 49 + .../lib/unictype/pr_bidi_embedding_or_override.h | 156 + gnulib/lib/unictype/pr_bidi_eur_num_separator.c | 47 + gnulib/lib/unictype/pr_bidi_eur_num_separator.h | 172 + gnulib/lib/unictype/pr_bidi_eur_num_terminator.c | 47 + gnulib/lib/unictype/pr_bidi_eur_num_terminator.h | 192 + gnulib/lib/unictype/pr_bidi_european_digit.c | 47 + gnulib/lib/unictype/pr_bidi_european_digit.h | 311 + gnulib/lib/unictype/pr_bidi_hebrew_right_to_left.c | 47 + gnulib/lib/unictype/pr_bidi_hebrew_right_to_left.h | 319 + gnulib/lib/unictype/pr_bidi_left_to_right.c | 47 + gnulib/lib/unictype/pr_bidi_left_to_right.h | 726 + gnulib/lib/unictype/pr_bidi_non_spacing_mark.c | 47 + gnulib/lib/unictype/pr_bidi_non_spacing_mark.h | 532 + gnulib/lib/unictype/pr_bidi_other_neutral.c | 47 + gnulib/lib/unictype/pr_bidi_other_neutral.h | 435 + gnulib/lib/unictype/pr_bidi_pdf.c | 47 + gnulib/lib/unictype/pr_bidi_pdf.h | 156 + gnulib/lib/unictype/pr_bidi_segment_separator.c | 47 + gnulib/lib/unictype/pr_bidi_segment_separator.h | 156 + gnulib/lib/unictype/pr_bidi_whitespace.c | 47 + gnulib/lib/unictype/pr_bidi_whitespace.h | 172 + gnulib/lib/unictype/pr_byname.c | 339 + gnulib/lib/unictype/pr_byname.gperf | 218 + gnulib/lib/unictype/pr_case_ignorable.c | 35 + gnulib/lib/unictype/pr_case_ignorable.h | 552 + gnulib/lib/unictype/pr_cased.c | 35 + gnulib/lib/unictype/pr_cased.h | 343 + gnulib/lib/unictype/pr_changes_when_casefolded.c | 35 + gnulib/lib/unictype/pr_changes_when_casefolded.h | 331 + gnulib/lib/unictype/pr_changes_when_casemapped.c | 35 + gnulib/lib/unictype/pr_changes_when_casemapped.h | 335 + gnulib/lib/unictype/pr_changes_when_lowercased.c | 35 + gnulib/lib/unictype/pr_changes_when_lowercased.h | 327 + gnulib/lib/unictype/pr_changes_when_titlecased.c | 35 + gnulib/lib/unictype/pr_changes_when_titlecased.h | 331 + gnulib/lib/unictype/pr_changes_when_uppercased.c | 35 + gnulib/lib/unictype/pr_changes_when_uppercased.h | 331 + gnulib/lib/unictype/pr_combining.c | 35 + gnulib/lib/unictype/pr_combining.h | 532 + gnulib/lib/unictype/pr_composite.c | 35 + gnulib/lib/unictype/pr_composite.h | 387 + gnulib/lib/unictype/pr_currency_symbol.c | 47 + gnulib/lib/unictype/pr_currency_symbol.h | 192 + gnulib/lib/unictype/pr_dash.c | 35 + gnulib/lib/unictype/pr_dash.h | 188 + gnulib/lib/unictype/pr_decimal_digit.c | 47 + gnulib/lib/unictype/pr_decimal_digit.h | 355 + .../lib/unictype/pr_default_ignorable_code_point.c | 35 + .../lib/unictype/pr_default_ignorable_code_point.h | 464 + gnulib/lib/unictype/pr_deprecated.c | 35 + gnulib/lib/unictype/pr_deprecated.h | 324 + gnulib/lib/unictype/pr_diacritic.c | 35 + gnulib/lib/unictype/pr_diacritic.h | 379 + gnulib/lib/unictype/pr_extender.c | 35 + gnulib/lib/unictype/pr_extender.h | 204 + gnulib/lib/unictype/pr_format_control.c | 35 + gnulib/lib/unictype/pr_format_control.h | 440 + gnulib/lib/unictype/pr_grapheme_base.c | 35 + gnulib/lib/unictype/pr_grapheme_base.h | 652 + gnulib/lib/unictype/pr_grapheme_extend.c | 35 + gnulib/lib/unictype/pr_grapheme_extend.h | 532 + gnulib/lib/unictype/pr_grapheme_link.c | 35 + gnulib/lib/unictype/pr_grapheme_link.h | 331 + gnulib/lib/unictype/pr_hex_digit.c | 35 + gnulib/lib/unictype/pr_hex_digit.h | 160 + gnulib/lib/unictype/pr_hyphen.c | 35 + gnulib/lib/unictype/pr_hyphen.h | 180 + gnulib/lib/unictype/pr_id_continue.c | 35 + gnulib/lib/unictype/pr_id_continue.h | 756 + gnulib/lib/unictype/pr_id_start.c | 35 + gnulib/lib/unictype/pr_id_start.h | 604 + gnulib/lib/unictype/pr_ideographic.c | 35 + gnulib/lib/unictype/pr_ideographic.h | 320 + gnulib/lib/unictype/pr_ids_binary_operator.c | 35 + gnulib/lib/unictype/pr_ids_binary_operator.h | 156 + gnulib/lib/unictype/pr_ids_trinary_operator.c | 35 + gnulib/lib/unictype/pr_ids_trinary_operator.h | 156 + gnulib/lib/unictype/pr_ignorable_control.c | 35 + gnulib/lib/unictype/pr_ignorable_control.h | 456 + gnulib/lib/unictype/pr_iso_control.c | 47 + gnulib/lib/unictype/pr_iso_control.h | 156 + gnulib/lib/unictype/pr_join_control.c | 47 + gnulib/lib/unictype/pr_join_control.h | 156 + gnulib/lib/unictype/pr_left_of_pair.c | 35 + gnulib/lib/unictype/pr_left_of_pair.h | 184 + gnulib/lib/unictype/pr_line_separator.c | 55 + gnulib/lib/unictype/pr_line_separator.h | 156 + gnulib/lib/unictype/pr_logical_order_exception.c | 35 + gnulib/lib/unictype/pr_logical_order_exception.h | 160 + gnulib/lib/unictype/pr_lowercase.c | 35 + gnulib/lib/unictype/pr_lowercase.h | 339 + gnulib/lib/unictype/pr_math.c | 35 + gnulib/lib/unictype/pr_math.h | 335 + gnulib/lib/unictype/pr_non_break.c | 35 + gnulib/lib/unictype/pr_non_break.h | 172 + gnulib/lib/unictype/pr_not_a_character.c | 35 + gnulib/lib/unictype/pr_not_a_character.h | 306 + gnulib/lib/unictype/pr_numeric.c | 35 + gnulib/lib/unictype/pr_numeric.h | 552 + gnulib/lib/unictype/pr_other_alphabetic.c | 35 + gnulib/lib/unictype/pr_other_alphabetic.h | 363 + .../pr_other_default_ignorable_code_point.c | 35 + .../pr_other_default_ignorable_code_point.h | 324 + gnulib/lib/unictype/pr_other_grapheme_extend.c | 35 + gnulib/lib/unictype/pr_other_grapheme_extend.h | 307 + gnulib/lib/unictype/pr_other_id_continue.c | 35 + gnulib/lib/unictype/pr_other_id_continue.h | 168 + gnulib/lib/unictype/pr_other_id_start.c | 35 + gnulib/lib/unictype/pr_other_id_start.h | 160 + gnulib/lib/unictype/pr_other_lowercase.c | 35 + gnulib/lib/unictype/pr_other_lowercase.h | 176 + gnulib/lib/unictype/pr_other_math.c | 35 + gnulib/lib/unictype/pr_other_math.h | 323 + gnulib/lib/unictype/pr_other_uppercase.c | 35 + gnulib/lib/unictype/pr_other_uppercase.h | 160 + gnulib/lib/unictype/pr_paired_punctuation.c | 35 + gnulib/lib/unictype/pr_paired_punctuation.h | 184 + gnulib/lib/unictype/pr_paragraph_separator.c | 55 + gnulib/lib/unictype/pr_paragraph_separator.h | 156 + gnulib/lib/unictype/pr_pattern_syntax.c | 35 + gnulib/lib/unictype/pr_pattern_syntax.h | 188 + gnulib/lib/unictype/pr_pattern_white_space.c | 35 + gnulib/lib/unictype/pr_pattern_white_space.h | 160 + gnulib/lib/unictype/pr_private_use.c | 49 + gnulib/lib/unictype/pr_private_use.h | 310 + gnulib/lib/unictype/pr_punctuation.c | 47 + gnulib/lib/unictype/pr_punctuation.h | 415 + gnulib/lib/unictype/pr_quotation_mark.c | 35 + gnulib/lib/unictype/pr_quotation_mark.h | 168 + gnulib/lib/unictype/pr_radical.c | 35 + gnulib/lib/unictype/pr_radical.h | 156 + gnulib/lib/unictype/pr_sentence_terminal.c | 35 + gnulib/lib/unictype/pr_sentence_terminal.h | 363 + gnulib/lib/unictype/pr_soft_dotted.c | 35 + gnulib/lib/unictype/pr_soft_dotted.h | 319 + gnulib/lib/unictype/pr_space.c | 47 + gnulib/lib/unictype/pr_space.h | 172 + gnulib/lib/unictype/pr_terminal_punctuation.c | 35 + gnulib/lib/unictype/pr_terminal_punctuation.h | 383 + gnulib/lib/unictype/pr_test.c | 27 + gnulib/lib/unictype/pr_titlecase.c | 47 + gnulib/lib/unictype/pr_titlecase.h | 160 + gnulib/lib/unictype/pr_unassigned_code_value.c | 35 + gnulib/lib/unictype/pr_unassigned_code_value.h | 920 + gnulib/lib/unictype/pr_unified_ideograph.c | 35 + gnulib/lib/unictype/pr_unified_ideograph.h | 312 + gnulib/lib/unictype/pr_uppercase.c | 35 + gnulib/lib/unictype/pr_uppercase.h | 335 + gnulib/lib/unictype/pr_variation_selector.c | 35 + gnulib/lib/unictype/pr_variation_selector.h | 308 + gnulib/lib/unictype/pr_white_space.c | 35 + gnulib/lib/unictype/pr_white_space.h | 172 + gnulib/lib/unictype/pr_xid_continue.c | 35 + gnulib/lib/unictype/pr_xid_continue.h | 756 + gnulib/lib/unictype/pr_xid_start.c | 35 + gnulib/lib/unictype/pr_xid_start.h | 604 + gnulib/lib/unictype/pr_zero_width.c | 35 + gnulib/lib/unictype/pr_zero_width.h | 456 + gnulib/lib/unictype/scripts.c | 75 + gnulib/lib/unictype/scripts.h | 4337 ++ gnulib/lib/unictype/scripts_byname.gperf | 109 + gnulib/lib/unictype/sy_c_ident.c | 31 + gnulib/lib/unictype/sy_c_ident.h | 140 + gnulib/lib/unictype/sy_c_whitespace.c | 27 + gnulib/lib/unictype/sy_c_whitespace.h | 156 + gnulib/lib/unictype/sy_java_ident.c | 31 + gnulib/lib/unictype/sy_java_ident.h | 389 + gnulib/lib/unictype/sy_java_whitespace.c | 27 + gnulib/lib/unictype/sy_java_whitespace.h | 156 + gnulib/lib/unigbrk.in.h | 120 + gnulib/lib/unigbrk/gbrkprop.h | 842 + gnulib/lib/unigbrk/u16-grapheme-breaks.c | 44 + gnulib/lib/unigbrk/u16-grapheme-next.c | 46 + gnulib/lib/unigbrk/u16-grapheme-prev.c | 54 + gnulib/lib/unigbrk/u32-grapheme-breaks.c | 42 + gnulib/lib/unigbrk/u32-grapheme-next.c | 46 + gnulib/lib/unigbrk/u32-grapheme-prev.c | 51 + gnulib/lib/unigbrk/u8-grapheme-breaks.c | 46 + gnulib/lib/unigbrk/u8-grapheme-next.c | 46 + gnulib/lib/unigbrk/u8-grapheme-prev.c | 54 + gnulib/lib/unigbrk/uc-gbrk-prop.c | 45 + gnulib/lib/unigbrk/uc-is-grapheme-break.c | 106 + gnulib/lib/unigbrk/ulc-grapheme-breaks.c | 130 + gnulib/lib/unilbrk.in.h | 110 + gnulib/lib/unilbrk/lbrkprop1.h | 33 + gnulib/lib/unilbrk/lbrkprop2.h | 2942 + gnulib/lib/unilbrk/lbrktables.c | 64 + gnulib/lib/unilbrk/lbrktables.h | 95 + gnulib/lib/unilbrk/u16-possible-linebreaks.c | 164 + gnulib/lib/unilbrk/u16-width-linebreaks.c | 108 + gnulib/lib/unilbrk/u32-possible-linebreaks.c | 158 + gnulib/lib/unilbrk/u32-width-linebreaks.c | 106 + gnulib/lib/unilbrk/u8-possible-linebreaks.c | 261 + gnulib/lib/unilbrk/u8-width-linebreaks.c | 204 + gnulib/lib/unilbrk/ulc-common.c | 51 + gnulib/lib/unilbrk/ulc-common.h | 31 + gnulib/lib/unilbrk/ulc-possible-linebreaks.c | 212 + gnulib/lib/unilbrk/ulc-width-linebreaks.c | 231 + gnulib/lib/uniname.in.h | 45 + gnulib/lib/uniname/gen-uninames.lisp | 301 + gnulib/lib/uniname/uniname.c | 516 + gnulib/lib/uniname/uninames.h | 61495 +++++++++++++++++++ gnulib/lib/uninorm.in.h | 245 + gnulib/lib/uninorm/canonical-decomposition.c | 108 + gnulib/lib/uninorm/compat-decomposition.c | 31 + gnulib/lib/uninorm/composition-table.gperf | 961 + gnulib/lib/uninorm/composition.c | 87 + gnulib/lib/uninorm/decompose-internal.c | 28 + gnulib/lib/uninorm/decompose-internal.h | 36 + gnulib/lib/uninorm/decomposing-form.c | 29 + gnulib/lib/uninorm/decomposition-table.c | 23 + gnulib/lib/uninorm/decomposition-table.h | 48 + gnulib/lib/uninorm/decomposition-table1.h | 20 + gnulib/lib/uninorm/decomposition-table2.h | 3261 + gnulib/lib/uninorm/decomposition.c | 102 + gnulib/lib/uninorm/nfc.c | 31 + gnulib/lib/uninorm/nfd.c | 31 + gnulib/lib/uninorm/nfkc.c | 32 + gnulib/lib/uninorm/nfkd.c | 32 + gnulib/lib/uninorm/normalize-internal.h | 35 + gnulib/lib/uninorm/u-normalize-internal.h | 375 + gnulib/lib/uninorm/u-normcmp.h | 64 + gnulib/lib/uninorm/u-normcoll.h | 65 + gnulib/lib/uninorm/u-normxfrm.h | 87 + gnulib/lib/uninorm/u16-normalize.c | 38 + gnulib/lib/uninorm/u16-normcmp.c | 33 + gnulib/lib/uninorm/u16-normcoll.c | 31 + gnulib/lib/uninorm/u16-normxfrm.c | 34 + gnulib/lib/uninorm/u32-normalize.c | 38 + gnulib/lib/uninorm/u32-normcmp.c | 33 + gnulib/lib/uninorm/u32-normcoll.c | 31 + gnulib/lib/uninorm/u32-normxfrm.c | 34 + gnulib/lib/uninorm/u8-normalize.c | 38 + gnulib/lib/uninorm/u8-normcmp.c | 33 + gnulib/lib/uninorm/u8-normcoll.c | 31 + gnulib/lib/uninorm/u8-normxfrm.c | 34 + gnulib/lib/uninorm/uninorm-filter.c | 367 + gnulib/lib/unistd--.h | 32 + gnulib/lib/unistd-safer.h | 31 + gnulib/lib/unistd.in.h | 1498 + gnulib/lib/unistdio.in.h | 256 + gnulib/lib/unistdio/u-asnprintf.h | 28 + gnulib/lib/unistdio/u-asprintf.h | 28 + gnulib/lib/unistdio/u-printf-args.c | 23 + gnulib/lib/unistdio/u-printf-args.h | 28 + gnulib/lib/unistdio/u-printf-parse.h | 28 + gnulib/lib/unistdio/u-snprintf.h | 28 + gnulib/lib/unistdio/u-sprintf.h | 28 + gnulib/lib/unistdio/u-vasprintf.h | 35 + gnulib/lib/unistdio/u-vsnprintf.h | 52 + gnulib/lib/unistdio/u-vsprintf.h | 58 + gnulib/lib/unistdio/u16-asnprintf.c | 29 + gnulib/lib/unistdio/u16-asprintf.c | 29 + gnulib/lib/unistdio/u16-printf-parse.c | 27 + gnulib/lib/unistdio/u16-snprintf.c | 29 + gnulib/lib/unistdio/u16-sprintf.c | 29 + gnulib/lib/unistdio/u16-u16-asnprintf.c | 29 + gnulib/lib/unistdio/u16-u16-asprintf.c | 29 + gnulib/lib/unistdio/u16-u16-snprintf.c | 29 + gnulib/lib/unistdio/u16-u16-sprintf.c | 29 + gnulib/lib/unistdio/u16-u16-vasnprintf.c | 50 + gnulib/lib/unistdio/u16-u16-vasprintf.c | 31 + gnulib/lib/unistdio/u16-u16-vsnprintf.c | 34 + gnulib/lib/unistdio/u16-u16-vsprintf.c | 33 + gnulib/lib/unistdio/u16-vasnprintf.c | 51 + gnulib/lib/unistdio/u16-vasprintf.c | 31 + gnulib/lib/unistdio/u16-vsnprintf.c | 34 + gnulib/lib/unistdio/u16-vsprintf.c | 33 + gnulib/lib/unistdio/u32-asnprintf.c | 29 + gnulib/lib/unistdio/u32-asprintf.c | 29 + gnulib/lib/unistdio/u32-printf-parse.c | 27 + gnulib/lib/unistdio/u32-snprintf.c | 29 + gnulib/lib/unistdio/u32-sprintf.c | 29 + gnulib/lib/unistdio/u32-u32-asnprintf.c | 29 + gnulib/lib/unistdio/u32-u32-asprintf.c | 29 + gnulib/lib/unistdio/u32-u32-snprintf.c | 29 + gnulib/lib/unistdio/u32-u32-sprintf.c | 29 + gnulib/lib/unistdio/u32-u32-vasnprintf.c | 50 + gnulib/lib/unistdio/u32-u32-vasprintf.c | 31 + gnulib/lib/unistdio/u32-u32-vsnprintf.c | 34 + gnulib/lib/unistdio/u32-u32-vsprintf.c | 33 + gnulib/lib/unistdio/u32-vasnprintf.c | 51 + gnulib/lib/unistdio/u32-vasprintf.c | 31 + gnulib/lib/unistdio/u32-vsnprintf.c | 34 + gnulib/lib/unistdio/u32-vsprintf.c | 33 + gnulib/lib/unistdio/u8-asnprintf.c | 29 + gnulib/lib/unistdio/u8-asprintf.c | 29 + gnulib/lib/unistdio/u8-printf-parse.c | 27 + gnulib/lib/unistdio/u8-snprintf.c | 29 + gnulib/lib/unistdio/u8-sprintf.c | 29 + gnulib/lib/unistdio/u8-u8-asnprintf.c | 29 + gnulib/lib/unistdio/u8-u8-asprintf.c | 29 + gnulib/lib/unistdio/u8-u8-snprintf.c | 29 + gnulib/lib/unistdio/u8-u8-sprintf.c | 29 + gnulib/lib/unistdio/u8-u8-vasnprintf.c | 50 + gnulib/lib/unistdio/u8-u8-vasprintf.c | 31 + gnulib/lib/unistdio/u8-u8-vsnprintf.c | 34 + gnulib/lib/unistdio/u8-u8-vsprintf.c | 33 + gnulib/lib/unistdio/u8-vasnprintf.c | 51 + gnulib/lib/unistdio/u8-vasprintf.c | 31 + gnulib/lib/unistdio/u8-vsnprintf.c | 34 + gnulib/lib/unistdio/u8-vsprintf.c | 33 + gnulib/lib/unistdio/ulc-asnprintf.c | 29 + gnulib/lib/unistdio/ulc-asprintf.c | 29 + gnulib/lib/unistdio/ulc-fprintf.c | 74 + gnulib/lib/unistdio/ulc-printf-parse.c | 28 + gnulib/lib/unistdio/ulc-snprintf.c | 29 + gnulib/lib/unistdio/ulc-sprintf.c | 29 + gnulib/lib/unistdio/ulc-vasnprintf.c | 47 + gnulib/lib/unistdio/ulc-vasprintf.c | 31 + gnulib/lib/unistdio/ulc-vfprintf.c | 71 + gnulib/lib/unistdio/ulc-vsnprintf.c | 34 + gnulib/lib/unistdio/ulc-vsprintf.c | 33 + gnulib/lib/unistr.in.h | 692 + gnulib/lib/unistr/u-cmp2.h | 32 + gnulib/lib/unistr/u-cpy-alloc.h | 40 + gnulib/lib/unistr/u-cpy.h | 32 + gnulib/lib/unistr/u-endswith.h | 28 + gnulib/lib/unistr/u-move.h | 44 + gnulib/lib/unistr/u-set.h | 39 + gnulib/lib/unistr/u-startswith.h | 30 + gnulib/lib/unistr/u-stpcpy.h | 24 + gnulib/lib/unistr/u-stpncpy.h | 34 + gnulib/lib/unistr/u-strcat.h | 26 + gnulib/lib/unistr/u-strcoll.h | 92 + gnulib/lib/unistr/u-strcpy.h | 26 + gnulib/lib/unistr/u-strcspn.h | 54 + gnulib/lib/unistr/u-strdup.h | 41 + gnulib/lib/unistr/u-strlen.h | 26 + gnulib/lib/unistr/u-strncat.h | 28 + gnulib/lib/unistr/u-strncpy.h | 32 + gnulib/lib/unistr/u-strnlen.h | 26 + gnulib/lib/unistr/u-strpbrk.h | 46 + gnulib/lib/unistr/u-strspn.h | 54 + gnulib/lib/unistr/u-strstr.h | 131 + gnulib/lib/unistr/u-strtok.h | 52 + gnulib/lib/unistr/u16-check.c | 51 + gnulib/lib/unistr/u16-chr.c | 57 + gnulib/lib/unistr/u16-cmp.c | 54 + gnulib/lib/unistr/u16-cmp2.c | 28 + gnulib/lib/unistr/u16-cpy-alloc.c | 25 + gnulib/lib/unistr/u16-cpy.c | 25 + gnulib/lib/unistr/u16-endswith.c | 27 + gnulib/lib/unistr/u16-mblen.c | 50 + gnulib/lib/unistr/u16-mbsnlen.c | 42 + gnulib/lib/unistr/u16-mbtouc-aux.c | 51 + gnulib/lib/unistr/u16-mbtouc-unsafe-aux.c | 55 + gnulib/lib/unistr/u16-mbtouc-unsafe.c | 66 + gnulib/lib/unistr/u16-mbtouc.c | 61 + gnulib/lib/unistr/u16-mbtoucr.c | 54 + gnulib/lib/unistr/u16-move.c | 25 + gnulib/lib/unistr/u16-next.c | 37 + gnulib/lib/unistr/u16-prev.c | 53 + gnulib/lib/unistr/u16-set.c | 26 + gnulib/lib/unistr/u16-startswith.c | 25 + gnulib/lib/unistr/u16-stpcpy.c | 26 + gnulib/lib/unistr/u16-stpncpy.c | 25 + gnulib/lib/unistr/u16-strcat.c | 26 + gnulib/lib/unistr/u16-strchr.c | 64 + gnulib/lib/unistr/u16-strcmp.c | 50 + gnulib/lib/unistr/u16-strcoll.c | 33 + gnulib/lib/unistr/u16-strcpy.c | 25 + gnulib/lib/unistr/u16-strcspn.c | 28 + gnulib/lib/unistr/u16-strdup.c | 26 + gnulib/lib/unistr/u16-strlen.c | 25 + gnulib/lib/unistr/u16-strmblen.c | 44 + gnulib/lib/unistr/u16-strmbtouc.c | 51 + gnulib/lib/unistr/u16-strncat.c | 26 + gnulib/lib/unistr/u16-strncmp.c | 54 + gnulib/lib/unistr/u16-strncpy.c | 25 + gnulib/lib/unistr/u16-strnlen.c | 25 + gnulib/lib/unistr/u16-strpbrk.c | 27 + gnulib/lib/unistr/u16-strrchr.c | 65 + gnulib/lib/unistr/u16-strspn.c | 29 + gnulib/lib/unistr/u16-strstr.c | 37 + gnulib/lib/unistr/u16-strtok.c | 27 + gnulib/lib/unistr/u16-to-u32.c | 125 + gnulib/lib/unistr/u16-to-u8.c | 136 + gnulib/lib/unistr/u16-uctomb-aux.c | 58 + gnulib/lib/unistr/u16-uctomb.c | 72 + gnulib/lib/unistr/u32-check.c | 39 + gnulib/lib/unistr/u32-chr.c | 32 + gnulib/lib/unistr/u32-cmp.c | 40 + gnulib/lib/unistr/u32-cmp2.c | 28 + gnulib/lib/unistr/u32-cpy-alloc.c | 25 + gnulib/lib/unistr/u32-cpy.c | 25 + gnulib/lib/unistr/u32-endswith.c | 27 + gnulib/lib/unistr/u32-mblen.c | 37 + gnulib/lib/unistr/u32-mbsnlen.c | 27 + gnulib/lib/unistr/u32-mbtouc-unsafe.c | 48 + gnulib/lib/unistr/u32-mbtouc.c | 43 + gnulib/lib/unistr/u32-mbtoucr.c | 39 + gnulib/lib/unistr/u32-move.c | 25 + gnulib/lib/unistr/u32-next.c | 39 + gnulib/lib/unistr/u32-prev.c | 39 + gnulib/lib/unistr/u32-set.c | 26 + gnulib/lib/unistr/u32-startswith.c | 25 + gnulib/lib/unistr/u32-stpcpy.c | 25 + gnulib/lib/unistr/u32-stpncpy.c | 25 + gnulib/lib/unistr/u32-strcat.c | 26 + gnulib/lib/unistr/u32-strchr.c | 36 + gnulib/lib/unistr/u32-strcmp.c | 36 + gnulib/lib/unistr/u32-strcoll.c | 33 + gnulib/lib/unistr/u32-strcpy.c | 25 + gnulib/lib/unistr/u32-strcspn.c | 51 + gnulib/lib/unistr/u32-strdup.c | 26 + gnulib/lib/unistr/u32-strlen.c | 25 + gnulib/lib/unistr/u32-strmblen.c | 36 + gnulib/lib/unistr/u32-strmbtouc.c | 39 + gnulib/lib/unistr/u32-strncat.c | 26 + gnulib/lib/unistr/u32-strncmp.c | 40 + gnulib/lib/unistr/u32-strncpy.c | 25 + gnulib/lib/unistr/u32-strnlen.c | 25 + gnulib/lib/unistr/u32-strpbrk.c | 50 + gnulib/lib/unistr/u32-strrchr.c | 38 + gnulib/lib/unistr/u32-strspn.c | 50 + gnulib/lib/unistr/u32-strstr.c | 34 + gnulib/lib/unistr/u32-strtok.c | 27 + gnulib/lib/unistr/u32-to-u16.c | 130 + gnulib/lib/unistr/u32-to-u8.c | 130 + gnulib/lib/unistr/u32-uctomb.c | 47 + gnulib/lib/unistr/u8-check.c | 105 + gnulib/lib/unistr/u8-chr.c | 201 + gnulib/lib/unistr/u8-cmp.c | 30 + gnulib/lib/unistr/u8-cmp2.c | 28 + gnulib/lib/unistr/u8-cpy-alloc.c | 25 + gnulib/lib/unistr/u8-cpy.c | 25 + gnulib/lib/unistr/u8-endswith.c | 27 + gnulib/lib/unistr/u8-mblen.c | 99 + gnulib/lib/unistr/u8-mbsnlen.c | 44 + gnulib/lib/unistr/u8-mbtouc-aux.c | 240 + gnulib/lib/unistr/u8-mbtouc-unsafe-aux.c | 260 + gnulib/lib/unistr/u8-mbtouc-unsafe.c | 271 + gnulib/lib/unistr/u8-mbtouc.c | 250 + gnulib/lib/unistr/u8-mbtoucr.c | 285 + gnulib/lib/unistr/u8-move.c | 25 + gnulib/lib/unistr/u8-next.c | 37 + gnulib/lib/unistr/u8-prev.c | 93 + gnulib/lib/unistr/u8-set.c | 44 + gnulib/lib/unistr/u8-startswith.c | 25 + gnulib/lib/unistr/u8-stpcpy.c | 44 + gnulib/lib/unistr/u8-stpncpy.c | 44 + gnulib/lib/unistr/u8-strcat.c | 29 + gnulib/lib/unistr/u8-strchr.c | 240 + gnulib/lib/unistr/u8-strcmp.c | 30 + gnulib/lib/unistr/u8-strcoll.c | 33 + gnulib/lib/unistr/u8-strcpy.c | 29 + gnulib/lib/unistr/u8-strcspn.c | 28 + gnulib/lib/unistr/u8-strdup.c | 40 + gnulib/lib/unistr/u8-strlen.c | 29 + gnulib/lib/unistr/u8-strmblen.c | 97 + gnulib/lib/unistr/u8-strmbtouc.c | 130 + gnulib/lib/unistr/u8-strncat.c | 29 + gnulib/lib/unistr/u8-strncmp.c | 30 + gnulib/lib/unistr/u8-strncpy.c | 29 + gnulib/lib/unistr/u8-strnlen.c | 44 + gnulib/lib/unistr/u8-strpbrk.c | 27 + gnulib/lib/unistr/u8-strrchr.c | 102 + gnulib/lib/unistr/u8-strspn.c | 29 + gnulib/lib/unistr/u8-strstr.c | 32 + gnulib/lib/unistr/u8-strtok.c | 27 + gnulib/lib/unistr/u8-to-u16.c | 136 + gnulib/lib/unistr/u8-to-u32.c | 125 + gnulib/lib/unistr/u8-uctomb-aux.c | 69 + gnulib/lib/unistr/u8-uctomb.c | 88 + gnulib/lib/unitypes.in.h | 26 + gnulib/lib/uniwbrk.in.h | 83 + gnulib/lib/uniwbrk/u-wordbreaks.h | 127 + gnulib/lib/uniwbrk/u16-wordbreaks.c | 31 + gnulib/lib/uniwbrk/u32-wordbreaks.c | 31 + gnulib/lib/uniwbrk/u8-wordbreaks.c | 124 + gnulib/lib/uniwbrk/ulc-wordbreaks.c | 201 + gnulib/lib/uniwbrk/wbrkprop.h | 4139 ++ gnulib/lib/uniwbrk/wbrktable.c | 52 + gnulib/lib/uniwbrk/wbrktable.h | 18 + gnulib/lib/uniwbrk/wordbreak-property.c | 44 + gnulib/lib/uniwidth.in.h | 69 + gnulib/lib/uniwidth/cjk.h | 37 + gnulib/lib/uniwidth/u16-strwidth.c | 29 + gnulib/lib/uniwidth/u16-width.c | 47 + gnulib/lib/uniwidth/u32-strwidth.c | 29 + gnulib/lib/uniwidth/u32-width.c | 43 + gnulib/lib/uniwidth/u8-strwidth.c | 29 + gnulib/lib/uniwidth/u8-width.c | 47 + gnulib/lib/uniwidth/width.c | 368 + gnulib/lib/unlink.c | 97 + gnulib/lib/unlinkat.c | 109 + gnulib/lib/unlinkdir.c | 54 + gnulib/lib/unlinkdir.h | 26 + gnulib/lib/unlocked-io.h | 136 + gnulib/lib/unlockpt.c | 44 + gnulib/lib/unsetenv.c | 127 + gnulib/lib/userspec.c | 309 + gnulib/lib/userspec.h | 10 + gnulib/lib/usleep.c | 58 + gnulib/lib/utimecmp.c | 380 + gnulib/lib/utimecmp.h | 37 + gnulib/lib/utimens.c | 533 + gnulib/lib/utimens.h | 19 + gnulib/lib/utimensat.c | 154 + gnulib/lib/vasnprintf.c | 5607 ++ gnulib/lib/vasnprintf.h | 80 + gnulib/lib/vasprintf.c | 51 + gnulib/lib/vdprintf.c | 67 + gnulib/lib/verify.h | 243 + gnulib/lib/verror.c | 77 + gnulib/lib/verror.h | 54 + gnulib/lib/version-etc-fsf.c | 30 + gnulib/lib/version-etc.c | 258 + gnulib/lib/version-etc.h | 78 + gnulib/lib/vfprintf.c | 74 + gnulib/lib/vma-iter.c | 625 + gnulib/lib/vma-iter.h | 63 + gnulib/lib/vprintf.c | 33 + gnulib/lib/vsnprintf.c | 71 + gnulib/lib/vsprintf.c | 77 + gnulib/lib/w32sock.h | 136 + gnulib/lib/w32spawn.h | 215 + gnulib/lib/wait-process.c | 361 + gnulib/lib/wait-process.h | 74 + gnulib/lib/waitpid.c | 31 + gnulib/lib/wchar.in.h | 1006 + gnulib/lib/wcpcpy-impl.h | 24 + gnulib/lib/wcpcpy.c | 23 + gnulib/lib/wcpncpy-impl.h | 30 + gnulib/lib/wcpncpy.c | 23 + gnulib/lib/wcrtomb.c | 53 + gnulib/lib/wcscasecmp-impl.h | 32 + gnulib/lib/wcscasecmp.c | 25 + gnulib/lib/wcscat-impl.h | 26 + gnulib/lib/wcscat.c | 23 + gnulib/lib/wcschr-impl.h | 32 + gnulib/lib/wcschr.c | 23 + gnulib/lib/wcscmp-impl.h | 32 + gnulib/lib/wcscmp.c | 23 + gnulib/lib/wcscoll-impl.h | 111 + gnulib/lib/wcscoll.c | 27 + gnulib/lib/wcscpy-impl.h | 26 + gnulib/lib/wcscpy.c | 23 + gnulib/lib/wcscspn-impl.h | 47 + gnulib/lib/wcscspn.c | 23 + gnulib/lib/wcsdup-impl.h | 29 + gnulib/lib/wcsdup.c | 25 + gnulib/lib/wcslen-impl.h | 26 + gnulib/lib/wcslen.c | 23 + gnulib/lib/wcsncasecmp-impl.h | 36 + gnulib/lib/wcsncasecmp.c | 25 + gnulib/lib/wcsncat-impl.h | 28 + gnulib/lib/wcsncat.c | 23 + gnulib/lib/wcsncmp-impl.h | 36 + gnulib/lib/wcsncmp.c | 23 + gnulib/lib/wcsncpy-impl.h | 32 + gnulib/lib/wcsncpy.c | 23 + gnulib/lib/wcsnlen-impl.h | 26 + gnulib/lib/wcsnlen.c | 23 + gnulib/lib/wcsnrtombs-impl.h | 90 + gnulib/lib/wcsnrtombs.c | 30 + gnulib/lib/wcspbrk-impl.h | 47 + gnulib/lib/wcspbrk.c | 23 + gnulib/lib/wcsrchr-impl.h | 33 + gnulib/lib/wcsrchr.c | 23 + gnulib/lib/wcsrtombs-impl.h | 90 + gnulib/lib/wcsrtombs-state.c | 37 + gnulib/lib/wcsrtombs.c | 56 + gnulib/lib/wcsspn-impl.h | 47 + gnulib/lib/wcsspn.c | 23 + gnulib/lib/wcsstr-impl.h | 51 + gnulib/lib/wcsstr.c | 23 + gnulib/lib/wcstok-impl.h | 50 + gnulib/lib/wcstok.c | 23 + gnulib/lib/wcswidth-impl.h | 43 + gnulib/lib/wcswidth.c | 25 + gnulib/lib/wcsxfrm-impl.h | 96 + gnulib/lib/wcsxfrm.c | 27 + gnulib/lib/wctob.c | 38 + gnulib/lib/wctomb-impl.h | 34 + gnulib/lib/wctomb.c | 25 + gnulib/lib/wctrans-impl.h | 37 + gnulib/lib/wctrans.c | 25 + gnulib/lib/wctype-impl.h | 96 + gnulib/lib/wctype.c | 25 + gnulib/lib/wctype.in.h | 499 + gnulib/lib/wcwidth.c | 50 + gnulib/lib/wmemchr-impl.h | 27 + gnulib/lib/wmemchr.c | 23 + gnulib/lib/wmemcmp-impl.h | 35 + gnulib/lib/wmemcmp.c | 23 + gnulib/lib/wmemcpy-impl.h | 26 + gnulib/lib/wmemcpy.c | 23 + gnulib/lib/wmemmove-impl.h | 36 + gnulib/lib/wmemmove.c | 23 + gnulib/lib/wmemset-impl.h | 26 + gnulib/lib/wmemset.c | 23 + gnulib/lib/write-any-file.c | 50 + gnulib/lib/write-any-file.h | 2 + gnulib/lib/write.c | 145 + gnulib/lib/xalloc-die.c | 41 + gnulib/lib/xalloc-oversized.h | 38 + gnulib/lib/xalloc.h | 271 + gnulib/lib/xasprintf.c | 34 + gnulib/lib/xconcat-filename.c | 41 + gnulib/lib/xfreopen.c | 42 + gnulib/lib/xfreopen.h | 2 + gnulib/lib/xgetcwd.c | 41 + gnulib/lib/xgetcwd.h | 17 + gnulib/lib/xgetdomainname.c | 77 + gnulib/lib/xgetdomainname.h | 30 + gnulib/lib/xgetgroups.c | 37 + gnulib/lib/xgethostname.c | 74 + gnulib/lib/xgethostname.h | 1 + gnulib/lib/xmalloc.c | 124 + gnulib/lib/xmalloca.c | 38 + gnulib/lib/xmalloca.h | 64 + gnulib/lib/xmemcoll.c | 76 + gnulib/lib/xmemcoll.h | 3 + gnulib/lib/xmemdup0.c | 44 + gnulib/lib/xmemdup0.h | 41 + gnulib/lib/xnanosleep.c | 58 + gnulib/lib/xnanosleep.h | 1 + gnulib/lib/xprintf.c | 79 + gnulib/lib/xprintf.h | 45 + gnulib/lib/xreadlink.c | 44 + gnulib/lib/xreadlink.h | 25 + gnulib/lib/xreadlinkat.c | 46 + gnulib/lib/xsetenv.c | 38 + gnulib/lib/xsetenv.h | 31 + gnulib/lib/xsize.h | 108 + gnulib/lib/xstriconv.c | 62 + gnulib/lib/xstriconv.h | 78 + gnulib/lib/xstriconveh.c | 86 + gnulib/lib/xstriconveh.h | 115 + gnulib/lib/xstrndup.c | 36 + gnulib/lib/xstrndup.h | 23 + gnulib/lib/xstrtod.c | 71 + gnulib/lib/xstrtod.h | 31 + gnulib/lib/xstrtoimax.c | 6 + gnulib/lib/xstrtol-error.c | 98 + gnulib/lib/xstrtol.c | 241 + gnulib/lib/xstrtol.h | 73 + gnulib/lib/xstrtold.c | 2 + gnulib/lib/xstrtoll.c | 6 + gnulib/lib/xstrtoul.c | 6 + gnulib/lib/xstrtoull.c | 6 + gnulib/lib/xstrtoumax.c | 6 + gnulib/lib/xtime.h | 86 + gnulib/lib/xvasprintf.c | 110 + gnulib/lib/xvasprintf.h | 55 + gnulib/lib/yesno.c | 60 + gnulib/lib/yesno.h | 24 + 1900 files changed, 366312 insertions(+), 1 deletion(-) delete mode 160000 gnulib create mode 100644 gnulib/lib/.cppi-disable create mode 100644 gnulib/lib/.cvsignore create mode 100644 gnulib/lib/Makefile create mode 100644 gnulib/lib/README create mode 100644 gnulib/lib/_Exit.c create mode 100644 gnulib/lib/accept.c create mode 100644 gnulib/lib/accept4.c create mode 100644 gnulib/lib/acl-internal.h create mode 100644 gnulib/lib/acl.h create mode 100644 gnulib/lib/acl_entries.c create mode 100644 gnulib/lib/acosf.c create mode 100644 gnulib/lib/acosl.c create mode 100644 gnulib/lib/alignof.h create mode 100644 gnulib/lib/alloca.c create mode 100644 gnulib/lib/alloca.in.h create mode 100644 gnulib/lib/allocator.c create mode 100644 gnulib/lib/allocator.h create mode 100644 gnulib/lib/alphasort.c create mode 100644 gnulib/lib/amemxfrm.c create mode 100644 gnulib/lib/amemxfrm.h create mode 100644 gnulib/lib/anytostr.c create mode 100644 gnulib/lib/arcfour.c create mode 100644 gnulib/lib/arcfour.h create mode 100644 gnulib/lib/arctwo.c create mode 100644 gnulib/lib/arctwo.h create mode 100644 gnulib/lib/areadlink-with-size.c create mode 100644 gnulib/lib/areadlink.c create mode 100644 gnulib/lib/areadlink.h create mode 100644 gnulib/lib/areadlinkat-with-size.c create mode 100644 gnulib/lib/areadlinkat.c create mode 100644 gnulib/lib/argmatch.c create mode 100644 gnulib/lib/argmatch.h create mode 100644 gnulib/lib/argp-ba.c create mode 100644 gnulib/lib/argp-eexst.c create mode 100644 gnulib/lib/argp-fmtstream.c create mode 100644 gnulib/lib/argp-fmtstream.h create mode 100644 gnulib/lib/argp-fs-xinl.c create mode 100644 gnulib/lib/argp-help.c create mode 100644 gnulib/lib/argp-namefrob.h create mode 100644 gnulib/lib/argp-parse.c create mode 100644 gnulib/lib/argp-pin.c create mode 100644 gnulib/lib/argp-pv.c create mode 100644 gnulib/lib/argp-pvh.c create mode 100644 gnulib/lib/argp-version-etc.c create mode 100644 gnulib/lib/argp-version-etc.h create mode 100644 gnulib/lib/argp-xinl.c create mode 100644 gnulib/lib/argp.h create mode 100644 gnulib/lib/argv-iter.c create mode 100644 gnulib/lib/argv-iter.h create mode 100644 gnulib/lib/argz.c create mode 100644 gnulib/lib/argz.in.h create mode 100644 gnulib/lib/arpa_inet.in.h create mode 100644 gnulib/lib/array-mergesort.h create mode 100644 gnulib/lib/asinf.c create mode 100644 gnulib/lib/asinl.c create mode 100644 gnulib/lib/asnprintf.c create mode 100644 gnulib/lib/asprintf.c create mode 100644 gnulib/lib/assert.in.h create mode 100644 gnulib/lib/astrxfrm.c create mode 100644 gnulib/lib/astrxfrm.h create mode 100644 gnulib/lib/at-func.c create mode 100644 gnulib/lib/at-func2.c create mode 100644 gnulib/lib/atan2f.c create mode 100644 gnulib/lib/atanf.c create mode 100644 gnulib/lib/atanl.c create mode 100644 gnulib/lib/atexit.c create mode 100644 gnulib/lib/atoll.c create mode 100644 gnulib/lib/backupfile.c create mode 100644 gnulib/lib/backupfile.h create mode 100644 gnulib/lib/base32.c create mode 100644 gnulib/lib/base32.h create mode 100644 gnulib/lib/base64.c create mode 100644 gnulib/lib/base64.h create mode 100644 gnulib/lib/basename-lgpl.c create mode 100644 gnulib/lib/basename.c create mode 100644 gnulib/lib/bcopy.c create mode 100644 gnulib/lib/binary-io.h create mode 100644 gnulib/lib/bind.c create mode 100644 gnulib/lib/bitrotate.h create mode 100644 gnulib/lib/btowc.c create mode 100644 gnulib/lib/byteswap.in.h create mode 100644 gnulib/lib/c-ctype.c create mode 100644 gnulib/lib/c-ctype.h create mode 100644 gnulib/lib/c-stack.c create mode 100644 gnulib/lib/c-stack.h create mode 100644 gnulib/lib/c-strcase.h create mode 100644 gnulib/lib/c-strcasecmp.c create mode 100644 gnulib/lib/c-strcaseeq.h create mode 100644 gnulib/lib/c-strcasestr.c create mode 100644 gnulib/lib/c-strcasestr.h create mode 100644 gnulib/lib/c-strncasecmp.c create mode 100644 gnulib/lib/c-strstr.c create mode 100644 gnulib/lib/c-strstr.h create mode 100644 gnulib/lib/c-strtod.c create mode 100644 gnulib/lib/c-strtod.h create mode 100644 gnulib/lib/c-strtold.c create mode 100644 gnulib/lib/calloc.c create mode 100644 gnulib/lib/canon-host.c create mode 100644 gnulib/lib/canon-host.h create mode 100644 gnulib/lib/canonicalize-lgpl.c create mode 100644 gnulib/lib/canonicalize.c create mode 100644 gnulib/lib/canonicalize.h create mode 100644 gnulib/lib/careadlinkat.c create mode 100644 gnulib/lib/careadlinkat.h create mode 100644 gnulib/lib/ceil.c create mode 100644 gnulib/lib/ceilf.c create mode 100644 gnulib/lib/ceill.c create mode 100644 gnulib/lib/chdir-long.c create mode 100644 gnulib/lib/chdir-long.h create mode 100644 gnulib/lib/chdir-safer.c create mode 100644 gnulib/lib/chdir-safer.h create mode 100644 gnulib/lib/check-version.c create mode 100644 gnulib/lib/check-version.h create mode 100644 gnulib/lib/chown.c create mode 100644 gnulib/lib/classpath.c create mode 100644 gnulib/lib/classpath.h create mode 100644 gnulib/lib/clean-temp.c create mode 100644 gnulib/lib/clean-temp.h create mode 100644 gnulib/lib/cloexec.c create mode 100644 gnulib/lib/cloexec.h create mode 100644 gnulib/lib/close-stream.c create mode 100644 gnulib/lib/close-stream.h create mode 100644 gnulib/lib/close.c create mode 100644 gnulib/lib/closedir.c create mode 100644 gnulib/lib/closein.c create mode 100644 gnulib/lib/closein.h create mode 100644 gnulib/lib/closeout.c create mode 100644 gnulib/lib/closeout.h create mode 100644 gnulib/lib/concat-filename.c create mode 100644 gnulib/lib/concat-filename.h create mode 100644 gnulib/lib/config.charset create mode 100644 gnulib/lib/connect.c create mode 100644 gnulib/lib/copy-acl.c create mode 100644 gnulib/lib/copy-file.c create mode 100644 gnulib/lib/copy-file.h create mode 100644 gnulib/lib/copysign.c create mode 100644 gnulib/lib/copysignf.c create mode 100644 gnulib/lib/copysignl.c create mode 100644 gnulib/lib/cosf.c create mode 100644 gnulib/lib/coshf.c create mode 100644 gnulib/lib/cosl.c create mode 100644 gnulib/lib/count-one-bits.h create mode 100644 gnulib/lib/crc.c create mode 100644 gnulib/lib/crc.h create mode 100644 gnulib/lib/creat-safer.c create mode 100644 gnulib/lib/csharpcomp.c create mode 100644 gnulib/lib/csharpcomp.h create mode 100644 gnulib/lib/csharpexec.c create mode 100644 gnulib/lib/csharpexec.h create mode 100644 gnulib/lib/ctype.in.h create mode 100644 gnulib/lib/cycle-check.c create mode 100644 gnulib/lib/cycle-check.h create mode 100644 gnulib/lib/des.c create mode 100644 gnulib/lib/des.h create mode 100644 gnulib/lib/dev-ino.h create mode 100644 gnulib/lib/di-set.c create mode 100644 gnulib/lib/di-set.h create mode 100644 gnulib/lib/diacrit.c create mode 100644 gnulib/lib/diacrit.h create mode 100644 gnulib/lib/diffseq.h create mode 100644 gnulib/lib/dirchownmod.c create mode 100644 gnulib/lib/dirchownmod.h create mode 100644 gnulib/lib/dirent--.h create mode 100644 gnulib/lib/dirent-private.h create mode 100644 gnulib/lib/dirent-safer.h create mode 100644 gnulib/lib/dirent.in.h create mode 100644 gnulib/lib/dirfd.c create mode 100644 gnulib/lib/dirname-lgpl.c create mode 100644 gnulib/lib/dirname.c create mode 100644 gnulib/lib/dirname.h create mode 100644 gnulib/lib/dosname.h create mode 100644 gnulib/lib/dprintf.c create mode 100644 gnulib/lib/dtoastr.c create mode 100644 gnulib/lib/dtotimespec.c create mode 100644 gnulib/lib/dummy.c create mode 100644 gnulib/lib/dup-safer-flag.c create mode 100644 gnulib/lib/dup-safer.c create mode 100644 gnulib/lib/dup.c create mode 100644 gnulib/lib/dup2.c create mode 100644 gnulib/lib/dup3.c create mode 100644 gnulib/lib/duplocale.c create mode 100644 gnulib/lib/eealloc.h create mode 100644 gnulib/lib/errno.in.h create mode 100644 gnulib/lib/error.c create mode 100644 gnulib/lib/error.h create mode 100644 gnulib/lib/euidaccess.c create mode 100644 gnulib/lib/exclude.c create mode 100644 gnulib/lib/exclude.h create mode 100644 gnulib/lib/execute.c create mode 100644 gnulib/lib/execute.h create mode 100644 gnulib/lib/exitfail.c create mode 100644 gnulib/lib/exitfail.h create mode 100644 gnulib/lib/expf.c create mode 100644 gnulib/lib/expl.c create mode 100644 gnulib/lib/fabsf.c create mode 100644 gnulib/lib/faccessat.c create mode 100644 gnulib/lib/fatal-signal.c create mode 100644 gnulib/lib/fatal-signal.h create mode 100644 gnulib/lib/fbufmode.c create mode 100644 gnulib/lib/fbufmode.h create mode 100644 gnulib/lib/fchdir.c create mode 100644 gnulib/lib/fchmodat.c create mode 100644 gnulib/lib/fchown-stub.c create mode 100644 gnulib/lib/fchownat.c create mode 100644 gnulib/lib/fclose.c create mode 100644 gnulib/lib/fcntl--.h create mode 100644 gnulib/lib/fcntl-safer.h create mode 100644 gnulib/lib/fcntl.c create mode 100644 gnulib/lib/fcntl.in.h create mode 100644 gnulib/lib/fd-hook.c create mode 100644 gnulib/lib/fd-hook.h create mode 100644 gnulib/lib/fd-safer-flag.c create mode 100644 gnulib/lib/fd-safer.c create mode 100644 gnulib/lib/fdatasync.c create mode 100644 gnulib/lib/fdopen.c create mode 100644 gnulib/lib/fdopendir.c create mode 100644 gnulib/lib/fdutimensat.c create mode 100644 gnulib/lib/fflush.c create mode 100644 gnulib/lib/ffs.c create mode 100644 gnulib/lib/ffsl.c create mode 100644 gnulib/lib/ffsl.h create mode 100644 gnulib/lib/ffsll.c create mode 100644 gnulib/lib/file-has-acl.c create mode 100644 gnulib/lib/file-set.c create mode 100644 gnulib/lib/file-set.h create mode 100644 gnulib/lib/file-type.c create mode 100644 gnulib/lib/file-type.h create mode 100644 gnulib/lib/fileblocks.c create mode 100644 gnulib/lib/filemode.c create mode 100644 gnulib/lib/filemode.h create mode 100644 gnulib/lib/filename.h create mode 100644 gnulib/lib/filenamecat-lgpl.c create mode 100644 gnulib/lib/filenamecat.c create mode 100644 gnulib/lib/filenamecat.h create mode 100644 gnulib/lib/filevercmp.c create mode 100644 gnulib/lib/filevercmp.h create mode 100644 gnulib/lib/findprog-lgpl.c create mode 100644 gnulib/lib/findprog.c create mode 100644 gnulib/lib/findprog.h create mode 100644 gnulib/lib/float+.h create mode 100644 gnulib/lib/float.c create mode 100644 gnulib/lib/float.in.h create mode 100644 gnulib/lib/flock.c create mode 100644 gnulib/lib/floor.c create mode 100644 gnulib/lib/floorf.c create mode 100644 gnulib/lib/floorl.c create mode 100644 gnulib/lib/fma.c create mode 100644 gnulib/lib/fmaf.c create mode 100644 gnulib/lib/fmal.c create mode 100644 gnulib/lib/fmodf.c create mode 100644 gnulib/lib/fnmatch.c create mode 100644 gnulib/lib/fnmatch.in.h create mode 100644 gnulib/lib/fnmatch_loop.c create mode 100644 gnulib/lib/fopen-safer.c create mode 100644 gnulib/lib/fopen.c create mode 100644 gnulib/lib/forkpty.c create mode 100644 gnulib/lib/fpending.c create mode 100644 gnulib/lib/fpending.h create mode 100644 gnulib/lib/fprintf.c create mode 100644 gnulib/lib/fprintftime.c create mode 100644 gnulib/lib/fprintftime.h create mode 100644 gnulib/lib/fpucw.h create mode 100644 gnulib/lib/fpurge.c create mode 100644 gnulib/lib/freadable.c create mode 100644 gnulib/lib/freadable.h create mode 100644 gnulib/lib/freadahead.c create mode 100644 gnulib/lib/freadahead.h create mode 100644 gnulib/lib/freading.c create mode 100644 gnulib/lib/freading.h create mode 100644 gnulib/lib/freadptr.c create mode 100644 gnulib/lib/freadptr.h create mode 100644 gnulib/lib/freadseek.c create mode 100644 gnulib/lib/freadseek.h create mode 100644 gnulib/lib/free.c create mode 100644 gnulib/lib/freopen-safer.c create mode 100644 gnulib/lib/freopen.c create mode 100644 gnulib/lib/frexp.c create mode 100644 gnulib/lib/frexpf.c create mode 100644 gnulib/lib/frexpl.c create mode 100644 gnulib/lib/fseek.c create mode 100644 gnulib/lib/fseeko.c create mode 100644 gnulib/lib/fseterr.c create mode 100644 gnulib/lib/fseterr.h create mode 100644 gnulib/lib/fstat.c create mode 100644 gnulib/lib/fstatat.c create mode 100644 gnulib/lib/fstrcmp.c create mode 100644 gnulib/lib/fstrcmp.h create mode 100644 gnulib/lib/fsusage.c create mode 100644 gnulib/lib/fsusage.h create mode 100644 gnulib/lib/fsync.c create mode 100644 gnulib/lib/ftell.c create mode 100644 gnulib/lib/ftello.c create mode 100644 gnulib/lib/ftoastr.c create mode 100644 gnulib/lib/ftoastr.h create mode 100644 gnulib/lib/ftruncate.c create mode 100644 gnulib/lib/fts-cycle.c create mode 100644 gnulib/lib/fts.c create mode 100644 gnulib/lib/fts_.h create mode 100644 gnulib/lib/full-read.c create mode 100644 gnulib/lib/full-read.h create mode 100644 gnulib/lib/full-write.c create mode 100644 gnulib/lib/full-write.h create mode 100644 gnulib/lib/futimens.c create mode 100644 gnulib/lib/fwritable.c create mode 100644 gnulib/lib/fwritable.h create mode 100644 gnulib/lib/fwriteerror.c create mode 100644 gnulib/lib/fwriteerror.h create mode 100644 gnulib/lib/fwriting.c create mode 100644 gnulib/lib/fwriting.h create mode 100644 gnulib/lib/gai_strerror.c create mode 100644 gnulib/lib/gc-gnulib.c create mode 100644 gnulib/lib/gc-libgcrypt.c create mode 100644 gnulib/lib/gc-pbkdf2-sha1.c create mode 100644 gnulib/lib/gc.h create mode 100644 gnulib/lib/gcd.c create mode 100644 gnulib/lib/gcd.h create mode 100644 gnulib/lib/gen-uni-tables.c create mode 100644 gnulib/lib/get-rusage-as.c create mode 100644 gnulib/lib/get-rusage-data.c create mode 100644 gnulib/lib/getaddrinfo.c create mode 100644 gnulib/lib/getcwd-lgpl.c create mode 100644 gnulib/lib/getcwd.c create mode 100644 gnulib/lib/getdate.h create mode 100644 gnulib/lib/getdelim.c create mode 100644 gnulib/lib/getdomainname.c create mode 100644 gnulib/lib/getdtablesize.c create mode 100644 gnulib/lib/getfilecon.c create mode 100644 gnulib/lib/getgroups.c create mode 100644 gnulib/lib/gethostname.c create mode 100644 gnulib/lib/gethrxtime.c create mode 100644 gnulib/lib/gethrxtime.h create mode 100644 gnulib/lib/getline.c create mode 100644 gnulib/lib/getloadavg.c create mode 100644 gnulib/lib/getlogin.c create mode 100644 gnulib/lib/getlogin_r.c create mode 100644 gnulib/lib/getndelim2.c create mode 100644 gnulib/lib/getndelim2.h create mode 100644 gnulib/lib/getnline.c create mode 100644 gnulib/lib/getnline.h create mode 100644 gnulib/lib/getopt.c create mode 100644 gnulib/lib/getopt.in.h create mode 100644 gnulib/lib/getopt1.c create mode 100644 gnulib/lib/getopt_int.h create mode 100644 gnulib/lib/getpagesize.c create mode 100644 gnulib/lib/getpass.c create mode 100644 gnulib/lib/getpass.h create mode 100644 gnulib/lib/getpeername.c create mode 100644 gnulib/lib/getsockname.c create mode 100644 gnulib/lib/getsockopt.c create mode 100644 gnulib/lib/getsubopt.c create mode 100644 gnulib/lib/gettext.h create mode 100644 gnulib/lib/gettime.c create mode 100644 gnulib/lib/gettimeofday.c create mode 100644 gnulib/lib/getugroups.c create mode 100644 gnulib/lib/getugroups.h create mode 100644 gnulib/lib/getusershell.c create mode 100644 gnulib/lib/git-merge-changelog.c create mode 100644 gnulib/lib/gl_anyavltree_list1.h create mode 100644 gnulib/lib/gl_anyavltree_list2.h create mode 100644 gnulib/lib/gl_anyhash_list1.h create mode 100644 gnulib/lib/gl_anyhash_list2.h create mode 100644 gnulib/lib/gl_anylinked_list1.h create mode 100644 gnulib/lib/gl_anylinked_list2.h create mode 100644 gnulib/lib/gl_anyrbtree_list1.h create mode 100644 gnulib/lib/gl_anyrbtree_list2.h create mode 100644 gnulib/lib/gl_anytree_list1.h create mode 100644 gnulib/lib/gl_anytree_list2.h create mode 100644 gnulib/lib/gl_anytree_oset.h create mode 100644 gnulib/lib/gl_anytreehash_list1.h create mode 100644 gnulib/lib/gl_anytreehash_list2.h create mode 100644 gnulib/lib/gl_array_list.c create mode 100644 gnulib/lib/gl_array_list.h create mode 100644 gnulib/lib/gl_array_oset.c create mode 100644 gnulib/lib/gl_array_oset.h create mode 100644 gnulib/lib/gl_avltree_list.c create mode 100644 gnulib/lib/gl_avltree_list.h create mode 100644 gnulib/lib/gl_avltree_oset.c create mode 100644 gnulib/lib/gl_avltree_oset.h create mode 100644 gnulib/lib/gl_avltreehash_list.c create mode 100644 gnulib/lib/gl_avltreehash_list.h create mode 100644 gnulib/lib/gl_carray_list.c create mode 100644 gnulib/lib/gl_carray_list.h create mode 100644 gnulib/lib/gl_linked_list.c create mode 100644 gnulib/lib/gl_linked_list.h create mode 100644 gnulib/lib/gl_linkedhash_list.c create mode 100644 gnulib/lib/gl_linkedhash_list.h create mode 100644 gnulib/lib/gl_list.c create mode 100644 gnulib/lib/gl_list.h create mode 100644 gnulib/lib/gl_oset.c create mode 100644 gnulib/lib/gl_oset.h create mode 100644 gnulib/lib/gl_rbtree_list.c create mode 100644 gnulib/lib/gl_rbtree_list.h create mode 100644 gnulib/lib/gl_rbtree_oset.c create mode 100644 gnulib/lib/gl_rbtree_oset.h create mode 100644 gnulib/lib/gl_rbtreehash_list.c create mode 100644 gnulib/lib/gl_rbtreehash_list.h create mode 100644 gnulib/lib/gl_sublist.c create mode 100644 gnulib/lib/gl_sublist.h create mode 100644 gnulib/lib/gl_xlist.c create mode 100644 gnulib/lib/gl_xlist.h create mode 100644 gnulib/lib/gl_xoset.c create mode 100644 gnulib/lib/gl_xoset.h create mode 100644 gnulib/lib/gl_xsublist.c create mode 100644 gnulib/lib/gl_xsublist.h create mode 100644 gnulib/lib/glob-libc.h create mode 100644 gnulib/lib/glob.c create mode 100644 gnulib/lib/glob.in.h create mode 100644 gnulib/lib/glthread/cond.c create mode 100644 gnulib/lib/glthread/cond.h create mode 100644 gnulib/lib/glthread/lock.c create mode 100644 gnulib/lib/glthread/lock.h create mode 100644 gnulib/lib/glthread/thread.c create mode 100644 gnulib/lib/glthread/thread.h create mode 100644 gnulib/lib/glthread/threadlib.c create mode 100644 gnulib/lib/glthread/tls.c create mode 100644 gnulib/lib/glthread/tls.h create mode 100644 gnulib/lib/glthread/yield.h create mode 100644 gnulib/lib/grantpt.c create mode 100644 gnulib/lib/group-member.c create mode 100644 gnulib/lib/hard-locale.c create mode 100644 gnulib/lib/hard-locale.h create mode 100644 gnulib/lib/hash-pjw.c create mode 100644 gnulib/lib/hash-pjw.h create mode 100644 gnulib/lib/hash-triple.c create mode 100644 gnulib/lib/hash-triple.h create mode 100644 gnulib/lib/hash.c create mode 100644 gnulib/lib/hash.h create mode 100644 gnulib/lib/hmac-md5.c create mode 100644 gnulib/lib/hmac-sha1.c create mode 100644 gnulib/lib/hmac.h create mode 100644 gnulib/lib/human.c create mode 100644 gnulib/lib/human.h create mode 100644 gnulib/lib/i-ring.c create mode 100644 gnulib/lib/i-ring.h create mode 100644 gnulib/lib/iconv.c create mode 100644 gnulib/lib/iconv.in.h create mode 100644 gnulib/lib/iconv_close.c create mode 100644 gnulib/lib/iconv_open-aix.gperf create mode 100644 gnulib/lib/iconv_open-hpux.gperf create mode 100644 gnulib/lib/iconv_open-irix.gperf create mode 100644 gnulib/lib/iconv_open-osf.gperf create mode 100644 gnulib/lib/iconv_open-solaris.gperf create mode 100644 gnulib/lib/iconv_open.c create mode 100644 gnulib/lib/iconveh.h create mode 100644 gnulib/lib/idcache.c create mode 100644 gnulib/lib/idcache.h create mode 100644 gnulib/lib/idpriv-drop.c create mode 100644 gnulib/lib/idpriv-droptemp.c create mode 100644 gnulib/lib/idpriv.h create mode 100644 gnulib/lib/ignore-value.h create mode 100644 gnulib/lib/imaxabs.c create mode 100644 gnulib/lib/imaxdiv.c create mode 100644 gnulib/lib/imaxtostr.c create mode 100644 gnulib/lib/inet_ntop.c create mode 100644 gnulib/lib/inet_pton.c create mode 100644 gnulib/lib/ino-map.c create mode 100644 gnulib/lib/ino-map.h create mode 100644 gnulib/lib/integer_length.c create mode 100644 gnulib/lib/integer_length.h create mode 100644 gnulib/lib/integer_length_l.c create mode 100644 gnulib/lib/integer_length_ll.c create mode 100644 gnulib/lib/intprops.h create mode 100644 gnulib/lib/inttostr.c create mode 100644 gnulib/lib/inttostr.h create mode 100644 gnulib/lib/inttypes.in.h create mode 100644 gnulib/lib/ioctl.c create mode 100644 gnulib/lib/isapipe.c create mode 100644 gnulib/lib/isapipe.h create mode 100644 gnulib/lib/isblank.c create mode 100644 gnulib/lib/isdir.c create mode 100644 gnulib/lib/isdir.h create mode 100644 gnulib/lib/isfinite.c create mode 100644 gnulib/lib/isinf.c create mode 100644 gnulib/lib/isnan.c create mode 100644 gnulib/lib/isnand-nolibm.h create mode 100644 gnulib/lib/isnand.c create mode 100644 gnulib/lib/isnanf-nolibm.h create mode 100644 gnulib/lib/isnanf.c create mode 100644 gnulib/lib/isnanl-nolibm.h create mode 100644 gnulib/lib/isnanl.c create mode 100644 gnulib/lib/iswblank.c create mode 100644 gnulib/lib/iswctype-impl.h create mode 100644 gnulib/lib/iswctype.c create mode 100644 gnulib/lib/itold.c create mode 100644 gnulib/lib/javacomp.c create mode 100644 gnulib/lib/javacomp.h create mode 100644 gnulib/lib/javaexec.c create mode 100644 gnulib/lib/javaexec.h create mode 100644 gnulib/lib/javaversion.c create mode 100644 gnulib/lib/javaversion.class create mode 100644 gnulib/lib/javaversion.h create mode 100644 gnulib/lib/javaversion.java create mode 100644 gnulib/lib/langinfo.in.h create mode 100644 gnulib/lib/lchown.c create mode 100644 gnulib/lib/ldexpf.c create mode 100644 gnulib/lib/ldexpl.c create mode 100644 gnulib/lib/ldtoastr.c create mode 100644 gnulib/lib/libunistring.valgrind create mode 100644 gnulib/lib/linebuffer.c create mode 100644 gnulib/lib/linebuffer.h create mode 100644 gnulib/lib/link.c create mode 100644 gnulib/lib/linkat.c create mode 100644 gnulib/lib/listen.c create mode 100644 gnulib/lib/localcharset.c create mode 100644 gnulib/lib/localcharset.h create mode 100644 gnulib/lib/locale.in.h create mode 100644 gnulib/lib/localename.c create mode 100644 gnulib/lib/localename.h create mode 100644 gnulib/lib/log10f.c create mode 100644 gnulib/lib/logf.c create mode 100644 gnulib/lib/login_tty.c create mode 100644 gnulib/lib/logl.c create mode 100644 gnulib/lib/long-options.c create mode 100644 gnulib/lib/long-options.h create mode 100644 gnulib/lib/lseek.c create mode 100644 gnulib/lib/lstat.c create mode 100644 gnulib/lib/malloc.c create mode 100644 gnulib/lib/malloca.c create mode 100644 gnulib/lib/malloca.h create mode 100644 gnulib/lib/malloca.valgrind create mode 100644 gnulib/lib/math.in.h create mode 100644 gnulib/lib/mbchar.c create mode 100644 gnulib/lib/mbchar.h create mode 100644 gnulib/lib/mbfile.h create mode 100644 gnulib/lib/mbiter.h create mode 100644 gnulib/lib/mbmemcasecmp.c create mode 100644 gnulib/lib/mbmemcasecmp.h create mode 100644 gnulib/lib/mbmemcasecoll.c create mode 100644 gnulib/lib/mbmemcasecoll.h create mode 100644 gnulib/lib/mbrlen.c create mode 100644 gnulib/lib/mbrtowc.c create mode 100644 gnulib/lib/mbscasecmp.c create mode 100644 gnulib/lib/mbscasestr.c create mode 100644 gnulib/lib/mbschr.c create mode 100644 gnulib/lib/mbscspn.c create mode 100644 gnulib/lib/mbsinit.c create mode 100644 gnulib/lib/mbslen.c create mode 100644 gnulib/lib/mbsncasecmp.c create mode 100644 gnulib/lib/mbsnlen.c create mode 100644 gnulib/lib/mbsnrtowcs-impl.h create mode 100644 gnulib/lib/mbsnrtowcs.c create mode 100644 gnulib/lib/mbspbrk.c create mode 100644 gnulib/lib/mbspcasecmp.c create mode 100644 gnulib/lib/mbsrchr.c create mode 100644 gnulib/lib/mbsrtowcs-impl.h create mode 100644 gnulib/lib/mbsrtowcs-state.c create mode 100644 gnulib/lib/mbsrtowcs.c create mode 100644 gnulib/lib/mbssep.c create mode 100644 gnulib/lib/mbsspn.c create mode 100644 gnulib/lib/mbsstr.c create mode 100644 gnulib/lib/mbstok_r.c create mode 100644 gnulib/lib/mbswidth.c create mode 100644 gnulib/lib/mbswidth.h create mode 100644 gnulib/lib/mbtowc-impl.h create mode 100644 gnulib/lib/mbtowc.c create mode 100644 gnulib/lib/mbuiter.h create mode 100644 gnulib/lib/md2.c create mode 100644 gnulib/lib/md2.h create mode 100644 gnulib/lib/md4.c create mode 100644 gnulib/lib/md4.h create mode 100644 gnulib/lib/md5.c create mode 100644 gnulib/lib/md5.h create mode 100644 gnulib/lib/memcasecmp.c create mode 100644 gnulib/lib/memcasecmp.h create mode 100644 gnulib/lib/memchr.c create mode 100644 gnulib/lib/memchr.valgrind create mode 100644 gnulib/lib/memchr2.c create mode 100644 gnulib/lib/memchr2.h create mode 100644 gnulib/lib/memchr2.valgrind create mode 100644 gnulib/lib/memcmp.c create mode 100644 gnulib/lib/memcmp2.c create mode 100644 gnulib/lib/memcmp2.h create mode 100644 gnulib/lib/memcoll.c create mode 100644 gnulib/lib/memcoll.h create mode 100644 gnulib/lib/memcpy.c create mode 100644 gnulib/lib/memmem.c create mode 100644 gnulib/lib/memmove.c create mode 100644 gnulib/lib/mempcpy.c create mode 100644 gnulib/lib/memrchr.c create mode 100644 gnulib/lib/memset.c create mode 100644 gnulib/lib/memxor.c create mode 100644 gnulib/lib/memxor.h create mode 100644 gnulib/lib/mgetgroups.c create mode 100644 gnulib/lib/mgetgroups.h create mode 100644 gnulib/lib/minmax.h create mode 100644 gnulib/lib/mkancesdirs.c create mode 100644 gnulib/lib/mkancesdirs.h create mode 100644 gnulib/lib/mkdir-p.c create mode 100644 gnulib/lib/mkdir-p.h create mode 100644 gnulib/lib/mkdir.c create mode 100644 gnulib/lib/mkdirat.c create mode 100644 gnulib/lib/mkdtemp.c create mode 100644 gnulib/lib/mkfifo.c create mode 100644 gnulib/lib/mkfifoat.c create mode 100644 gnulib/lib/mknod.c create mode 100644 gnulib/lib/mknodat.c create mode 100644 gnulib/lib/mkostemp.c create mode 100644 gnulib/lib/mkostemps.c create mode 100644 gnulib/lib/mkstemp-safer.c create mode 100644 gnulib/lib/mkstemp.c create mode 100644 gnulib/lib/mkstemps.c create mode 100644 gnulib/lib/mktime-internal.h create mode 100644 gnulib/lib/mktime.c create mode 100644 gnulib/lib/modechange.c create mode 100644 gnulib/lib/modechange.h create mode 100644 gnulib/lib/modff.c create mode 100644 gnulib/lib/mountlist.c create mode 100644 gnulib/lib/mountlist.h create mode 100644 gnulib/lib/mpsort.c create mode 100644 gnulib/lib/mpsort.h create mode 100644 gnulib/lib/msvc-inval.c create mode 100644 gnulib/lib/msvc-inval.h create mode 100644 gnulib/lib/msvc-nothrow.c create mode 100644 gnulib/lib/msvc-nothrow.h create mode 100644 gnulib/lib/nanosleep.c create mode 100644 gnulib/lib/netdb.in.h create mode 100644 gnulib/lib/netinet_in.in.h create mode 100644 gnulib/lib/nl_langinfo.c create mode 100644 gnulib/lib/nonblocking.c create mode 100644 gnulib/lib/nonblocking.h create mode 100644 gnulib/lib/nproc.c create mode 100644 gnulib/lib/nproc.h create mode 100644 gnulib/lib/obstack.c create mode 100644 gnulib/lib/obstack.h create mode 100644 gnulib/lib/obstack_printf.c create mode 100644 gnulib/lib/offtostr.c create mode 100644 gnulib/lib/open-safer.c create mode 100644 gnulib/lib/open.c create mode 100644 gnulib/lib/openat-die.c create mode 100644 gnulib/lib/openat-priv.h create mode 100644 gnulib/lib/openat-proc.c create mode 100644 gnulib/lib/openat-safer.c create mode 100644 gnulib/lib/openat.c create mode 100644 gnulib/lib/openat.h create mode 100644 gnulib/lib/opendir-safer.c create mode 100644 gnulib/lib/opendir.c create mode 100644 gnulib/lib/openpty.c create mode 100644 gnulib/lib/pagealign_alloc.c create mode 100644 gnulib/lib/pagealign_alloc.h create mode 100644 gnulib/lib/parse-datetime.h create mode 100644 gnulib/lib/parse-datetime.y create mode 100644 gnulib/lib/parse-duration.c create mode 100644 gnulib/lib/parse-duration.h create mode 100644 gnulib/lib/passfd.c create mode 100644 gnulib/lib/passfd.h create mode 100644 gnulib/lib/pathmax.h create mode 100644 gnulib/lib/pclose.c create mode 100644 gnulib/lib/perror.c create mode 100644 gnulib/lib/physmem.c create mode 100644 gnulib/lib/physmem.h create mode 100644 gnulib/lib/pipe-filter-aux.h create mode 100644 gnulib/lib/pipe-filter-gi.c create mode 100644 gnulib/lib/pipe-filter-ii.c create mode 100644 gnulib/lib/pipe-filter.h create mode 100644 gnulib/lib/pipe-safer.c create mode 100644 gnulib/lib/pipe.c create mode 100644 gnulib/lib/pipe.h create mode 100644 gnulib/lib/pipe2-safer.c create mode 100644 gnulib/lib/pipe2.c create mode 100644 gnulib/lib/poll.c create mode 100644 gnulib/lib/poll.in.h create mode 100644 gnulib/lib/popen-safer.c create mode 100644 gnulib/lib/popen.c create mode 100644 gnulib/lib/posix_openpt.c create mode 100644 gnulib/lib/posixtm.c create mode 100644 gnulib/lib/posixtm.h create mode 100644 gnulib/lib/posixver.c create mode 100644 gnulib/lib/posixver.h create mode 100644 gnulib/lib/powf.c create mode 100644 gnulib/lib/pread.c create mode 100644 gnulib/lib/printf-args.c create mode 100644 gnulib/lib/printf-args.h create mode 100644 gnulib/lib/printf-frexp.c create mode 100644 gnulib/lib/printf-frexp.h create mode 100644 gnulib/lib/printf-frexpl.c create mode 100644 gnulib/lib/printf-frexpl.h create mode 100644 gnulib/lib/printf-parse.c create mode 100644 gnulib/lib/printf-parse.h create mode 100644 gnulib/lib/printf.c create mode 100644 gnulib/lib/priv-set.c create mode 100644 gnulib/lib/priv-set.h create mode 100644 gnulib/lib/progname.c create mode 100644 gnulib/lib/progname.h create mode 100644 gnulib/lib/progreloc.c create mode 100644 gnulib/lib/propername.c create mode 100644 gnulib/lib/propername.h create mode 100644 gnulib/lib/pselect.c create mode 100644 gnulib/lib/pt_chown.c create mode 100644 gnulib/lib/pthread.in.h create mode 100644 gnulib/lib/pthread_sigmask.c create mode 100644 gnulib/lib/ptsname.c create mode 100644 gnulib/lib/ptsname_r.c create mode 100644 gnulib/lib/pty-private.h create mode 100644 gnulib/lib/pty.in.h create mode 100644 gnulib/lib/putenv.c create mode 100644 gnulib/lib/pwrite.c create mode 100644 gnulib/lib/quote.c create mode 100644 gnulib/lib/quote.h create mode 100644 gnulib/lib/quotearg.c create mode 100644 gnulib/lib/quotearg.h create mode 100644 gnulib/lib/raise.c create mode 100644 gnulib/lib/random_r.c create mode 100644 gnulib/lib/rawmemchr.c create mode 100644 gnulib/lib/rawmemchr.valgrind create mode 100644 gnulib/lib/read-file.c create mode 100644 gnulib/lib/read-file.h create mode 100644 gnulib/lib/read.c create mode 100644 gnulib/lib/readdir.c create mode 100644 gnulib/lib/readline.c create mode 100644 gnulib/lib/readline.h create mode 100644 gnulib/lib/readlink.c create mode 100644 gnulib/lib/readlinkat.c create mode 100644 gnulib/lib/readtokens.c create mode 100644 gnulib/lib/readtokens.h create mode 100644 gnulib/lib/readtokens0.c create mode 100644 gnulib/lib/readtokens0.h create mode 100644 gnulib/lib/readutmp.c create mode 100644 gnulib/lib/readutmp.h create mode 100644 gnulib/lib/realloc.c create mode 100644 gnulib/lib/recv.c create mode 100644 gnulib/lib/recvfrom.c create mode 100644 gnulib/lib/ref-add.sin create mode 100644 gnulib/lib/ref-del.sin create mode 100644 gnulib/lib/regcomp.c create mode 100644 gnulib/lib/regex-quote.c create mode 100644 gnulib/lib/regex-quote.h create mode 100644 gnulib/lib/regex.c create mode 100644 gnulib/lib/regex.h create mode 100644 gnulib/lib/regex_internal.c create mode 100644 gnulib/lib/regex_internal.h create mode 100644 gnulib/lib/regexec.c create mode 100644 gnulib/lib/relocatable.c create mode 100644 gnulib/lib/relocatable.h create mode 100644 gnulib/lib/relocwrapper.c create mode 100644 gnulib/lib/remove.c create mode 100644 gnulib/lib/rename.c create mode 100644 gnulib/lib/renameat.c create mode 100644 gnulib/lib/resource-ext.h create mode 100644 gnulib/lib/rewinddir.c create mode 100644 gnulib/lib/rijndael-alg-fst.c create mode 100644 gnulib/lib/rijndael-alg-fst.h create mode 100644 gnulib/lib/rijndael-api-fst.c create mode 100644 gnulib/lib/rijndael-api-fst.h create mode 100644 gnulib/lib/rint.c create mode 100644 gnulib/lib/rintf.c create mode 100644 gnulib/lib/rintl.c create mode 100644 gnulib/lib/rmdir.c create mode 100644 gnulib/lib/round.c create mode 100644 gnulib/lib/roundf.c create mode 100644 gnulib/lib/roundl.c create mode 100644 gnulib/lib/rpmatch.c create mode 100644 gnulib/lib/safe-alloc.c create mode 100644 gnulib/lib/safe-alloc.h create mode 100644 gnulib/lib/safe-read.c create mode 100644 gnulib/lib/safe-read.h create mode 100644 gnulib/lib/safe-write.c create mode 100644 gnulib/lib/safe-write.h create mode 100644 gnulib/lib/same-inode.h create mode 100644 gnulib/lib/same.c create mode 100644 gnulib/lib/same.h create mode 100644 gnulib/lib/save-cwd.c create mode 100644 gnulib/lib/save-cwd.h create mode 100644 gnulib/lib/savedir.c create mode 100644 gnulib/lib/savedir.h create mode 100644 gnulib/lib/savewd.c create mode 100644 gnulib/lib/savewd.h create mode 100644 gnulib/lib/scandir.c create mode 100644 gnulib/lib/sched.in.h create mode 100644 gnulib/lib/se-context.in.h create mode 100644 gnulib/lib/se-selinux.in.h create mode 100644 gnulib/lib/search.in.h create mode 100644 gnulib/lib/select.c create mode 100644 gnulib/lib/selinux-at.c create mode 100644 gnulib/lib/selinux-at.h create mode 100644 gnulib/lib/send.c create mode 100644 gnulib/lib/sendto.c create mode 100644 gnulib/lib/set-mode-acl.c create mode 100644 gnulib/lib/setenv.c create mode 100644 gnulib/lib/sethostname.c create mode 100644 gnulib/lib/setlocale.c create mode 100644 gnulib/lib/setsockopt.c create mode 100644 gnulib/lib/settime.c create mode 100644 gnulib/lib/sh-quote.c create mode 100644 gnulib/lib/sh-quote.h create mode 100644 gnulib/lib/sha1.c create mode 100644 gnulib/lib/sha1.h create mode 100644 gnulib/lib/sha256.c create mode 100644 gnulib/lib/sha256.h create mode 100644 gnulib/lib/sha512.c create mode 100644 gnulib/lib/sha512.h create mode 100644 gnulib/lib/shutdown.c create mode 100644 gnulib/lib/sig-handler.h create mode 100644 gnulib/lib/sig2str.c create mode 100644 gnulib/lib/sig2str.h create mode 100644 gnulib/lib/sigaction.c create mode 100644 gnulib/lib/siglist.h create mode 100644 gnulib/lib/signal.in.h create mode 100644 gnulib/lib/signbitd.c create mode 100644 gnulib/lib/signbitf.c create mode 100644 gnulib/lib/signbitl.c create mode 100644 gnulib/lib/sigpipe-die.c create mode 100644 gnulib/lib/sigpipe-die.h create mode 100644 gnulib/lib/sigprocmask.c create mode 100644 gnulib/lib/sincosl.c create mode 100644 gnulib/lib/sinf.c create mode 100644 gnulib/lib/sinhf.c create mode 100644 gnulib/lib/sinl.c create mode 100644 gnulib/lib/size_max.h create mode 100644 gnulib/lib/sleep.c create mode 100644 gnulib/lib/snprintf.c create mode 100644 gnulib/lib/socket.c create mode 100644 gnulib/lib/sockets.c create mode 100644 gnulib/lib/sockets.h create mode 100644 gnulib/lib/spawn-pipe.c create mode 100644 gnulib/lib/spawn-pipe.h create mode 100644 gnulib/lib/spawn.c create mode 100644 gnulib/lib/spawn.in.h create mode 100644 gnulib/lib/spawn_faction_addclose.c create mode 100644 gnulib/lib/spawn_faction_adddup2.c create mode 100644 gnulib/lib/spawn_faction_addopen.c create mode 100644 gnulib/lib/spawn_faction_destroy.c create mode 100644 gnulib/lib/spawn_faction_init.c create mode 100644 gnulib/lib/spawn_int.h create mode 100644 gnulib/lib/spawnattr_destroy.c create mode 100644 gnulib/lib/spawnattr_getdefault.c create mode 100644 gnulib/lib/spawnattr_getflags.c create mode 100644 gnulib/lib/spawnattr_getpgroup.c create mode 100644 gnulib/lib/spawnattr_getschedparam.c create mode 100644 gnulib/lib/spawnattr_getschedpolicy.c create mode 100644 gnulib/lib/spawnattr_getsigmask.c create mode 100644 gnulib/lib/spawnattr_init.c create mode 100644 gnulib/lib/spawnattr_setdefault.c create mode 100644 gnulib/lib/spawnattr_setflags.c create mode 100644 gnulib/lib/spawnattr_setpgroup.c create mode 100644 gnulib/lib/spawnattr_setschedparam.c create mode 100644 gnulib/lib/spawnattr_setschedpolicy.c create mode 100644 gnulib/lib/spawnattr_setsigmask.c create mode 100644 gnulib/lib/spawni.c create mode 100644 gnulib/lib/spawnp.c create mode 100644 gnulib/lib/sprintf.c create mode 100644 gnulib/lib/sqrtf.c create mode 100644 gnulib/lib/sqrtl.c create mode 100644 gnulib/lib/stat-macros.h create mode 100644 gnulib/lib/stat-size.h create mode 100644 gnulib/lib/stat-time.h create mode 100644 gnulib/lib/stat.c create mode 100644 gnulib/lib/stdalign.in.h create mode 100644 gnulib/lib/stdarg.in.h create mode 100644 gnulib/lib/stdbool.in.h create mode 100644 gnulib/lib/stddef.in.h create mode 100644 gnulib/lib/stdint.in.h create mode 100644 gnulib/lib/stdio--.h create mode 100644 gnulib/lib/stdio-impl.h create mode 100644 gnulib/lib/stdio-read.c create mode 100644 gnulib/lib/stdio-safer.h create mode 100644 gnulib/lib/stdio-write.c create mode 100644 gnulib/lib/stdio.in.h create mode 100644 gnulib/lib/stdlib--.h create mode 100644 gnulib/lib/stdlib-safer.h create mode 100644 gnulib/lib/stdlib.in.h create mode 100644 gnulib/lib/stpcpy.c create mode 100644 gnulib/lib/stpncpy.c create mode 100644 gnulib/lib/str-kmp.h create mode 100644 gnulib/lib/str-two-way.h create mode 100644 gnulib/lib/strcasecmp.c create mode 100644 gnulib/lib/strcasestr.c create mode 100644 gnulib/lib/strchrnul.c create mode 100644 gnulib/lib/strchrnul.valgrind create mode 100644 gnulib/lib/strcspn.c create mode 100644 gnulib/lib/strdup.c create mode 100644 gnulib/lib/streq.h create mode 100644 gnulib/lib/strerror-override.c create mode 100644 gnulib/lib/strerror-override.h create mode 100644 gnulib/lib/strerror.c create mode 100644 gnulib/lib/strerror_r.c create mode 100644 gnulib/lib/strftime.c create mode 100644 gnulib/lib/strftime.h create mode 100644 gnulib/lib/striconv.c create mode 100644 gnulib/lib/striconv.h create mode 100644 gnulib/lib/striconveh.c create mode 100644 gnulib/lib/striconveh.h create mode 100644 gnulib/lib/striconveha.c create mode 100644 gnulib/lib/striconveha.h create mode 100644 gnulib/lib/string.in.h create mode 100644 gnulib/lib/strings.in.h create mode 100644 gnulib/lib/stripslash.c create mode 100644 gnulib/lib/strncasecmp.c create mode 100644 gnulib/lib/strncat.c create mode 100644 gnulib/lib/strndup.c create mode 100644 gnulib/lib/strnlen.c create mode 100644 gnulib/lib/strnlen1.c create mode 100644 gnulib/lib/strnlen1.h create mode 100644 gnulib/lib/strpbrk.c create mode 100644 gnulib/lib/strptime.c create mode 100644 gnulib/lib/strsep.c create mode 100644 gnulib/lib/strsignal.c create mode 100644 gnulib/lib/strstr.c create mode 100644 gnulib/lib/strtod.c create mode 100644 gnulib/lib/strtoimax.c create mode 100644 gnulib/lib/strtok_r.c create mode 100644 gnulib/lib/strtol.c create mode 100644 gnulib/lib/strtoll.c create mode 100644 gnulib/lib/strtoul.c create mode 100644 gnulib/lib/strtoull.c create mode 100644 gnulib/lib/strtoumax.c create mode 100644 gnulib/lib/strverscmp.c create mode 100644 gnulib/lib/symlink.c create mode 100644 gnulib/lib/symlinkat.c create mode 100644 gnulib/lib/sys_file.in.h create mode 100644 gnulib/lib/sys_ioctl.in.h create mode 100644 gnulib/lib/sys_select.in.h create mode 100644 gnulib/lib/sys_socket.in.h create mode 100644 gnulib/lib/sys_stat.in.h create mode 100644 gnulib/lib/sys_time.in.h create mode 100644 gnulib/lib/sys_times.in.h create mode 100644 gnulib/lib/sys_types.in.h create mode 100644 gnulib/lib/sys_uio.in.h create mode 100644 gnulib/lib/sys_utsname.in.h create mode 100644 gnulib/lib/sys_wait.in.h create mode 100644 gnulib/lib/sysexits.in.h create mode 100755 gnulib/lib/t-idcache create mode 100644 gnulib/lib/tanf.c create mode 100644 gnulib/lib/tanhf.c create mode 100644 gnulib/lib/tanl.c create mode 100644 gnulib/lib/tcgetsid.c create mode 100644 gnulib/lib/tempname.c create mode 100644 gnulib/lib/tempname.h create mode 100644 gnulib/lib/termios.in.h create mode 100644 gnulib/lib/time.in.h create mode 100644 gnulib/lib/time_r.c create mode 100644 gnulib/lib/timegm.c create mode 100644 gnulib/lib/times.c create mode 100644 gnulib/lib/timespec-add.c create mode 100644 gnulib/lib/timespec-sub.c create mode 100644 gnulib/lib/timespec.h create mode 100644 gnulib/lib/tmpdir.c create mode 100644 gnulib/lib/tmpdir.h create mode 100644 gnulib/lib/tmpfile-safer.c create mode 100644 gnulib/lib/tmpfile.c create mode 100644 gnulib/lib/towctrans-impl.h create mode 100644 gnulib/lib/towctrans.c create mode 100644 gnulib/lib/trigl.c create mode 100644 gnulib/lib/trigl.h create mode 100644 gnulib/lib/trim.c create mode 100644 gnulib/lib/trim.h create mode 100644 gnulib/lib/trunc.c create mode 100644 gnulib/lib/truncf.c create mode 100644 gnulib/lib/truncl.c create mode 100644 gnulib/lib/tsearch.c create mode 100644 gnulib/lib/ttyname_r.c create mode 100644 gnulib/lib/u64.h create mode 100644 gnulib/lib/uinttostr.c create mode 100644 gnulib/lib/umaxtostr.c create mode 100644 gnulib/lib/uname.c create mode 100644 gnulib/lib/unicase.in.h create mode 100644 gnulib/lib/unicase/cased.c create mode 100644 gnulib/lib/unicase/cased.h create mode 100644 gnulib/lib/unicase/casefold.h create mode 100644 gnulib/lib/unicase/caseprop.h create mode 100644 gnulib/lib/unicase/context.h create mode 100644 gnulib/lib/unicase/empty-prefix-context.c create mode 100644 gnulib/lib/unicase/empty-suffix-context.c create mode 100644 gnulib/lib/unicase/ignorable.c create mode 100644 gnulib/lib/unicase/ignorable.h create mode 100644 gnulib/lib/unicase/invariant.h create mode 100644 gnulib/lib/unicase/locale-language.c create mode 100644 gnulib/lib/unicase/locale-languages.gperf create mode 100644 gnulib/lib/unicase/simple-mapping.h create mode 100644 gnulib/lib/unicase/special-casing-table.gperf create mode 100644 gnulib/lib/unicase/special-casing.c create mode 100644 gnulib/lib/unicase/special-casing.h create mode 100644 gnulib/lib/unicase/tocasefold.c create mode 100644 gnulib/lib/unicase/tocasefold.h create mode 100644 gnulib/lib/unicase/tolower.c create mode 100644 gnulib/lib/unicase/tolower.h create mode 100644 gnulib/lib/unicase/totitle.c create mode 100644 gnulib/lib/unicase/totitle.h create mode 100644 gnulib/lib/unicase/toupper.c create mode 100644 gnulib/lib/unicase/toupper.h create mode 100644 gnulib/lib/unicase/u-casecmp.h create mode 100644 gnulib/lib/unicase/u-casecoll.h create mode 100644 gnulib/lib/unicase/u-casefold.h create mode 100644 gnulib/lib/unicase/u-casemap.h create mode 100644 gnulib/lib/unicase/u-casexfrm.h create mode 100644 gnulib/lib/unicase/u-ct-casefold.h create mode 100644 gnulib/lib/unicase/u-ct-totitle.h create mode 100644 gnulib/lib/unicase/u-is-cased.h create mode 100644 gnulib/lib/unicase/u-is-invariant.h create mode 100644 gnulib/lib/unicase/u-prefix-context.h create mode 100644 gnulib/lib/unicase/u-suffix-context.h create mode 100644 gnulib/lib/unicase/u-totitle.h create mode 100644 gnulib/lib/unicase/u16-casecmp.c create mode 100644 gnulib/lib/unicase/u16-casecoll.c create mode 100644 gnulib/lib/unicase/u16-casefold.c create mode 100644 gnulib/lib/unicase/u16-casemap.c create mode 100644 gnulib/lib/unicase/u16-casexfrm.c create mode 100644 gnulib/lib/unicase/u16-ct-casefold.c create mode 100644 gnulib/lib/unicase/u16-ct-tolower.c create mode 100644 gnulib/lib/unicase/u16-ct-totitle.c create mode 100644 gnulib/lib/unicase/u16-ct-toupper.c create mode 100644 gnulib/lib/unicase/u16-is-cased.c create mode 100644 gnulib/lib/unicase/u16-is-casefolded.c create mode 100644 gnulib/lib/unicase/u16-is-invariant.c create mode 100644 gnulib/lib/unicase/u16-is-lowercase.c create mode 100644 gnulib/lib/unicase/u16-is-titlecase.c create mode 100644 gnulib/lib/unicase/u16-is-uppercase.c create mode 100644 gnulib/lib/unicase/u16-prefix-context.c create mode 100644 gnulib/lib/unicase/u16-suffix-context.c create mode 100644 gnulib/lib/unicase/u16-tolower.c create mode 100644 gnulib/lib/unicase/u16-totitle.c create mode 100644 gnulib/lib/unicase/u16-toupper.c create mode 100644 gnulib/lib/unicase/u32-casecmp.c create mode 100644 gnulib/lib/unicase/u32-casecoll.c create mode 100644 gnulib/lib/unicase/u32-casefold.c create mode 100644 gnulib/lib/unicase/u32-casemap.c create mode 100644 gnulib/lib/unicase/u32-casexfrm.c create mode 100644 gnulib/lib/unicase/u32-ct-casefold.c create mode 100644 gnulib/lib/unicase/u32-ct-tolower.c create mode 100644 gnulib/lib/unicase/u32-ct-totitle.c create mode 100644 gnulib/lib/unicase/u32-ct-toupper.c create mode 100644 gnulib/lib/unicase/u32-is-cased.c create mode 100644 gnulib/lib/unicase/u32-is-casefolded.c create mode 100644 gnulib/lib/unicase/u32-is-invariant.c create mode 100644 gnulib/lib/unicase/u32-is-lowercase.c create mode 100644 gnulib/lib/unicase/u32-is-titlecase.c create mode 100644 gnulib/lib/unicase/u32-is-uppercase.c create mode 100644 gnulib/lib/unicase/u32-prefix-context.c create mode 100644 gnulib/lib/unicase/u32-suffix-context.c create mode 100644 gnulib/lib/unicase/u32-tolower.c create mode 100644 gnulib/lib/unicase/u32-totitle.c create mode 100644 gnulib/lib/unicase/u32-toupper.c create mode 100644 gnulib/lib/unicase/u8-casecmp.c create mode 100644 gnulib/lib/unicase/u8-casecoll.c create mode 100644 gnulib/lib/unicase/u8-casefold.c create mode 100644 gnulib/lib/unicase/u8-casemap.c create mode 100644 gnulib/lib/unicase/u8-casexfrm.c create mode 100644 gnulib/lib/unicase/u8-ct-casefold.c create mode 100644 gnulib/lib/unicase/u8-ct-tolower.c create mode 100644 gnulib/lib/unicase/u8-ct-totitle.c create mode 100644 gnulib/lib/unicase/u8-ct-toupper.c create mode 100644 gnulib/lib/unicase/u8-is-cased.c create mode 100644 gnulib/lib/unicase/u8-is-casefolded.c create mode 100644 gnulib/lib/unicase/u8-is-invariant.c create mode 100644 gnulib/lib/unicase/u8-is-lowercase.c create mode 100644 gnulib/lib/unicase/u8-is-titlecase.c create mode 100644 gnulib/lib/unicase/u8-is-uppercase.c create mode 100644 gnulib/lib/unicase/u8-prefix-context.c create mode 100644 gnulib/lib/unicase/u8-suffix-context.c create mode 100644 gnulib/lib/unicase/u8-tolower.c create mode 100644 gnulib/lib/unicase/u8-totitle.c create mode 100644 gnulib/lib/unicase/u8-toupper.c create mode 100644 gnulib/lib/unicase/ulc-casecmp.c create mode 100644 gnulib/lib/unicase/ulc-casecoll.c create mode 100644 gnulib/lib/unicase/ulc-casexfrm.c create mode 100644 gnulib/lib/unicase/unicasemap.h create mode 100644 gnulib/lib/unicodeio.c create mode 100644 gnulib/lib/unicodeio.h create mode 100644 gnulib/lib/uniconv.in.h create mode 100644 gnulib/lib/uniconv/u-conv-from-enc.h create mode 100644 gnulib/lib/uniconv/u-conv-to-enc.h create mode 100644 gnulib/lib/uniconv/u-strconv-from-enc.h create mode 100644 gnulib/lib/uniconv/u-strconv-to-enc.h create mode 100644 gnulib/lib/uniconv/u16-conv-from-enc.c create mode 100644 gnulib/lib/uniconv/u16-conv-to-enc.c create mode 100644 gnulib/lib/uniconv/u16-strconv-from-enc.c create mode 100644 gnulib/lib/uniconv/u16-strconv-from-locale.c create mode 100644 gnulib/lib/uniconv/u16-strconv-to-enc.c create mode 100644 gnulib/lib/uniconv/u16-strconv-to-locale.c create mode 100644 gnulib/lib/uniconv/u32-conv-from-enc.c create mode 100644 gnulib/lib/uniconv/u32-conv-to-enc.c create mode 100644 gnulib/lib/uniconv/u32-strconv-from-enc.c create mode 100644 gnulib/lib/uniconv/u32-strconv-from-locale.c create mode 100644 gnulib/lib/uniconv/u32-strconv-to-enc.c create mode 100644 gnulib/lib/uniconv/u32-strconv-to-locale.c create mode 100644 gnulib/lib/uniconv/u8-conv-from-enc.c create mode 100644 gnulib/lib/uniconv/u8-conv-to-enc.c create mode 100644 gnulib/lib/uniconv/u8-strconv-from-enc.c create mode 100644 gnulib/lib/uniconv/u8-strconv-from-locale.c create mode 100644 gnulib/lib/uniconv/u8-strconv-to-enc.c create mode 100644 gnulib/lib/uniconv/u8-strconv-to-locale.c create mode 100644 gnulib/lib/unictype.in.h create mode 100644 gnulib/lib/unictype/3level.h create mode 100644 gnulib/lib/unictype/3levelbit.h create mode 100644 gnulib/lib/unictype/Makefile create mode 100644 gnulib/lib/unictype/bidi_byname.c create mode 100644 gnulib/lib/unictype/bidi_byname.gperf create mode 100644 gnulib/lib/unictype/bidi_longname.c create mode 100644 gnulib/lib/unictype/bidi_name.c create mode 100644 gnulib/lib/unictype/bidi_of.c create mode 100644 gnulib/lib/unictype/bidi_of.h create mode 100644 gnulib/lib/unictype/bidi_test.c create mode 100644 gnulib/lib/unictype/bitmap.h create mode 100644 gnulib/lib/unictype/block_test.c create mode 100644 gnulib/lib/unictype/blocks.c create mode 100644 gnulib/lib/unictype/blocks.h create mode 100644 gnulib/lib/unictype/categ_C.c create mode 100644 gnulib/lib/unictype/categ_C.h create mode 100644 gnulib/lib/unictype/categ_Cc.c create mode 100644 gnulib/lib/unictype/categ_Cc.h create mode 100644 gnulib/lib/unictype/categ_Cf.c create mode 100644 gnulib/lib/unictype/categ_Cf.h create mode 100644 gnulib/lib/unictype/categ_Cn.c create mode 100644 gnulib/lib/unictype/categ_Cn.h create mode 100644 gnulib/lib/unictype/categ_Co.c create mode 100644 gnulib/lib/unictype/categ_Co.h create mode 100644 gnulib/lib/unictype/categ_Cs.c create mode 100644 gnulib/lib/unictype/categ_Cs.h create mode 100644 gnulib/lib/unictype/categ_L.c create mode 100644 gnulib/lib/unictype/categ_L.h create mode 100644 gnulib/lib/unictype/categ_LC.c create mode 100644 gnulib/lib/unictype/categ_LC.h create mode 100644 gnulib/lib/unictype/categ_Ll.c create mode 100644 gnulib/lib/unictype/categ_Ll.h create mode 100644 gnulib/lib/unictype/categ_Lm.c create mode 100644 gnulib/lib/unictype/categ_Lm.h create mode 100644 gnulib/lib/unictype/categ_Lo.c create mode 100644 gnulib/lib/unictype/categ_Lo.h create mode 100644 gnulib/lib/unictype/categ_Lt.c create mode 100644 gnulib/lib/unictype/categ_Lt.h create mode 100644 gnulib/lib/unictype/categ_Lu.c create mode 100644 gnulib/lib/unictype/categ_Lu.h create mode 100644 gnulib/lib/unictype/categ_M.c create mode 100644 gnulib/lib/unictype/categ_M.h create mode 100644 gnulib/lib/unictype/categ_Mc.c create mode 100644 gnulib/lib/unictype/categ_Mc.h create mode 100644 gnulib/lib/unictype/categ_Me.c create mode 100644 gnulib/lib/unictype/categ_Me.h create mode 100644 gnulib/lib/unictype/categ_Mn.c create mode 100644 gnulib/lib/unictype/categ_Mn.h create mode 100644 gnulib/lib/unictype/categ_N.c create mode 100644 gnulib/lib/unictype/categ_N.h create mode 100644 gnulib/lib/unictype/categ_Nd.c create mode 100644 gnulib/lib/unictype/categ_Nd.h create mode 100644 gnulib/lib/unictype/categ_Nl.c create mode 100644 gnulib/lib/unictype/categ_Nl.h create mode 100644 gnulib/lib/unictype/categ_No.c create mode 100644 gnulib/lib/unictype/categ_No.h create mode 100644 gnulib/lib/unictype/categ_P.c create mode 100644 gnulib/lib/unictype/categ_P.h create mode 100644 gnulib/lib/unictype/categ_Pc.c create mode 100644 gnulib/lib/unictype/categ_Pc.h create mode 100644 gnulib/lib/unictype/categ_Pd.c create mode 100644 gnulib/lib/unictype/categ_Pd.h create mode 100644 gnulib/lib/unictype/categ_Pe.c create mode 100644 gnulib/lib/unictype/categ_Pe.h create mode 100644 gnulib/lib/unictype/categ_Pf.c create mode 100644 gnulib/lib/unictype/categ_Pf.h create mode 100644 gnulib/lib/unictype/categ_Pi.c create mode 100644 gnulib/lib/unictype/categ_Pi.h create mode 100644 gnulib/lib/unictype/categ_Po.c create mode 100644 gnulib/lib/unictype/categ_Po.h create mode 100644 gnulib/lib/unictype/categ_Ps.c create mode 100644 gnulib/lib/unictype/categ_Ps.h create mode 100644 gnulib/lib/unictype/categ_S.c create mode 100644 gnulib/lib/unictype/categ_S.h create mode 100644 gnulib/lib/unictype/categ_Sc.c create mode 100644 gnulib/lib/unictype/categ_Sc.h create mode 100644 gnulib/lib/unictype/categ_Sk.c create mode 100644 gnulib/lib/unictype/categ_Sk.h create mode 100644 gnulib/lib/unictype/categ_Sm.c create mode 100644 gnulib/lib/unictype/categ_Sm.h create mode 100644 gnulib/lib/unictype/categ_So.c create mode 100644 gnulib/lib/unictype/categ_So.h create mode 100644 gnulib/lib/unictype/categ_Z.c create mode 100644 gnulib/lib/unictype/categ_Z.h create mode 100644 gnulib/lib/unictype/categ_Zl.c create mode 100644 gnulib/lib/unictype/categ_Zl.h create mode 100644 gnulib/lib/unictype/categ_Zp.c create mode 100644 gnulib/lib/unictype/categ_Zp.h create mode 100644 gnulib/lib/unictype/categ_Zs.c create mode 100644 gnulib/lib/unictype/categ_Zs.h create mode 100644 gnulib/lib/unictype/categ_and.c create mode 100644 gnulib/lib/unictype/categ_and_not.c create mode 100644 gnulib/lib/unictype/categ_byname.c create mode 100644 gnulib/lib/unictype/categ_byname.gperf create mode 100644 gnulib/lib/unictype/categ_longname.c create mode 100644 gnulib/lib/unictype/categ_name.c create mode 100644 gnulib/lib/unictype/categ_none.c create mode 100644 gnulib/lib/unictype/categ_of.c create mode 100644 gnulib/lib/unictype/categ_of.h create mode 100644 gnulib/lib/unictype/categ_or.c create mode 100644 gnulib/lib/unictype/categ_test.c create mode 100644 gnulib/lib/unictype/combiningclass.c create mode 100644 gnulib/lib/unictype/combiningclass.h create mode 100644 gnulib/lib/unictype/combiningclass_byname.c create mode 100644 gnulib/lib/unictype/combiningclass_byname.gperf create mode 100644 gnulib/lib/unictype/combiningclass_longname.c create mode 100644 gnulib/lib/unictype/combiningclass_name.c create mode 100644 gnulib/lib/unictype/ctype_alnum.c create mode 100644 gnulib/lib/unictype/ctype_alnum.h create mode 100644 gnulib/lib/unictype/ctype_alpha.c create mode 100644 gnulib/lib/unictype/ctype_alpha.h create mode 100644 gnulib/lib/unictype/ctype_blank.c create mode 100644 gnulib/lib/unictype/ctype_blank.h create mode 100644 gnulib/lib/unictype/ctype_cntrl.c create mode 100644 gnulib/lib/unictype/ctype_cntrl.h create mode 100644 gnulib/lib/unictype/ctype_digit.c create mode 100644 gnulib/lib/unictype/ctype_digit.h create mode 100644 gnulib/lib/unictype/ctype_graph.c create mode 100644 gnulib/lib/unictype/ctype_graph.h create mode 100644 gnulib/lib/unictype/ctype_lower.c create mode 100644 gnulib/lib/unictype/ctype_lower.h create mode 100644 gnulib/lib/unictype/ctype_print.c create mode 100644 gnulib/lib/unictype/ctype_print.h create mode 100644 gnulib/lib/unictype/ctype_punct.c create mode 100644 gnulib/lib/unictype/ctype_punct.h create mode 100644 gnulib/lib/unictype/ctype_space.c create mode 100644 gnulib/lib/unictype/ctype_space.h create mode 100644 gnulib/lib/unictype/ctype_upper.c create mode 100644 gnulib/lib/unictype/ctype_upper.h create mode 100644 gnulib/lib/unictype/ctype_xdigit.c create mode 100644 gnulib/lib/unictype/ctype_xdigit.h create mode 100644 gnulib/lib/unictype/decdigit.c create mode 100644 gnulib/lib/unictype/decdigit.h create mode 100644 gnulib/lib/unictype/digit.c create mode 100644 gnulib/lib/unictype/digit.h create mode 100644 gnulib/lib/unictype/identsyntaxmap.h create mode 100644 gnulib/lib/unictype/joininggroup_byname.c create mode 100644 gnulib/lib/unictype/joininggroup_byname.gperf create mode 100644 gnulib/lib/unictype/joininggroup_name.c create mode 100644 gnulib/lib/unictype/joininggroup_name.h create mode 100644 gnulib/lib/unictype/joininggroup_of.c create mode 100644 gnulib/lib/unictype/joininggroup_of.h create mode 100644 gnulib/lib/unictype/joiningtype_byname.c create mode 100644 gnulib/lib/unictype/joiningtype_byname.gperf create mode 100644 gnulib/lib/unictype/joiningtype_longname.c create mode 100644 gnulib/lib/unictype/joiningtype_name.c create mode 100644 gnulib/lib/unictype/joiningtype_of.c create mode 100644 gnulib/lib/unictype/joiningtype_of.h create mode 100644 gnulib/lib/unictype/mirror.c create mode 100644 gnulib/lib/unictype/mirror.h create mode 100644 gnulib/lib/unictype/numeric.c create mode 100644 gnulib/lib/unictype/numeric.h create mode 100644 gnulib/lib/unictype/pr_alphabetic.c create mode 100644 gnulib/lib/unictype/pr_alphabetic.h create mode 100644 gnulib/lib/unictype/pr_ascii_hex_digit.c create mode 100644 gnulib/lib/unictype/pr_ascii_hex_digit.h create mode 100644 gnulib/lib/unictype/pr_bidi_arabic_digit.c create mode 100644 gnulib/lib/unictype/pr_bidi_arabic_digit.h create mode 100644 gnulib/lib/unictype/pr_bidi_arabic_right_to_left.c create mode 100644 gnulib/lib/unictype/pr_bidi_arabic_right_to_left.h create mode 100644 gnulib/lib/unictype/pr_bidi_block_separator.c create mode 100644 gnulib/lib/unictype/pr_bidi_block_separator.h create mode 100644 gnulib/lib/unictype/pr_bidi_boundary_neutral.c create mode 100644 gnulib/lib/unictype/pr_bidi_boundary_neutral.h create mode 100644 gnulib/lib/unictype/pr_bidi_common_separator.c create mode 100644 gnulib/lib/unictype/pr_bidi_common_separator.h create mode 100644 gnulib/lib/unictype/pr_bidi_control.c create mode 100644 gnulib/lib/unictype/pr_bidi_control.h create mode 100644 gnulib/lib/unictype/pr_bidi_embedding_or_override.c create mode 100644 gnulib/lib/unictype/pr_bidi_embedding_or_override.h create mode 100644 gnulib/lib/unictype/pr_bidi_eur_num_separator.c create mode 100644 gnulib/lib/unictype/pr_bidi_eur_num_separator.h create mode 100644 gnulib/lib/unictype/pr_bidi_eur_num_terminator.c create mode 100644 gnulib/lib/unictype/pr_bidi_eur_num_terminator.h create mode 100644 gnulib/lib/unictype/pr_bidi_european_digit.c create mode 100644 gnulib/lib/unictype/pr_bidi_european_digit.h create mode 100644 gnulib/lib/unictype/pr_bidi_hebrew_right_to_left.c create mode 100644 gnulib/lib/unictype/pr_bidi_hebrew_right_to_left.h create mode 100644 gnulib/lib/unictype/pr_bidi_left_to_right.c create mode 100644 gnulib/lib/unictype/pr_bidi_left_to_right.h create mode 100644 gnulib/lib/unictype/pr_bidi_non_spacing_mark.c create mode 100644 gnulib/lib/unictype/pr_bidi_non_spacing_mark.h create mode 100644 gnulib/lib/unictype/pr_bidi_other_neutral.c create mode 100644 gnulib/lib/unictype/pr_bidi_other_neutral.h create mode 100644 gnulib/lib/unictype/pr_bidi_pdf.c create mode 100644 gnulib/lib/unictype/pr_bidi_pdf.h create mode 100644 gnulib/lib/unictype/pr_bidi_segment_separator.c create mode 100644 gnulib/lib/unictype/pr_bidi_segment_separator.h create mode 100644 gnulib/lib/unictype/pr_bidi_whitespace.c create mode 100644 gnulib/lib/unictype/pr_bidi_whitespace.h create mode 100644 gnulib/lib/unictype/pr_byname.c create mode 100644 gnulib/lib/unictype/pr_byname.gperf create mode 100644 gnulib/lib/unictype/pr_case_ignorable.c create mode 100644 gnulib/lib/unictype/pr_case_ignorable.h create mode 100644 gnulib/lib/unictype/pr_cased.c create mode 100644 gnulib/lib/unictype/pr_cased.h create mode 100644 gnulib/lib/unictype/pr_changes_when_casefolded.c create mode 100644 gnulib/lib/unictype/pr_changes_when_casefolded.h create mode 100644 gnulib/lib/unictype/pr_changes_when_casemapped.c create mode 100644 gnulib/lib/unictype/pr_changes_when_casemapped.h create mode 100644 gnulib/lib/unictype/pr_changes_when_lowercased.c create mode 100644 gnulib/lib/unictype/pr_changes_when_lowercased.h create mode 100644 gnulib/lib/unictype/pr_changes_when_titlecased.c create mode 100644 gnulib/lib/unictype/pr_changes_when_titlecased.h create mode 100644 gnulib/lib/unictype/pr_changes_when_uppercased.c create mode 100644 gnulib/lib/unictype/pr_changes_when_uppercased.h create mode 100644 gnulib/lib/unictype/pr_combining.c create mode 100644 gnulib/lib/unictype/pr_combining.h create mode 100644 gnulib/lib/unictype/pr_composite.c create mode 100644 gnulib/lib/unictype/pr_composite.h create mode 100644 gnulib/lib/unictype/pr_currency_symbol.c create mode 100644 gnulib/lib/unictype/pr_currency_symbol.h create mode 100644 gnulib/lib/unictype/pr_dash.c create mode 100644 gnulib/lib/unictype/pr_dash.h create mode 100644 gnulib/lib/unictype/pr_decimal_digit.c create mode 100644 gnulib/lib/unictype/pr_decimal_digit.h create mode 100644 gnulib/lib/unictype/pr_default_ignorable_code_point.c create mode 100644 gnulib/lib/unictype/pr_default_ignorable_code_point.h create mode 100644 gnulib/lib/unictype/pr_deprecated.c create mode 100644 gnulib/lib/unictype/pr_deprecated.h create mode 100644 gnulib/lib/unictype/pr_diacritic.c create mode 100644 gnulib/lib/unictype/pr_diacritic.h create mode 100644 gnulib/lib/unictype/pr_extender.c create mode 100644 gnulib/lib/unictype/pr_extender.h create mode 100644 gnulib/lib/unictype/pr_format_control.c create mode 100644 gnulib/lib/unictype/pr_format_control.h create mode 100644 gnulib/lib/unictype/pr_grapheme_base.c create mode 100644 gnulib/lib/unictype/pr_grapheme_base.h create mode 100644 gnulib/lib/unictype/pr_grapheme_extend.c create mode 100644 gnulib/lib/unictype/pr_grapheme_extend.h create mode 100644 gnulib/lib/unictype/pr_grapheme_link.c create mode 100644 gnulib/lib/unictype/pr_grapheme_link.h create mode 100644 gnulib/lib/unictype/pr_hex_digit.c create mode 100644 gnulib/lib/unictype/pr_hex_digit.h create mode 100644 gnulib/lib/unictype/pr_hyphen.c create mode 100644 gnulib/lib/unictype/pr_hyphen.h create mode 100644 gnulib/lib/unictype/pr_id_continue.c create mode 100644 gnulib/lib/unictype/pr_id_continue.h create mode 100644 gnulib/lib/unictype/pr_id_start.c create mode 100644 gnulib/lib/unictype/pr_id_start.h create mode 100644 gnulib/lib/unictype/pr_ideographic.c create mode 100644 gnulib/lib/unictype/pr_ideographic.h create mode 100644 gnulib/lib/unictype/pr_ids_binary_operator.c create mode 100644 gnulib/lib/unictype/pr_ids_binary_operator.h create mode 100644 gnulib/lib/unictype/pr_ids_trinary_operator.c create mode 100644 gnulib/lib/unictype/pr_ids_trinary_operator.h create mode 100644 gnulib/lib/unictype/pr_ignorable_control.c create mode 100644 gnulib/lib/unictype/pr_ignorable_control.h create mode 100644 gnulib/lib/unictype/pr_iso_control.c create mode 100644 gnulib/lib/unictype/pr_iso_control.h create mode 100644 gnulib/lib/unictype/pr_join_control.c create mode 100644 gnulib/lib/unictype/pr_join_control.h create mode 100644 gnulib/lib/unictype/pr_left_of_pair.c create mode 100644 gnulib/lib/unictype/pr_left_of_pair.h create mode 100644 gnulib/lib/unictype/pr_line_separator.c create mode 100644 gnulib/lib/unictype/pr_line_separator.h create mode 100644 gnulib/lib/unictype/pr_logical_order_exception.c create mode 100644 gnulib/lib/unictype/pr_logical_order_exception.h create mode 100644 gnulib/lib/unictype/pr_lowercase.c create mode 100644 gnulib/lib/unictype/pr_lowercase.h create mode 100644 gnulib/lib/unictype/pr_math.c create mode 100644 gnulib/lib/unictype/pr_math.h create mode 100644 gnulib/lib/unictype/pr_non_break.c create mode 100644 gnulib/lib/unictype/pr_non_break.h create mode 100644 gnulib/lib/unictype/pr_not_a_character.c create mode 100644 gnulib/lib/unictype/pr_not_a_character.h create mode 100644 gnulib/lib/unictype/pr_numeric.c create mode 100644 gnulib/lib/unictype/pr_numeric.h create mode 100644 gnulib/lib/unictype/pr_other_alphabetic.c create mode 100644 gnulib/lib/unictype/pr_other_alphabetic.h create mode 100644 gnulib/lib/unictype/pr_other_default_ignorable_code_point.c create mode 100644 gnulib/lib/unictype/pr_other_default_ignorable_code_point.h create mode 100644 gnulib/lib/unictype/pr_other_grapheme_extend.c create mode 100644 gnulib/lib/unictype/pr_other_grapheme_extend.h create mode 100644 gnulib/lib/unictype/pr_other_id_continue.c create mode 100644 gnulib/lib/unictype/pr_other_id_continue.h create mode 100644 gnulib/lib/unictype/pr_other_id_start.c create mode 100644 gnulib/lib/unictype/pr_other_id_start.h create mode 100644 gnulib/lib/unictype/pr_other_lowercase.c create mode 100644 gnulib/lib/unictype/pr_other_lowercase.h create mode 100644 gnulib/lib/unictype/pr_other_math.c create mode 100644 gnulib/lib/unictype/pr_other_math.h create mode 100644 gnulib/lib/unictype/pr_other_uppercase.c create mode 100644 gnulib/lib/unictype/pr_other_uppercase.h create mode 100644 gnulib/lib/unictype/pr_paired_punctuation.c create mode 100644 gnulib/lib/unictype/pr_paired_punctuation.h create mode 100644 gnulib/lib/unictype/pr_paragraph_separator.c create mode 100644 gnulib/lib/unictype/pr_paragraph_separator.h create mode 100644 gnulib/lib/unictype/pr_pattern_syntax.c create mode 100644 gnulib/lib/unictype/pr_pattern_syntax.h create mode 100644 gnulib/lib/unictype/pr_pattern_white_space.c create mode 100644 gnulib/lib/unictype/pr_pattern_white_space.h create mode 100644 gnulib/lib/unictype/pr_private_use.c create mode 100644 gnulib/lib/unictype/pr_private_use.h create mode 100644 gnulib/lib/unictype/pr_punctuation.c create mode 100644 gnulib/lib/unictype/pr_punctuation.h create mode 100644 gnulib/lib/unictype/pr_quotation_mark.c create mode 100644 gnulib/lib/unictype/pr_quotation_mark.h create mode 100644 gnulib/lib/unictype/pr_radical.c create mode 100644 gnulib/lib/unictype/pr_radical.h create mode 100644 gnulib/lib/unictype/pr_sentence_terminal.c create mode 100644 gnulib/lib/unictype/pr_sentence_terminal.h create mode 100644 gnulib/lib/unictype/pr_soft_dotted.c create mode 100644 gnulib/lib/unictype/pr_soft_dotted.h create mode 100644 gnulib/lib/unictype/pr_space.c create mode 100644 gnulib/lib/unictype/pr_space.h create mode 100644 gnulib/lib/unictype/pr_terminal_punctuation.c create mode 100644 gnulib/lib/unictype/pr_terminal_punctuation.h create mode 100644 gnulib/lib/unictype/pr_test.c create mode 100644 gnulib/lib/unictype/pr_titlecase.c create mode 100644 gnulib/lib/unictype/pr_titlecase.h create mode 100644 gnulib/lib/unictype/pr_unassigned_code_value.c create mode 100644 gnulib/lib/unictype/pr_unassigned_code_value.h create mode 100644 gnulib/lib/unictype/pr_unified_ideograph.c create mode 100644 gnulib/lib/unictype/pr_unified_ideograph.h create mode 100644 gnulib/lib/unictype/pr_uppercase.c create mode 100644 gnulib/lib/unictype/pr_uppercase.h create mode 100644 gnulib/lib/unictype/pr_variation_selector.c create mode 100644 gnulib/lib/unictype/pr_variation_selector.h create mode 100644 gnulib/lib/unictype/pr_white_space.c create mode 100644 gnulib/lib/unictype/pr_white_space.h create mode 100644 gnulib/lib/unictype/pr_xid_continue.c create mode 100644 gnulib/lib/unictype/pr_xid_continue.h create mode 100644 gnulib/lib/unictype/pr_xid_start.c create mode 100644 gnulib/lib/unictype/pr_xid_start.h create mode 100644 gnulib/lib/unictype/pr_zero_width.c create mode 100644 gnulib/lib/unictype/pr_zero_width.h create mode 100644 gnulib/lib/unictype/scripts.c create mode 100644 gnulib/lib/unictype/scripts.h create mode 100644 gnulib/lib/unictype/scripts_byname.gperf create mode 100644 gnulib/lib/unictype/sy_c_ident.c create mode 100644 gnulib/lib/unictype/sy_c_ident.h create mode 100644 gnulib/lib/unictype/sy_c_whitespace.c create mode 100644 gnulib/lib/unictype/sy_c_whitespace.h create mode 100644 gnulib/lib/unictype/sy_java_ident.c create mode 100644 gnulib/lib/unictype/sy_java_ident.h create mode 100644 gnulib/lib/unictype/sy_java_whitespace.c create mode 100644 gnulib/lib/unictype/sy_java_whitespace.h create mode 100644 gnulib/lib/unigbrk.in.h create mode 100644 gnulib/lib/unigbrk/gbrkprop.h create mode 100644 gnulib/lib/unigbrk/u16-grapheme-breaks.c create mode 100644 gnulib/lib/unigbrk/u16-grapheme-next.c create mode 100644 gnulib/lib/unigbrk/u16-grapheme-prev.c create mode 100644 gnulib/lib/unigbrk/u32-grapheme-breaks.c create mode 100644 gnulib/lib/unigbrk/u32-grapheme-next.c create mode 100644 gnulib/lib/unigbrk/u32-grapheme-prev.c create mode 100644 gnulib/lib/unigbrk/u8-grapheme-breaks.c create mode 100644 gnulib/lib/unigbrk/u8-grapheme-next.c create mode 100644 gnulib/lib/unigbrk/u8-grapheme-prev.c create mode 100644 gnulib/lib/unigbrk/uc-gbrk-prop.c create mode 100644 gnulib/lib/unigbrk/uc-is-grapheme-break.c create mode 100644 gnulib/lib/unigbrk/ulc-grapheme-breaks.c create mode 100644 gnulib/lib/unilbrk.in.h create mode 100644 gnulib/lib/unilbrk/lbrkprop1.h create mode 100644 gnulib/lib/unilbrk/lbrkprop2.h create mode 100644 gnulib/lib/unilbrk/lbrktables.c create mode 100644 gnulib/lib/unilbrk/lbrktables.h create mode 100644 gnulib/lib/unilbrk/u16-possible-linebreaks.c create mode 100644 gnulib/lib/unilbrk/u16-width-linebreaks.c create mode 100644 gnulib/lib/unilbrk/u32-possible-linebreaks.c create mode 100644 gnulib/lib/unilbrk/u32-width-linebreaks.c create mode 100644 gnulib/lib/unilbrk/u8-possible-linebreaks.c create mode 100644 gnulib/lib/unilbrk/u8-width-linebreaks.c create mode 100644 gnulib/lib/unilbrk/ulc-common.c create mode 100644 gnulib/lib/unilbrk/ulc-common.h create mode 100644 gnulib/lib/unilbrk/ulc-possible-linebreaks.c create mode 100644 gnulib/lib/unilbrk/ulc-width-linebreaks.c create mode 100644 gnulib/lib/uniname.in.h create mode 100755 gnulib/lib/uniname/gen-uninames.lisp create mode 100644 gnulib/lib/uniname/uniname.c create mode 100644 gnulib/lib/uniname/uninames.h create mode 100644 gnulib/lib/uninorm.in.h create mode 100644 gnulib/lib/uninorm/canonical-decomposition.c create mode 100644 gnulib/lib/uninorm/compat-decomposition.c create mode 100644 gnulib/lib/uninorm/composition-table.gperf create mode 100644 gnulib/lib/uninorm/composition.c create mode 100644 gnulib/lib/uninorm/decompose-internal.c create mode 100644 gnulib/lib/uninorm/decompose-internal.h create mode 100644 gnulib/lib/uninorm/decomposing-form.c create mode 100644 gnulib/lib/uninorm/decomposition-table.c create mode 100644 gnulib/lib/uninorm/decomposition-table.h create mode 100644 gnulib/lib/uninorm/decomposition-table1.h create mode 100644 gnulib/lib/uninorm/decomposition-table2.h create mode 100644 gnulib/lib/uninorm/decomposition.c create mode 100644 gnulib/lib/uninorm/nfc.c create mode 100644 gnulib/lib/uninorm/nfd.c create mode 100644 gnulib/lib/uninorm/nfkc.c create mode 100644 gnulib/lib/uninorm/nfkd.c create mode 100644 gnulib/lib/uninorm/normalize-internal.h create mode 100644 gnulib/lib/uninorm/u-normalize-internal.h create mode 100644 gnulib/lib/uninorm/u-normcmp.h create mode 100644 gnulib/lib/uninorm/u-normcoll.h create mode 100644 gnulib/lib/uninorm/u-normxfrm.h create mode 100644 gnulib/lib/uninorm/u16-normalize.c create mode 100644 gnulib/lib/uninorm/u16-normcmp.c create mode 100644 gnulib/lib/uninorm/u16-normcoll.c create mode 100644 gnulib/lib/uninorm/u16-normxfrm.c create mode 100644 gnulib/lib/uninorm/u32-normalize.c create mode 100644 gnulib/lib/uninorm/u32-normcmp.c create mode 100644 gnulib/lib/uninorm/u32-normcoll.c create mode 100644 gnulib/lib/uninorm/u32-normxfrm.c create mode 100644 gnulib/lib/uninorm/u8-normalize.c create mode 100644 gnulib/lib/uninorm/u8-normcmp.c create mode 100644 gnulib/lib/uninorm/u8-normcoll.c create mode 100644 gnulib/lib/uninorm/u8-normxfrm.c create mode 100644 gnulib/lib/uninorm/uninorm-filter.c create mode 100644 gnulib/lib/unistd--.h create mode 100644 gnulib/lib/unistd-safer.h create mode 100644 gnulib/lib/unistd.in.h create mode 100644 gnulib/lib/unistdio.in.h create mode 100644 gnulib/lib/unistdio/u-asnprintf.h create mode 100644 gnulib/lib/unistdio/u-asprintf.h create mode 100644 gnulib/lib/unistdio/u-printf-args.c create mode 100644 gnulib/lib/unistdio/u-printf-args.h create mode 100644 gnulib/lib/unistdio/u-printf-parse.h create mode 100644 gnulib/lib/unistdio/u-snprintf.h create mode 100644 gnulib/lib/unistdio/u-sprintf.h create mode 100644 gnulib/lib/unistdio/u-vasprintf.h create mode 100644 gnulib/lib/unistdio/u-vsnprintf.h create mode 100644 gnulib/lib/unistdio/u-vsprintf.h create mode 100644 gnulib/lib/unistdio/u16-asnprintf.c create mode 100644 gnulib/lib/unistdio/u16-asprintf.c create mode 100644 gnulib/lib/unistdio/u16-printf-parse.c create mode 100644 gnulib/lib/unistdio/u16-snprintf.c create mode 100644 gnulib/lib/unistdio/u16-sprintf.c create mode 100644 gnulib/lib/unistdio/u16-u16-asnprintf.c create mode 100644 gnulib/lib/unistdio/u16-u16-asprintf.c create mode 100644 gnulib/lib/unistdio/u16-u16-snprintf.c create mode 100644 gnulib/lib/unistdio/u16-u16-sprintf.c create mode 100644 gnulib/lib/unistdio/u16-u16-vasnprintf.c create mode 100644 gnulib/lib/unistdio/u16-u16-vasprintf.c create mode 100644 gnulib/lib/unistdio/u16-u16-vsnprintf.c create mode 100644 gnulib/lib/unistdio/u16-u16-vsprintf.c create mode 100644 gnulib/lib/unistdio/u16-vasnprintf.c create mode 100644 gnulib/lib/unistdio/u16-vasprintf.c create mode 100644 gnulib/lib/unistdio/u16-vsnprintf.c create mode 100644 gnulib/lib/unistdio/u16-vsprintf.c create mode 100644 gnulib/lib/unistdio/u32-asnprintf.c create mode 100644 gnulib/lib/unistdio/u32-asprintf.c create mode 100644 gnulib/lib/unistdio/u32-printf-parse.c create mode 100644 gnulib/lib/unistdio/u32-snprintf.c create mode 100644 gnulib/lib/unistdio/u32-sprintf.c create mode 100644 gnulib/lib/unistdio/u32-u32-asnprintf.c create mode 100644 gnulib/lib/unistdio/u32-u32-asprintf.c create mode 100644 gnulib/lib/unistdio/u32-u32-snprintf.c create mode 100644 gnulib/lib/unistdio/u32-u32-sprintf.c create mode 100644 gnulib/lib/unistdio/u32-u32-vasnprintf.c create mode 100644 gnulib/lib/unistdio/u32-u32-vasprintf.c create mode 100644 gnulib/lib/unistdio/u32-u32-vsnprintf.c create mode 100644 gnulib/lib/unistdio/u32-u32-vsprintf.c create mode 100644 gnulib/lib/unistdio/u32-vasnprintf.c create mode 100644 gnulib/lib/unistdio/u32-vasprintf.c create mode 100644 gnulib/lib/unistdio/u32-vsnprintf.c create mode 100644 gnulib/lib/unistdio/u32-vsprintf.c create mode 100644 gnulib/lib/unistdio/u8-asnprintf.c create mode 100644 gnulib/lib/unistdio/u8-asprintf.c create mode 100644 gnulib/lib/unistdio/u8-printf-parse.c create mode 100644 gnulib/lib/unistdio/u8-snprintf.c create mode 100644 gnulib/lib/unistdio/u8-sprintf.c create mode 100644 gnulib/lib/unistdio/u8-u8-asnprintf.c create mode 100644 gnulib/lib/unistdio/u8-u8-asprintf.c create mode 100644 gnulib/lib/unistdio/u8-u8-snprintf.c create mode 100644 gnulib/lib/unistdio/u8-u8-sprintf.c create mode 100644 gnulib/lib/unistdio/u8-u8-vasnprintf.c create mode 100644 gnulib/lib/unistdio/u8-u8-vasprintf.c create mode 100644 gnulib/lib/unistdio/u8-u8-vsnprintf.c create mode 100644 gnulib/lib/unistdio/u8-u8-vsprintf.c create mode 100644 gnulib/lib/unistdio/u8-vasnprintf.c create mode 100644 gnulib/lib/unistdio/u8-vasprintf.c create mode 100644 gnulib/lib/unistdio/u8-vsnprintf.c create mode 100644 gnulib/lib/unistdio/u8-vsprintf.c create mode 100644 gnulib/lib/unistdio/ulc-asnprintf.c create mode 100644 gnulib/lib/unistdio/ulc-asprintf.c create mode 100644 gnulib/lib/unistdio/ulc-fprintf.c create mode 100644 gnulib/lib/unistdio/ulc-printf-parse.c create mode 100644 gnulib/lib/unistdio/ulc-snprintf.c create mode 100644 gnulib/lib/unistdio/ulc-sprintf.c create mode 100644 gnulib/lib/unistdio/ulc-vasnprintf.c create mode 100644 gnulib/lib/unistdio/ulc-vasprintf.c create mode 100644 gnulib/lib/unistdio/ulc-vfprintf.c create mode 100644 gnulib/lib/unistdio/ulc-vsnprintf.c create mode 100644 gnulib/lib/unistdio/ulc-vsprintf.c create mode 100644 gnulib/lib/unistr.in.h create mode 100644 gnulib/lib/unistr/u-cmp2.h create mode 100644 gnulib/lib/unistr/u-cpy-alloc.h create mode 100644 gnulib/lib/unistr/u-cpy.h create mode 100644 gnulib/lib/unistr/u-endswith.h create mode 100644 gnulib/lib/unistr/u-move.h create mode 100644 gnulib/lib/unistr/u-set.h create mode 100644 gnulib/lib/unistr/u-startswith.h create mode 100644 gnulib/lib/unistr/u-stpcpy.h create mode 100644 gnulib/lib/unistr/u-stpncpy.h create mode 100644 gnulib/lib/unistr/u-strcat.h create mode 100644 gnulib/lib/unistr/u-strcoll.h create mode 100644 gnulib/lib/unistr/u-strcpy.h create mode 100644 gnulib/lib/unistr/u-strcspn.h create mode 100644 gnulib/lib/unistr/u-strdup.h create mode 100644 gnulib/lib/unistr/u-strlen.h create mode 100644 gnulib/lib/unistr/u-strncat.h create mode 100644 gnulib/lib/unistr/u-strncpy.h create mode 100644 gnulib/lib/unistr/u-strnlen.h create mode 100644 gnulib/lib/unistr/u-strpbrk.h create mode 100644 gnulib/lib/unistr/u-strspn.h create mode 100644 gnulib/lib/unistr/u-strstr.h create mode 100644 gnulib/lib/unistr/u-strtok.h create mode 100644 gnulib/lib/unistr/u16-check.c create mode 100644 gnulib/lib/unistr/u16-chr.c create mode 100644 gnulib/lib/unistr/u16-cmp.c create mode 100644 gnulib/lib/unistr/u16-cmp2.c create mode 100644 gnulib/lib/unistr/u16-cpy-alloc.c create mode 100644 gnulib/lib/unistr/u16-cpy.c create mode 100644 gnulib/lib/unistr/u16-endswith.c create mode 100644 gnulib/lib/unistr/u16-mblen.c create mode 100644 gnulib/lib/unistr/u16-mbsnlen.c create mode 100644 gnulib/lib/unistr/u16-mbtouc-aux.c create mode 100644 gnulib/lib/unistr/u16-mbtouc-unsafe-aux.c create mode 100644 gnulib/lib/unistr/u16-mbtouc-unsafe.c create mode 100644 gnulib/lib/unistr/u16-mbtouc.c create mode 100644 gnulib/lib/unistr/u16-mbtoucr.c create mode 100644 gnulib/lib/unistr/u16-move.c create mode 100644 gnulib/lib/unistr/u16-next.c create mode 100644 gnulib/lib/unistr/u16-prev.c create mode 100644 gnulib/lib/unistr/u16-set.c create mode 100644 gnulib/lib/unistr/u16-startswith.c create mode 100644 gnulib/lib/unistr/u16-stpcpy.c create mode 100644 gnulib/lib/unistr/u16-stpncpy.c create mode 100644 gnulib/lib/unistr/u16-strcat.c create mode 100644 gnulib/lib/unistr/u16-strchr.c create mode 100644 gnulib/lib/unistr/u16-strcmp.c create mode 100644 gnulib/lib/unistr/u16-strcoll.c create mode 100644 gnulib/lib/unistr/u16-strcpy.c create mode 100644 gnulib/lib/unistr/u16-strcspn.c create mode 100644 gnulib/lib/unistr/u16-strdup.c create mode 100644 gnulib/lib/unistr/u16-strlen.c create mode 100644 gnulib/lib/unistr/u16-strmblen.c create mode 100644 gnulib/lib/unistr/u16-strmbtouc.c create mode 100644 gnulib/lib/unistr/u16-strncat.c create mode 100644 gnulib/lib/unistr/u16-strncmp.c create mode 100644 gnulib/lib/unistr/u16-strncpy.c create mode 100644 gnulib/lib/unistr/u16-strnlen.c create mode 100644 gnulib/lib/unistr/u16-strpbrk.c create mode 100644 gnulib/lib/unistr/u16-strrchr.c create mode 100644 gnulib/lib/unistr/u16-strspn.c create mode 100644 gnulib/lib/unistr/u16-strstr.c create mode 100644 gnulib/lib/unistr/u16-strtok.c create mode 100644 gnulib/lib/unistr/u16-to-u32.c create mode 100644 gnulib/lib/unistr/u16-to-u8.c create mode 100644 gnulib/lib/unistr/u16-uctomb-aux.c create mode 100644 gnulib/lib/unistr/u16-uctomb.c create mode 100644 gnulib/lib/unistr/u32-check.c create mode 100644 gnulib/lib/unistr/u32-chr.c create mode 100644 gnulib/lib/unistr/u32-cmp.c create mode 100644 gnulib/lib/unistr/u32-cmp2.c create mode 100644 gnulib/lib/unistr/u32-cpy-alloc.c create mode 100644 gnulib/lib/unistr/u32-cpy.c create mode 100644 gnulib/lib/unistr/u32-endswith.c create mode 100644 gnulib/lib/unistr/u32-mblen.c create mode 100644 gnulib/lib/unistr/u32-mbsnlen.c create mode 100644 gnulib/lib/unistr/u32-mbtouc-unsafe.c create mode 100644 gnulib/lib/unistr/u32-mbtouc.c create mode 100644 gnulib/lib/unistr/u32-mbtoucr.c create mode 100644 gnulib/lib/unistr/u32-move.c create mode 100644 gnulib/lib/unistr/u32-next.c create mode 100644 gnulib/lib/unistr/u32-prev.c create mode 100644 gnulib/lib/unistr/u32-set.c create mode 100644 gnulib/lib/unistr/u32-startswith.c create mode 100644 gnulib/lib/unistr/u32-stpcpy.c create mode 100644 gnulib/lib/unistr/u32-stpncpy.c create mode 100644 gnulib/lib/unistr/u32-strcat.c create mode 100644 gnulib/lib/unistr/u32-strchr.c create mode 100644 gnulib/lib/unistr/u32-strcmp.c create mode 100644 gnulib/lib/unistr/u32-strcoll.c create mode 100644 gnulib/lib/unistr/u32-strcpy.c create mode 100644 gnulib/lib/unistr/u32-strcspn.c create mode 100644 gnulib/lib/unistr/u32-strdup.c create mode 100644 gnulib/lib/unistr/u32-strlen.c create mode 100644 gnulib/lib/unistr/u32-strmblen.c create mode 100644 gnulib/lib/unistr/u32-strmbtouc.c create mode 100644 gnulib/lib/unistr/u32-strncat.c create mode 100644 gnulib/lib/unistr/u32-strncmp.c create mode 100644 gnulib/lib/unistr/u32-strncpy.c create mode 100644 gnulib/lib/unistr/u32-strnlen.c create mode 100644 gnulib/lib/unistr/u32-strpbrk.c create mode 100644 gnulib/lib/unistr/u32-strrchr.c create mode 100644 gnulib/lib/unistr/u32-strspn.c create mode 100644 gnulib/lib/unistr/u32-strstr.c create mode 100644 gnulib/lib/unistr/u32-strtok.c create mode 100644 gnulib/lib/unistr/u32-to-u16.c create mode 100644 gnulib/lib/unistr/u32-to-u8.c create mode 100644 gnulib/lib/unistr/u32-uctomb.c create mode 100644 gnulib/lib/unistr/u8-check.c create mode 100644 gnulib/lib/unistr/u8-chr.c create mode 100644 gnulib/lib/unistr/u8-cmp.c create mode 100644 gnulib/lib/unistr/u8-cmp2.c create mode 100644 gnulib/lib/unistr/u8-cpy-alloc.c create mode 100644 gnulib/lib/unistr/u8-cpy.c create mode 100644 gnulib/lib/unistr/u8-endswith.c create mode 100644 gnulib/lib/unistr/u8-mblen.c create mode 100644 gnulib/lib/unistr/u8-mbsnlen.c create mode 100644 gnulib/lib/unistr/u8-mbtouc-aux.c create mode 100644 gnulib/lib/unistr/u8-mbtouc-unsafe-aux.c create mode 100644 gnulib/lib/unistr/u8-mbtouc-unsafe.c create mode 100644 gnulib/lib/unistr/u8-mbtouc.c create mode 100644 gnulib/lib/unistr/u8-mbtoucr.c create mode 100644 gnulib/lib/unistr/u8-move.c create mode 100644 gnulib/lib/unistr/u8-next.c create mode 100644 gnulib/lib/unistr/u8-prev.c create mode 100644 gnulib/lib/unistr/u8-set.c create mode 100644 gnulib/lib/unistr/u8-startswith.c create mode 100644 gnulib/lib/unistr/u8-stpcpy.c create mode 100644 gnulib/lib/unistr/u8-stpncpy.c create mode 100644 gnulib/lib/unistr/u8-strcat.c create mode 100644 gnulib/lib/unistr/u8-strchr.c create mode 100644 gnulib/lib/unistr/u8-strcmp.c create mode 100644 gnulib/lib/unistr/u8-strcoll.c create mode 100644 gnulib/lib/unistr/u8-strcpy.c create mode 100644 gnulib/lib/unistr/u8-strcspn.c create mode 100644 gnulib/lib/unistr/u8-strdup.c create mode 100644 gnulib/lib/unistr/u8-strlen.c create mode 100644 gnulib/lib/unistr/u8-strmblen.c create mode 100644 gnulib/lib/unistr/u8-strmbtouc.c create mode 100644 gnulib/lib/unistr/u8-strncat.c create mode 100644 gnulib/lib/unistr/u8-strncmp.c create mode 100644 gnulib/lib/unistr/u8-strncpy.c create mode 100644 gnulib/lib/unistr/u8-strnlen.c create mode 100644 gnulib/lib/unistr/u8-strpbrk.c create mode 100644 gnulib/lib/unistr/u8-strrchr.c create mode 100644 gnulib/lib/unistr/u8-strspn.c create mode 100644 gnulib/lib/unistr/u8-strstr.c create mode 100644 gnulib/lib/unistr/u8-strtok.c create mode 100644 gnulib/lib/unistr/u8-to-u16.c create mode 100644 gnulib/lib/unistr/u8-to-u32.c create mode 100644 gnulib/lib/unistr/u8-uctomb-aux.c create mode 100644 gnulib/lib/unistr/u8-uctomb.c create mode 100644 gnulib/lib/unitypes.in.h create mode 100644 gnulib/lib/uniwbrk.in.h create mode 100644 gnulib/lib/uniwbrk/u-wordbreaks.h create mode 100644 gnulib/lib/uniwbrk/u16-wordbreaks.c create mode 100644 gnulib/lib/uniwbrk/u32-wordbreaks.c create mode 100644 gnulib/lib/uniwbrk/u8-wordbreaks.c create mode 100644 gnulib/lib/uniwbrk/ulc-wordbreaks.c create mode 100644 gnulib/lib/uniwbrk/wbrkprop.h create mode 100644 gnulib/lib/uniwbrk/wbrktable.c create mode 100644 gnulib/lib/uniwbrk/wbrktable.h create mode 100644 gnulib/lib/uniwbrk/wordbreak-property.c create mode 100644 gnulib/lib/uniwidth.in.h create mode 100644 gnulib/lib/uniwidth/cjk.h create mode 100644 gnulib/lib/uniwidth/u16-strwidth.c create mode 100644 gnulib/lib/uniwidth/u16-width.c create mode 100644 gnulib/lib/uniwidth/u32-strwidth.c create mode 100644 gnulib/lib/uniwidth/u32-width.c create mode 100644 gnulib/lib/uniwidth/u8-strwidth.c create mode 100644 gnulib/lib/uniwidth/u8-width.c create mode 100644 gnulib/lib/uniwidth/width.c create mode 100644 gnulib/lib/unlink.c create mode 100644 gnulib/lib/unlinkat.c create mode 100644 gnulib/lib/unlinkdir.c create mode 100644 gnulib/lib/unlinkdir.h create mode 100644 gnulib/lib/unlocked-io.h create mode 100644 gnulib/lib/unlockpt.c create mode 100644 gnulib/lib/unsetenv.c create mode 100644 gnulib/lib/userspec.c create mode 100644 gnulib/lib/userspec.h create mode 100644 gnulib/lib/usleep.c create mode 100644 gnulib/lib/utimecmp.c create mode 100644 gnulib/lib/utimecmp.h create mode 100644 gnulib/lib/utimens.c create mode 100644 gnulib/lib/utimens.h create mode 100644 gnulib/lib/utimensat.c create mode 100644 gnulib/lib/vasnprintf.c create mode 100644 gnulib/lib/vasnprintf.h create mode 100644 gnulib/lib/vasprintf.c create mode 100644 gnulib/lib/vdprintf.c create mode 100644 gnulib/lib/verify.h create mode 100644 gnulib/lib/verror.c create mode 100644 gnulib/lib/verror.h create mode 100644 gnulib/lib/version-etc-fsf.c create mode 100644 gnulib/lib/version-etc.c create mode 100644 gnulib/lib/version-etc.h create mode 100644 gnulib/lib/vfprintf.c create mode 100644 gnulib/lib/vma-iter.c create mode 100644 gnulib/lib/vma-iter.h create mode 100644 gnulib/lib/vprintf.c create mode 100644 gnulib/lib/vsnprintf.c create mode 100644 gnulib/lib/vsprintf.c create mode 100644 gnulib/lib/w32sock.h create mode 100644 gnulib/lib/w32spawn.h create mode 100644 gnulib/lib/wait-process.c create mode 100644 gnulib/lib/wait-process.h create mode 100644 gnulib/lib/waitpid.c create mode 100644 gnulib/lib/wchar.in.h create mode 100644 gnulib/lib/wcpcpy-impl.h create mode 100644 gnulib/lib/wcpcpy.c create mode 100644 gnulib/lib/wcpncpy-impl.h create mode 100644 gnulib/lib/wcpncpy.c create mode 100644 gnulib/lib/wcrtomb.c create mode 100644 gnulib/lib/wcscasecmp-impl.h create mode 100644 gnulib/lib/wcscasecmp.c create mode 100644 gnulib/lib/wcscat-impl.h create mode 100644 gnulib/lib/wcscat.c create mode 100644 gnulib/lib/wcschr-impl.h create mode 100644 gnulib/lib/wcschr.c create mode 100644 gnulib/lib/wcscmp-impl.h create mode 100644 gnulib/lib/wcscmp.c create mode 100644 gnulib/lib/wcscoll-impl.h create mode 100644 gnulib/lib/wcscoll.c create mode 100644 gnulib/lib/wcscpy-impl.h create mode 100644 gnulib/lib/wcscpy.c create mode 100644 gnulib/lib/wcscspn-impl.h create mode 100644 gnulib/lib/wcscspn.c create mode 100644 gnulib/lib/wcsdup-impl.h create mode 100644 gnulib/lib/wcsdup.c create mode 100644 gnulib/lib/wcslen-impl.h create mode 100644 gnulib/lib/wcslen.c create mode 100644 gnulib/lib/wcsncasecmp-impl.h create mode 100644 gnulib/lib/wcsncasecmp.c create mode 100644 gnulib/lib/wcsncat-impl.h create mode 100644 gnulib/lib/wcsncat.c create mode 100644 gnulib/lib/wcsncmp-impl.h create mode 100644 gnulib/lib/wcsncmp.c create mode 100644 gnulib/lib/wcsncpy-impl.h create mode 100644 gnulib/lib/wcsncpy.c create mode 100644 gnulib/lib/wcsnlen-impl.h create mode 100644 gnulib/lib/wcsnlen.c create mode 100644 gnulib/lib/wcsnrtombs-impl.h create mode 100644 gnulib/lib/wcsnrtombs.c create mode 100644 gnulib/lib/wcspbrk-impl.h create mode 100644 gnulib/lib/wcspbrk.c create mode 100644 gnulib/lib/wcsrchr-impl.h create mode 100644 gnulib/lib/wcsrchr.c create mode 100644 gnulib/lib/wcsrtombs-impl.h create mode 100644 gnulib/lib/wcsrtombs-state.c create mode 100644 gnulib/lib/wcsrtombs.c create mode 100644 gnulib/lib/wcsspn-impl.h create mode 100644 gnulib/lib/wcsspn.c create mode 100644 gnulib/lib/wcsstr-impl.h create mode 100644 gnulib/lib/wcsstr.c create mode 100644 gnulib/lib/wcstok-impl.h create mode 100644 gnulib/lib/wcstok.c create mode 100644 gnulib/lib/wcswidth-impl.h create mode 100644 gnulib/lib/wcswidth.c create mode 100644 gnulib/lib/wcsxfrm-impl.h create mode 100644 gnulib/lib/wcsxfrm.c create mode 100644 gnulib/lib/wctob.c create mode 100644 gnulib/lib/wctomb-impl.h create mode 100644 gnulib/lib/wctomb.c create mode 100644 gnulib/lib/wctrans-impl.h create mode 100644 gnulib/lib/wctrans.c create mode 100644 gnulib/lib/wctype-impl.h create mode 100644 gnulib/lib/wctype.c create mode 100644 gnulib/lib/wctype.in.h create mode 100644 gnulib/lib/wcwidth.c create mode 100644 gnulib/lib/wmemchr-impl.h create mode 100644 gnulib/lib/wmemchr.c create mode 100644 gnulib/lib/wmemcmp-impl.h create mode 100644 gnulib/lib/wmemcmp.c create mode 100644 gnulib/lib/wmemcpy-impl.h create mode 100644 gnulib/lib/wmemcpy.c create mode 100644 gnulib/lib/wmemmove-impl.h create mode 100644 gnulib/lib/wmemmove.c create mode 100644 gnulib/lib/wmemset-impl.h create mode 100644 gnulib/lib/wmemset.c create mode 100644 gnulib/lib/write-any-file.c create mode 100644 gnulib/lib/write-any-file.h create mode 100644 gnulib/lib/write.c create mode 100644 gnulib/lib/xalloc-die.c create mode 100644 gnulib/lib/xalloc-oversized.h create mode 100644 gnulib/lib/xalloc.h create mode 100644 gnulib/lib/xasprintf.c create mode 100644 gnulib/lib/xconcat-filename.c create mode 100644 gnulib/lib/xfreopen.c create mode 100644 gnulib/lib/xfreopen.h create mode 100644 gnulib/lib/xgetcwd.c create mode 100644 gnulib/lib/xgetcwd.h create mode 100644 gnulib/lib/xgetdomainname.c create mode 100644 gnulib/lib/xgetdomainname.h create mode 100644 gnulib/lib/xgetgroups.c create mode 100644 gnulib/lib/xgethostname.c create mode 100644 gnulib/lib/xgethostname.h create mode 100644 gnulib/lib/xmalloc.c create mode 100644 gnulib/lib/xmalloca.c create mode 100644 gnulib/lib/xmalloca.h create mode 100644 gnulib/lib/xmemcoll.c create mode 100644 gnulib/lib/xmemcoll.h create mode 100644 gnulib/lib/xmemdup0.c create mode 100644 gnulib/lib/xmemdup0.h create mode 100644 gnulib/lib/xnanosleep.c create mode 100644 gnulib/lib/xnanosleep.h create mode 100644 gnulib/lib/xprintf.c create mode 100644 gnulib/lib/xprintf.h create mode 100644 gnulib/lib/xreadlink.c create mode 100644 gnulib/lib/xreadlink.h create mode 100644 gnulib/lib/xreadlinkat.c create mode 100644 gnulib/lib/xsetenv.c create mode 100644 gnulib/lib/xsetenv.h create mode 100644 gnulib/lib/xsize.h create mode 100644 gnulib/lib/xstriconv.c create mode 100644 gnulib/lib/xstriconv.h create mode 100644 gnulib/lib/xstriconveh.c create mode 100644 gnulib/lib/xstriconveh.h create mode 100644 gnulib/lib/xstrndup.c create mode 100644 gnulib/lib/xstrndup.h create mode 100644 gnulib/lib/xstrtod.c create mode 100644 gnulib/lib/xstrtod.h create mode 100644 gnulib/lib/xstrtoimax.c create mode 100644 gnulib/lib/xstrtol-error.c create mode 100644 gnulib/lib/xstrtol.c create mode 100644 gnulib/lib/xstrtol.h create mode 100644 gnulib/lib/xstrtold.c create mode 100644 gnulib/lib/xstrtoll.c create mode 100644 gnulib/lib/xstrtoul.c create mode 100644 gnulib/lib/xstrtoull.c create mode 100644 gnulib/lib/xstrtoumax.c create mode 100644 gnulib/lib/xtime.h create mode 100644 gnulib/lib/xvasprintf.c create mode 100644 gnulib/lib/xvasprintf.h create mode 100644 gnulib/lib/yesno.c create mode 100644 gnulib/lib/yesno.h (limited to 'gnulib/lib') diff --git a/gnulib b/gnulib deleted file mode 160000 index 443bc5f..0000000 --- a/gnulib +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 443bc5ffcf7429e557f4a371b0661abe98ddbc13 diff --git a/gnulib/lib/.cppi-disable b/gnulib/lib/.cppi-disable new file mode 100644 index 0000000..29c43f9 --- /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 0000000..f2e6007 --- /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/Makefile b/gnulib/lib/Makefile new file mode 100644 index 0000000..2e10203 --- /dev/null +++ b/gnulib/lib/Makefile @@ -0,0 +1,6 @@ +# Run "make check" to ensure that the code passes some simple tests, +# usually (always?) not involving compilation. +all: + +check: + ./t-idcache diff --git a/gnulib/lib/README b/gnulib/lib/README new file mode 100644 index 0000000..100b99d --- /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/_Exit.c b/gnulib/lib/_Exit.c new file mode 100644 index 0000000..288766c --- /dev/null +++ b/gnulib/lib/_Exit.c @@ -0,0 +1,27 @@ +/* Copyright (C) 2010-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include + +void +_Exit (int status) +{ + _exit (status); +} diff --git a/gnulib/lib/accept.c b/gnulib/lib/accept.c new file mode 100644 index 0000000..01faf54 --- /dev/null +++ b/gnulib/lib/accept.c @@ -0,0 +1,52 @@ +/* accept.c --- wrappers for Windows accept function + + Copyright (C) 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paolo Bonzini */ + +#include + +#define WIN32_LEAN_AND_MEAN +/* Get winsock2.h. */ +#include + +/* Get set_winsock_errno, FD_TO_SOCKET etc. */ +#include "w32sock.h" + +#undef accept + +int +rpl_accept (int fd, struct sockaddr *addr, socklen_t *addrlen) +{ + SOCKET sock = FD_TO_SOCKET (fd); + + if (sock == INVALID_SOCKET) + { + errno = EBADF; + return -1; + } + else + { + SOCKET fh = accept (sock, 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 0000000..4e1ef1a --- /dev/null +++ b/gnulib/lib/accept4.c @@ -0,0 +1,129 @@ +/* Accept a connection on a socket, with specific opening flags. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 + +/* Specification. */ +#include + +#include +#include +#include "binary-io.h" +#include "msvc-nothrow.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 0000000..7a105c8 --- /dev/null +++ b/gnulib/lib/acl-internal.h @@ -0,0 +1,256 @@ +/* Internal implementation of access control lists. + + Copyright (C) 2002-2003, 2005-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Written by Paul Eggert, Andreas Grünbacher, and Bruno Haible. */ + +#include "acl.h" + +#include +#include + +/* All systems define the ACL related API in . */ +#if HAVE_SYS_ACL_H +# include +#endif +#if defined HAVE_FACL && ! defined GETACLCNT && defined ACL_CNT +# define GETACLCNT ACL_CNT +#endif + +/* On Linux, additional ACL related API is available in . */ +#ifdef HAVE_ACL_LIBACL_H +# include +#endif + +/* On HP-UX >= 11.11, additional ACL API is available in . */ +#if HAVE_ACLV_H +# include +# include +/* HP-UX 11.11 lacks these declarations. */ +extern int acl (char *, int, int, struct acl *); +extern int aclsort (int, int, struct acl *); +#endif + +#include "error.h" +#include "quote.h" + +#include +#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 + +/* Recognize some common errors such as from an NFS mount that does + not support ACLs, even when local drives do. */ +#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 + +#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) || defined __sgi /* MacOS X, IRIX */ +# define MODE_INSIDE_ACL 0 +# else +# define MODE_INSIDE_ACL 1 +# 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_FACL && 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 + +/* 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 OLD_ALLOW 0 +# define OLD_DENY 1 +# define NEW_ACE_ACCESS_ALLOWED_ACE_TYPE 0 /* replaces ALLOW */ +# define NEW_ACE_ACCESS_DENIED_ACE_TYPE 1 /* replaces DENY */ +/* For a_flags. */ +# define OLD_ACE_OWNER 0x0100 +# define OLD_ACE_GROUP 0x0200 +# define OLD_ACE_OTHER 0x0400 +# define NEW_ACE_OWNER 0x1000 +# define NEW_ACE_GROUP 0x2000 +# define NEW_ACE_IDENTIFIER_GROUP 0x0040 +# define NEW_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_APPEND_DATA 0x004 +# define NEW_ACE_READ_NAMED_ATTRS 0x008 +# define NEW_ACE_WRITE_NAMED_ATTRS 0x010 +# define NEW_ACE_EXECUTE 0x020 +# define NEW_ACE_DELETE_CHILD 0x040 +# define NEW_ACE_READ_ATTRIBUTES 0x080 +# define NEW_ACE_WRITE_ATTRIBUTES 0x100 +# define NEW_ACE_DELETE 0x10000 +# define NEW_ACE_READ_ACL 0x20000 +# define NEW_ACE_WRITE_ACL 0x40000 +# define NEW_ACE_WRITE_OWNER 0x80000 +# define NEW_ACE_SYNCHRONIZE 0x100000 + +# 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); + +# if HAVE_ACLV_H /* HP-UX >= 11.11 */ + +/* 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 aclv_nontrivial (int count, struct acl *entries); + +# endif + +# 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); + +# elif HAVE_ACLSORT /* NonStop Kernel */ + +/* 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 *entries); + +# endif + +#endif diff --git a/gnulib/lib/acl.h b/gnulib/lib/acl.h new file mode 100644 index 0000000..d3e3e37 --- /dev/null +++ b/gnulib/lib/acl.h @@ -0,0 +1,27 @@ +/* acl.c - access control lists + + Copyright (C) 2002, 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Written by Paul Eggert. */ + +#include +#include + +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 0000000..2bf8adc --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Written by Paul Eggert and Andreas Gruenbacher. */ + +#include + +#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/acosf.c b/gnulib/lib/acosf.c new file mode 100644 index 0000000..25c9262 --- /dev/null +++ b/gnulib/lib/acosf.c @@ -0,0 +1,26 @@ +/* Inverse cosine function. + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +float +acosf (float x) +{ + return (float) acos ((double) x); +} diff --git a/gnulib/lib/acosl.c b/gnulib/lib/acosl.c new file mode 100644 index 0000000..c864631 --- /dev/null +++ b/gnulib/lib/acosl.c @@ -0,0 +1,238 @@ +/* + * ==================================================== + * 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 + +/* Specification. */ +#include + +#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE + +long double +acosl (long double x) +{ + return acos (x); +} + +#else + +/* + Long double expansions contributed by + Stephen L. Moshier +*/ + +/* 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)); +} + +#endif + +#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 0000000..bff3930 --- /dev/null +++ b/gnulib/lib/alignof.h @@ -0,0 +1,51 @@ +/* Determine alignment of types. + Copyright (C) 2003-2004, 2006, 2009-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 + +/* alignof_slot (TYPE) + Determine the alignment of a structure slot (field) of a given type, + at compile time. Note that the result depends on the ABI. + This is the same as alignof (TYPE) and _Alignof (TYPE), defined in + if __alignof_is_defined is 1. + 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 struct alignof_helper { char __slot1; type __slot2; }; +# define alignof_slot(type) offsetof (alignof_helper, __slot2) +#else +# define alignof_slot(type) offsetof (struct { char __slot1; type __slot2; }, __slot2) +#endif + +/* alignof_type (TYPE) + Determine the good alignment of an 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 + +#endif /* _ALIGNOF_H */ diff --git a/gnulib/lib/alloca.c b/gnulib/lib/alloca.c new file mode 100644 index 0000000..c7e91ab --- /dev/null +++ b/gnulib/lib/alloca.c @@ -0,0 +1,478 @@ +/* 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 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 + +#include + +#include +#include + +#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 int +find_stack_direction (int *addr, int depth) +{ + int dir, dummy = 0; + if (! addr) + addr = &dummy; + *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1; + dir = depth ? find_stack_direction (addr, depth - 1) : 0; + return dir + dummy; +} + +# 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. */ + STACK_DIR = find_stack_direction (NULL, (size & 1) + 20); +# 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 +# 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 0000000..74b4990 --- /dev/null +++ b/gnulib/lib/alloca.in.h @@ -0,0 +1,56 @@ +/* Memory allocation on the stack. + + Copyright (C) 1995, 1999, 2001-2004, 2006-2011 Free Software Foundation, + Inc. + + This program is free software; you can 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 +# define alloca _alloca +# elif defined __DECC && defined __VMS +# define alloca __ALLOCA +# else +# include +# ifdef __cplusplus +extern "C" +# endif +void *alloca (size_t); +# endif +#endif + +#endif /* _GL_ALLOCA_H */ diff --git a/gnulib/lib/allocator.c b/gnulib/lib/allocator.c new file mode 100644 index 0000000..2c1a3da --- /dev/null +++ b/gnulib/lib/allocator.c @@ -0,0 +1,5 @@ +#define _GL_USE_STDLIB_ALLOC 1 +#include +#include "allocator.h" +#include +struct allocator const stdlib_allocator = { malloc, realloc, free, NULL }; diff --git a/gnulib/lib/allocator.h b/gnulib/lib/allocator.h new file mode 100644 index 0000000..b8de95c --- /dev/null +++ b/gnulib/lib/allocator.h @@ -0,0 +1,58 @@ +/* Memory allocators such as malloc+free. + + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +#ifndef _GL_ALLOCATOR_H +#define _GL_ALLOCATOR_H + +#include + +/* An object describing a memory allocator family. */ + +struct allocator +{ + /* Do not use GCC attributes such as __attribute__ ((malloc)) with + the function types pointed at by these members, because these + attributes do not work with pointers to functions. See + . */ + + /* Call ALLOCATE to allocate memory, like 'malloc'. On failure ALLOCATE + should return NULL, though not necessarily set errno. When given + a zero size it may return NULL even if successful. */ + void *(*allocate) (size_t); + + /* If nonnull, call REALLOCATE to reallocate memory, like 'realloc'. + On failure REALLOCATE should return NULL, though not necessarily set + errno. When given a zero size it may return NULL even if + successful. */ + void *(*reallocate) (void *, size_t); + + /* Call FREE to free memory, like 'free'. */ + void (*free) (void *); + + /* If nonnull, call DIE (SIZE) if MALLOC (SIZE) or REALLOC (..., + SIZE) fails. DIE should not return. SIZE should equal SIZE_MAX + if size_t overflow was detected while calculating sizes to be + passed to MALLOC or REALLOC. */ + void (*die) (size_t); +}; + +/* An allocator using the stdlib functions and a null DIE function. */ +extern struct allocator const stdlib_allocator; + +#endif /* _GL_ALLOCATOR_H */ diff --git a/gnulib/lib/alphasort.c b/gnulib/lib/alphasort.c new file mode 100644 index 0000000..7cbdcfb --- /dev/null +++ b/gnulib/lib/alphasort.c @@ -0,0 +1,28 @@ +/* Copyright (C) 1992, 1997-1998, 2009-2011 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 + +#include + +#include + +int +alphasort (const struct dirent **a, const struct dirent **b) +{ + return strcoll ((*a)->d_name, (*b)->d_name); +} diff --git a/gnulib/lib/amemxfrm.c b/gnulib/lib/amemxfrm.c new file mode 100644 index 0000000..0d75b60 --- /dev/null +++ b/gnulib/lib/amemxfrm.c @@ -0,0 +1,180 @@ +/* Locale dependent memory area transformation for comparison. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "amemxfrm.h" + +#include +#include +#include + +char * +amemxfrm (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. */ + size_t l = strlen (p); + + for (;;) + { + size_t k; + + /* A call to strxfrm costs about 20 times more than a call to + strdup of the result. Therefore it is worth to try to avoid + calling strxfrm more than once on a given string, by making + enough room before calling strxfrm. + The size of the strxfrm result, k, is likely to be between + l and 3 * l. */ + if (3 * l >= allocated - length) + { + /* Grow the result buffer. */ + size_t new_allocated; + char *new_result; + + new_allocated = length + 3 * l + 1; + if (new_allocated < 2 * allocated) + new_allocated = 2 * allocated; + if (new_allocated < 64) + new_allocated = 64; + if (result == resultbuf) + new_result = (char *) malloc (new_allocated); + else + new_result = (char *) realloc (result, new_allocated); + if (new_result != NULL) + { + allocated = new_allocated; + result = new_result; + } + } + + errno = 0; + k = strxfrm (result + length, p, allocated - length); + if (errno != 0) + goto fail; + if (k >= allocated - length) + { + /* Grow the result buffer. */ + size_t new_allocated; + char *new_result; + + new_allocated = length + k + 1; + if (new_allocated < 2 * allocated) + new_allocated = 2 * allocated; + if (new_allocated < 64) + new_allocated = 64; + if (result == resultbuf) + new_result = (char *) malloc (new_allocated); + else + new_result = (char *) realloc (result, new_allocated); + if (new_result == NULL) + goto out_of_memory_1; + allocated = new_allocated; + result = new_result; + } + else + { + length += k; + break; + } + } + + p = p + l + 1; + if (p == p_end) + break; + result[length] = '\0'; + length++; + } + } + + /* Shrink the allocated memory if possible. + It is not worth calling realloc when length + 1 == allocated; it would + save just one byte. */ + if (result != resultbuf && length + 1 < allocated) + { + if ((length > 0 ? length : 1) <= *lengthp) + { + memcpy (resultbuf, result, length); + free (result); + result = resultbuf; + } + else + { + 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/amemxfrm.h b/gnulib/lib/amemxfrm.h new file mode 100644 index 0000000..be8e1df --- /dev/null +++ b/gnulib/lib/amemxfrm.h @@ -0,0 +1,48 @@ +/* Locale dependent memory area transformation for comparison. + Copyright (C) 2009-2011 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 . */ + +#ifndef AMEMXFRM_H +#define AMEMXFRM_H + +#include + +#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 + amemxfrm(S1,N1) and amemxfrm(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 * amemxfrm (char *s, size_t n, char *resultbuf, size_t *lengthp); + + +#ifdef __cplusplus +} +#endif + +#endif /* AMEMXFRM_H */ diff --git a/gnulib/lib/anytostr.c b/gnulib/lib/anytostr.c new file mode 100644 index 0000000..e23746a --- /dev/null +++ b/gnulib/lib/anytostr.c @@ -0,0 +1,55 @@ +/* anytostr.c -- convert integers to printable strings + + Copyright (C) 2001, 2006, 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert */ + +/* Tell gcc not to warn about the (i < 0) test, below. */ +#if (__GNUC__ == 4 && 3 <= __GNUC_MINOR__) || 4 < __GNUC__ +# pragma GCC diagnostic ignored "-Wtype-limits" +#endif + +#include + +#include "inttostr.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 * __attribute_warn_unused_result__ +anytostr (inttype i, char *buf) +{ + char *p = buf + INT_STRLEN_BOUND (inttype); + *p = 0; + + if (i < 0) + { + do + *--p = '0' - i % 10; + while ((i /= 10) != 0); + + *--p = '-'; + } + else + { + do + *--p = '0' + i % 10; + while ((i /= 10) != 0); + } + + return p; +} diff --git a/gnulib/lib/arcfour.c b/gnulib/lib/arcfour.c new file mode 100644 index 0000000..7df321b --- /dev/null +++ b/gnulib/lib/arcfour.c @@ -0,0 +1,77 @@ +/* arcfour.c --- The arcfour stream cipher + * Copyright (C) 2000-2003, 2005-2006, 2009-2011 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 + +#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 0000000..5e4cee7 --- /dev/null +++ b/gnulib/lib/arcfour.h @@ -0,0 +1,50 @@ +/* arcfour.h --- The arcfour stream cipher + * Copyright (C) 2000-2005, 2009-2011 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 +# include + +#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 0000000..4e90895 --- /dev/null +++ b/gnulib/lib/arctwo.c @@ -0,0 +1,228 @@ +/* arctwo.c --- The RC2 cipher as described in RFC 2268. + * Copyright (C) 2003-2006, 2008-2011 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 + +#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 0000000..dc23aeb --- /dev/null +++ b/gnulib/lib/arctwo.h @@ -0,0 +1,63 @@ +/* arctwo.h --- The arctwo block cipher + * Copyright (C) 2000-2003, 2005, 2009-2011 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 +# include + +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 0000000..e7e21b7 --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Jim Meyering */ + +#include + +#include "areadlink.h" + +#include +#include +#include +#include +#include + +#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 0000000..6bf9a0c --- /dev/null +++ b/gnulib/lib/areadlink.c @@ -0,0 +1,39 @@ +/* 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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Jim Meyering + and Bruno Haible . */ + +#include + +/* Specification. */ +#include "areadlink.h" + +#include "careadlinkat.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 allocation fails, or if the link value is longer than SIZE_MAX :-), + return NULL and set errno to ENOMEM. */ + +char * +areadlink (char const *filename) +{ + return careadlinkat (AT_FDCWD, filename, NULL, 0, NULL, careadlinkatcwd); +} diff --git a/gnulib/lib/areadlink.h b/gnulib/lib/areadlink.h new file mode 100644 index 0000000..30e3b69 --- /dev/null +++ b/gnulib/lib/areadlink.h @@ -0,0 +1,33 @@ +/* Read symbolic links without size limitation. + + Copyright (C) 2001, 2003-2004, 2007, 2009-2011 Free Software Foundation, + Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Jim Meyering */ + +#include + +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 0000000..2469be8 --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Jim Meyering + and Eric Blake . */ + +#include + +#include "areadlink.h" + +#include +#include +#include +#include +#include + +#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 0000000..2c227f3 --- /dev/null +++ b/gnulib/lib/areadlinkat.c @@ -0,0 +1,65 @@ +/* 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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Jim Meyering , + and Bruno Haible , + and Eric Blake . */ + +#include + +/* Specification. */ +#include "areadlink.h" + +#include "careadlinkat.h" + +#if HAVE_READLINKAT + +/* 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 allocation 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) +{ + return careadlinkat (fd, filename, NULL, 0, NULL, readlinkat); +} + +#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 0000000..6adbef6 --- /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-2007, 2009-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by David MacKenzie + Modified by Akim Demaille */ + +#include + +/* Specification. */ +#include "argmatch.h" + +#include +#include +#include +#include + +#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 */ + fputs (_("Valid arguments are:"), stderr); + for (i = 0; arglist[i]; i++) + if ((i == 0) + || memcmp (last_val, vallist + valsize * i, valsize)) + { + fprintf (stderr, "\n - %s", quote (arglist[i])); + last_val = vallist + valsize * i; + } + else + { + fprintf (stderr, ", %s", quote (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 + */ +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 0000000..b1a1193 --- /dev/null +++ b/gnulib/lib/argmatch.h @@ -0,0 +1,103 @@ +/* argmatch.h -- definitions and prototypes for argmatch.c + + Copyright (C) 1990, 1998-1999, 2001-2002, 2004-2005, 2009-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by David MacKenzie + Modified by Akim Demaille */ + +#ifndef ARGMATCH_H_ +# define ARGMATCH_H_ 1 + +# include + +# 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) _GL_ATTRIBUTE_PURE; + +# 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, report an explanation of the + failure, and exit 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) + _GL_ATTRIBUTE_PURE; + +# 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 0000000..a03b134 --- /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-2011 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Written by Miles Bader . + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* 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 + + . */ +#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 0000000..1082a39 --- /dev/null +++ b/gnulib/lib/argp-eexst.c @@ -0,0 +1,30 @@ +/* Default definition for ARGP_ERR_EXIT_STATUS + Copyright (C) 1997, 2009-2011 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Written by Miles Bader . + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#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 + . */ +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 0000000..c308eb6 --- /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-2011 Free Software + Foundation, Inc. + This file is part of the GNU C Library. + Written by Miles Bader . + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* This package emulates glibc `line_wrap_stream' semantics for systems that + don't have that. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include + +#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 +# include +# 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 0000000..f664254 --- /dev/null +++ b/gnulib/lib/argp-fmtstream.h @@ -0,0 +1,354 @@ +/* Word-wrapping and line-truncating streams. + Copyright (C) 1997, 2006-2011 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Written by Miles Bader . + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* 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 +#include +#include + +/* 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 _GL_ATTRIBUTE_FORMAT 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 _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec)) +#else +# define _GL_ATTRIBUTE_FORMAT(spec) /* empty */ +#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 + +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, ...) + _GL_ATTRIBUTE_FORMAT ((printf, 2, 3)); +extern ssize_t argp_fmtstream_printf (argp_fmtstream_t __fs, + const char *__fmt, ...) + _GL_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 0000000..8dd679c --- /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-2011 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Written by Miles Bader . + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifdef HAVE_CONFIG_H +# include +#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 0000000..ec7fcda --- /dev/null +++ b/gnulib/lib/argp-help.c @@ -0,0 +1,1954 @@ +/* Hierarchial argument parsing help output + Copyright (C) 1995-2005, 2007, 2009-2011 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Written by Miles Bader . + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef USE_IN_LIBIO +# include +#endif + +#ifdef _LIBC +# include +# 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 a 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 an 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 +#if __GNUC__ >= 3 +__attribute__ ((always_inline)) +#endif +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 an 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 + (e->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 an 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 && !defined strerror_r) + 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 0000000..5f6b020 --- /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-2011 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Written by Miles Bader . + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#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 0000000..64360be --- /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-2011 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Written by Miles Bader . + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef _LIBC +# include +# 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 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; + /* A 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 0000000..c966756 --- /dev/null +++ b/gnulib/lib/argp-pin.c @@ -0,0 +1,27 @@ +/* Full and short program names for argp module + Copyright (C) 2005, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifdef HAVE_CONFIG_H +# include +#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 0000000..7a8cba7 --- /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-2011 Free Software Foundation, + Inc. + This file is part of the GNU C Library. + Written by Miles Bader . + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* 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 + + . */ +#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 0000000..04f6603 --- /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-2011 Free Software Foundation, + Inc. + This file is part of the GNU C Library. + Written by Miles Bader . + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifdef HAVE_CONFIG_H +# include +#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 0000000..dca14f3 --- /dev/null +++ b/gnulib/lib/argp-version-etc.c @@ -0,0 +1,38 @@ +/* Version hook for Argp. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include +#include +#include +#include + +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 0000000..53a8517 --- /dev/null +++ b/gnulib/lib/argp-version-etc.h @@ -0,0 +1,40 @@ +/* Version hook for Argp. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#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 0000000..5b1f6fb --- /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-2011 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Written by Miles Bader . + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#if defined _LIBC || defined HAVE_FEATURES_H +# include +#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 0000000..c0483ab --- /dev/null +++ b/gnulib/lib/argp.h @@ -0,0 +1,645 @@ +/* Hierarchial argument parsing, layered over getopt. + Copyright (C) 1995-1999, 2003-2011 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Written by Miles Bader . + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef _ARGP_H +#define _ARGP_H + +#include +#include +#include +#include + +#define __need_error_t +#include + +#ifndef __THROW +# define __THROW +#endif +#ifndef __NTH +# define __NTH(fct) fct __THROW +#endif + +/* 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 _GL_ATTRIBUTE_FORMAT 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 _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec)) +#else +# define _GL_ATTRIBUTE_FORMAT(spec) /* empty */ +#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 + . */ +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, ...) + _GL_ATTRIBUTE_FORMAT ((__printf__, 2, 3)); +extern void __argp_error (const struct argp_state *__restrict __state, + const char *__restrict __fmt, ...) + _GL_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, ...) + _GL_ATTRIBUTE_FORMAT ((__printf__, 4, 5)); +extern void __argp_failure (const struct argp_state *__restrict __state, + int __status, int __errnum, + const char *__restrict __fmt, ...) + _GL_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 0000000..340e588 --- /dev/null +++ b/gnulib/lib/argv-iter.c @@ -0,0 +1,111 @@ +/* Iterate over arguments from argv or --files0-from=FILE + Copyright (C) 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Jim Meyering. */ + +#include +#include "argv-iter.h" + +#include +#include + +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 0000000..73db77d --- /dev/null +++ b/gnulib/lib/argv-iter.h @@ -0,0 +1,42 @@ +/* Iterate over arguments from argv or --files0-from=FILE + Copyright (C) 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include +#include + +/* Definition of _GL_ARG_NONNULL. */ +#include "arg-nonnull.h" + +struct argv_iterator; + +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_ATTRIBUTE_PURE _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 0000000..8745c89 --- /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-2011 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 + +#include +#include +#include +#include + + + +/* 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 0000000..d769350 --- /dev/null +++ b/gnulib/lib/argz.in.h @@ -0,0 +1,160 @@ +/* Routines for dealing with '\0' separated arg vectors. + Copyright (C) 1995-2000, 2004, 2007, 2009-2011 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 . */ + +#ifndef _ARGZ_H +#define _ARGZ_H 1 + + +#define __need_error_t +#include +#include /* 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 0000000..bf18316 --- /dev/null +++ b/gnulib/lib/arpa_inet.in.h @@ -0,0 +1,141 @@ +/* A GNU-like . + + Copyright (C) 2005-2006, 2008-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 _@GUARD_PREFIX@_ARPA_INET_H + +#if __GNUC__ >= 3 +@PRAGMA_SYSTEM_HEADER@ +#endif +@PRAGMA_COLUMNS@ + +#if @HAVE_FEATURES_H@ +# include /* for __GLIBC__ */ +#endif + +/* Gnulib's sys/socket.h is responsible for defining socklen_t (used below) and + for pulling in winsock2.h etc. under MinGW. + But avoid namespace pollution on glibc systems. */ +#ifndef __GLIBC__ +# include +#endif + +/* On NonStop Kernel, inet_ntop and inet_pton are declared in . + But avoid namespace pollution on glibc systems. */ +#if defined __TANDEM && !defined __GLIBC__ +# include +#endif + +#if @HAVE_ARPA_INET_H@ + +/* The include_next requires a split double-inclusion guard. */ +# @INCLUDE_NEXT@ @NEXT_ARPA_INET_H@ + +#endif + +#ifndef _@GUARD_PREFIX@_ARPA_INET_H +#define _@GUARD_PREFIX@_ARPA_INET_H + +/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ + +/* The definition of _GL_ARG_NONNULL is copied here. */ + +/* The definition of _GL_WARN_ON_USE is copied here. */ + + +#if @GNULIB_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 + . */ +# if @REPLACE_INET_NTOP@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef inet_ntop +# define inet_ntop rpl_inet_ntop +# endif +_GL_FUNCDECL_RPL (inet_ntop, const char *, + (int af, const void *restrict src, + char *restrict dst, socklen_t cnt) + _GL_ARG_NONNULL ((2, 3))); +_GL_CXXALIAS_RPL (inet_ntop, const char *, + (int af, const void *restrict src, + char *restrict dst, socklen_t cnt)); +# else +# if !@HAVE_DECL_INET_NTOP@ +_GL_FUNCDECL_SYS (inet_ntop, const char *, + (int af, const void *restrict src, + char *restrict dst, socklen_t cnt) + _GL_ARG_NONNULL ((2, 3))); +# endif +/* Need to cast, because on NonStop Kernel, the fourth parameter is + size_t cnt. */ +_GL_CXXALIAS_SYS_CAST (inet_ntop, const char *, + (int af, const void *restrict src, + char *restrict dst, socklen_t cnt)); +# endif +_GL_CXXALIASWARN (inet_ntop); +#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 @REPLACE_INET_PTON@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef inet_pton +# define inet_pton rpl_inet_pton +# endif +_GL_FUNCDECL_RPL (inet_pton, int, + (int af, const char *restrict src, void *restrict dst) + _GL_ARG_NONNULL ((2, 3))); +_GL_CXXALIAS_RPL (inet_pton, int, + (int af, const char *restrict src, void *restrict dst)); +# else +# if !@HAVE_DECL_INET_PTON@ +_GL_FUNCDECL_SYS (inet_pton, int, + (int af, const char *restrict src, void *restrict dst) + _GL_ARG_NONNULL ((2, 3))); +# endif +_GL_CXXALIAS_SYS (inet_pton, int, + (int af, const char *restrict src, void *restrict dst)); +# endif +_GL_CXXALIASWARN (inet_pton); +#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 + + +#endif /* _@GUARD_PREFIX@_ARPA_INET_H */ +#endif /* _@GUARD_PREFIX@_ARPA_INET_H */ diff --git a/gnulib/lib/array-mergesort.h b/gnulib/lib/array-mergesort.h new file mode 100644 index 0000000..b26341b --- /dev/null +++ b/gnulib/lib/array-mergesort.h @@ -0,0 +1,274 @@ +/* Stable-sorting of an array using mergesort. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +/* 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 + */ + +/* 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/asinf.c b/gnulib/lib/asinf.c new file mode 100644 index 0000000..82f1d34 --- /dev/null +++ b/gnulib/lib/asinf.c @@ -0,0 +1,26 @@ +/* Inverse sine function. + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +float +asinf (float x) +{ + return (float) asin ((double) x); +} diff --git a/gnulib/lib/asinl.c b/gnulib/lib/asinl.c new file mode 100644 index 0000000..6e4368d --- /dev/null +++ b/gnulib/lib/asinl.c @@ -0,0 +1,232 @@ +/* + * ==================================================== + * 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 + +/* Specification. */ +#include + +#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE + +long double +asinl (long double x) +{ + return asin (x); +} + +#else + +/* + Long double expansions contributed by + Stephen L. Moshier +*/ + +/* 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; +} + +#endif + +#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 0000000..df54bbc --- /dev/null +++ b/gnulib/lib/asnprintf.c @@ -0,0 +1,35 @@ +/* Formatted output to strings. + Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 + +/* Specification. */ +#include "vasnprintf.h" + +#include + +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 0000000..b0f7b1b --- /dev/null +++ b/gnulib/lib/asprintf.c @@ -0,0 +1,40 @@ +/* Formatted output to strings. + Copyright (C) 1999, 2002, 2006-2007, 2009-2011 Free Software Foundation, + Inc. + + This program is free software; you can 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 + +/* Specification. */ +#ifdef IN_LIBASPRINTF +# include "vasprintf.h" +#else +# include +#endif + +#include + +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/assert.in.h b/gnulib/lib/assert.in.h new file mode 100644 index 0000000..1857ceb --- /dev/null +++ b/gnulib/lib/assert.in.h @@ -0,0 +1,28 @@ +/* Substitute for and wrapper around + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software; you can redistribute 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. */ + +/* Do not guard the include, since is supposed to define + the assert macro each time it is included. */ + +#if __GNUC__ >= 3 +@PRAGMA_SYSTEM_HEADER@ +#endif +@PRAGMA_COLUMNS@ + +#@INCLUDE_NEXT@ @NEXT_ASSERT_H@ + +/* The definition of static_assert is copied here. */ diff --git a/gnulib/lib/astrxfrm.c b/gnulib/lib/astrxfrm.c new file mode 100644 index 0000000..eb48643 --- /dev/null +++ b/gnulib/lib/astrxfrm.c @@ -0,0 +1,181 @@ +/* Locale dependent string transformation for comparison. + Copyright (C) 2010-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2010. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "astrxfrm.h" + +#include +#include +#include + +char * +astrxfrm (const char *s, char *resultbuf, size_t *lengthp) +{ + char tmpbuf[4000]; + char *result; /* either == resultbuf or == tmpbuf or freshly allocated + or NULL. */ + size_t allocated; /* number of bytes allocated at result */ + size_t length; + + if (resultbuf != NULL) + { + result = resultbuf; + allocated = *lengthp; + } + else + { + result = NULL; + allocated = 0; + } + + { + size_t l = strlen (s); + size_t k; + + /* A call to strxfrm costs about 20 times more than a call to strdup of + the result. Therefore it is worth to try to avoid calling strxfrm + more than once on a given string, by making enough room before calling + strxfrm. The size of the strxfrm result, k, is likely to be between + l and 3 * l. */ + if (3 * l + 1 > allocated) + { + /* Grow the result buffer. */ + if (3 * l + 1 <= sizeof (tmpbuf)) + { + result = tmpbuf; + allocated = sizeof (tmpbuf); + } + else + { + size_t new_allocated; + char *new_result; + + new_allocated = 3 * l + 1; + if (new_allocated < 2 * allocated) + new_allocated = 2 * allocated; + new_result = (char *) malloc (new_allocated); + if (new_result != NULL) + { + allocated = new_allocated; + result = new_result; + } + } + } + + errno = 0; + k = strxfrm (result, s, allocated); + if (errno != 0) + goto fail; + if (k >= allocated) + { + /* Grow the result buffer. */ + if (result != resultbuf && result != tmpbuf) + free (result); + if (k + 1 <= sizeof (tmpbuf)) + { + result = tmpbuf; + allocated = sizeof (tmpbuf); + } + else + { + size_t new_allocated; + char *new_result; + + new_allocated = k + 1; + new_result = (char *) malloc (new_allocated); + if (new_result == NULL) + goto out_of_memory; + allocated = new_allocated; + result = new_result; + } + /* Here k < allocated. */ + + /* Try again. */ + errno = 0; + if (strxfrm (result, s, allocated) != k) + /* strxfrm() is not producing reproducible results. */ + abort (); + if (errno != 0) + goto fail; + } + + /* Verify that strxfrm() has NUL-terminated the result. */ + if (result[k] != '\0') + abort (); + length = k + 1; + } + + /* Here length > 0. */ + + if (result == tmpbuf) + { + if (resultbuf != NULL && length <= *lengthp) + { + memcpy (resultbuf, result, length); + result = resultbuf; + } + else + { + char *memory = (char *) malloc (length); + + if (memory == NULL) + goto out_of_memory; + memcpy (memory, result, length); + result = memory; + } + } + else + { + /* Shrink the allocated memory if possible. */ + if (result != resultbuf && length < allocated) + { + if (length <= *lengthp) + { + memcpy (resultbuf, result, length); + free (result); + result = resultbuf; + } + else + { + char *memory = (char *) realloc (result, length); + if (memory != NULL) + { + memcpy (memory, result, length); + result = memory; + } + } + } + } + + *lengthp = length; + return result; + + fail: + { + int saved_errno = errno; + if (result != resultbuf && result != tmpbuf) + free (result); + errno = saved_errno; + return NULL; + } + + out_of_memory: + errno = ENOMEM; + return NULL; +} diff --git a/gnulib/lib/astrxfrm.h b/gnulib/lib/astrxfrm.h new file mode 100644 index 0000000..372c350 --- /dev/null +++ b/gnulib/lib/astrxfrm.h @@ -0,0 +1,47 @@ +/* Locale dependent string transformation for comparison. + Copyright (C) 2010-2011 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 . */ + +#ifndef ASTRXFRM_H +#define ASTRXFRM_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +/* Variant of strxfrm() with a calling convention that reduces the number + of strxfrm calls. */ + +/* Transform the string starting at S to a string, in such a way that + comparing S1 and S2 with strcoll() is equivalent to comparing astrxfrm(S1) + and astrxfrm(S2) with strcmp(). + 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 * astrxfrm (const char *s, char *resultbuf, size_t *lengthp); + + +#ifdef __cplusplus +} +#endif + +#endif /* ASTRXFRM_H */ diff --git a/gnulib/lib/at-func.c b/gnulib/lib/at-func.c new file mode 100644 index 0000000..5d1cd14 --- /dev/null +++ b/gnulib/lib/at-func.c @@ -0,0 +1,131 @@ +/* Define at-style functions like fstatat, unlinkat, fchownat, etc. + Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Jim Meyering */ + +#include "dosname.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 0000000..0983a77 --- /dev/null +++ b/gnulib/lib/at-func2.c @@ -0,0 +1,282 @@ +/* Define 2-FD at-style functions like linkat or renameat. + Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Jim Meyering and Eric Blake */ + +#include + +#include "openat-priv.h" + +#include +#include +#include +#include + +#include "dosname.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/atan2f.c b/gnulib/lib/atan2f.c new file mode 100644 index 0000000..09771f6 --- /dev/null +++ b/gnulib/lib/atan2f.c @@ -0,0 +1,26 @@ +/* Angle of a point in the plane. + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +float +atan2f (float y, float x) +{ + return (float) atan2 ((double) y, (double) x); +} diff --git a/gnulib/lib/atanf.c b/gnulib/lib/atanf.c new file mode 100644 index 0000000..f8bd4f1 --- /dev/null +++ b/gnulib/lib/atanf.c @@ -0,0 +1,26 @@ +/* Inverse tangent function. + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +float +atanf (float x) +{ + return (float) atan ((double) x); +} diff --git a/gnulib/lib/atanl.c b/gnulib/lib/atanl.c new file mode 100644 index 0000000..4d09c2f --- /dev/null +++ b/gnulib/lib/atanl.c @@ -0,0 +1,236 @@ +/* Copyright 2001 by Stephen L. Moshier + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE + +long double +atanl (long double x) +{ + return atan (x); +} + +#else + +/* 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; +} + +#endif diff --git a/gnulib/lib/atexit.c b/gnulib/lib/atexit.c new file mode 100644 index 0000000..5ef33e5 --- /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 + +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 0000000..d9467b7 --- /dev/null +++ b/gnulib/lib/atoll.c @@ -0,0 +1,34 @@ +/* Copyright (C) 1991, 1997-1998, 2008-2011 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 . */ + +#if !_LIBC +# include +#endif + +/* Specification. */ +#include + +#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 0000000..8633065 --- /dev/null +++ b/gnulib/lib/backupfile.c @@ -0,0 +1,355 @@ +/* backupfile.c -- make Emacs style backup file names + + Copyright (C) 1990-2006, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert and David MacKenzie. + Some algorithms adapted from GNU Emacs. */ + +#include + +#include "backupfile.h" + +#include "argmatch.h" +#include "dirname.h" +#include "xalloc.h" + +#include +#include +#include +#include + +#include + +#include + +#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 0000000..ca9f762 --- /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-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#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/base32.c b/gnulib/lib/base32.c new file mode 100644 index 0000000..45af45c --- /dev/null +++ b/gnulib/lib/base32.c @@ -0,0 +1,588 @@ +/* base32.c -- Encode binary data using printable characters. + Copyright (C) 1999-2001, 2004-2006, 2009-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 from Simon Josefsson's base64 code by Gijs van Tulder. + * + * See also RFC 4648 . + * + * Be careful with error checking. Here is how you would typically + * use these functions: + * + * bool ok = base32_decode_alloc (in, inlen, &out, &outlen); + * if (!ok) + * FAIL: input was not valid base32 + * if (out == NULL) + * FAIL: memory allocation error + * OK: data in OUT/OUTLEN + * + * size_t outlen = base32_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 + +/* Get prototype. */ +#include "base32.h" + +/* Get malloc. */ +#include + +/* Get UCHAR_MAX. */ +#include + +#include + +/* C89 compliant way to cast 'char' to 'unsigned char'. */ +static inline unsigned char +to_uchar (char ch) +{ + return ch; +} + +/* Base32 encode IN array of size INLEN into OUT array of size OUTLEN. + If OUTLEN is less than BASE32_LENGTH(INLEN), write as many bytes as + possible. If OUTLEN is larger than BASE32_LENGTH(INLEN), also zero + terminate the output buffer. */ +void +base32_encode (const char *restrict in, size_t inlen, + char *restrict out, size_t outlen) +{ + static const char b32str[32] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"; + + while (inlen && outlen) + { + *out++ = b32str[(to_uchar (in[0]) >> 3) & 0x1f]; + if (!--outlen) + break; + *out++ = b32str[((to_uchar (in[0]) << 2) + + (--inlen ? to_uchar (in[1]) >> 6 : 0)) + & 0x1f]; + if (!--outlen) + break; + *out++ = + (inlen + ? b32str[(to_uchar (in[1]) >> 1) & 0x1f] + : '='); + if (!--outlen) + break; + *out++ = + (inlen + ? b32str[((to_uchar (in[1]) << 4) + + (--inlen ? to_uchar (in[2]) >> 4 : 0)) + & 0x1f] + : '='); + if (!--outlen) + break; + *out++ = + (inlen + ? b32str[((to_uchar (in[2]) << 1) + + (--inlen ? to_uchar (in[3]) >> 7 : 0)) + & 0x1f] + : '='); + if (!--outlen) + break; + *out++ = + (inlen + ? b32str[(to_uchar (in[3]) >> 2) & 0x1f] + : '='); + if (!--outlen) + break; + *out++ = + (inlen + ? b32str[((to_uchar (in[3]) << 3) + + (--inlen ? to_uchar (in[4]) >> 5 : 0)) + & 0x1f] + : '='); + if (!--outlen) + break; + *out++ = inlen ? b32str[to_uchar (in[4]) & 0x1f] : '='; + if (!--outlen) + break; + if (inlen) + inlen--; + if (inlen) + in += 5; + } + + if (outlen) + *out = '\0'; +} + +/* Allocate a buffer and store zero terminated base32 encoded data + from array IN of size INLEN, returning BASE32_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., + BASE32_LENGTH(inlen) + 1. */ +size_t +base32_encode_alloc (const char *in, size_t inlen, char **out) +{ + size_t outlen = 1 + BASE32_LENGTH (inlen); + + /* Check for overflow in outlen computation. + * + * If there is no overflow, outlen >= inlen. + * + * TODO Is this a sufficient check? (See the notes in base64.c.) + */ + if (inlen > outlen) + { + *out = NULL; + return 0; + } + + *out = malloc (outlen); + if (!*out) + return outlen; + + base32_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 + Base32 alphabet (A-Z2-7) 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 B32(x) ...'x'...", so use "_" + as the formal parameter rather than "x". */ +#define B32(_) \ + ((_) == '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 \ + : (_) == '2' ? 26 \ + : (_) == '3' ? 27 \ + : (_) == '4' ? 28 \ + : (_) == '5' ? 29 \ + : (_) == '6' ? 30 \ + : (_) == '7' ? 31 \ + : -1) + +static const signed char b32[0x100] = { + B32 (0), B32 (1), B32 (2), B32 (3), + B32 (4), B32 (5), B32 (6), B32 (7), + B32 (8), B32 (9), B32 (10), B32 (11), + B32 (12), B32 (13), B32 (14), B32 (15), + B32 (16), B32 (17), B32 (18), B32 (19), + B32 (20), B32 (21), B32 (22), B32 (23), + B32 (24), B32 (25), B32 (26), B32 (27), + B32 (28), B32 (29), B32 (30), B32 (31), + B32 (32), B32 (33), B32 (34), B32 (35), + B32 (36), B32 (37), B32 (38), B32 (39), + B32 (40), B32 (41), B32 (42), B32 (43), + B32 (44), B32 (45), B32 (46), B32 (47), + B32 (48), B32 (49), B32 (50), B32 (51), + B32 (52), B32 (53), B32 (54), B32 (55), + B32 (56), B32 (57), B32 (58), B32 (59), + B32 (60), B32 (61), B32 (62), B32 (63), + B32 (32), B32 (65), B32 (66), B32 (67), + B32 (68), B32 (69), B32 (70), B32 (71), + B32 (72), B32 (73), B32 (74), B32 (75), + B32 (76), B32 (77), B32 (78), B32 (79), + B32 (80), B32 (81), B32 (82), B32 (83), + B32 (84), B32 (85), B32 (86), B32 (87), + B32 (88), B32 (89), B32 (90), B32 (91), + B32 (92), B32 (93), B32 (94), B32 (95), + B32 (96), B32 (97), B32 (98), B32 (99), + B32 (100), B32 (101), B32 (102), B32 (103), + B32 (104), B32 (105), B32 (106), B32 (107), + B32 (108), B32 (109), B32 (110), B32 (111), + B32 (112), B32 (113), B32 (114), B32 (115), + B32 (116), B32 (117), B32 (118), B32 (119), + B32 (120), B32 (121), B32 (122), B32 (123), + B32 (124), B32 (125), B32 (126), B32 (127), + B32 (128), B32 (129), B32 (130), B32 (131), + B32 (132), B32 (133), B32 (134), B32 (135), + B32 (136), B32 (137), B32 (138), B32 (139), + B32 (140), B32 (141), B32 (142), B32 (143), + B32 (144), B32 (145), B32 (146), B32 (147), + B32 (148), B32 (149), B32 (150), B32 (151), + B32 (152), B32 (153), B32 (154), B32 (155), + B32 (156), B32 (157), B32 (158), B32 (159), + B32 (160), B32 (161), B32 (162), B32 (163), + B32 (132), B32 (165), B32 (166), B32 (167), + B32 (168), B32 (169), B32 (170), B32 (171), + B32 (172), B32 (173), B32 (174), B32 (175), + B32 (176), B32 (177), B32 (178), B32 (179), + B32 (180), B32 (181), B32 (182), B32 (183), + B32 (184), B32 (185), B32 (186), B32 (187), + B32 (188), B32 (189), B32 (190), B32 (191), + B32 (192), B32 (193), B32 (194), B32 (195), + B32 (196), B32 (197), B32 (198), B32 (199), + B32 (200), B32 (201), B32 (202), B32 (203), + B32 (204), B32 (205), B32 (206), B32 (207), + B32 (208), B32 (209), B32 (210), B32 (211), + B32 (212), B32 (213), B32 (214), B32 (215), + B32 (216), B32 (217), B32 (218), B32 (219), + B32 (220), B32 (221), B32 (222), B32 (223), + B32 (224), B32 (225), B32 (226), B32 (227), + B32 (228), B32 (229), B32 (230), B32 (231), + B32 (232), B32 (233), B32 (234), B32 (235), + B32 (236), B32 (237), B32 (238), B32 (239), + B32 (240), B32 (241), B32 (242), B32 (243), + B32 (244), B32 (245), B32 (246), B32 (247), + B32 (248), B32 (249), B32 (250), B32 (251), + B32 (252), B32 (253), B32 (254), B32 (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 Base32 alphabet, and + false otherwise. Note that '=' is padding and not considered to be + part of the alphabet. */ +bool +isbase32 (char ch) +{ + return uchar_in_range (to_uchar (ch)) && 0 <= b32[to_uchar (ch)]; +} + +/* Initialize decode-context buffer, CTX. */ +void +base32_decode_ctx_init (struct base32_decode_context *ctx) +{ + ctx->i = 0; +} + +/* If CTX->i is 0 or 8, there are eight or more bytes in [*IN..IN_END), and + none of those eight 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_8 (struct base32_decode_context *ctx, + char const *restrict *in, char const *restrict in_end, + size_t *n_non_newline) +{ + if (ctx->i == 8) + ctx->i = 0; + + if (ctx->i == 0) + { + char const *t = *in; + if (8 <= in_end - *in && memchr (t, '\n', 8) == NULL) + { + /* This is the common case: no newline. */ + *in += 8; + *n_non_newline = 8; + 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 == 8) + break; + } + } + + *in = p; + *n_non_newline = ctx->i; + return ctx->buf; + } +} + +#define return_false \ + do \ + { \ + *outp = out; \ + return false; \ + } \ + while (false) + +/* Decode eight bytes of base32-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_8 (char const *restrict in, size_t inlen, + char *restrict *outp, size_t *outleft) +{ + char *out = *outp; + if (inlen < 8) + return false; + + if (!isbase32 (in[0]) || !isbase32 (in[1]) ) + return false; + + if (*outleft) + { + *out++ = ((b32[to_uchar (in[0])] << 3) + | (b32[to_uchar (in[1])] >> 2)); + --*outleft; + } + + if (in[2] == '=') + { + if (in[3] != '=' || in[4] != '=' || in[5] != '=' + || in[6] != '=' || in[7] != '=') + return_false; + } + else + { + if (!isbase32 (in[2]) || !isbase32 (in[3])) + return_false; + + if (*outleft) + { + *out++ = ((b32[to_uchar (in[1])] << 6) + | (b32[to_uchar (in[2])] << 1) + | (b32[to_uchar (in[3])] >> 4)); + --*outleft; + } + + if (in[4] == '=') + { + if (in[5] != '=' || in[6] != '=' || in[7] != '=') + return_false; + } + else + { + if (!isbase32 (in[4])) + return_false; + + if (*outleft) + { + *out++ = ((b32[to_uchar (in[3])] << 4) + | (b32[to_uchar (in[4])] >> 1)); + --*outleft; + } + + if (in[5] == '=') + { + if (in[6] != '=' || in[7] != '=') + return_false; + } + else + { + if (!isbase32 (in[5]) || !isbase32 (in[6])) + return_false; + + if (*outleft) + { + *out++ = ((b32[to_uchar (in[4])] << 7) + | (b32[to_uchar (in[5])] << 2) + | (b32[to_uchar (in[6])] >> 3)); + --*outleft; + } + + if (in[7] != '=') + { + if (!isbase32 (in[7])) + return_false; + + if (*outleft) + { + *out++ = ((b32[to_uchar (in[6])] << 5) + | (b32[to_uchar (in[7])])); + --*outleft; + } + } + } + } + } + + *outp = out; + return true; +} + +/* Decode base32-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 base32 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 base32_decode_ctx_init. + Subsequent calls to this function must reuse whatever state is recorded + in that buffer. It is necessary for when a octuple of base32 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 +base32_decode_ctx (struct base32_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_8 (in, inlen, &out, &outleft)) + break; + + in += 8; + inlen -= 8; + } + } + + if (inlen == 0 && !flush_ctx) + break; + + /* Handle the common case of 72-byte wrapped lines. + This also handles any other multiple-of-8-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_8 (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 8 bytes when not + flushing context and not treating newlines as garbage. */ + if (inlen == 0 || (inlen < 8 && !flush_ctx && ignore_newlines)) + { + inlen = 0; + break; + } + if (!decode_8 (non_nl, inlen, &out, &outleft)) + break; + + inlen = in_end - in; + } + } + + *outlen -= outleft; + + return inlen == 0; +} + +/* Allocate an output buffer in *OUT, and decode the base32 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 +base32_decode_alloc_ctx (struct base32_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 5 * inlen / 8, minus one or more bytes if the + input is padded with one or more "=". + Dividing before multiplying avoids the possibility of overflow. */ + size_t needlen = 5 * (inlen / 8) + 5; + + *out = malloc (needlen); + if (!*out) + return true; + + if (!base32_decode_ctx (ctx, in, inlen, *out, &needlen)) + { + free (*out); + *out = NULL; + return false; + } + + if (outlen) + *outlen = needlen; + + return true; +} diff --git a/gnulib/lib/base32.h b/gnulib/lib/base32.h new file mode 100644 index 0000000..8768686 --- /dev/null +++ b/gnulib/lib/base32.h @@ -0,0 +1,61 @@ +/* base32.h -- Encode binary data using printable characters. + Copyright (C) 2004-2006, 2009-2011 Free Software Foundation, Inc. + Adapted from Simon Josefsson's base64 code by Gijs van Tulder. + + This program is free software; you can 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 BASE32_H +# define BASE32_H + +/* Get size_t. */ +# include + +/* Get bool. */ +# include + +/* This uses that the expression (n+(k-1))/k means the smallest + integer >= n/k, i.e., the ceiling of n/k. */ +# define BASE32_LENGTH(inlen) ((((inlen) + 4) / 5) * 8) + +struct base32_decode_context +{ + unsigned int i; + char buf[8]; +}; + +extern bool isbase32 (char ch); + +extern void base32_encode (const char *restrict in, size_t inlen, + char *restrict out, size_t outlen); + +extern size_t base32_encode_alloc (const char *in, size_t inlen, char **out); + +extern void base32_decode_ctx_init (struct base32_decode_context *ctx); + +extern bool base32_decode_ctx (struct base32_decode_context *ctx, + const char *restrict in, size_t inlen, + char *restrict out, size_t *outlen); + +extern bool base32_decode_alloc_ctx (struct base32_decode_context *ctx, + const char *in, size_t inlen, + char **out, size_t *outlen); + +#define base32_decode(in, inlen, out, outlen) \ + base32_decode_ctx (NULL, in, inlen, out, outlen) + +#define base32_decode_alloc(in, inlen, out, outlen) \ + base32_decode_alloc_ctx (NULL, in, inlen, out, outlen) + +#endif /* BASE32_H */ diff --git a/gnulib/lib/base64.c b/gnulib/lib/base64.c new file mode 100644 index 0000000..cbe9a63 --- /dev/null +++ b/gnulib/lib/base64.c @@ -0,0 +1,575 @@ +/* base64.c -- Encode binary data using printable characters. + Copyright (C) 1999-2001, 2004-2006, 2009-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 4648 . + * + * 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 + +/* Get prototype. */ +#include "base64.h" + +/* Get malloc. */ +#include + +/* Get UCHAR_MAX. */ +#include + +#include + +/* 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 + (ctx ? ctx->i : 0)) / 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) + 3; + + *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 0000000..1d65edc --- /dev/null +++ b/gnulib/lib/base64.h @@ -0,0 +1,61 @@ +/* base64.h -- Encode binary data using printable characters. + Copyright (C) 2004-2006, 2009-2011 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 + +/* Get bool. */ +# include + +/* 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) _GL_ATTRIBUTE_CONST; + +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 0000000..529bc35 --- /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-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#include "dirname.h" + +#include + +/* 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 0000000..90ac501 --- /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-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#include "dirname.h" + +#include +#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 0000000..c3e8caa --- /dev/null +++ b/gnulib/lib/bcopy.c @@ -0,0 +1,23 @@ +/* bcopy.c -- copy memory. + Copy LENGTH bytes from SOURCE to DEST. Does not null-terminate. + In the public domain. + By David MacKenzie . */ + +#include + +#include + +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 0000000..c09dbf5 --- /dev/null +++ b/gnulib/lib/binary-io.h @@ -0,0 +1,52 @@ +/* Binary mode I/O. + Copyright (C) 2001, 2003, 2005, 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef _BINARY_H +#define _BINARY_H + +/* For systems that distinguish between text and binary I/O. + O_BINARY is guaranteed by the gnulib . */ +#include + +/* The MSVC7 doesn't like to be included after '#define fileno ...', + so we include it here first. */ +#include + +/* SET_BINARY (fd); + changes the file descriptor fd to perform binary I/O. */ +#if O_BINARY +# if defined __EMX__ || defined __DJGPP__ || defined __CYGWIN__ +# include /* declares setmode() */ +# else +# define setmode _setmode +# undef fileno +# define fileno _fileno +# endif +# ifdef __DJGPP__ +# include /* 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. */ +# 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 0000000..baaea59 --- /dev/null +++ b/gnulib/lib/bind.c @@ -0,0 +1,49 @@ +/* bind.c --- wrappers for Windows bind function + + Copyright (C) 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paolo Bonzini */ + +#include + +#define WIN32_LEAN_AND_MEAN +/* Get winsock2.h. */ +#include + +/* Get set_winsock_errno, FD_TO_SOCKET etc. */ +#include "w32sock.h" + +#undef bind + +int +rpl_bind (int fd, const struct sockaddr *sockaddr, socklen_t len) +{ + SOCKET sock = FD_TO_SOCKET (fd); + + if (sock == INVALID_SOCKET) + { + errno = EBADF; + return -1; + } + else + { + 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 0000000..c3a5e1a --- /dev/null +++ b/gnulib/lib/bitrotate.h @@ -0,0 +1,126 @@ +/* bitrotate.h - Rotate bits in integers + Copyright (C) 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Simon Josefsson , 2008. */ + +#ifndef _GL_BITROTATE_H +#define _GL_BITROTATE_H + +#include +#include +#include + +#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 0000000..9b3908d --- /dev/null +++ b/gnulib/lib/btowc.c @@ -0,0 +1,39 @@ +/* Convert unibyte character to wide character. + Copyright (C) 2008, 2010-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include + +#include +#include + +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 0000000..6114916 --- /dev/null +++ b/gnulib/lib/byteswap.in.h @@ -0,0 +1,44 @@ +/* byteswap.h - Byte swapping + Copyright (C) 2005, 2007, 2009-2011 Free Software Foundation, Inc. + Written by Oskar Liljeblad , 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 . */ + +#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 0000000..335cde5 --- /dev/null +++ b/gnulib/lib/c-ctype.c @@ -0,0 +1,396 @@ +/* Character handling in C locale. + + Copyright 2000-2003, 2006, 2009-2011 Free Software Foundation, Inc. + +This program is free software; you can 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 + +/* 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 0000000..078bd9a --- /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 , + except that they have the C (POSIX) locale hardwired, whereas the + functions' behaviour depends on the current locale set via + setlocale. + + Copyright (C) 2000-2003, 2006, 2008-2011 Free Software Foundation, Inc. + +This program is free software; you can 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 + + +#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 , 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 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) _GL_ATTRIBUTE_CONST; /* not locale dependent */ + +extern bool c_isalnum (int c) _GL_ATTRIBUTE_CONST; +extern bool c_isalpha (int c) _GL_ATTRIBUTE_CONST; +extern bool c_isblank (int c) _GL_ATTRIBUTE_CONST; +extern bool c_iscntrl (int c) _GL_ATTRIBUTE_CONST; +extern bool c_isdigit (int c) _GL_ATTRIBUTE_CONST; +extern bool c_islower (int c) _GL_ATTRIBUTE_CONST; +extern bool c_isgraph (int c) _GL_ATTRIBUTE_CONST; +extern bool c_isprint (int c) _GL_ATTRIBUTE_CONST; +extern bool c_ispunct (int c) _GL_ATTRIBUTE_CONST; +extern bool c_isspace (int c) _GL_ATTRIBUTE_CONST; +extern bool c_isupper (int c) _GL_ATTRIBUTE_CONST; +extern bool c_isxdigit (int c) _GL_ATTRIBUTE_CONST; + +extern int c_tolower (int c) _GL_ATTRIBUTE_CONST; +extern int c_toupper (int c) _GL_ATTRIBUTE_CONST; + + +#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 0000000..2f902af --- /dev/null +++ b/gnulib/lib/c-stack.c @@ -0,0 +1,330 @@ +/* Stack overflow handling. + + Copyright (C) 2002, 2004, 2006, 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* 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 + +#ifndef __attribute__ +# if __GNUC__ < 3 +# define __attribute__(x) +# endif +#endif + +#include "gettext.h" +#define _(msgid) gettext (msgid) + +#include + +#include +#if ! HAVE_STACK_T && ! defined stack_t +typedef struct sigaltstack stack_t; +#endif +#ifndef SIGSTKSZ +# define SIGSTKSZ 16384 +#elif HAVE_LIBSIGSEGV && SIGSTKSZ < 16384 +/* libsigsegv 2.6 through 2.8 have a bug where some architectures use + more than the Linux default of an 8k alternate stack when deciding + if a fault was caused by stack overflow. */ +# undef SIGSTKSZ +# define SIGSTKSZ 16384 +#endif + +#include +#include + +/* Posix 2001 declares ucontext_t in , Posix 200x in + . */ +#if HAVE_UCONTEXT_H +# include +#endif + +#include + +#if HAVE_LIBSIGSEGV +# include +#endif + +#include "c-stack.h" +#include "exitfail.h" +#include "ignore-value.h" + +#if defined SA_ONSTACK && defined SA_SIGINFO +# define SIGINFO_WORKS 1 +#else +# define SIGINFO_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 _Noreturn void +die (int signo) +{ + char const *message; +#if !SIGINFO_WORKS && !HAVE_LIBSIGSEGV + /* 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. */ + signo = 0; +#endif /* !SIGINFO_WORKS && !HAVE_LIBSIGSEGV */ + 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 _Noreturn 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 + +# if SIGINFO_WORKS + +/* Handle a segmentation violation and exit. This function is + async-signal-safe. */ + +static _Noreturn 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, 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 page_size = sysconf (_SC_PAGESIZE); + size_t s = faulting_address - stack_base + page_size; + if (s < stack_size + 2 * 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 SIGINFO_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 0000000..5aadfb5 --- /dev/null +++ b/gnulib/lib/c-stack.h @@ -0,0 +1,44 @@ +/* Stack overflow handling. + + Copyright (C) 2002, 2004, 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + + +/* 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 0000000..df2f070 --- /dev/null +++ b/gnulib/lib/c-strcase.h @@ -0,0 +1,57 @@ +/* Case-insensitive string comparison functions in C locale. + Copyright (C) 1995-1996, 2001, 2003, 2005, 2009-2011 Free Software + Foundation, Inc. + + This program is free software; you can 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 + + +/* 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) _GL_ATTRIBUTE_PURE; + +/* 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) + _GL_ATTRIBUTE_PURE; + + +#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 0000000..f5e5e48 --- /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-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 + +/* Specification. */ +#include "c-strcase.h" + +#include + +#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 0000000..754303d --- /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-2011 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 . */ + +/* Written by Bruno Haible . */ + +#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 0000000..45fccca --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "c-strcasestr.h" + +#include +#include + +#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 0000000..396c0d4 --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#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 0000000..0085185 --- /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-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 + +/* Specification. */ +#include "c-strcase.h" + +#include + +#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 0000000..307c1f9 --- /dev/null +++ b/gnulib/lib/c-strstr.c @@ -0,0 +1,32 @@ +/* c-strstr.c -- substring search in C locale + Copyright (C) 2005-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "c-strstr.h" + +#include + +/* 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 0000000..b4206b9 --- /dev/null +++ b/gnulib/lib/c-strstr.h @@ -0,0 +1,44 @@ +/* Searching in a string. + Copyright (C) 2001-2003, 2006, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + + +/* 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 0000000..5b39b9b --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +#include + +#include "c-strtod.h" + +#include +#include +#include +#include + +#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 + +#if defined LC_ALL_MASK && (LONG ? HAVE_STRTOLD_L : HAVE_STRTOD_L) + +/* 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; + +#if defined LC_ALL_MASK && (LONG ? HAVE_STRTOLD_L : HAVE_STRTOD_L) + + 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 0000000..3d5cb13 --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* 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 0000000..5510e4a --- /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 0000000..4ac06d2 --- /dev/null +++ b/gnulib/lib/calloc.c @@ -0,0 +1,73 @@ +/* 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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Jim Meyering and Bruno Haible */ + +#include +/* Only the AC_FUNC_CALLOC macro defines 'calloc' already in config.h. */ +#ifdef calloc +# define NEED_CALLOC_GNU 1 +# undef calloc +/* Whereas the gnulib module 'calloc-gnu' defines HAVE_CALLOC_GNU. */ +#elif GNULIB_CALLOC_GNU && !HAVE_CALLOC_GNU +# define NEED_CALLOC_GNU 1 +#endif + +/* Specification. */ +#include + +#include + +/* 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; + +#if 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 0000000..10886ab --- /dev/null +++ b/gnulib/lib/canon-host.c @@ -0,0 +1,90 @@ +/* Host name canonicalization + + Copyright (C) 2005-2011 Free Software Foundation, Inc. + + Written by Derek Price . + + This program is free software: you can redistribute 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 . */ + +#include + +#include "canon-host.h" + +#include +#include + +/* 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 , + RFC 1034 , & RFC 2181 + 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 0000000..bc852b7 --- /dev/null +++ b/gnulib/lib/canon-host.h @@ -0,0 +1,29 @@ +/* Host name canonicalization + + Copyright (C) 2005, 2009-2011 Free Software Foundation, Inc. + + Written by Derek Price + + This program is free software: you can redistribute 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 . */ + +#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 0000000..2755df9 --- /dev/null +++ b/gnulib/lib/canonicalize-lgpl.c @@ -0,0 +1,378 @@ +/* Return the canonical absolute name of a given file. + Copyright (C) 1996-2011 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 . */ + +#ifndef _LIBC +# define _GL_USE_STDLIB_ALLOC 1 +# include +#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 + +#include +#include +#include +#include +#if HAVE_SYS_PARAM_H || defined _LIBC +# include +#endif +#include +#include +#include + +#ifdef _LIBC +# include +#else +# define SHLIB_COMPAT(lib, introduced, obsoleted) 0 +# define versioned_symbol(lib, local, symbol, version) extern int dummy +# 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 +# if IN_RELOCWRAPPER + /* When building the relocatable program wrapper, use the system's getcwd + function, not the gnulib override, otherwise we would get a link error. + */ +# undef getcwd +# endif +# 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 = 8192; +#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 0000000..4fe9f30 --- /dev/null +++ b/gnulib/lib/canonicalize.c @@ -0,0 +1,296 @@ +/* Return the canonical absolute name of a given file. + Copyright (C) 1996-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#include "canonicalize.h" + +#include +#include +#include +#include +#include + +#include "areadlink.h" +#include "file-set.h" +#include "hash-triple.h" +#include "pathmax.h" +#include "xalloc.h" +#include "xgetcwd.h" + +/* In this file, we cannot handle file names longer than PATH_MAX. + On systems with no file name length limit, use a fallback. */ +#ifndef PATH_MAX +# define PATH_MAX 8192 +#endif + +#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, . + 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 0000000..04ad79c --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef CANONICALIZE_H_ +# define CANONICALIZE_H_ + +#include /* 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/careadlinkat.c b/gnulib/lib/careadlinkat.c new file mode 100644 index 0000000..751578b --- /dev/null +++ b/gnulib/lib/careadlinkat.c @@ -0,0 +1,175 @@ +/* Read symbolic links into a buffer without size limitation, relative to fd. + + Copyright (C) 2001, 2003-2004, 2007, 2009-2011 Free Software Foundation, + Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert, Bruno Haible, and Jim Meyering. */ + +#include + +#include "careadlinkat.h" + +#include +#include +#include +#include +#include + +/* Define this independently so that stdint.h is not a prerequisite. */ +#ifndef SIZE_MAX +# define SIZE_MAX ((size_t) -1) +#endif + +#ifndef SSIZE_MAX +# define SSIZE_MAX ((ssize_t) (SIZE_MAX / 2)) +#endif + +#include "allocator.h" + +/* Get the symbolic link value of FILENAME and put it into BUFFER, with + size BUFFER_SIZE. This function acts like readlink but has + readlinkat's signature. */ +ssize_t +careadlinkatcwd (int fd, char const *filename, char *buffer, + size_t buffer_size) +{ + /* FD must be AT_FDCWD here, otherwise the caller is using this + function in contexts for which it was not meant for. */ + if (fd != AT_FDCWD) + abort (); + return readlink (filename, buffer, buffer_size); +} + +/* Assuming the current directory is FD, get the symbolic link value + of FILENAME as a null-terminated string and put it into a buffer. + If FD is AT_FDCWD, FILENAME is interpreted relative to the current + working directory, as in openat. + + If the link is small enough to fit into BUFFER put it there. + BUFFER's size is BUFFER_SIZE, and BUFFER can be null + if BUFFER_SIZE is zero. + + If the link is not small, put it into a dynamically allocated + buffer managed by ALLOC. It is the caller's responsibility to free + the returned value if it is nonnull and is not BUFFER. A null + ALLOC stands for the standard allocator. + + The PREADLINKAT function specifies how to read links. It operates + like POSIX readlinkat() + + but can assume that its first argument is the same as FD. + + If successful, return the buffer address; otherwise return NULL and + set errno. */ + +char * +careadlinkat (int fd, char const *filename, + char *buffer, size_t buffer_size, + struct allocator const *alloc, + ssize_t (*preadlinkat) (int, char const *, char *, size_t)) +{ + char *buf; + size_t buf_size; + size_t buf_size_max = + SSIZE_MAX < SIZE_MAX ? (size_t) SSIZE_MAX + 1 : SIZE_MAX; + char stack_buf[1024]; + + if (! alloc) + alloc = &stdlib_allocator; + + if (! buffer_size) + { + /* 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(). */ + buffer = stack_buf; + buffer_size = sizeof stack_buf; + } + + buf = buffer; + buf_size = buffer_size; + + do + { + /* Attempt to read the link into the current buffer. */ + ssize_t link_length = preadlinkat (fd, filename, buf, buf_size); + size_t link_size; + if (link_length < 0) + { + /* On AIX 5L v5.3 and HP-UX 11i v2 04/09, readlink returns -1 + with errno == ERANGE if the buffer is too small. */ + int readlinkat_errno = errno; + if (readlinkat_errno != ERANGE) + { + if (buf != buffer) + { + alloc->free (buf); + errno = readlinkat_errno; + } + return NULL; + } + } + + link_size = link_length; + + if (link_size < buf_size) + { + buf[link_size++] = '\0'; + + if (buf == stack_buf) + { + char *b = (char *) alloc->allocate (link_size); + buf_size = link_size; + if (! b) + break; + memcpy (b, buf, link_size); + buf = b; + } + else if (link_size < buf_size && buf != buffer && alloc->reallocate) + { + /* Shrink BUF before returning it. */ + char *b = (char *) alloc->reallocate (buf, link_size); + if (b) + buf = b; + } + + return buf; + } + + if (buf != buffer) + alloc->free (buf); + + if (buf_size <= buf_size_max / 2) + buf_size *= 2; + else if (buf_size < buf_size_max) + buf_size = buf_size_max; + else if (buf_size_max < SIZE_MAX) + { + errno = ENAMETOOLONG; + return NULL; + } + else + break; + buf = (char *) alloc->allocate (buf_size); + } + while (buf); + + if (alloc->die) + alloc->die (buf_size); + errno = ENOMEM; + return NULL; +} diff --git a/gnulib/lib/careadlinkat.h b/gnulib/lib/careadlinkat.h new file mode 100644 index 0000000..6576fb2 --- /dev/null +++ b/gnulib/lib/careadlinkat.h @@ -0,0 +1,72 @@ +/* Read symbolic links into a buffer without size limitation, relative to fd. + + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert, Bruno Haible, and Jim Meyering. */ + +#ifndef _GL_CAREADLINKAT_H +#define _GL_CAREADLINKAT_H + +#include +#include + +struct allocator; + +/* Assuming the current directory is FD, get the symbolic link value + of FILENAME as a null-terminated string and put it into a buffer. + If FD is AT_FDCWD, FILENAME is interpreted relative to the current + working directory, as in openat. + + If the link is small enough to fit into BUFFER put it there. + BUFFER's size is BUFFER_SIZE, and BUFFER can be null + if BUFFER_SIZE is zero. + + If the link is not small, put it into a dynamically allocated + buffer managed by ALLOC. It is the caller's responsibility to free + the returned value if it is nonnull and is not BUFFER. + + The PREADLINKAT function specifies how to read links. It operates + like POSIX readlinkat() + + but can assume that its first argument is the same as FD. + + If successful, return the buffer address; otherwise return NULL and + set errno. */ + +char *careadlinkat (int fd, char const *filename, + char *buffer, size_t buffer_size, + struct allocator const *alloc, + ssize_t (*preadlinkat) (int, char const *, + char *, size_t)); + +/* Suitable values for careadlinkat's FD and PREADLINKAT arguments, + when doing a plain readlink: + Pass FD = AT_FDCWD and PREADLINKAT = careadlinkatcwd. */ +#if HAVE_READLINKAT +/* AT_FDCWD is declared in . */ +#else +/* Define AT_FDCWD independently, so that the careadlinkat module does + not depend on the fcntl-h module. The value does not matter, since + careadlinkatcwd ignores it, but we might as well use the same value + as fcntl-h. */ +# ifndef AT_FDCWD +# define AT_FDCWD (-3041965) +# endif +#endif +ssize_t careadlinkatcwd (int fd, char const *filename, + char *buffer, size_t buffer_size); + +#endif /* _GL_CAREADLINKAT_H */ diff --git a/gnulib/lib/ceil.c b/gnulib/lib/ceil.c new file mode 100644 index 0000000..4e0354e --- /dev/null +++ b/gnulib/lib/ceil.c @@ -0,0 +1,111 @@ +/* Round towards positive infinity. + Copyright (C) 2007, 2010-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible , 2007. */ + +#if ! defined USE_LONG_DOUBLE +# include +#endif + +/* Specification. */ +#include + +#include + +#undef MIN + +#ifdef USE_LONG_DOUBLE +# define FUNC ceill +# define DOUBLE long double +# define MANT_DIG LDBL_MANT_DIG +# define MIN LDBL_MIN +# define L_(literal) literal##L +#elif ! defined USE_FLOAT +# define FUNC ceil +# define DOUBLE double +# define MANT_DIG DBL_MANT_DIG +# define MIN DBL_MIN +# define L_(literal) literal +#else /* defined USE_FLOAT */ +# define FUNC ceilf +# define DOUBLE float +# define MANT_DIG FLT_MANT_DIG +# define MIN FLT_MIN +# define L_(literal) literal##f +#endif + +/* -0.0. See minus-zero.h. */ +#if defined __hpux || defined __sgi || defined __ICC +# define MINUS_ZERO (-MIN * MIN) +#else +# define MINUS_ZERO L_(-0.0) +#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)) + { + /* For -1 < x < 0, return -0.0 regardless of the current rounding + mode. */ + if (z > L_(-1.0)) + z = MINUS_ZERO; + /* Avoid rounding errors for values near -2^k, where k >= MANT_DIG-1. */ + else 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 0000000..2dd0ce7 --- /dev/null +++ b/gnulib/lib/ceilf.c @@ -0,0 +1,20 @@ +/* Round towards positive infinity. + Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible , 2007. */ + +#define USE_FLOAT +#include "ceil.c" diff --git a/gnulib/lib/ceill.c b/gnulib/lib/ceill.c new file mode 100644 index 0000000..6181c91 --- /dev/null +++ b/gnulib/lib/ceill.c @@ -0,0 +1,37 @@ +/* Round towards positive infinity. + Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible , 2007. */ + +#include + +#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE + +/* Specification. */ +# include + +long double +ceill (long double x) +{ + return ceil (x); +} + +#else + +# define USE_LONG_DOUBLE +# include "ceil.c" + +#endif diff --git a/gnulib/lib/chdir-long.c b/gnulib/lib/chdir-long.c new file mode 100644 index 0000000..af41b12 --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Jim Meyering */ + +#include + +#include "chdir-long.h" + +#include +#include +#include +#include +#include +#include +#include + +#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_SEARCH | 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 * _GL_ATTRIBUTE_PURE +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 0000000..feff175 --- /dev/null +++ b/gnulib/lib/chdir-long.h @@ -0,0 +1,30 @@ +/* provide a chdir function that tries not to fail due to ENAMETOOLONG + Copyright (C) 2004-2005, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Jim Meyering. */ + +#include +#include + +#include "pathmax.h" + +/* 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 0000000..92451dc --- /dev/null +++ b/gnulib/lib/chdir-safer.c @@ -0,0 +1,82 @@ +/* much like chdir(2), but safer + + Copyright (C) 2005-2006, 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Jim Meyering */ + +#include + +#include "chdir-safer.h" + +#include +#include +#include +#include +#include +#include +#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). This avoids a minor race condition + between when a directory is created or statted and when the process + chdirs into it. + + On older systems lacking full support for O_SEARCH, this function + can also fail if DIR is not readable. */ +int +chdir_no_follow (char const *dir) +{ + int result = 0; + int saved_errno; + int fd = open (dir, + O_SEARCH | 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 0000000..c5f10a1 --- /dev/null +++ b/gnulib/lib/chdir-safer.h @@ -0,0 +1,20 @@ +/* much like chdir(2), but safer + + Copyright (C) 2005, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* 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 0000000..ad696b2 --- /dev/null +++ b/gnulib/lib/check-version.c @@ -0,0 +1,43 @@ +/* check-version.h --- Check version string compatibility. + Copyright (C) 1998-2006, 2008-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 + +#include +#include + +/* 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 0000000..7440fa3 --- /dev/null +++ b/gnulib/lib/check-version.h @@ -0,0 +1,26 @@ +/* check-version.h --- Check version string compatibility. + Copyright (C) 2005, 2009-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 0000000..9d97e73 --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Jim Meyering */ + +#include + +/* Specification. */ +#include + +#include +#include +#include +#include +#include + +#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 0000000..62620b3 --- /dev/null +++ b/gnulib/lib/classpath.c @@ -0,0 +1,122 @@ +/* Java CLASSPATH handling. + Copyright (C) 2001-2003, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "classpath.h" + +#include +#include +#include + +#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 0000000..7cd4f89 --- /dev/null +++ b/gnulib/lib/classpath.h @@ -0,0 +1,33 @@ +/* Java CLASSPATH handling. + Copyright (C) 2003, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..22e766b --- /dev/null +++ b/gnulib/lib/clean-temp.c @@ -0,0 +1,782 @@ +/* Temporary directories and temporary files with automatic cleanup. + Copyright (C) 2001, 2003, 2006-2007, 2009-2011 Free Software Foundation, + Inc. + Written by Bruno Haible , 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 . */ + + +#include + +/* Specification. */ +#include "clean-temp.h" + +#include +#include +#include +#include +#include +#include +#include + +#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ +# define WIN32_LEAN_AND_MEAN /* avoid including junk */ +# include +#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. Use a fallback. + Temporary directory names are usually not that long. */ +#ifndef PATH_MAX +# define PATH_MAX 1024 +#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 /* */ volatile subdirs; + /* Absolute pathnames of files. */ + gl_list_t /* */ 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 /* */ 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 0000000..7015e21 --- /dev/null +++ b/gnulib/lib/clean-temp.h @@ -0,0 +1,142 @@ +/* Temporary directories and temporary files with automatic cleanup. + Copyright (C) 2006, 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#ifndef _CLEAN_TEMP_H +#define _CLEAN_TEMP_H + +#include +#include +#include + +#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. The temporary directories and files + are automatically cleaned up (at the latest) when the program exits or + dies from a fatal signal such as SIGINT, SIGTERM, SIGHUP, but not if it + dies from a fatal signal such as SIGQUIT, SIGKILL, or SIGABRT, SIGSEGV, + SIGBUS, SIGILL, SIGFPE. + + For the cleanup in the normal case, programs that use this module need to + call 'cleanup_temp_dir' for each successful return of 'create_temp_dir'. + The cleanup in the case of a fatal signal such as SIGINT, SIGTERM, SIGHUP, + is done entirely automatically by the functions of this module. */ + +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 0000000..d525202 --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + The code is taken from glibc/manual/llio.texi */ + +#include + +#include "cloexec.h" + +#include +#include +#include + +/* 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 0000000..17c8ac0 --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +*/ + +#include + +/* 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-stream.c b/gnulib/lib/close-stream.c new file mode 100644 index 0000000..8819b58 --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#include "close-stream.h" + +#include +#include + +#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) +{ + const bool some_pending = (__fpending (stream) != 0); + const bool prev_fail = (ferror (stream) != 0); + const 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 0000000..be3d419 --- /dev/null +++ b/gnulib/lib/close-stream.h @@ -0,0 +1,2 @@ +#include +int close_stream (FILE *stream); diff --git a/gnulib/lib/close.c b/gnulib/lib/close.c new file mode 100644 index 0000000..c2197fe --- /dev/null +++ b/gnulib/lib/close.c @@ -0,0 +1,69 @@ +/* close replacement. + Copyright (C) 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include + +#include "fd-hook.h" +#include "msvc-inval.h" + +#undef close + +#if HAVE_MSVC_INVALID_PARAMETER_HANDLER +static int +close_nothrow (int fd) +{ + int result; + + TRY_MSVC_INVAL + { + result = close (fd); + } + CATCH_MSVC_INVAL + { + result = -1; + errno = EBADF; + } + DONE_MSVC_INVAL; + + return result; +} +#else +# define close_nothrow close +#endif + +/* Override close() to call into other gnulib modules. */ + +int +rpl_close (int fd) +{ +#if WINDOWS_SOCKETS + int retval = execute_all_close_hooks (close_nothrow, fd); +#else + int retval = close_nothrow (fd); +#endif + +#if REPLACE_FCHDIR + if (retval >= 0) + _gl_unregister_fd (fd); +#endif + + return retval; +} diff --git a/gnulib/lib/closedir.c b/gnulib/lib/closedir.c new file mode 100644 index 0000000..0fdce18 --- /dev/null +++ b/gnulib/lib/closedir.c @@ -0,0 +1,67 @@ +/* Stop reading the entries of a directory. + Copyright (C) 2006-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#if REPLACE_FCHDIR +# include +#endif + +#if HAVE_CLOSEDIR + +/* Override closedir(), to keep track of the open file descriptors. + Needed because there is a function dirfd(). */ + +#else + +# include + +# include "dirent-private.h" + +#endif + +int +closedir (DIR *dirp) +{ +# if REPLACE_FCHDIR + int fd = dirfd (dirp); +# endif + int retval; + +#if HAVE_CLOSEDIR +# undef closedir + + retval = closedir (dirp); + +#else + + if (dirp->current != INVALID_HANDLE_VALUE) + FindClose (dirp->current); + free (dirp); + + retval = 0; + +#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 0000000..2a652f4 --- /dev/null +++ b/gnulib/lib/closein.c @@ -0,0 +1,112 @@ +/* Close standard input, rewinding seekable stdin if necessary. + + Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#include "closein.h" + +#include +#include +#include +#include + +#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 +2 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), ftello (stdin)) + == 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 0000000..5e614d5 --- /dev/null +++ b/gnulib/lib/closein.h @@ -0,0 +1,32 @@ +/* Close standard input, rewinding seekable stdin if necessary. + + Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#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 0000000..f6cdd3f --- /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-2011 Free Software Foundation, + Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#include "closeout.h" + +#include +#include +#include +#include + +#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 0000000..ec8d7a6 --- /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-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef CLOSEOUT_H +# define CLOSEOUT_H 1 + +# include + +# 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 0000000..732df11 --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify 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 . */ + +/* Written by Bruno Haible . */ + +#include + +/* Specification. */ +#include "concat-filename.h" + +#include +#include +#include + +#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 0000000..c62880e --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#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 0000000..2eadbaa --- /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-2011 Free Software Foundation, Inc. +# +# This program is free software; you can 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 cygwin +# ISO-8859-1 Y glibc aix hpux irix osf solaris freebsd netbsd openbsd darwin cygwin +# ISO-8859-2 Y glibc aix hpux irix osf solaris freebsd netbsd openbsd darwin cygwin +# ISO-8859-3 Y glibc solaris cygwin +# ISO-8859-4 Y osf solaris freebsd netbsd openbsd darwin +# ISO-8859-5 Y glibc aix hpux irix osf solaris freebsd netbsd openbsd darwin cygwin +# ISO-8859-6 Y glibc aix hpux solaris cygwin +# ISO-8859-7 Y glibc aix hpux irix osf solaris netbsd openbsd darwin cygwin +# ISO-8859-8 Y glibc aix hpux osf solaris cygwin +# ISO-8859-9 Y glibc aix hpux irix osf solaris darwin cygwin +# ISO-8859-13 glibc netbsd openbsd darwin cygwin +# ISO-8859-14 glibc cygwin +# ISO-8859-15 glibc aix osf solaris freebsd netbsd openbsd darwin cygwin +# KOI8-R Y glibc solaris freebsd netbsd openbsd darwin +# KOI8-U Y glibc freebsd netbsd openbsd darwin cygwin +# 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 cygwin 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 cygwin 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 cygwin +# EUC-TW glibc aix hpux irix osf solaris netbsd +# BIG5 Y glibc aix hpux osf solaris freebsd netbsd darwin cygwin +# BIG5-HKSCS glibc solaris darwin +# GBK glibc aix osf solaris darwin cygwin 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 cygwin +# VISCII Y glibc +# TCVN5712-1 glibc +# ARMSCII-8 glibc darwin +# GEORGIAN-PS glibc cygwin +# 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 cygwin +# +# 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 " + echo "# and Bruno Haible ." + 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 0000000..afd13b9 --- /dev/null +++ b/gnulib/lib/connect.c @@ -0,0 +1,56 @@ +/* connect.c --- wrappers for Windows connect function + + Copyright (C) 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paolo Bonzini */ + +#include + +#define WIN32_LEAN_AND_MEAN +/* Get winsock2.h. */ +#include + +/* Get set_winsock_errno, FD_TO_SOCKET etc. */ +#include "w32sock.h" + +#undef connect + +int +rpl_connect (int fd, const struct sockaddr *sockaddr, socklen_t len) +{ + SOCKET sock = FD_TO_SOCKET (fd); + + if (sock == INVALID_SOCKET) + { + errno = EBADF; + return -1; + } + else + { + 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 0000000..1532cb8 --- /dev/null +++ b/gnulib/lib/copy-acl.c @@ -0,0 +1,644 @@ +/* copy-acl.c - copy access control list from one file to another file + + Copyright (C) 2002-2003, 2005-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Written by Paul Eggert, Andreas Grünbacher, and Bruno Haible. */ + +#include + +#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 !HAVE_ACL_TYPE_EXTENDED + /* 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_INSIDE_ACL || (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 /* 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. 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 */ + + /* 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 + 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 || errno == EOPNOTSUPP) + { + 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 || errno == EOPNOTSUPP || errno == EINVAL) + && !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; + +#elif USE_ACL && HAVE_GETACL /* HP-UX */ + + int count; + struct acl_entry entries[NACLENTRIES]; +# if HAVE_ACLV_H + int aclv_count; + struct acl aclv_entries[NACLVENTRIES]; +# endif + int did_chmod; + int saved_errno; + 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 || errno == ENOTSUP) + { + 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 HAVE_ACLV_H + for (;;) + { + aclv_count = acl ((char *) src_name, ACL_CNT, NACLVENTRIES, aclv_entries); + + if (aclv_count < 0) + { + if (errno == ENOSYS || errno == EOPNOTSUPP || errno == EINVAL) + { + count = 0; + break; + } + else + return -2; + } + + if (aclv_count == 0) + break; + + if (aclv_count > NACLVENTRIES) + /* If NACLVENTRIES cannot be trusted, use dynamic memory allocation. */ + abort (); + + if (acl ((char *) src_name, ACL_GET, aclv_count, aclv_entries) + == aclv_count) + break; + /* Huh? The number of ACL entries changed since the last call. + Repeat. */ + } +# endif + + if (count == 0) +# if HAVE_ACLV_H + if (aclv_count == 0) +# endif + 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 (count > 0) + { + ret = (dest_desc != -1 + ? fsetacl (dest_desc, count, entries) + : setacl (dst_name, count, entries)); + if (ret < 0 && saved_errno == 0) + { + saved_errno = errno; + if (errno == ENOSYS || errno == EOPNOTSUPP || errno == ENOTSUP) + { + 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)) + saved_errno = 0; + } + else + saved_errno = errno; + } + } + else + did_chmod = 1; + } + +# if HAVE_ACLV_H + if (aclv_count > 0) + { + ret = acl ((char *) dst_name, ACL_SET, aclv_count, aclv_entries); + if (ret < 0 && saved_errno == 0) + { + saved_errno = errno; + if (errno == ENOSYS || errno == EOPNOTSUPP || errno == EINVAL) + { + if (!aclv_nontrivial (aclv_count, aclv_entries)) + saved_errno = 0; + } + } + else + did_chmod = 1; + } +# endif + + if (did_chmod <= ((mode & (S_ISUID | S_ISGID | S_ISVTX)) ? 1 : 0)) + { + /* We did not call chmod so far, and 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; + +#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; + +#elif USE_ACL && HAVE_ACLSORT /* NonStop Kernel */ + + int count; + struct acl entries[NACLENTRIES]; + int ret; + + for (;;) + { + count = acl ((char *) src_name, ACL_CNT, NACLENTRIES, NULL); + + if (count < 0) + { + if (0) + { + count = 0; + break; + } + else + return -2; + } + + if (count == 0) + break; + + if (count > NACLENTRIES) + /* If NACLENTRIES cannot be trusted, use dynamic memory allocation. */ + abort (); + + if (acl ((char *) src_name, ACL_GET, 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 = acl ((char *) dst_name, ACL_SET, count, entries); + if (ret < 0) + { + int saved_errno = errno; + + if (0) + { + if (!acl_nontrivial (count, entries)) + return chmod_or_fchmod (dst_name, dest_desc, mode); + } + + 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; + +#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 0000000..f9cd9c0 --- /dev/null +++ b/gnulib/lib/copy-file.c @@ -0,0 +1,137 @@ +/* Copying of files. + Copyright (C) 2001-2003, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + + +#include + +/* Specification. */ +#include "copy-file.h" + +#include +#include +#include +#include +#include +#include + +#if HAVE_UTIME || HAVE_UTIMES +# if HAVE_UTIME_H +# include +# else +# include +# 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 0000000..cb8b1f7 --- /dev/null +++ b/gnulib/lib/copy-file.h @@ -0,0 +1,34 @@ +/* Copying of files. + Copyright (C) 2001-2003, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + + +#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/copysign.c b/gnulib/lib/copysign.c new file mode 100644 index 0000000..5480245 --- /dev/null +++ b/gnulib/lib/copysign.c @@ -0,0 +1,26 @@ +/* Copy sign into another 'double' number. + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +double +copysign (double x, double y) +{ + return (signbit (x) != signbit (y) ? - x : x); +} diff --git a/gnulib/lib/copysignf.c b/gnulib/lib/copysignf.c new file mode 100644 index 0000000..82409d4 --- /dev/null +++ b/gnulib/lib/copysignf.c @@ -0,0 +1,26 @@ +/* Copy sign into another 'float' number. + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +float +copysignf (float x, float y) +{ + return (signbit (x) != signbit (y) ? - x : x); +} diff --git a/gnulib/lib/copysignl.c b/gnulib/lib/copysignl.c new file mode 100644 index 0000000..4432577 --- /dev/null +++ b/gnulib/lib/copysignl.c @@ -0,0 +1,72 @@ +/* Copy sign into another 'long double' number. + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE + +long double +copysignl (long double x, long double y) +{ + return copysign (x, y); +} + +#else + +# if defined __hpux && !defined __GNUC__ + +# include + +/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0L. */ +static long double +compute_minus_zerol (void) +{ + return -LDBL_MIN * LDBL_MIN; +} +# define minus_zerol compute_minus_zerol () + +/* HP cc on HP-UX 11 has a bug: When x is a positive zero, - x comes out + as a positive zero, rather than as a minus zero. Work around it. */ +static long double +unary_minus (long double x) +{ + if (x == 0.0L) + { + if (signbit (x)) + return 0.0L; + else + return minus_zerol; + } + else + return - x; +} + +# endif + +long double +copysignl (long double x, long double y) +{ +# if defined __hpux && !defined __GNUC__ + return (signbit (x) != signbit (y) ? unary_minus (x) : x); +# else + return (signbit (x) != signbit (y) ? - x : x); +# endif +} + +#endif diff --git a/gnulib/lib/cosf.c b/gnulib/lib/cosf.c new file mode 100644 index 0000000..e9156a9 --- /dev/null +++ b/gnulib/lib/cosf.c @@ -0,0 +1,26 @@ +/* Cosine function. + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +float +cosf (float x) +{ + return (float) cos ((double) x); +} diff --git a/gnulib/lib/coshf.c b/gnulib/lib/coshf.c new file mode 100644 index 0000000..c9775d7 --- /dev/null +++ b/gnulib/lib/coshf.c @@ -0,0 +1,26 @@ +/* Hyperbolic cosine function. + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +float +coshf (float x) +{ + return (float) cosh ((double) x); +} diff --git a/gnulib/lib/cosl.c b/gnulib/lib/cosl.c new file mode 100644 index 0000000..a3eaf39 --- /dev/null +++ b/gnulib/lib/cosl.c @@ -0,0 +1,116 @@ +/* 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 + +/* Specification. */ +#include + +#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE + +long double +cosl (long double x) +{ + return cos (x); +} + +#else + +/* 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); + } + } +} + +#endif + +#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 0000000..093165c --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Ben Pfaff. */ + +#ifndef COUNT_ONE_BITS_H +# define COUNT_ONE_BITS_H 1 + +#include +#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 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 0000000..db99891 --- /dev/null +++ b/gnulib/lib/crc.c @@ -0,0 +1,103 @@ +/* crc.c -- cyclic redundancy checks + Copyright (C) 2005-2006, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute 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 . */ + +/* Written by Simon Josefsson. */ + +#include + +#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 0000000..e774252 --- /dev/null +++ b/gnulib/lib/crc.h @@ -0,0 +1,47 @@ +/* crc.h -- cyclic redundancy checks + Copyright (C) 2005, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Simon Josefsson. */ + +#ifndef CRC_H +# define CRC_H 1 + +#include +#include + +/* 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 0000000..2a6916d --- /dev/null +++ b/gnulib/lib/creat-safer.c @@ -0,0 +1,31 @@ +/* Invoke creat, but avoid some glitches. + + Copyright (C) 2005-2006, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Jim Meyering. */ + +#include + +#include "fcntl-safer.h" + +#include +#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 0000000..9726bbc --- /dev/null +++ b/gnulib/lib/csharpcomp.c @@ -0,0 +1,573 @@ +/* Compile a C# program. + Copyright (C) 2003-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include +#include + +/* Specification. */ +#include "csharpcomp.h" + +#include +#include +#include +#include + +#include "execute.h" +#include "spawn-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 0000000..4bd7807 --- /dev/null +++ b/gnulib/lib/csharpcomp.h @@ -0,0 +1,40 @@ +/* Compile a C# program. + Copyright (C) 2003, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#ifndef _CSHARPCOMP_H +#define _CSHARPCOMP_H + +#include + +/* 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 0000000..15dbb29 --- /dev/null +++ b/gnulib/lib/csharpexec.c @@ -0,0 +1,345 @@ +/* Execute a C# program. + Copyright (C) 2003-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include +#include + +/* Specification. */ +#include "csharpexec.h" + +#include +#include + +#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 0000000..e1aedf7 --- /dev/null +++ b/gnulib/lib/csharpexec.h @@ -0,0 +1,43 @@ +/* Execute a C# program. + Copyright (C) 2003, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#ifndef _CSHARPEXEC_H +#define _CSHARPEXEC_H + +#include + +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 0000000..8d414f4 --- /dev/null +++ b/gnulib/lib/ctype.in.h @@ -0,0 +1,58 @@ +/* A substitute for ISO C99 , for platforms on which it is incomplete. + + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 for platforms on which it is incomplete. + * + */ + +#ifndef _@GUARD_PREFIX@_CTYPE_H + +#if __GNUC__ >= 3 +@PRAGMA_SYSTEM_HEADER@ +#endif +@PRAGMA_COLUMNS@ + +/* Include the original . */ +/* The include_next requires a split double-inclusion guard. */ +#@INCLUDE_NEXT@ @NEXT_CTYPE_H@ + +#ifndef _@GUARD_PREFIX@_CTYPE_H +#define _@GUARD_PREFIX@_CTYPE_H + +/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ + +/* 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@ +_GL_EXTERN_C 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 /* _@GUARD_PREFIX@_CTYPE_H */ +#endif /* _@GUARD_PREFIX@_CTYPE_H */ diff --git a/gnulib/lib/cycle-check.c b/gnulib/lib/cycle-check.c new file mode 100644 index 0000000..3b48a9d --- /dev/null +++ b/gnulib/lib/cycle-check.c @@ -0,0 +1,85 @@ +/* help detect directory cycles efficiently + + Copyright (C) 2003-2006, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Jim Meyering */ + +#include + +#include +#include +#include +#include +#include + +#include + +#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 0000000..064710e --- /dev/null +++ b/gnulib/lib/cycle-check.h @@ -0,0 +1,52 @@ +/* help detect directory cycles efficiently + + Copyright (C) 2003-2004, 2006, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Jim Meyering */ + +#ifndef CYCLE_CHECK_H +# define CYCLE_CHECK_H 1 + +# include +# include +# 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 0000000..e1c505d --- /dev/null +++ b/gnulib/lib/des.c @@ -0,0 +1,668 @@ +/* des.c --- DES and Triple-DES encryption/decryption Algorithm + * Copyright (C) 1998-1999, 2001-2007, 2009-2011 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 , 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 + +#include "des.h" + +#include +#include /* 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<> 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 0000000..516d155 --- /dev/null +++ b/gnulib/lib/des.h @@ -0,0 +1,121 @@ +/* des.h --- DES cipher implementation. + * Copyright (C) 2005, 2007, 2009-2011 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 +#include +#include + +/* + * 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 0000000..695d38c --- /dev/null +++ b/gnulib/lib/dev-ino.h @@ -0,0 +1,13 @@ +#ifndef DEV_INO_H +# define DEV_INO_H 1 + +# include +# include + +struct dev_ino +{ + ino_t st_ino; + dev_t st_dev; +}; + +#endif diff --git a/gnulib/lib/di-set.c b/gnulib/lib/di-set.c new file mode 100644 index 0000000..2f78448 --- /dev/null +++ b/gnulib/lib/di-set.c @@ -0,0 +1,259 @@ +/* Set operations for device-inode pairs stored in a space-efficient manner. + + Copyright 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Paul Eggert and Jim Meyering */ + +#include +#include "di-set.h" + +#include "hash.h" +#include "ino-map.h" + +#include +#include + +/* The hash package hashes "void *", but this package wants to hash + integers. Use integers that are as large as possible, but no + larger than void *, so that they can be cast to void * and back + without losing information. */ +typedef size_t hashint; +#define HASHINT_MAX ((hashint) -1) + +/* Integers represent inode numbers. Integers in the range + 1..(LARGE_INO_MIN-1) represent inode numbers directly. (The hash + package does not work with null pointers, so inode 0 cannot be used + as a key.) To find the representations of other inode numbers, map + them through INO_MAP. */ +#define LARGE_INO_MIN (HASHINT_MAX / 2) + +/* Set operations for device-inode pairs stored in a space-efficient + manner. Use a two-level hash table. The top level hashes by + device number, as there are typically a small number of devices. + The lower level hashes by mapped inode numbers. In the typical + case where the inode number is positive and small, the inode number + maps to itself, masquerading as a void * value; otherwise, its + value is the result of hashing the inode value through INO_MAP. */ + +/* A pair that maps a device number to a set of inode numbers. */ +struct di_ent +{ + dev_t dev; + struct hash_table *ino_set; +}; + +/* A two-level hash table that manages and indexes these pairs. */ +struct di_set +{ + /* Map device numbers to sets of inode number representatives. */ + struct hash_table *dev_map; + + /* If nonnull, map large inode numbers to their small + representatives. If null, there are no large inode numbers in + this set. */ + struct ino_map *ino_map; + + /* Cache of the most recently allocated and otherwise-unused storage + for probing this table. */ + struct di_ent *probe; +}; + +/* Hash a device-inode-set entry. */ +static size_t +di_ent_hash (void const *x, size_t table_size) +{ + struct di_ent const *p = x; + dev_t dev = p->dev; + + /* When DEV is wider than size_t, exclusive-OR the words of DEV into H. + This avoids loss of info, without applying % to the wider type, + which could be quite slow on some systems. */ + size_t h = dev; + unsigned int i; + unsigned int n_words = sizeof dev / sizeof h + (sizeof dev % sizeof h != 0); + for (i = 1; i < n_words; i++) + h ^= dev >> CHAR_BIT * sizeof h * i; + + return h % table_size; +} + +/* Return true if two device-inode-set entries are the same. */ +static bool +di_ent_compare (void const *x, void const *y) +{ + struct di_ent const *a = x; + struct di_ent const *b = y; + return a->dev == b->dev; +} + +/* Free a device-inode-set entry. */ +static void +di_ent_free (void *v) +{ + struct di_ent *a = v; + hash_free (a->ino_set); + free (a); +} + +/* Create a set of device-inode pairs. Return NULL on allocation failure. */ +struct di_set * +di_set_alloc (void) +{ + struct di_set *dis = malloc (sizeof *dis); + if (dis) + { + enum { INITIAL_DEV_MAP_SIZE = 11 }; + dis->dev_map = hash_initialize (INITIAL_DEV_MAP_SIZE, NULL, + di_ent_hash, di_ent_compare, + di_ent_free); + if (! dis->dev_map) + { + free (dis); + return NULL; + } + dis->ino_map = NULL; + dis->probe = NULL; + } + + return dis; +} + +/* Free a set of device-inode pairs. */ +void +di_set_free (struct di_set *dis) +{ + hash_free (dis->dev_map); + free (dis->ino_map); + free (dis->probe); + free (dis); +} + +/* Hash an encoded inode number I. */ +static size_t +di_ino_hash (void const *i, size_t table_size) +{ + return (hashint) i % table_size; +} + +/* Using the DIS table, map a device to a hash table that represents + a set of inode numbers. Return NULL on error. */ +static struct hash_table * +map_device (struct di_set *dis, dev_t dev) +{ + /* Find space for the probe, reusing the cache if available. */ + struct di_ent *ent; + struct di_ent *probe = dis->probe; + if (probe) + { + /* If repeating a recent query, return the cached result. */ + if (probe->dev == dev) + return probe->ino_set; + } + else + { + dis->probe = probe = malloc (sizeof *probe); + if (! probe) + return NULL; + } + + /* Probe for the device. */ + probe->dev = dev; + ent = hash_insert (dis->dev_map, probe); + if (! ent) + return NULL; + + if (ent != probe) + { + /* Use the existing entry. */ + probe->ino_set = ent->ino_set; + } + else + { + enum { INITIAL_INO_SET_SIZE = 1021 }; + + /* Prepare to allocate a new probe next time; this one is in use. */ + dis->probe = NULL; + + /* DEV is new; allocate an inode set for it. */ + probe->ino_set = hash_initialize (INITIAL_INO_SET_SIZE, NULL, + di_ino_hash, NULL, NULL); + } + + return probe->ino_set; +} + +/* Using the DIS table, map an inode number to a mapped value. + Return INO_MAP_INSERT_FAILURE on error. */ +static hashint +map_inode_number (struct di_set *dis, ino_t ino) +{ + if (0 < ino && ino < LARGE_INO_MIN) + return ino; + + if (! dis->ino_map) + { + dis->ino_map = ino_map_alloc (LARGE_INO_MIN); + if (! dis->ino_map) + return INO_MAP_INSERT_FAILURE; + } + + return ino_map_insert (dis->ino_map, ino); +} + +/* Attempt to insert the DEV,INO pair into the set DIS. + If it matches a pair already in DIS, keep that pair and return 0. + Otherwise, if insertion is successful, return 1. + Upon any failure return -1. */ +int +di_set_insert (struct di_set *dis, dev_t dev, ino_t ino) +{ + hashint i; + + /* Map the device number to a set of inodes. */ + struct hash_table *ino_set = map_device (dis, dev); + if (! ino_set) + return -1; + + /* Map the inode number to a small representative I. */ + i = map_inode_number (dis, ino); + if (i == INO_MAP_INSERT_FAILURE) + return -1; + + /* Put I into the inode set. */ + return hash_insert_if_absent (ino_set, (void const *) i, NULL); +} + +/* Look up the DEV,INO pair in the set DIS. + If found, return 1; if not found, return 0. + Upon any failure return -1. */ +int +di_set_lookup (struct di_set *dis, dev_t dev, ino_t ino) +{ + hashint i; + + /* Map the device number to a set of inodes. */ + struct hash_table *ino_set = map_device (dis, dev); + if (! ino_set) + return -1; + + /* Map the inode number to a small representative I. */ + i = map_inode_number (dis, ino); + if (i == INO_MAP_INSERT_FAILURE) + return -1; + + /* Perform the look-up. */ + return !!hash_lookup (ino_set, (void const *) i); +} diff --git a/gnulib/lib/di-set.h b/gnulib/lib/di-set.h new file mode 100644 index 0000000..abc3161 --- /dev/null +++ b/gnulib/lib/di-set.h @@ -0,0 +1,19 @@ +#ifndef _GL_DI_SET_H +# define _GL_DI_SET_H + +# include + +# undef _GL_ATTRIBUTE_NONNULL +# if __GNUC__ == 3 && __GNUC_MINOR__ >= 3 || 3 < __GNUC__ +# define _GL_ATTRIBUTE_NONNULL(m) __attribute__ ((__nonnull__ (m))) +# else +# define _GL_ATTRIBUTE_NONNULL(m) +# endif + +struct di_set *di_set_alloc (void); +int di_set_insert (struct di_set *, dev_t, ino_t) _GL_ATTRIBUTE_NONNULL (1); +void di_set_free (struct di_set *) _GL_ATTRIBUTE_NONNULL (1); +int di_set_lookup (struct di_set *dis, dev_t dev, ino_t ino) + _GL_ATTRIBUTE_NONNULL (1); + +#endif diff --git a/gnulib/lib/diacrit.c b/gnulib/lib/diacrit.c new file mode 100644 index 0000000..9696b06 --- /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-2011 Free Software Foundation, + Inc. + + François Pinard , 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 . */ + +#include + +#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 0000000..6244b79 --- /dev/null +++ b/gnulib/lib/diacrit.h @@ -0,0 +1,27 @@ +/* Diacritics processing for a few character codes. + Copyright (C) 1990-1993, 2009-2011 Free Software Foundation, Inc. + François Pinard , 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 . */ + +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 0000000..1cdc985 --- /dev/null +++ b/gnulib/lib/diffseq.h @@ -0,0 +1,523 @@ +/* Analyze differences between two vectors. + + Copyright (C) 1988-1989, 1992-1995, 2001-2004, 2006-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + + +/* 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. + It is also possible to use this file with abstract arrays. In this case, + xvec and yvec are not represented in memory. They only exist conceptually. + In this case, the list of defines above is amended as follows: + ELEMENT Undefined. + EQUAL Undefined. + XVECREF_YVECREF_EQUAL(ctxt, xoff, yoff) + A three-argument macro: References xvec[xoff] and + yvec[yoff] and tests these elements for equality. + Before including this file, you also need to include: + #include + #include + #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 +{ + #ifdef ELEMENT + /* Vectors being compared. */ + ELEMENT const *xvec; + ELEMENT const *yvec; + #endif + + /* 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. */ +#ifdef ELEMENT + ELEMENT const *const xv = ctxt->xvec; /* Still more help for the compiler. */ + ELEMENT const *const yv = ctxt->yvec; /* And more and more . . . */ + #define XREF_YREF_EQUAL(x,y) EQUAL (xv[x], yv[y]) +#else + #define XREF_YREF_EQUAL(x,y) XVECREF_YVECREF_EQUAL (ctxt, x, y) +#endif + 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 && XREF_YREF_EQUAL (x, 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 && XREF_YREF_EQUAL (x - 1, 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; XREF_YREF_EQUAL (x - k, 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; XREF_YREF_EQUAL (x + k, 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; + } + } + #undef XREF_YREF_EQUAL +} + + +/* 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) +{ +#ifdef ELEMENT + ELEMENT const *xv = ctxt->xvec; /* Help the compiler. */ + ELEMENT const *yv = ctxt->yvec; + #define XREF_YREF_EQUAL(x,y) EQUAL (xv[x], yv[y]) +#else + #define XREF_YREF_EQUAL(x,y) XVECREF_YVECREF_EQUAL (ctxt, x, y) +#endif + + /* Slide down the bottom initial diagonal. */ + while (xoff < xlim && yoff < ylim && XREF_YREF_EQUAL (xoff, yoff)) + { + xoff++; + yoff++; + } + + /* Slide up the top initial diagonal. */ + while (xoff < xlim && yoff < ylim && XREF_YREF_EQUAL (xlim - 1, 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 XREF_YREF_EQUAL +} + +#undef ELEMENT +#undef EQUAL +#undef OFFSET +#undef EXTRA_CONTEXT_FIELDS +#undef NOTE_DELETE +#undef NOTE_INSERT +#undef EARLY_ABORT +#undef USE_HEURISTIC +#undef XVECREF_YVECREF_EQUAL +#undef OFFSET_MAX diff --git a/gnulib/lib/dirchownmod.c b/gnulib/lib/dirchownmod.c new file mode 100644 index 0000000..15b59e2 --- /dev/null +++ b/gnulib/lib/dirchownmod.c @@ -0,0 +1,141 @@ +/* Change the ownership and mode bits of a directory. + + Copyright (C) 2006-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +#include + +#include "dirchownmod.h" + +#include +#include +#include +#include + +#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 0000000..3f07748 --- /dev/null +++ b/gnulib/lib/dirchownmod.h @@ -0,0 +1,2 @@ +#include +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 0000000..bb20132 --- /dev/null +++ b/gnulib/lib/dirent--.h @@ -0,0 +1,23 @@ +/* Like dirent.h, but redefine some names to avoid glitches. + + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Eric Blake. */ + +#include "dirent-safer.h" + +#undef opendir +#define opendir opendir_safer diff --git a/gnulib/lib/dirent-private.h b/gnulib/lib/dirent-private.h new file mode 100644 index 0000000..74632ff --- /dev/null +++ b/gnulib/lib/dirent-private.h @@ -0,0 +1,40 @@ +/* Private details of the DIR type. + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef _DIRENT_PRIVATE_H +#define _DIRENT_PRIVATE_H 1 + +#define WIN32_LEAN_AND_MEAN +#include + +struct gl_directory +{ + /* Status, or error code to produce in next readdir() call. + -2 means the end of the directory is already reached, + -1 means the entry was already filled by FindFirstFile, + 0 means the entry needs to be filled using FindNextFile. + A positive value is an error code. */ + int status; + /* Handle, reading the directory, at current position. */ + HANDLE current; + /* Found directory entry. */ + WIN32_FIND_DATA entry; + /* Argument to pass to FindFirstFile. It consists of the absolutized + directory name, followed by a directory separator and the wildcards. */ + char dir_name_mask[1]; +}; + +#endif /* _DIRENT_PRIVATE_H */ diff --git a/gnulib/lib/dirent-safer.h b/gnulib/lib/dirent-safer.h new file mode 100644 index 0000000..1a0499e --- /dev/null +++ b/gnulib/lib/dirent-safer.h @@ -0,0 +1,22 @@ +/* Invoke dirent-like functions, but avoid some glitches. + + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Eric Blake. */ + +#include + +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 0000000..cbcf841 --- /dev/null +++ b/gnulib/lib/dirent.in.h @@ -0,0 +1,249 @@ +/* A GNU-like . + Copyright (C) 2006-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef _@GUARD_PREFIX@_DIRENT_H + +#if __GNUC__ >= 3 +@PRAGMA_SYSTEM_HEADER@ +#endif +@PRAGMA_COLUMNS@ + +/* The include_next requires a split double-inclusion guard. */ +#if @HAVE_DIRENT_H@ +# @INCLUDE_NEXT@ @NEXT_DIRENT_H@ +#endif + +#ifndef _@GUARD_PREFIX@_DIRENT_H +#define _@GUARD_PREFIX@_DIRENT_H + +/* Get ino_t. Needed on some systems, including glibc 2.8. */ +#include + +#if !@HAVE_DIRENT_H@ +/* Define types DIR and 'struct dirent'. */ +# if !GNULIB_defined_struct_dirent +struct dirent +{ + char d_type; + char d_name[1]; +}; +/* Possible values for 'd_type'. */ +# define DT_UNKNOWN 0 +# define DT_FIFO 1 /* FIFO */ +# define DT_CHR 2 /* character device */ +# define DT_DIR 4 /* directory */ +# define DT_BLK 6 /* block device */ +# define DT_REG 8 /* regular file */ +# define DT_LNK 10 /* symbolic link */ +# define DT_SOCK 12 /* socket */ +# define DT_WHT 14 /* whiteout */ +typedef struct gl_directory DIR; +# define GNULIB_defined_struct_dirent 1 +# endif +#endif + +/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ + +/* The definition of _GL_ARG_NONNULL is copied here. */ + +/* The definition of _GL_WARN_ON_USE is copied here. */ + + +/* Declare overridden functions. */ + +#if @GNULIB_OPENDIR@ +# if @REPLACE_OPENDIR@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef opendir +# define opendir rpl_opendir +# endif +_GL_FUNCDECL_RPL (opendir, DIR *, (const char *dir_name) _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (opendir, DIR *, (const char *dir_name)); +# else +# if !@HAVE_OPENDIR@ +_GL_FUNCDECL_SYS (opendir, DIR *, (const char *dir_name) _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (opendir, DIR *, (const char *dir_name)); +# endif +_GL_CXXALIASWARN (opendir); +#elif defined GNULIB_POSIXCHECK +# undef opendir +# if HAVE_RAW_DECL_OPENDIR +_GL_WARN_ON_USE (opendir, "opendir is not portable - " + "use gnulib module opendir for portability"); +# endif +#endif + +#if @GNULIB_READDIR@ +# if !@HAVE_READDIR@ +_GL_FUNCDECL_SYS (readdir, struct dirent *, (DIR *dirp) _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (readdir, struct dirent *, (DIR *dirp)); +_GL_CXXALIASWARN (readdir); +#elif defined GNULIB_POSIXCHECK +# undef readdir +# if HAVE_RAW_DECL_READDIR +_GL_WARN_ON_USE (readdir, "readdir is not portable - " + "use gnulib module readdir for portability"); +# endif +#endif + +#if @GNULIB_REWINDDIR@ +# if !@HAVE_REWINDDIR@ +_GL_FUNCDECL_SYS (rewinddir, void, (DIR *dirp) _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (rewinddir, void, (DIR *dirp)); +_GL_CXXALIASWARN (rewinddir); +#elif defined GNULIB_POSIXCHECK +# undef rewinddir +# if HAVE_RAW_DECL_REWINDDIR +_GL_WARN_ON_USE (rewinddir, "rewinddir is not portable - " + "use gnulib module rewinddir for portability"); +# endif +#endif + +#if @GNULIB_CLOSEDIR@ +# if @REPLACE_CLOSEDIR@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef closedir +# define closedir rpl_closedir +# endif +_GL_FUNCDECL_RPL (closedir, int, (DIR *dirp) _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (closedir, int, (DIR *dirp)); +# else +# if !@HAVE_CLOSEDIR@ +_GL_FUNCDECL_SYS (closedir, int, (DIR *dirp) _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (closedir, int, (DIR *dirp)); +# endif +_GL_CXXALIASWARN (closedir); +#elif defined GNULIB_POSIXCHECK +# undef closedir +# if HAVE_RAW_DECL_CLOSEDIR +_GL_WARN_ON_USE (closedir, "closedir is not portable - " + "use gnulib module closedir for portability"); +# endif +#endif + +#if @GNULIB_DIRFD@ +/* Return the file descriptor associated with the given directory stream, + or -1 if none exists. */ +# if @REPLACE_DIRFD@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef dirfd +# define dirfd rpl_dirfd +# endif +_GL_FUNCDECL_RPL (dirfd, int, (DIR *) _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (dirfd, int, (DIR *)); +# else +# if defined __cplusplus && defined GNULIB_NAMESPACE && defined dirfd + /* dirfd is defined as a macro and not as a function. + Turn it into a function and get rid of the macro. */ +static inline int (dirfd) (DIR *dp) { return dirfd (dp); } +# undef dirfd +# endif +# if !(@HAVE_DECL_DIRFD@ || defined dirfd) +_GL_FUNCDECL_SYS (dirfd, int, (DIR *) _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (dirfd, int, (DIR *)); +# endif +_GL_CXXALIASWARN (dirfd); +#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@ +/* 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). */ +# if @REPLACE_FDOPENDIR@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef fdopendir +# define fdopendir rpl_fdopendir +# endif +_GL_FUNCDECL_RPL (fdopendir, DIR *, (int fd)); +_GL_CXXALIAS_RPL (fdopendir, DIR *, (int fd)); +# else +# if !@HAVE_FDOPENDIR@ || !@HAVE_DECL_FDOPENDIR@ +_GL_FUNCDECL_SYS (fdopendir, DIR *, (int fd)); +# endif +_GL_CXXALIAS_SYS (fdopendir, DIR *, (int fd)); +# endif +_GL_CXXALIASWARN (fdopendir); +#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 @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@ +_GL_FUNCDECL_SYS (scandir, int, + (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 +/* Need to cast, because on glibc systems, the fourth parameter is + int (*cmp) (const void *, const void *). */ +_GL_CXXALIAS_SYS_CAST (scandir, int, + (const char *dir, struct dirent ***namelist, + int (*filter) (const struct dirent *), + int (*cmp) (const struct dirent **, const struct dirent **))); +_GL_CXXALIASWARN (scandir); +#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@ +_GL_FUNCDECL_SYS (alphasort, int, + (const struct dirent **, const struct dirent **) + _GL_ARG_NONNULL ((1, 2))); +# endif +/* Need to cast, because on glibc systems, the parameters are + (const void *, const void *). */ +_GL_CXXALIAS_SYS_CAST (alphasort, int, + (const struct dirent **, const struct dirent **)); +_GL_CXXALIASWARN (alphasort); +#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 + + +#endif /* _@GUARD_PREFIX@_DIRENT_H */ +#endif /* _@GUARD_PREFIX@_DIRENT_H */ diff --git a/gnulib/lib/dirfd.c b/gnulib/lib/dirfd.c new file mode 100644 index 0000000..5f1a70e --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Jim Meyering. */ + +#include + +#include +#include + +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 0000000..f5b0c0f --- /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-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#include "dirname.h" + +#include +#include + +/* 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 0000000..411ded3 --- /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-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#include "dirname.h" + +#include +#include +#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 0000000..ba9c56e --- /dev/null +++ b/gnulib/lib/dirname.h @@ -0,0 +1,46 @@ +/* Take file names apart into directory and base names. + + Copyright (C) 1998, 2001, 2003-2006, 2009-2011 Free Software Foundation, + Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef DIRNAME_H_ +# define DIRNAME_H_ 1 + +# include +# include +# include "dosname.h" + +# ifndef DIRECTORY_SEPARATOR +# define DIRECTORY_SEPARATOR '/' +# endif + +# ifndef DOUBLE_SLASH_IS_DISTINCT_ROOT +# define DOUBLE_SLASH_IS_DISTINCT_ROOT 0 +# endif + +# 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) _GL_ATTRIBUTE_PURE; +size_t dir_len (char const *file) _GL_ATTRIBUTE_PURE; +char *last_component (char const *file) _GL_ATTRIBUTE_PURE; + +bool strip_trailing_slashes (char *file); + +#endif /* not DIRNAME_H_ */ diff --git a/gnulib/lib/dosname.h b/gnulib/lib/dosname.h new file mode 100644 index 0000000..acdd03b --- /dev/null +++ b/gnulib/lib/dosname.h @@ -0,0 +1,53 @@ +/* File names on MS-DOS/Windows systems. + + Copyright (C) 2000-2001, 2004-2006, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + From Paul Eggert and Jim Meyering. */ + +#ifndef _DOSNAME_H +#define _DOSNAME_H + +#if (defined _WIN32 || defined __WIN32__ || \ + defined __MSDOS__ || defined __CYGWIN__ || \ + defined __EMX__ || defined __DJGPP__) + /* 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) +# ifndef __CYGWIN__ +# define FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE 1 +# endif +# define ISSLASH(C) ((C) == '/' || (C) == '\\') +#else +# define FILE_SYSTEM_PREFIX_LEN(Filename) 0 +# define ISSLASH(C) ((C) == '/') +#endif + +#ifndef FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE +# define FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE 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]) || FILE_SYSTEM_PREFIX_LEN (F) != 0) +#endif +#define IS_RELATIVE_FILE_NAME(F) (! IS_ABSOLUTE_FILE_NAME (F)) + +#endif /* DOSNAME_H_ */ diff --git a/gnulib/lib/dprintf.c b/gnulib/lib/dprintf.c new file mode 100644 index 0000000..c58dd06 --- /dev/null +++ b/gnulib/lib/dprintf.c @@ -0,0 +1,70 @@ +/* Formatted output to a file descriptor. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +/* Specification. */ +#include + +#include +#include +#include +#include + +#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/dtoastr.c b/gnulib/lib/dtoastr.c new file mode 100644 index 0000000..aed181d --- /dev/null +++ b/gnulib/lib/dtoastr.c @@ -0,0 +1,2 @@ +#define LENGTH 2 +#include "ftoastr.c" diff --git a/gnulib/lib/dtotimespec.c b/gnulib/lib/dtotimespec.c new file mode 100644 index 0000000..ea0470a --- /dev/null +++ b/gnulib/lib/dtotimespec.c @@ -0,0 +1,69 @@ +/* Convert double to timespec. + + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Paul Eggert */ + +/* Convert the double value SEC to a struct timespec. Round toward + positive infinity. On overflow, return an extremal value. */ + +#include + +#include "timespec.h" + +#include "intprops.h" + +struct timespec +dtotimespec (double sec) +{ + enum { BILLION = 1000 * 1000 * 1000 }; + double min_representable = TYPE_MINIMUM (time_t); + double max_representable = + ((TYPE_MAXIMUM (time_t) * (double) BILLION + (BILLION - 1)) + / BILLION); + struct timespec r; + + if (! (min_representable < sec)) + { + r.tv_sec = TYPE_MINIMUM (time_t); + r.tv_nsec = 0; + } + else if (! (sec < max_representable)) + { + r.tv_sec = TYPE_MAXIMUM (time_t); + r.tv_nsec = BILLION - 1; + } + else + { + time_t s = sec; + double frac = BILLION * (sec - s); + long ns = frac; + ns += ns < frac; + s += ns / BILLION; + ns %= BILLION; + + if (ns < 0) + { + s--; + ns += BILLION; + } + + r.tv_sec = s; + r.tv_nsec = ns; + } + + return r; +} diff --git a/gnulib/lib/dummy.c b/gnulib/lib/dummy.c new file mode 100644 index 0000000..c958ea0 --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* 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 0000000..e922b91 --- /dev/null +++ b/gnulib/lib/dup-safer-flag.c @@ -0,0 +1,40 @@ +/* Duplicate a file descriptor result, avoiding clobbering + STD{IN,OUT,ERR}_FILENO, with specific flags. + + Copyright (C) 2001, 2004-2006, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert and Eric Blake. */ + +#include + +/* Specification. */ +#include "unistd-safer.h" + +#include +#include + +#include "cloexec.h" + +/* 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 0000000..5441b96 --- /dev/null +++ b/gnulib/lib/dup-safer.c @@ -0,0 +1,34 @@ +/* Invoke dup, but avoid some glitches. + + Copyright (C) 2001, 2004-2006, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +#include + +#include "unistd-safer.h" + +#include +#include + +/* 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/dup.c b/gnulib/lib/dup.c new file mode 100644 index 0000000..4a75a0c --- /dev/null +++ b/gnulib/lib/dup.c @@ -0,0 +1,61 @@ +/* Duplicate an open file descriptor. + + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include + +#include "msvc-inval.h" + +#undef dup + +#if HAVE_MSVC_INVALID_PARAMETER_HANDLER +static inline int +dup_nothrow (int fd) +{ + int result; + + TRY_MSVC_INVAL + { + result = dup (fd); + } + CATCH_MSVC_INVAL + { + result = -1; + errno = EBADF; + } + DONE_MSVC_INVAL; + + return result; +} +#else +# define dup_nothrow dup +#endif + +int +rpl_dup (int fd) +{ + int result = dup_nothrow (fd); +#if REPLACE_FCHDIR + if (result >= 0) + result = _gl_register_dup (fd, result); +#endif + return result; +} diff --git a/gnulib/lib/dup2.c b/gnulib/lib/dup2.c new file mode 100644 index 0000000..790c98a --- /dev/null +++ b/gnulib/lib/dup2.c @@ -0,0 +1,157 @@ +/* Duplicate an open file descriptor to a specified file descriptor. + + Copyright (C) 1999, 2004-2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Paul Eggert */ + +#include + +/* Specification. */ +#include + +#include +#include + +#if HAVE_DUP2 + +# undef dup2 + +# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ + +/* Get declarations of the Win32 API functions. */ +# define WIN32_LEAN_AND_MEAN +# include + +# include "msvc-inval.h" + +/* Get _get_osfhandle. */ +# include "msvc-nothrow.h" + +static int +ms_windows_dup2 (int fd, int desired_fd) +{ + int result; + + /* 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; + } + + TRY_MSVC_INVAL + { + result = dup2 (fd, desired_fd); + } + CATCH_MSVC_INVAL + { + errno = EBADF; + result = -1; + } + DONE_MSVC_INVAL; + + if (result == 0) + result = desired_fd; + + return result; +} + +# define dup2 ms_windows_dup2 + +# endif + +int +rpl_dup2 (int fd, int desired_fd) +{ + int result; + +# ifdef F_GETFL + /* On Linux kernels 2.6.26-2.6.29, dup2 (fd, fd) returns -EBADF. + On Cygwin 1.5.x, dup2 (1, 1) returns 0. + On Haiku, dup2 (fd, fd) mistakenly clears FD_CLOEXEC. */ + if (fd == desired_fd) + return fcntl (fd, F_GETFL) == -1 ? -1 : fd; +# endif + + result = dup2 (fd, desired_fd); + + /* Correct an errno value on FreeBSD 6.1 and Cygwin 1.5.x. */ + 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 0000000..7525142 --- /dev/null +++ b/gnulib/lib/dup3.c @@ -0,0 +1,102 @@ +/* Copy a file descriptor, applying specific flags. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 + +/* Specification. */ +#include + +#include +#include +#include + +#include "binary-io.h" + +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 0000000..dc28243 --- /dev/null +++ b/gnulib/lib/duplocale.c @@ -0,0 +1,102 @@ +/* Duplicate a locale object. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible , 2007. */ + +#include + +/* Specification. */ +#include + +#include +#include + +#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 . + Also, on AIX 7.1, duplocale(LC_GLOBAL_LOCALE) returns (locale_t)0 with + errno set to EINVAL. */ + 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 0000000..7249ac7 --- /dev/null +++ b/gnulib/lib/eealloc.h @@ -0,0 +1,79 @@ +/* Memory allocation with expensive empty allocations. + Copyright (C) 2003, 2008, 2010-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#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 + +#if MALLOC_0_IS_NONNULL +# define eemalloc malloc +#else +# if __GNUC__ >= 3 +static inline void *eemalloc (size_t n) + __attribute__ ((__malloc__)) +# if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) + __attribute__ ((__alloc_size__ (1))) +# endif + ; +# 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 +# if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) +static inline void *eerealloc (void *p, size_t n) + __attribute__ ((__alloc_size__ (2))); +# endif +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 0000000..8022c0a --- /dev/null +++ b/gnulib/lib/errno.in.h @@ -0,0 +1,233 @@ +/* A POSIX-like . + + Copyright (C) 2008-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 _@GUARD_PREFIX@_ERRNO_H + +#if __GNUC__ >= 3 +@PRAGMA_SYSTEM_HEADER@ +#endif +@PRAGMA_COLUMNS@ + +/* The include_next requires a split double-inclusion guard. */ +#@INCLUDE_NEXT@ @NEXT_ERRNO_H@ + +#ifndef _@GUARD_PREFIX@_ERRNO_H +#define _@GUARD_PREFIX@_ERRNO_H + + +/* On native Windows platforms, many macros are not defined. */ +# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ + +/* These are the same values as defined by MSVC 10, for interoperability. */ + +# ifndef ENOMSG +# define ENOMSG 122 +# define GNULIB_defined_ENOMSG 1 +# endif + +# ifndef EIDRM +# define EIDRM 111 +# define GNULIB_defined_EIDRM 1 +# endif + +# ifndef ENOLINK +# define ENOLINK 121 +# define GNULIB_defined_ENOLINK 1 +# endif + +# ifndef EPROTO +# define EPROTO 134 +# define GNULIB_defined_EPROTO 1 +# endif + +# ifndef EBADMSG +# define EBADMSG 104 +# define GNULIB_defined_EBADMSG 1 +# endif + +# ifndef EOVERFLOW +# define EOVERFLOW 132 +# define GNULIB_defined_EOVERFLOW 1 +# endif + +# ifndef ENOTSUP +# define ENOTSUP 129 +# define GNULIB_defined_ENOTSUP 1 +# endif + +# ifndef ENETRESET +# define ENETRESET 117 +# define GNULIB_defined_ENETRESET 1 +# endif + +# ifndef ECONNABORTED +# define ECONNABORTED 106 +# define GNULIB_defined_ECONNABORTED 1 +# endif + +# ifndef ECANCELED +# define ECANCELED 105 +# define GNULIB_defined_ECANCELED 1 +# endif + +# ifndef EINPROGRESS +# define EINPROGRESS 112 +# define EALREADY 103 +# define ENOTSOCK 128 +# define EDESTADDRREQ 109 +# define EMSGSIZE 115 +# define EPROTOTYPE 136 +# define ENOPROTOOPT 123 +# define EPROTONOSUPPORT 135 +# define EOPNOTSUPP 130 +# define EAFNOSUPPORT 102 +# define EADDRINUSE 100 +# define EADDRNOTAVAIL 101 +# define ENETDOWN 116 +# define ENETUNREACH 118 +# define ECONNRESET 108 +# define ENOBUFS 119 +# define EISCONN 113 +# define ENOTCONN 126 +# define ETIMEDOUT 138 +# define ECONNREFUSED 107 +# define ELOOP 114 +# define EHOSTUNREACH 110 +# define EWOULDBLOCK 140 +# define ETXTBSY 139 +# define ENODATA 120 /* not required by POSIX */ +# define ENOSR 124 /* not required by POSIX */ +# define ENOSTR 125 /* not required by POSIX */ +# define ENOTRECOVERABLE 127 /* not required by POSIX */ +# define EOWNERDEAD 133 /* not required by POSIX */ +# define ETIME 137 /* not required by POSIX */ +# define EOTHER 131 /* not required by POSIX */ +# define GNULIB_defined_ESOCK 1 +# endif + +/* These are intentionally the same values as the WSA* error numbers, defined + in . */ +# define ESOCKTNOSUPPORT 10044 /* not required by POSIX */ +# define EPFNOSUPPORT 10046 /* not required by POSIX */ +# define ESHUTDOWN 10058 /* not required by POSIX */ +# define ETOOMANYREFS 10059 /* not required by POSIX */ +# define EHOSTDOWN 10064 /* not required by POSIX */ +# 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_EWINSOCK 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. + Likewise, on NonStop Kernel, EDQUOT is 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 ENETRESET +# define ENETRESET 2011 +# define GNULIB_defined_ENETRESET 1 +# endif + +# ifndef ECONNABORTED +# define ECONNABORTED 2012 +# define GNULIB_defined_ECONNABORTED 1 +# endif + +# ifndef ESTALE +# define ESTALE 2009 +# define GNULIB_defined_ESTALE 1 +# endif + +# ifndef EDQUOT +# define EDQUOT 2010 +# define GNULIB_defined_EDQUOT 1 +# endif + +# ifndef ECANCELED +# define ECANCELED 2008 +# define GNULIB_defined_ECANCELED 1 +# endif + + +#endif /* _@GUARD_PREFIX@_ERRNO_H */ +#endif /* _@GUARD_PREFIX@_ERRNO_H */ diff --git a/gnulib/lib/error.c b/gnulib/lib/error.c new file mode 100644 index 0000000..5ebe8bf --- /dev/null +++ b/gnulib/lib/error.c @@ -0,0 +1,400 @@ +/* Error handler for noninteractive utilities + Copyright (C) 1990-1998, 2000-2007, 2009-2011 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 . */ + +/* Written by David MacKenzie . */ + +#if !_LIBC +# include +#endif + +#include "error.h" + +#include +#include +#include +#include + +#if !_LIBC && ENABLE_NLS +# include "gettext.h" +# define _(msgid) gettext (msgid) +#endif + +#ifdef _LIBC +# include +# include +# include +# include +# 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 +# include +# include + +/* 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 +# define fflush(s) INTUSE(_IO_fflush) (s) +# undef putc +# define putc(c, fp) INTUSE(_IO_putc) (c, fp) + +# include + +#else /* not _LIBC */ + +# include +# include + +# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ +/* Get declarations of the Win32 API functions. */ +# define WIN32_LEAN_AND_MEAN +# include +/* Get _get_osfhandle. */ +# include "msvc-nothrow.h" +# endif + +/* The gnulib override of fcntl is not needed in this file. */ +# undef fcntl + +# if !HAVE_DECL_STRERROR_R +# ifndef HAVE_DECL_STRERROR_R +"this configure-time declaration test was not run" +# endif +# if STRERROR_R_CHAR_P +char *strerror_r (); +# else +int strerror_r (); +# endif +# 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 */ + +#if !_LIBC +/* Return non-zero if FD is open. */ +static inline 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. There is no + fcntl, and the gnulib replacement fcntl does not support F_GETFL. */ + 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 +} +#endif + +static inline void +flush_stdout (void) +{ +#if !_LIBC + 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 && is_open (stdout_fd)) +#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 0000000..80f81bc --- /dev/null +++ b/gnulib/lib/error.h @@ -0,0 +1,65 @@ +/* Declaration for error-reporting function + Copyright (C) 1995-1997, 2003, 2006, 2008-2011 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 . */ + +#ifndef _ERROR_H +#define _ERROR_H 1 + +/* 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 _GL_ATTRIBUTE_FORMAT 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 _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec)) +#else +# define _GL_ATTRIBUTE_FORMAT(spec) /* empty */ +#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, ...) + _GL_ATTRIBUTE_FORMAT ((__printf__, 3, 4)); + +extern void error_at_line (int __status, int __errnum, const char *__fname, + unsigned int __lineno, const char *__format, ...) + _GL_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 0000000..b12eb46 --- /dev/null +++ b/gnulib/lib/euidaccess.c @@ -0,0 +1,218 @@ +/* euidaccess -- check if effective user id can access file + + Copyright (C) 1990-1991, 1995, 1998, 2000, 2003-2006, 2008-2011 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 . */ + +/* Written by David MacKenzie and Torbjorn Granlund. + Adapted for GNU C library by Roland McGrath. */ + +#ifndef _LIBC +# include +#endif + +#include +#include +#include +#include + +#if HAVE_LIBGEN_H +# include +#endif + +#include +#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 + +#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 /* glibc, AIX 7, Solaris 11, Cygwin 1.7 */ + return faccessat (AT_FDCWD, file, mode, AT_EACCESS); +#elif defined EFF_ONLY_OK /* IRIX, OSF/1, Interix */ + return access (file, mode | EFF_ONLY_OK); +#elif defined ACC_SELF /* AIX */ + return accessx (file, mode, ACC_SELF); +#elif HAVE_EACCESS /* FreeBSD */ + return eaccess (file, mode); +#else /* MacOS X, NetBSD, OpenBSD, HP-UX, Solaris, Cygwin, mingw, BeOS */ + + 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 +# include +# include + +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 0000000..df49714 --- /dev/null +++ b/gnulib/lib/exclude.c @@ -0,0 +1,578 @@ +/* exclude.c -- exclude file names + + Copyright (C) 1992-1994, 1997, 1999-2007, 2009-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert + and Sergey Poznyakoff . + Thanks to Phil Proudman + for improvement suggestions. */ + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include + +#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; +} + +static void +unescape_pattern (char *str) +{ + int inset = 0; + char *q = str; + do + { + if (inset) + { + if (*q == ']') + inset = 0; + } + else if (*q == '[') + inset = 1; + else if (*q == '\\') + q++; + } + while ((*str++ = *q++)); +} + +/* 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 (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); + if (options & EXCLUDE_WILDCARDS) + unescape_pattern (str); + 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 0000000..63e94d3 --- /dev/null +++ b/gnulib/lib/exclude.h @@ -0,0 +1,52 @@ +/* exclude.h -- declarations for excluding file names + + Copyright (C) 1992-1994, 1997, 1999, 2001-2003, 2005-2006, 2009-2011 Free + Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef _GL_EXCLUDE_H +#define _GL_EXCLUDE_H 1 + +#include + +/* Written by Paul Eggert + and Sergey Poznyakoff */ + +/* 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) _GL_ATTRIBUTE_PURE; + +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 0000000..6de6c62 --- /dev/null +++ b/gnulib/lib/execute.c @@ -0,0 +1,278 @@ +/* Creation of autonomous subprocesses. + Copyright (C) 2001-2004, 2006-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + + +#include + +/* Specification. */ +#include "execute.h" + +#include +#include +#include +#include +#include +#include + +#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 +# include "w32spawn.h" + +#else + +/* Unix API. */ +# include + +#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 a 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 0000000..5750169 --- /dev/null +++ b/gnulib/lib/execute.h @@ -0,0 +1,44 @@ +/* Creation of autonomous subprocesses. + Copyright (C) 2001-2003, 2008-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#ifndef _EXECUTE_H +#define _EXECUTE_H + +#include + +/* 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 0000000..953aa02 --- /dev/null +++ b/gnulib/lib/exitfail.c @@ -0,0 +1,24 @@ +/* Failure exit status + + Copyright (C) 2002-2003, 2005-2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#include "exitfail.h" + +#include + +int volatile exit_failure = EXIT_FAILURE; diff --git a/gnulib/lib/exitfail.h b/gnulib/lib/exitfail.h new file mode 100644 index 0000000..6d01d4f --- /dev/null +++ b/gnulib/lib/exitfail.h @@ -0,0 +1,18 @@ +/* Failure exit status + + Copyright (C) 2002, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +extern int volatile exit_failure; diff --git a/gnulib/lib/expf.c b/gnulib/lib/expf.c new file mode 100644 index 0000000..a16dbea --- /dev/null +++ b/gnulib/lib/expf.c @@ -0,0 +1,26 @@ +/* Exponential function. + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +float +expf (float x) +{ + return (float) exp ((double) x); +} diff --git a/gnulib/lib/expl.c b/gnulib/lib/expl.c new file mode 100644 index 0000000..49fdefa --- /dev/null +++ b/gnulib/lib/expl.c @@ -0,0 +1,147 @@ +/* Emulation for expl. + Contributed by Paolo Bonzini + + Copyright 2002-2003, 2007, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include + +#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE + +long double +expl (long double x) +{ + return exp (x); +} + +#else + +# include + +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; +} + +#endif + +#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/fabsf.c b/gnulib/lib/fabsf.c new file mode 100644 index 0000000..4c0f970 --- /dev/null +++ b/gnulib/lib/fabsf.c @@ -0,0 +1,26 @@ +/* Absolute value. + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +float +fabsf (float x) +{ + return (float) fabs ((double) x); +} diff --git a/gnulib/lib/faccessat.c b/gnulib/lib/faccessat.c new file mode 100644 index 0000000..3ba9fee --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Eric Blake */ + +#include + +#include + +#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 0000000..aca9027 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + + +#include + +/* Specification. */ +#include "fatal-signal.h" + +#include +#include +#include +#include + +#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 0000000..9c6aaa2 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + + +#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 0000000..8b29ae7 --- /dev/null +++ b/gnulib/lib/fbufmode.c @@ -0,0 +1,85 @@ +/* Retrieve information about a FILE stream. + Copyright (C) 2007-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "fbufmode.h" + +#if HAVE___FLBF +# include +#endif + +#include "stdio-impl.h" + +int +fbufmode (FILE *fp) +{ + /* Most systems provide FILE as a struct and the necessary bitmask in + , 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 __minix /* Minix */ + return fp->_flags & (_IOLBF | _IONBF | _IOFBF); +#elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, NonStop Kernel */ +# 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 0000000..b1036b6 --- /dev/null +++ b/gnulib/lib/fbufmode.h @@ -0,0 +1,36 @@ +/* Retrieve information about a FILE stream. + Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#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 0000000..a3623ed --- /dev/null +++ b/gnulib/lib/fchdir.c @@ -0,0 +1,208 @@ +/* fchdir replacement. + Copyright (C) 2006-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "dosname.h" +#include "filenamecat.h" + +#ifndef REPLACE_OPEN_DIRECTORY +# define REPLACE_OPEN_DIRECTORY 0 +#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 an absolute name of DIR in malloc'd storage. */ +static char * +get_name (char const *dir) +{ + char *cwd; + char *result; + int saved_errno; + + if (IS_ABSOLUTE_FILE_NAME (dir)) + return strdup (dir); + + /* We often encounter "."; treat it as a special case. */ + cwd = getcwd (NULL, 0); + if (!cwd || (dir[0] == '.' && dir[1] == '\0')) + return cwd; + + result = mfile_name_concat (cwd, dir, NULL); + saved_errno = errno; + free (cwd); + errno = saved_errno; + 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; +} + + +/* 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 0000000..18fc4df --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Jim Meyering */ + +#include + +#include + +#include + +#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 0000000..6be750b --- /dev/null +++ b/gnulib/lib/fchown-stub.c @@ -0,0 +1,16 @@ +#include + +#include +#include + +/* 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 0000000..303d0fd --- /dev/null +++ b/gnulib/lib/fchownat.c @@ -0,0 +1,114 @@ +/* This function serves as replacement for a missing fchownat function, + as well as a work around for the fchownat bug in glibc-2.4: + + 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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Jim Meyering */ + +#include + +#include + +#include +#include + +#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 FCHOWNAT_EMPTY_FILENAME_BUG + if (file[0] == '\0') + { + errno = ENOENT; + return -1; + } +# 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 0000000..3abe2e8 --- /dev/null +++ b/gnulib/lib/fclose.c @@ -0,0 +1,110 @@ +/* fclose replacement. + Copyright (C) 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include +#include + +#include "freading.h" +#include "msvc-inval.h" + +#undef fclose + +#if HAVE_MSVC_INVALID_PARAMETER_HANDLER +static int +fclose_nothrow (FILE *fp) +{ + int result; + + TRY_MSVC_INVAL + { + result = fclose (fp); + } + CATCH_MSVC_INVAL + { + result = EOF; + errno = EBADF; + } + DONE_MSVC_INVAL; + + return result; +} +#else +# define fclose_nothrow fclose +#endif + +/* Override fclose() to call the overridden fflush() or close(). */ + +int +rpl_fclose (FILE *fp) +{ + int saved_errno = 0; + int fd; + int result = 0; + + /* Don't change behavior on memstreams. */ + fd = fileno (fp); + if (fd < 0) + return fclose_nothrow (fp); + + /* We only need to flush the file if it is not reading or if it is + seekable. This only guarantees the file position of input files + if the fflush module is also in use. */ + if ((!freading (fp) || lseek (fileno (fp), 0, SEEK_CUR) != -1) + && fflush (fp)) + saved_errno = errno; + + /* fclose() calls close(), but we need to also invoke all hooks that our + overridden close() function invokes. See lib/close.c. */ +#if WINDOWS_SOCKETS + /* Call the overridden close(), then the original fclose(). + Note about multithread-safety: There is a race condition where some + other thread could open fd between our close and fclose. */ + if (close (fd) < 0 && saved_errno == 0) + saved_errno = errno; + + fclose_nothrow (fp); /* will fail with errno = EBADF, + if we did not lose a race */ + +#else /* !WINDOWS_SOCKETS */ + /* Call fclose() and invoke all hooks of the overridden close(). */ + +# if REPLACE_FCHDIR + /* Note about multithread-safety: There is a race condition here as well. + Some other thread could open fd between our calls to fclose and + _gl_unregister_fd. */ + result = fclose_nothrow (fp); + if (result == 0) + _gl_unregister_fd (fd); +# else + /* No race condition here. */ + result = fclose_nothrow (fp); +# endif + +#endif /* !WINDOWS_SOCKETS */ + + if (saved_errno != 0) + { + errno = saved_errno; + result = EOF; + } + + return result; +} diff --git a/gnulib/lib/fcntl--.h b/gnulib/lib/fcntl--.h new file mode 100644 index 0000000..ad696c9 --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +#include +#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 0000000..2aaf17e --- /dev/null +++ b/gnulib/lib/fcntl-safer.h @@ -0,0 +1,27 @@ +/* Invoke fcntl-like functions, but avoid some glitches. + + Copyright (C) 2005, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +#include + +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 0000000..92e32ee --- /dev/null +++ b/gnulib/lib/fcntl.c @@ -0,0 +1,311 @@ +/* Provide file descriptor control. + + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Eric Blake . */ + +#include + +/* Specification. */ +#include + +#include +#include +#include +#include + +#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 + +/* Get _get_osfhandle. */ +# include "msvc-nothrow.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 + { + /* Haiku alpha 2 loses fd flags on original. */ + int flags = fcntl (fd, F_GETFD); + if (flags < 0) + { + result = -1; + break; + } + result = fcntl (fd, action, target); + if (0 <= result && fcntl (fd, F_SETFD, flags) == -1) + { + int saved_errno = errno; + close (result); + result = -1; + errno = saved_errno; + } +# 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 0000000..0a07221 --- /dev/null +++ b/gnulib/lib/fcntl.in.h @@ -0,0 +1,325 @@ +/* Like , but with non-working flags defined to 0. + + Copyright (C) 2006-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Paul Eggert */ + +#if __GNUC__ >= 3 +@PRAGMA_SYSTEM_HEADER@ +#endif +@PRAGMA_COLUMNS@ + +#if defined __need_system_fcntl_h +/* Special invocation convention. */ + +#include +/* On some systems other than glibc, is a prerequisite of + . On glibc systems, we would like to avoid namespace pollution. + But on glibc systems, includes inside an + extern "C" { ... } block, which leads to errors in C++ mode with the + overridden from gnulib. These errors are known to be gone + with g++ version >= 4.3. */ +#if !(defined __GLIBC__ || defined __UCLIBC__) || (defined __cplusplus && defined GNULIB_NAMESPACE && !(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))) +# include +#endif +#@INCLUDE_NEXT@ @NEXT_FCNTL_H@ + +#else +/* Normal invocation convention. */ + +#ifndef _@GUARD_PREFIX@_FCNTL_H + +#include +/* On some systems other than glibc, is a prerequisite of + . On glibc systems, we would like to avoid namespace pollution. + But on glibc systems, includes inside an + extern "C" { ... } block, which leads to errors in C++ mode with the + overridden from gnulib. These errors are known to be gone + with g++ version >= 4.3. */ +#if !(defined __GLIBC__ || defined __UCLIBC__) || (defined __cplusplus && defined GNULIB_NAMESPACE && !(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))) +# include +#endif +/* The include_next requires a split double-inclusion guard. */ +#@INCLUDE_NEXT@ @NEXT_FCNTL_H@ + +#ifndef _@GUARD_PREFIX@_FCNTL_H +#define _@GUARD_PREFIX@_FCNTL_H + +#ifndef __GLIBC__ /* Avoid namespace pollution on glibc systems. */ +# include +#endif + + +/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ + +/* The definition of _GL_ARG_NONNULL is copied here. */ + +/* The definition of _GL_WARN_ON_USE is copied here. */ + + +/* Declare overridden functions. */ + +#if @GNULIB_FCNTL@ +# if @REPLACE_FCNTL@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef fcntl +# define fcntl rpl_fcntl +# endif +_GL_FUNCDECL_RPL (fcntl, int, (int fd, int action, ...)); +_GL_CXXALIAS_RPL (fcntl, int, (int fd, int action, ...)); +# else +# if !@HAVE_FCNTL@ +_GL_FUNCDECL_SYS (fcntl, int, (int fd, int action, ...)); +# endif +_GL_CXXALIAS_SYS (fcntl, int, (int fd, int action, ...)); +# endif +_GL_CXXALIASWARN (fcntl); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef open +# define open rpl_open +# endif +_GL_FUNCDECL_RPL (open, int, (const char *filename, int flags, ...) + _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (open, int, (const char *filename, int flags, ...)); +# else +_GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...)); +# endif +/* On HP-UX 11, in C++ mode, open() is defined as an inline function with a + default argument. _GL_CXXALIASWARN does not work in this case. */ +# if !defined __hpux +_GL_CXXALIASWARN (open); +# 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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef openat +# define openat rpl_openat +# endif +_GL_FUNCDECL_RPL (openat, int, + (int fd, char const *file, int flags, /* mode_t mode */ ...) + _GL_ARG_NONNULL ((2))); +_GL_CXXALIAS_RPL (openat, int, + (int fd, char const *file, int flags, /* mode_t mode */ ...)); +# else +# if !@HAVE_OPENAT@ +_GL_FUNCDECL_SYS (openat, int, + (int fd, char const *file, int flags, /* mode_t mode */ ...) + _GL_ARG_NONNULL ((2))); +# endif +_GL_CXXALIAS_SYS (openat, int, + (int fd, char const *file, int flags, /* mode_t mode */ ...)); +# endif +_GL_CXXALIASWARN (openat); +#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 + + +/* 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'. */ +# define O_CLOEXEC O_NOINHERIT +#endif + +#ifndef O_CLOEXEC +# define O_CLOEXEC 0 +#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_EXEC +# define O_EXEC O_RDONLY /* This is often close enough in older systems. */ +#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 + +/* If the gnulib module 'nonblocking' is in use, guarantee a working non-zero + value of O_NONBLOCK. Otherwise, O_NONBLOCK is defined (above) to O_NDELAY + or to 0 as fallback. */ +#if @GNULIB_NONBLOCKING@ +# if O_NONBLOCK +# define GNULIB_defined_O_NONBLOCK 0 +# else +# define GNULIB_defined_O_NONBLOCK 1 +# undef O_NONBLOCK +# define O_NONBLOCK 0x40000000 +# endif +#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_SEARCH +# define O_SEARCH O_RDONLY /* This is often close enough in older systems. */ +#endif + +#ifndef O_SYNC +# define O_SYNC 0 +#endif + +#ifndef O_TTY_INIT +# define O_TTY_INIT 0 +#endif + +#if O_ACCMODE != (O_RDONLY | O_WRONLY | O_RDWR | O_EXEC | O_SEARCH) +# undef O_ACCMODE +# define O_ACCMODE (O_RDONLY | O_WRONLY | O_RDWR | O_EXEC | O_SEARCH) +#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 /* _@GUARD_PREFIX@_FCNTL_H */ +#endif /* _@GUARD_PREFIX@_FCNTL_H */ +#endif diff --git a/gnulib/lib/fd-hook.c b/gnulib/lib/fd-hook.c new file mode 100644 index 0000000..40fbeeb --- /dev/null +++ b/gnulib/lib/fd-hook.c @@ -0,0 +1,116 @@ +/* Hook for making making file descriptor functions close(), ioctl() extensible. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "fd-hook.h" + +#include + +/* 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 fd_hook anchor = { &anchor, &anchor, NULL, NULL }; + +int +execute_close_hooks (const struct fd_hook *remaining_list, gl_close_fn primary, + int fd) +{ + if (remaining_list == &anchor) + /* End of list reached. */ + return primary (fd); + else + return remaining_list->private_close_fn (remaining_list->private_next, + primary, fd); +} + +int +execute_all_close_hooks (gl_close_fn primary, int fd) +{ + return execute_close_hooks (anchor.private_next, primary, fd); +} + +int +execute_ioctl_hooks (const struct fd_hook *remaining_list, gl_ioctl_fn primary, + int fd, int request, void *arg) +{ + if (remaining_list == &anchor) + /* End of list reached. */ + return primary (fd, request, arg); + else + return remaining_list->private_ioctl_fn (remaining_list->private_next, + primary, fd, request, arg); +} + +int +execute_all_ioctl_hooks (gl_ioctl_fn primary, + int fd, int request, void *arg) +{ + return execute_ioctl_hooks (anchor.private_next, primary, fd, request, arg); +} + +void +register_fd_hook (close_hook_fn close_hook, ioctl_hook_fn ioctl_hook, struct fd_hook *link) +{ + if (close_hook == NULL) + close_hook = execute_close_hooks; + if (ioctl_hook == NULL) + ioctl_hook = execute_ioctl_hooks; + + 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_close_fn = close_hook; + link->private_ioctl_fn = ioctl_hook; + anchor.private_next->private_prev = link; + anchor.private_next = link; + } + else + { + /* The link is already in use. */ + if (link->private_close_fn != close_hook + || link->private_ioctl_fn != ioctl_hook) + abort (); + } +} + +void +unregister_fd_hook (struct fd_hook *link) +{ + struct fd_hook *next = link->private_next; + struct fd_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_close_fn = NULL; + link->private_ioctl_fn = NULL; + } +} + +#endif diff --git a/gnulib/lib/fd-hook.h b/gnulib/lib/fd-hook.h new file mode 100644 index 0000000..aab4d91 --- /dev/null +++ b/gnulib/lib/fd-hook.h @@ -0,0 +1,119 @@ +/* Hook for making making file descriptor functions close(), ioctl() extensible. + Copyright (C) 2009-2011 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 . */ + + +#ifndef FD_HOOK_H +#define FD_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 + + +/* Type of function that closes FD. */ +typedef int (*gl_close_fn) (int fd); + +/* Type of function that applies a control request to FD. */ +typedef int (*gl_ioctl_fn) (int fd, int request, void *arg); + +/* An element of the list of file descriptor hooks. + In CLOS (Common Lisp Object System) speak, it consists of an "around" + method for the close() function and an "around" method for the ioctl() + function. + The fields of this structure are considered private. */ +struct fd_hook +{ + /* Doubly linked list. */ + struct fd_hook *private_next; + struct fd_hook *private_prev; + /* Function that treats the types of FD that it knows about and calls + execute_close_hooks (REMAINING_LIST, PRIMARY, FD) as a fallback. */ + int (*private_close_fn) (const struct fd_hook *remaining_list, + gl_close_fn primary, + int fd); + /* Function that treats the types of FD that it knows about and calls + execute_ioctl_hooks (REMAINING_LIST, PRIMARY, FD, REQUEST, ARG) as a + fallback. */ + int (*private_ioctl_fn) (const struct fd_hook *remaining_list, + gl_ioctl_fn primary, + int fd, int request, void *arg); +}; + +/* This type of function closes FD, applying special knowledge for the FD + types it knows about, and calls + execute_close_hooks (REMAINING_LIST, PRIMARY, FD) + for the other FD types. + In CLOS speak, REMAINING_LIST is the remaining list of "around" methods, + and PRIMARY is the "primary" method for close(). */ +typedef int (*close_hook_fn) (const struct fd_hook *remaining_list, + gl_close_fn primary, + int fd); + +/* Execute the close hooks in REMAINING_LIST, with PRIMARY as "primary" method. + Return 0 or -1, like close() would do. */ +extern int execute_close_hooks (const struct fd_hook *remaining_list, + gl_close_fn primary, + int fd); + +/* Execute all close hooks, with PRIMARY as "primary" method. + Return 0 or -1, like close() would do. */ +extern int execute_all_close_hooks (gl_close_fn primary, int fd); + +/* This type of function applies a control request to FD, applying special + knowledge for the FD types it knows about, and calls + execute_ioctl_hooks (REMAINING_LIST, PRIMARY, FD, REQUEST, ARG) + for the other FD types. + In CLOS speak, REMAINING_LIST is the remaining list of "around" methods, + and PRIMARY is the "primary" method for ioctl(). */ +typedef int (*ioctl_hook_fn) (const struct fd_hook *remaining_list, + gl_ioctl_fn primary, + int fd, int request, void *arg); + +/* Execute the ioctl hooks in REMAINING_LIST, with PRIMARY as "primary" method. + Return 0 or -1, like ioctl() would do. */ +extern int execute_ioctl_hooks (const struct fd_hook *remaining_list, + gl_ioctl_fn primary, + int fd, int request, void *arg); + +/* Execute all ioctl hooks, with PRIMARY as "primary" method. + Return 0 or -1, like ioctl() would do. */ +extern int execute_all_ioctl_hooks (gl_ioctl_fn primary, + int fd, int request, void *arg); + +/* Add a function pair to the list of file descriptor hooks. + CLOSE_HOOK and IOCTL_HOOK may be NULL, indicating no change. + The LINK variable points to a piece of memory which is guaranteed to be + accessible until the corresponding call to unregister_fd_hook. */ +extern void register_fd_hook (close_hook_fn close_hook, ioctl_hook_fn ioctl_hook, + struct fd_hook *link); + +/* Removes a hook from the list of file descriptor hooks. */ +extern void unregister_fd_hook (struct fd_hook *link); + + +#endif + + +#ifdef __cplusplus +} +#endif + +#endif /* FD_HOOK_H */ diff --git a/gnulib/lib/fd-safer-flag.c b/gnulib/lib/fd-safer-flag.c new file mode 100644 index 0000000..2305b73 --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert and Eric Blake. */ + +#include + +/* Specification. */ +#include "unistd-safer.h" + +#include +#include + +/* 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 0000000..910fa4c --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +#include + +#include "unistd-safer.h" + +#include +#include + +/* 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/fdatasync.c b/gnulib/lib/fdatasync.c new file mode 100644 index 0000000..3d26793 --- /dev/null +++ b/gnulib/lib/fdatasync.c @@ -0,0 +1,27 @@ +/* Emulate fdatasync on platforms that lack it. + + Copyright (C) 2011 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 . */ + +#include +#include + +int +fdatasync (int fd) +{ + /* This does more work than strictly necessary, but is the best we + can do portably. */ + return fsync (fd); +} diff --git a/gnulib/lib/fdopen.c b/gnulib/lib/fdopen.c new file mode 100644 index 0000000..50c889b --- /dev/null +++ b/gnulib/lib/fdopen.c @@ -0,0 +1,69 @@ +/* Open a stream with a given file descriptor. + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include + +#if HAVE_MSVC_INVALID_PARAMETER_HANDLER +# include "msvc-inval.h" +#endif + +#undef fdopen + +#if HAVE_MSVC_INVALID_PARAMETER_HANDLER +static FILE * +fdopen_nothrow (int fd, const char *mode) +{ + FILE *result; + + TRY_MSVC_INVAL + { + result = fdopen (fd, mode); + } + CATCH_MSVC_INVAL + { + result = NULL; + } + DONE_MSVC_INVAL; + + return result; +} +#else +# define fdopen_nothrow fdopen +#endif + +FILE * +rpl_fdopen (int fd, const char *mode) +{ + int saved_errno = errno; + FILE *fp; + + errno = 0; + fp = fdopen_nothrow (fd, mode); + if (fp == NULL) + { + if (errno == 0) + errno = EBADF; + } + else + errno = saved_errno; + + return fp; +} diff --git a/gnulib/lib/fdopendir.c b/gnulib/lib/fdopendir.c new file mode 100644 index 0000000..0853e59 --- /dev/null +++ b/gnulib/lib/fdopendir.c @@ -0,0 +1,204 @@ +/* provide a replacement fdopendir function + Copyright (C) 2004-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Jim Meyering */ + +#include + +#include + +#include +#include + +#if !HAVE_FDOPENDIR + +# include "openat.h" +# include "openat-priv.h" +# include "save-cwd.h" + +# if GNULIB_DIRENT_SAFER +# include "dirent--.h" +# endif + +# ifndef REPLACE_FCHDIR +# define REPLACE_FCHDIR 0 +# endif + +static DIR *fdopendir_with_dup (int, int, struct saved_cwd const *); +static DIR *fd_clone_opendir (int, struct saved_cwd const *); + +/* Replacement for POSIX fdopendir. + + First, try to simulate it via opendir ("/proc/self/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. + + If successful, the resulting stream is based on FD in + implementations where streams are based on file descriptors and in + applications where no other thread or signal handler allocates or + frees file descriptors. In other cases, consult dirfd on the result + to find out whether FD is still being used. + + Otherwise, this function works just like POSIX fdopendir. + + W A R N I N G: + + Unlike other fd-related functions, this one places constraints on FD. + If this function returns successfully, FD is under control of the + dirent.h system, and the caller should not close or modify the state of + FD other than by the dirent.h functions. */ +DIR * +fdopendir (int fd) +{ + DIR *dir = fdopendir_with_dup (fd, -1, NULL); + + if (! REPLACE_FCHDIR && ! dir) + { + int saved_errno = errno; + if (EXPECTED_ERRNO (saved_errno)) + { + struct saved_cwd cwd; + if (save_cwd (&cwd) != 0) + openat_save_fail (errno); + dir = fdopendir_with_dup (fd, -1, &cwd); + saved_errno = errno; + free_cwd (&cwd); + errno = saved_errno; + } + } + + return dir; +} + +/* Like fdopendir, except that if OLDER_DUPFD is not -1, it is known + to be a dup of FD which is less than FD - 1 and which will be + closed by the caller and not otherwise used by the caller. This + function makes sure that FD is closed and all file descriptors less + than FD are open, and then calls fd_clone_opendir on a dup of FD. + That way, barring race conditions, fd_clone_opendir returns a + stream whose file descriptor is FD. + + If REPLACE_CHDIR or CWD is null, use opendir ("/proc/self/fd/...", + falling back on fchdir metadata. Otherwise, CWD is a saved version + of the working directory; use fchdir/opendir(".")/restore_cwd(CWD). */ +static DIR * +fdopendir_with_dup (int fd, int older_dupfd, struct saved_cwd const *cwd) +{ + int dupfd = dup (fd); + if (dupfd < 0 && errno == EMFILE) + dupfd = older_dupfd; + if (dupfd < 0) + return NULL; + else + { + DIR *dir; + int saved_errno; + if (dupfd < fd - 1 && dupfd != older_dupfd) + { + dir = fdopendir_with_dup (fd, dupfd, cwd); + saved_errno = errno; + } + else + { + close (fd); + dir = fd_clone_opendir (dupfd, cwd); + saved_errno = errno; + if (! dir) + { + int fd1 = dup (dupfd); + if (fd1 != fd) + openat_save_fail (fd1 < 0 ? errno : EBADF); + } + } + + if (dupfd != older_dupfd) + close (dupfd); + errno = saved_errno; + return dir; + } +} + +/* Like fdopendir, except the result controls a clone of FD. It is + the caller's responsibility both to close FD and (if the result is + not null) to closedir the result. */ +static DIR * +fd_clone_opendir (int fd, struct saved_cwd const *cwd) +{ + if (REPLACE_FCHDIR || ! cwd) + { + DIR *dir = NULL; + int saved_errno = EOPNOTSUPP; + char buf[OPENAT_BUFFER_SIZE]; + char *proc_file = openat_proc_name (buf, fd, "."); + if (proc_file) + { + dir = opendir (proc_file); + saved_errno = errno; + if (proc_file != buf) + free (proc_file); + } +# if REPLACE_FCHDIR + if (! dir && EXPECTED_ERRNO (saved_errno)) + { + char const *name = _gl_directory_name (fd); + return (name ? opendir (name) : NULL); + } +# endif + errno = saved_errno; + return dir; + } + else + { + if (fchdir (fd) != 0) + return NULL; + else + { + DIR *dir = opendir ("."); + int saved_errno = errno; + if (restore_cwd (cwd) != 0) + openat_restore_fail (errno); + errno = saved_errno; + return dir; + } + } +} + +#else /* HAVE_FDOPENDIR */ + +# include +# include + +# 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 0000000..d226638 --- /dev/null +++ b/gnulib/lib/fdutimensat.c @@ -0,0 +1,57 @@ +/* Set file access and modification times. + + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify 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 . */ + +/* Written by Eric Blake. */ + +/* derived from a function in utimens.c */ + +#include + +#include "utimens.h" + +#include +#include +#include + +/* 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. + ATFLAG is passed to utimensat if FD is negative or futimens was + unsupported, which can allow operation on FILE as a symlink. + Return 0 on success, -1 (setting errno) on failure. */ + +int +fdutimensat (int fd, int dir, char const *file, struct timespec const ts[2], + int atflag) +{ + int result = 1; + if (0 <= fd) + result = futimens (fd, ts); + if (file && (fd < 0 || (result == -1 && errno == ENOSYS))) + result = utimensat (dir, file, ts, atflag); + 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 0000000..fdbe6de --- /dev/null +++ b/gnulib/lib/fflush.c @@ -0,0 +1,218 @@ +/* fflush.c -- allow flushing input streams + Copyright (C) 2007-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Eric Blake. */ + +#include + +/* Specification. */ +#include + +#include +#include + +#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 /* Minix, AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, NonStop Kernel */ + /* 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(): + + "... the fgetc() function shall ... advance the associated file + position indicator for the stream ..." + + "The file-position indicator is decremented by each successful + call to ungetc()..." + 2) 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) 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/ffs.c b/gnulib/lib/ffs.c new file mode 100644 index 0000000..34916f5 --- /dev/null +++ b/gnulib/lib/ffs.c @@ -0,0 +1,56 @@ +/* ffs.c -- find the first set bit in a word. + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Eric Blake. */ + +#include + +/* Specification. */ +#include + +#include + +int +ffs (int i) +{ +#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) + return __builtin_ffs (i); +#else + /* http://graphics.stanford.edu/~seander/bithacks.html#ZerosOnRightMultLookup + gives this deBruijn constant for a branch-less computation, although + that table counted trailing zeros rather than bit position. This + requires 32-bit int, we fall back to a naive algorithm on the rare + platforms where that assumption is not true. */ + if (CHAR_BIT * sizeof i == 32) + { + static unsigned int table[] = { + 1, 2, 29, 3, 30, 15, 25, 4, 31, 23, 21, 16, 26, 18, 5, 9, + 32, 28, 14, 24, 22, 20, 17, 8, 27, 13, 19, 7, 12, 6, 11, 10 + }; + unsigned int u = i; + unsigned int bit = u & -u; + return table[(bit * 0x077cb531U) >> 27] - !i; + } + else + { + unsigned int j; + for (j = 0; j < CHAR_BIT * sizeof i; j++) + if (i & (1U << j)) + return j + 1; + return 0; + } +#endif +} diff --git a/gnulib/lib/ffsl.c b/gnulib/lib/ffsl.c new file mode 100644 index 0000000..ee99ba7 --- /dev/null +++ b/gnulib/lib/ffsl.c @@ -0,0 +1,4 @@ +#define FUNC ffsl +#define TYPE long int +#define GCC_BUILTIN __builtin_ffsl +#include "ffsl.h" diff --git a/gnulib/lib/ffsl.h b/gnulib/lib/ffsl.h new file mode 100644 index 0000000..ab994b7 --- /dev/null +++ b/gnulib/lib/ffsl.h @@ -0,0 +1,67 @@ +/* ffsl.h -- find the first set bit in a word. + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Eric Blake. */ + +/* This file is meant to be included by ffsl.c and ffsll.c, after + they have defined FUNC and TYPE. */ + +#include + +/* Specification. */ +#include + +#include +#include + +#if !defined FUNC || !defined TYPE +# error +#endif + +int +FUNC (TYPE i) +{ +#if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) && defined GCC_BUILTIN + return GCC_BUILTIN (i); +#else + unsigned TYPE j = i; + /* Split j into chunks, and look at one chunk after the other. */ + enum { chunk_bits = CHAR_BIT * sizeof (unsigned int) }; + /* The number of chunks is ceil (sizeof (TYPE) / sizeof (unsigned int)) + = (sizeof (TYPE) - 1) / sizeof (unsigned int) + 1. */ + enum { chunk_count = (sizeof (TYPE) - 1) / sizeof (unsigned int) + 1 }; + + if (chunk_count > 1) + { + size_t k; + + /* It is tempting to write if (!j) here, but if we do this, + Solaris 10/x86 "cc -O" miscompiles the code. */ + if (!i) + return 0; + /* Unroll the first loop round. k = 0. */ + if ((unsigned int) j) + return ffs ((unsigned int) j); + /* Generic loop. */ + for (k = 1; k < chunk_count - 1; k++) + if ((unsigned int) (j >> (k * chunk_bits)) != 0) + return k * chunk_bits + ffs ((unsigned int) (j >> (k * chunk_bits))); + } + /* Last loop round. k = chunk_count - 1. */ + return (chunk_count - 1) * chunk_bits + + ffs ((unsigned int) (j >> ((chunk_count - 1) * chunk_bits))); +#endif +} diff --git a/gnulib/lib/ffsll.c b/gnulib/lib/ffsll.c new file mode 100644 index 0000000..f0e9425 --- /dev/null +++ b/gnulib/lib/ffsll.c @@ -0,0 +1,4 @@ +#define FUNC ffsll +#define TYPE long long int +#define GCC_BUILTIN __builtin_ffsll +#include "ffsl.h" diff --git a/gnulib/lib/file-has-acl.c b/gnulib/lib/file-has-acl.c new file mode 100644 index 0000000..4ff2808 --- /dev/null +++ b/gnulib/lib/file-has-acl.c @@ -0,0 +1,839 @@ +/* Test whether a file has a nontrivial access control list. + + Copyright (C) 2002-2003, 2005-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Written by Paul Eggert, Andreas Grünbacher, and Bruno Haible. */ + +#include + +#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_FACL && defined GETACL /* Solaris, Cygwin, not HP-UX */ + +/* 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 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 & (OLD_ACE_OWNER | OLD_ACE_GROUP | OLD_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 == OLD_ALLOW + && (ace->a_flags == OLD_ACE_OWNER + || ace->a_flags == OLD_ACE_GROUP + || ace->a_flags == OLD_ACE_OTHER))) + return 1; + } + else + { + /* Running on Solaris 10 (newer version) or Solaris 11. */ + unsigned int access_masks[6] = + { + 0, /* owner@ deny */ + 0, /* owner@ allow */ + 0, /* group@ deny */ + 0, /* group@ allow */ + 0, /* everyone@ deny */ + 0 /* everyone@ allow */ + }; + + for (i = 0; i < count; i++) + { + ace_t *ace = &entries[i]; + unsigned int index1; + unsigned int index2; + + if (ace->a_type == NEW_ACE_ACCESS_ALLOWED_ACE_TYPE) + index1 = 1; + else if (ace->a_type == NEW_ACE_ACCESS_DENIED_ACE_TYPE) + index1 = 0; + else + return 1; + + if (ace->a_flags == NEW_ACE_OWNER) + index2 = 0; + else if (ace->a_flags == (NEW_ACE_GROUP | NEW_ACE_IDENTIFIER_GROUP)) + index2 = 2; + else if (ace->a_flags == NEW_ACE_EVERYONE) + index2 = 4; + else + return 1; + + access_masks[index1 + index2] |= ace->a_access_mask; + } + + /* The same bit shouldn't be both allowed and denied. */ + if (access_masks[0] & access_masks[1]) + return 1; + if (access_masks[2] & access_masks[3]) + return 1; + if (access_masks[4] & access_masks[5]) + return 1; + + /* Check minimum masks. */ + if ((NEW_ACE_WRITE_NAMED_ATTRS + | NEW_ACE_WRITE_ATTRIBUTES + | NEW_ACE_WRITE_ACL + | NEW_ACE_WRITE_OWNER) + & ~ access_masks[1]) + return 1; + access_masks[1] &= ~(NEW_ACE_WRITE_NAMED_ATTRS + | NEW_ACE_WRITE_ATTRIBUTES + | NEW_ACE_WRITE_ACL + | NEW_ACE_WRITE_OWNER); + if ((NEW_ACE_WRITE_NAMED_ATTRS + | NEW_ACE_WRITE_ATTRIBUTES + | NEW_ACE_WRITE_ACL + | NEW_ACE_WRITE_OWNER) + & ~ access_masks[4]) + return 1; + access_masks[4] &= ~(NEW_ACE_WRITE_NAMED_ATTRS + | NEW_ACE_WRITE_ATTRIBUTES + | NEW_ACE_WRITE_ACL + | NEW_ACE_WRITE_OWNER); + if ((NEW_ACE_READ_NAMED_ATTRS + | NEW_ACE_READ_ATTRIBUTES + | NEW_ACE_READ_ACL + | NEW_ACE_SYNCHRONIZE) + & ~ access_masks[5]) + return 1; + access_masks[5] &= ~(NEW_ACE_READ_NAMED_ATTRS + | NEW_ACE_READ_ATTRIBUTES + | NEW_ACE_READ_ACL + | NEW_ACE_SYNCHRONIZE); + + /* Check the allowed or denied bits. */ + if ((access_masks[0] | access_masks[1]) + != (NEW_ACE_READ_DATA + | NEW_ACE_WRITE_DATA | NEW_ACE_APPEND_DATA + | NEW_ACE_EXECUTE)) + return 1; + if ((access_masks[2] | access_masks[3]) + != (NEW_ACE_READ_DATA + | NEW_ACE_WRITE_DATA | NEW_ACE_APPEND_DATA + | NEW_ACE_EXECUTE)) + return 1; + if ((access_masks[4] | access_masks[5]) + != (NEW_ACE_READ_DATA + | NEW_ACE_WRITE_DATA | NEW_ACE_APPEND_DATA + | NEW_ACE_EXECUTE)) + return 1; + + /* Check that the NEW_ACE_WRITE_DATA and NEW_ACE_APPEND_DATA bits are + either both allowed or both denied. */ + if (((access_masks[0] & NEW_ACE_WRITE_DATA) != 0) + != ((access_masks[0] & NEW_ACE_APPEND_DATA) != 0)) + return 1; + if (((access_masks[2] & NEW_ACE_WRITE_DATA) != 0) + != ((access_masks[2] & NEW_ACE_APPEND_DATA) != 0)) + return 1; + if (((access_masks[4] & NEW_ACE_WRITE_DATA) != 0) + != ((access_masks[4] & NEW_ACE_APPEND_DATA) != 0)) + return 1; + } + + return 0; +} + +# 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; +} + +# if HAVE_ACLV_H /* HP-UX >= 11.11 */ + +/* Return 1 if the given ACL is non-trivial. + Return 0 if it is trivial, i.e. equivalent to a simple stat() mode. */ +int +aclv_nontrivial (int count, struct acl *entries) +{ + int i; + + for (i = 0; i < count; i++) + { + struct acl *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 /* no need to check ace->a_id here */ + || ace->a_type == GROUP_OBJ /* no need to check ace->a_id here */ + || ace->a_type == CLASS_OBJ + || ace->a_type == OTHER_OBJ)) + return 1; + } + return 0; +} + +# endif + +#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 + +#elif USE_ACL && HAVE_ACLSORT /* NonStop Kernel */ + +/* Test an ACL retrieved with ACL_GET. + 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, struct acl *entries) +{ + int i; + + for (i = 0; i < count; i++) + { + struct acl *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 /* no need to check ace->a_id here */ + || ace->a_type == GROUP_OBJ /* no need to check ace->a_id here */ + || ace->a_type == CLASS_OBJ + || ace->a_type == OTHER_OBJ)) + return 1; + } + return 0; +} + +#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 NAME, obtained + through stat() or lstat(). */ + +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_FACL && defined GETACLCNT /* Solaris, Cygwin, not HP-UX */ + +# if defined ACL_NO_TRIVIAL + + /* Solaris 10 (newer version), which has additional API declared in + (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; + + /* In the old (original Solaris 10) convention: + If there are more than 3 entries, there cannot be only the + ACE_OWNER, ACE_GROUP, ACE_OTHER entries. + In the newer Solaris 10 and Solaris 11 convention: + If there are more than 6 entries, there cannot be only the + ACE_OWNER, ACE_GROUP, ACE_EVERYONE entries, each once with + NEW_ACE_ACCESS_ALLOWED_ACE_TYPE and once with + NEW_ACE_ACCESS_DENIED_ACE_TYPE. */ + if (count > 6) + 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 */ + + for (;;) + { + int count; + struct acl_entry entries[NACLENTRIES]; + + count = getacl (name, 0, NULL); + + if (count < 0) + { + /* ENOSYS is seen on newer HP-UX versions. + EOPNOTSUPP is typically seen on NFS mounts. + ENOTSUP was seen on Quantum StorNext file systems (cvfs). */ + if (errno == ENOSYS || errno == EOPNOTSUPP || errno == ENOTSUP) + break; + else + return -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. */ + } + +# if HAVE_ACLV_H /* HP-UX >= 11.11 */ + + for (;;) + { + int count; + struct acl entries[NACLVENTRIES]; + + count = acl ((char *) name, ACL_CNT, NACLVENTRIES, entries); + + if (count < 0) + { + /* EOPNOTSUPP is seen on NFS in HP-UX 11.11, 11.23. + EINVAL is seen on NFS in HP-UX 11.31. */ + if (errno == ENOSYS || errno == EOPNOTSUPP || errno == EINVAL) + break; + else + return -1; + } + + if (count == 0) + return 0; + + if (count > NACLVENTRIES) + /* If NACLVENTRIES cannot be trusted, use dynamic memory + allocation. */ + abort (); + + /* If there are more than 4 entries, there cannot be only the + four base ACL entries. */ + if (count > 4) + return 1; + + if (acl ((char *) name, ACL_GET, count, entries) == count) + return aclv_nontrivial (count, entries); + /* Huh? The number of ACL entries changed since the last call. + Repeat. */ + } + +# endif + +# 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 == ENOSYS) + return 0; + 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); + +# elif HAVE_ACLSORT /* NonStop Kernel */ + + int count; + struct acl entries[NACLENTRIES]; + + for (;;) + { + count = acl ((char *) name, ACL_CNT, NACLENTRIES, NULL); + + if (count < 0) + { + if (errno == ENOSYS || errno == ENOTSUP) + break; + else + return -1; + } + + if (count == 0) + return 0; + + if (count > NACLENTRIES) + /* If NACLENTRIES cannot be trusted, use dynamic memory + allocation. */ + abort (); + + /* If there are more than 4 entries, there cannot be only the + four base ACL entries. */ + if (count > 4) + return 1; + + if (acl ((char *) name, ACL_GET, count, entries) == count) + return acl_nontrivial (count, entries); + /* Huh? The number of ACL entries changed since the last call. + Repeat. */ + } + +# endif + } +#endif + + return 0; +} diff --git a/gnulib/lib/file-set.c b/gnulib/lib/file-set.c new file mode 100644 index 0000000..0126556 --- /dev/null +++ b/gnulib/lib/file-set.c @@ -0,0 +1,74 @@ +/* Specialized functions to manipulate a set of files. + Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Jim Meyering */ + +#include +#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 0000000..4e47d95 --- /dev/null +++ b/gnulib/lib/file-set.h @@ -0,0 +1,15 @@ +#include +#include +#include + +#include "hash.h" + +extern void record_file (Hash_table *ht, char const *file, + struct stat const *stats) +#if defined __GNUC__ && ((__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3) + __attribute__ ((nonnull (2, 3))) +#endif +; + +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 0000000..109db44 --- /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-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +#include + +#include "file-type.h" + +#include +#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 0000000..d7c66e9 --- /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-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert and Jim Meyering. */ + +#ifndef FILE_TYPE_H +# define FILE_TYPE_H 1 + +# include +# include + +char const *file_type (struct stat const *) _GL_ATTRIBUTE_PURE; + +#endif /* FILE_TYPE_H */ diff --git a/gnulib/lib/fileblocks.c b/gnulib/lib/fileblocks.c new file mode 100644 index 0000000..993ec97 --- /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-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Brian L. Matthews, blm@6sceng.UUCP. */ + +#include + +#include + +#if HAVE_SYS_PARAM_H +# include +#endif + +#if !HAVE_STRUCT_STAT_ST_BLOCKS && !defined _POSIX_SOURCE && defined BSIZE + +# include + +# 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 0000000..0f6641a --- /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-2011 Free + Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#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 0000000..1a50302 --- /dev/null +++ b/gnulib/lib/filemode.h @@ -0,0 +1,44 @@ +/* Make a string describing file modes. + + Copyright (C) 1998-1999, 2003, 2006, 2009-2011 Free Software Foundation, + Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef FILEMODE_H_ + +# include +# include + +/* Get the declaration of strmode. */ +# if HAVE_DECL_STRMODE +# include /* MacOS X, FreeBSD, OpenBSD */ +# include /* NetBSD */ +# endif + +# ifdef __cplusplus +extern "C" { +# endif + +# if !HAVE_DECL_STRMODE +extern void strmode (mode_t mode, char *str); +# endif + +extern void filemodestring (struct stat const *statp, char *str); + +# ifdef __cplusplus +} +# endif + +#endif diff --git a/gnulib/lib/filename.h b/gnulib/lib/filename.h new file mode 100644 index 0000000..7827c11 --- /dev/null +++ b/gnulib/lib/filename.h @@ -0,0 +1,54 @@ +/* Basic filename support macros. + Copyright (C) 2001-2004, 2007-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#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 0000000..26d1c73 --- /dev/null +++ b/gnulib/lib/filenamecat-lgpl.c @@ -0,0 +1,88 @@ +/* Concatenate two arbitrary file names. + + Copyright (C) 1996-2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Jim Meyering. */ + +#include + +/* Specification. */ +#include "filenamecat.h" + +#include +#include + +#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 * _GL_ATTRIBUTE_PURE +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 0000000..86b4e07 --- /dev/null +++ b/gnulib/lib/filenamecat.c @@ -0,0 +1,41 @@ +/* Concatenate two arbitrary file names. + + Copyright (C) 1996-2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Jim Meyering. */ + +#include + +/* Specification. */ +#include "filenamecat.h" + +#include +#include + +#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 0000000..31b3375 --- /dev/null +++ b/gnulib/lib/filenamecat.h @@ -0,0 +1,27 @@ +/* Concatenate two arbitrary file names. + + Copyright (C) 1996-1997, 2003, 2005, 2007, 2009-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* 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 0000000..fd9e9f4 --- /dev/null +++ b/gnulib/lib/filevercmp.c @@ -0,0 +1,181 @@ +/* + Copyright (C) 1995 Ian Jackson + Copyright (C) 2001 Anthony Towns + Copyright (C) 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include +#include "filevercmp.h" + +#include +#include +#include +#include +#include +#include + +/* 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 _GL_ATTRIBUTE_PURE +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 0000000..8fedcb5 --- /dev/null +++ b/gnulib/lib/filevercmp.h @@ -0,0 +1,42 @@ +/* + Copyright (C) 1995 Ian Jackson + Copyright (C) 2001 Anthony Towns + Copyright (C) 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#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 0000000..4adf469 --- /dev/null +++ b/gnulib/lib/findprog-lgpl.c @@ -0,0 +1,20 @@ +/* Locating a program in PATH. + Copyright (C) 2001-2004, 2006-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#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 0000000..81b641d --- /dev/null +++ b/gnulib/lib/findprog.c @@ -0,0 +1,138 @@ +/* Locating a program in PATH. + Copyright (C) 2001-2004, 2006-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + + +#include + +/* Specification. */ +#include "findprog.h" + +#include +#include +#include +#include + +/* 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 0000000..dcd6e85 --- /dev/null +++ b/gnulib/lib/findprog.h @@ -0,0 +1,37 @@ +/* Locating a program in PATH. + Copyright (C) 2001-2003, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + + +#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 0000000..c8cf5c3 --- /dev/null +++ b/gnulib/lib/float+.h @@ -0,0 +1,148 @@ +/* Supplemental information about the floating-point formats. + Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 +#include + +/* 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[SIZEOF_FLT <= sizeof (float) ? 1 : -1]; +typedef int verify_sizeof_dbl[SIZEOF_DBL <= sizeof (double) ? 1 : - 1]; +typedef int verify_sizeof_ldbl[SIZEOF_LDBL <= sizeof (long double) ? 1 : - 1]; + +#endif /* _FLOATPLUS_H */ diff --git a/gnulib/lib/float.c b/gnulib/lib/float.c new file mode 100644 index 0000000..b05b40c --- /dev/null +++ b/gnulib/lib/float.c @@ -0,0 +1,33 @@ +/* Auxiliary definitions for . + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#if (defined _ARCH_PPC || defined _POWER) && (defined _AIX || defined __linux__) && (LDBL_MANT_DIG == 106) && defined __GNUC__ +const union gl_long_double_union gl_LDBL_MAX = + { { DBL_MAX, DBL_MAX / (double)134217728UL / (double)134217728UL } }; +#elif defined __i386__ +const union gl_long_double_union gl_LDBL_MAX = + { { 0xFFFFFFFF, 0xFFFFFFFF, 32766 } }; +#else +/* This declaration is solely to ensure that after preprocessing + this file is never empty. */ +typedef int dummy; +#endif diff --git a/gnulib/lib/float.in.h b/gnulib/lib/float.in.h new file mode 100644 index 0000000..d5b2258 --- /dev/null +++ b/gnulib/lib/float.in.h @@ -0,0 +1,188 @@ +/* A correct . + + Copyright (C) 2007-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef _@GUARD_PREFIX@_FLOAT_H + +#if __GNUC__ >= 3 +@PRAGMA_SYSTEM_HEADER@ +#endif +@PRAGMA_COLUMNS@ + +/* The include_next requires a split double-inclusion guard. */ +#@INCLUDE_NEXT@ @NEXT_FLOAT_H@ + +#ifndef _@GUARD_PREFIX@_FLOAT_H +#define _@GUARD_PREFIX@_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 + +/* On FreeBSD/x86 6.4, the 'long double' type really has only 53 bits of + precision in the compiler but 64 bits of precision at runtime. See + . */ +#if defined __i386__ && defined __FreeBSD__ +/* 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.084202172485504434007452800869941711426e-19L /* 2^-63 */ +/* 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.3621031431120935E-4932L /* = 0x1p-16382L */ +/* Maximum representable finite number. */ +# undef LDBL_MAX +/* LDBL_MAX is represented as { 0xFFFFFFFF, 0xFFFFFFFF, 32766 }. + But the largest literal that GCC allows us to write is + 0x0.fffffffffffff8p16384L = { 0xFFFFF800, 0xFFFFFFFF, 32766 }. + So, define it like this through a reference to an external variable + + const unsigned int LDBL_MAX[3] = { 0xFFFFFFFF, 0xFFFFFFFF, 32766 }; + extern const long double LDBL_MAX; + + Unfortunately, this is not a constant expression. */ +union gl_long_double_union + { + struct { unsigned int lo; unsigned int hi; unsigned int exponent; } xd; + long double ld; + }; +extern const union gl_long_double_union gl_LDBL_MAX; +# define LDBL_MAX (gl_LDBL_MAX.ld) +/* 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 + +/* On AIX 7.1 with gcc 4.2, the values of LDBL_MIN_EXP, LDBL_MIN, LDBL_MAX are + wrong. + On Linux/PowerPC with gcc 4.4, the value of LDBL_MAX is wrong. */ +#if (defined _ARCH_PPC || defined _POWER) && defined _AIX && (LDBL_MANT_DIG == 106) && defined __GNUC__ +# undef LDBL_MIN_EXP +# define LDBL_MIN_EXP DBL_MIN_EXP +# undef LDBL_MIN_10_EXP +# define LDBL_MIN_10_EXP DBL_MIN_10_EXP +# undef LDBL_MIN +# define LDBL_MIN 2.22507385850720138309023271733240406422e-308L /* DBL_MIN = 2^-1022 */ +#endif +#if (defined _ARCH_PPC || defined _POWER) && (defined _AIX || defined __linux__) && (LDBL_MANT_DIG == 106) && defined __GNUC__ +# undef LDBL_MAX +/* LDBL_MAX is represented as { 0x7FEFFFFF, 0xFFFFFFFF, 0x7C8FFFFF, 0xFFFFFFFF }. + It is not easy to define: + #define LDBL_MAX 1.79769313486231580793728971405302307166e308L + is too small, whereas + #define LDBL_MAX 1.79769313486231580793728971405302307167e308L + is too large. Apparently a bug in GCC decimal-to-binary conversion. + Also, I can't get values larger than + #define LDBL63 ((long double) (1ULL << 63)) + #define LDBL882 (LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63) + #define LDBL945 (LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63) + #define LDBL1008 (LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63) + #define LDBL_MAX (LDBL1008 * 65535.0L + LDBL945 * (long double) 9223372036821221375ULL + LDBL882 * (long double) 4611686018427387904ULL) + which is represented as { 0x7FEFFFFF, 0xFFFFFFFF, 0x7C8FFFFF, 0xF8000000 }. + So, define it like this through a reference to an external variable + + const double LDBL_MAX[2] = { DBL_MAX, DBL_MAX / (double)134217728UL / (double)134217728UL }; + extern const long double LDBL_MAX; + + or through a pointer cast + + #define LDBL_MAX \ + (*(const long double *) (double[]) { DBL_MAX, DBL_MAX / (double)134217728UL / (double)134217728UL }) + + Unfortunately, this is not a constant expression, and the latter expression + does not work well when GCC is optimizing.. */ +union gl_long_double_union + { + struct { double hi; double lo; } dd; + long double ld; + }; +extern const union gl_long_double_union gl_LDBL_MAX; +# define LDBL_MAX (gl_LDBL_MAX.ld) +#endif + +/* On IRIX 6.5, with cc, the value of LDBL_MANT_DIG is wrong. + On IRIX 6.5, with gcc 4.2, the values of LDBL_MIN_EXP, LDBL_MIN, LDBL_EPSILON + are wrong. */ +#if defined __sgi && (LDBL_MANT_DIG >= 106) +# undef LDBL_MANT_DIG +# define LDBL_MANT_DIG 106 +# if defined __GNUC__ +# undef LDBL_MIN_EXP +# define LDBL_MIN_EXP DBL_MIN_EXP +# undef LDBL_MIN_10_EXP +# define LDBL_MIN_10_EXP DBL_MIN_10_EXP +# undef LDBL_MIN +# define LDBL_MIN 2.22507385850720138309023271733240406422e-308L /* DBL_MIN = 2^-1022 */ +# undef LDBL_EPSILON +# define LDBL_EPSILON 2.46519032881566189191165176650870696773e-32L /* 2^-105 */ +# endif +#endif + +#if @REPLACE_ITOLD@ +/* Pull in a function that fixes the 'int' to 'long double' conversion + of glibc 2.7. */ +extern +# ifdef __cplusplus +"C" +# endif +void _Qp_itoq (long double *, int); +static void (*_gl_float_fix_itold) (long double *, int) = _Qp_itoq; +#endif + +#endif /* _@GUARD_PREFIX@_FLOAT_H */ +#endif /* _@GUARD_PREFIX@_FLOAT_H */ diff --git a/gnulib/lib/flock.c b/gnulib/lib/flock.c new file mode 100644 index 0000000..439ff43 --- /dev/null +++ b/gnulib/lib/flock.c @@ -0,0 +1,220 @@ +/* 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 + + Copyright (C) 2008-2011 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 Lesser General Public License + along with this program. If not, see . */ + +#include +#include + +#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ + +/* LockFileEx */ +# define WIN32_LEAN_AND_MEAN +# include + +# include + +/* _get_osfhandle */ +# include "msvc-nothrow.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. */ + +# include + +# ifdef HAVE_UNISTD_H +# include +# endif + +# include +# include + +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 0000000..71a5b30 --- /dev/null +++ b/gnulib/lib/floor.c @@ -0,0 +1,99 @@ +/* Round towards negative infinity. + Copyright (C) 2007, 2010-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible , 2007. */ + +#if ! defined USE_LONG_DOUBLE +# include +#endif + +/* Specification. */ +#include + +#include + +#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)) + { + /* For 0 < x < 1, return +0.0 even if the current rounding mode is + FE_DOWNWARD. */ + if (z < L_(1.0)) + z = L_(0.0); + /* Avoid rounding errors for values near 2^k, where k >= MANT_DIG-1. */ + else 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 0000000..a62a4d1 --- /dev/null +++ b/gnulib/lib/floorf.c @@ -0,0 +1,20 @@ +/* Round towards negative infinity. + Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible , 2007. */ + +#define USE_FLOAT +#include "floor.c" diff --git a/gnulib/lib/floorl.c b/gnulib/lib/floorl.c new file mode 100644 index 0000000..aa62294 --- /dev/null +++ b/gnulib/lib/floorl.c @@ -0,0 +1,37 @@ +/* Round towards negative infinity. + Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible , 2007. */ + +#include + +#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE + +/* Specification. */ +# include + +long double +floorl (long double x) +{ + return floor (x); +} + +#else + +# define USE_LONG_DOUBLE +# include "floor.c" + +#endif diff --git a/gnulib/lib/fma.c b/gnulib/lib/fma.c new file mode 100644 index 0000000..d804663 --- /dev/null +++ b/gnulib/lib/fma.c @@ -0,0 +1,887 @@ +/* Fused multiply-add. + Copyright (C) 2007, 2009, 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible , 2011. */ + +#if ! defined USE_LONG_DOUBLE +# include +#endif + +/* Specification. */ +#include + +#include +#include + +#if HAVE_FEGETROUND +# include +#endif + +#include "float+.h" +#include "integer_length.h" +#include "verify.h" + +#ifdef USE_LONG_DOUBLE +# define FUNC fmal +# define DOUBLE long double +# define FREXP frexpl +# define LDEXP ldexpl +# define MIN_EXP LDBL_MIN_EXP +# define MANT_BIT LDBL_MANT_BIT +# define L_(literal) literal##L +#elif ! defined USE_FLOAT +# define FUNC fma +# define DOUBLE double +# define FREXP frexp +# define LDEXP ldexp +# define MIN_EXP DBL_MIN_EXP +# define MANT_BIT DBL_MANT_BIT +# define L_(literal) literal +#else /* defined USE_FLOAT */ +# define FUNC fmaf +# define DOUBLE float +# define FREXP frexpf +# define LDEXP ldexpf +# define MIN_EXP FLT_MIN_EXP +# define MANT_BIT FLT_MANT_BIT +# define L_(literal) literal##f +#endif + +#undef MAX +#define MAX(a,b) ((a) > (b) ? (a) : (b)) + +#undef MIN +#define MIN(a,b) ((a) < (b) ? (a) : (b)) + +/* It is possible to write an implementation of fused multiply-add with + floating-point operations alone. See + Sylvie Boldo, Guillaume Melquiond: + Emulation of FMA and correctly-rounded sums: proved algorithms using + rounding to odd. + + But is it complicated. + Here we take the simpler (and probably slower) approach of doing + multi-precision arithmetic. */ + +/* 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 +verify (sizeof (mp_limb_t) * CHAR_BIT == GMP_LIMB_BITS); + +typedef unsigned long long mp_twolimb_t; +#define GMP_TWOLIMB_BITS 64 +verify (sizeof (mp_twolimb_t) * CHAR_BIT == GMP_TWOLIMB_BITS); + +/* Number of limbs needed for a single DOUBLE. */ +#define NLIMBS1 ((MANT_BIT + GMP_LIMB_BITS - 1) / GMP_LIMB_BITS) + +/* Number of limbs needed for the accumulator. */ +#define NLIMBS3 (3 * NLIMBS1 + 1) + +/* Assuming 0.5 <= x < 1.0: + Convert the mantissa (x * 2^DBL_MANT_BIT) to a sequence of limbs. */ +static void +decode (DOUBLE x, mp_limb_t limbs[NLIMBS1]) +{ + /* 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^31 (to 'unsigned int' or 'int', + doesn't matter). + So, we split the MANT_BIT bits of x into a number of chunks of + at most 31 bits. */ + enum { chunk_count = (MANT_BIT - 1) / 31 + 1 }; + /* Variables used for storing the bits limb after limb. */ + mp_limb_t *p = limbs + NLIMBS1 - 1; + mp_limb_t accu = 0; + unsigned int bits_needed = MANT_BIT - (NLIMBS1 - 1) * GMP_LIMB_BITS; + /* The bits bits_needed-1...0 need to be ORed into the accu. + 1 <= bits_needed <= GMP_LIMB_BITS. */ + /* Unroll the first 4 loop rounds. */ + if (chunk_count > 0) + { + /* Here we still have MANT_BIT-0*31 bits to extract from x. */ + enum { chunk_bits = MIN (31, MANT_BIT - 0 * 31) }; /* > 0, <= 31 */ + mp_limb_t d; + x *= (mp_limb_t) 1 << chunk_bits; + d = (int) x; /* 0 <= d < 2^chunk_bits. */ + x -= d; + if (!(x >= L_(0.0) && x < L_(1.0))) + abort (); + if (bits_needed < chunk_bits) + { + /* store bits_needed bits */ + accu |= d >> (chunk_bits - bits_needed); + *p = accu; + if (p == limbs) + goto done; + p--; + /* hold (chunk_bits - bits_needed) bits */ + accu = d << (GMP_LIMB_BITS - (chunk_bits - bits_needed)); + bits_needed = GMP_LIMB_BITS - (chunk_bits - bits_needed); + } + else + { + /* store chunk_bits bits */ + accu |= d << (bits_needed - chunk_bits); + bits_needed -= chunk_bits; + if (bits_needed == 0) + { + *p = accu; + if (p == limbs) + goto done; + p--; + accu = 0; + bits_needed = GMP_LIMB_BITS; + } + } + } + if (chunk_count > 1) + { + /* Here we still have MANT_BIT-1*31 bits to extract from x. */ + enum { chunk_bits = MIN (31, MAX (MANT_BIT - 1 * 31, 0)) }; /* > 0, <= 31 */ + mp_limb_t d; + x *= (mp_limb_t) 1 << chunk_bits; + d = (int) x; /* 0 <= d < 2^chunk_bits. */ + x -= d; + if (!(x >= L_(0.0) && x < L_(1.0))) + abort (); + if (bits_needed < chunk_bits) + { + /* store bits_needed bits */ + accu |= d >> (chunk_bits - bits_needed); + *p = accu; + if (p == limbs) + goto done; + p--; + /* hold (chunk_bits - bits_needed) bits */ + accu = d << (GMP_LIMB_BITS - (chunk_bits - bits_needed)); + bits_needed = GMP_LIMB_BITS - (chunk_bits - bits_needed); + } + else + { + /* store chunk_bits bits */ + accu |= d << (bits_needed - chunk_bits); + bits_needed -= chunk_bits; + if (bits_needed == 0) + { + *p = accu; + if (p == limbs) + goto done; + p--; + accu = 0; + bits_needed = GMP_LIMB_BITS; + } + } + } + if (chunk_count > 2) + { + /* Here we still have MANT_BIT-2*31 bits to extract from x. */ + enum { chunk_bits = MIN (31, MAX (MANT_BIT - 2 * 31, 0)) }; /* > 0, <= 31 */ + mp_limb_t d; + x *= (mp_limb_t) 1 << chunk_bits; + d = (int) x; /* 0 <= d < 2^chunk_bits. */ + x -= d; + if (!(x >= L_(0.0) && x < L_(1.0))) + abort (); + if (bits_needed < chunk_bits) + { + /* store bits_needed bits */ + accu |= d >> (chunk_bits - bits_needed); + *p = accu; + if (p == limbs) + goto done; + p--; + /* hold (chunk_bits - bits_needed) bits */ + accu = d << (GMP_LIMB_BITS - (chunk_bits - bits_needed)); + bits_needed = GMP_LIMB_BITS - (chunk_bits - bits_needed); + } + else + { + /* store chunk_bits bits */ + accu |= d << (bits_needed - chunk_bits); + bits_needed -= chunk_bits; + if (bits_needed == 0) + { + *p = accu; + if (p == limbs) + goto done; + p--; + accu = 0; + bits_needed = GMP_LIMB_BITS; + } + } + } + if (chunk_count > 3) + { + /* Here we still have MANT_BIT-3*31 bits to extract from x. */ + enum { chunk_bits = MIN (31, MAX (MANT_BIT - 3 * 31, 0)) }; /* > 0, <= 31 */ + mp_limb_t d; + x *= (mp_limb_t) 1 << chunk_bits; + d = (int) x; /* 0 <= d < 2^chunk_bits. */ + x -= d; + if (!(x >= L_(0.0) && x < L_(1.0))) + abort (); + if (bits_needed < chunk_bits) + { + /* store bits_needed bits */ + accu |= d >> (chunk_bits - bits_needed); + *p = accu; + if (p == limbs) + goto done; + p--; + /* hold (chunk_bits - bits_needed) bits */ + accu = d << (GMP_LIMB_BITS - (chunk_bits - bits_needed)); + bits_needed = GMP_LIMB_BITS - (chunk_bits - bits_needed); + } + else + { + /* store chunk_bits bits */ + accu |= d << (bits_needed - chunk_bits); + bits_needed -= chunk_bits; + if (bits_needed == 0) + { + *p = accu; + if (p == limbs) + goto done; + p--; + accu = 0; + bits_needed = GMP_LIMB_BITS; + } + } + } + if (chunk_count > 4) + { + /* Here we still have MANT_BIT-4*31 bits to extract from x. */ + /* Generic loop. */ + size_t k; + for (k = 4; k < chunk_count; k++) + { + size_t chunk_bits = MIN (31, MANT_BIT - k * 31); /* > 0, <= 31 */ + mp_limb_t d; + x *= (mp_limb_t) 1 << chunk_bits; + d = (int) x; /* 0 <= d < 2^chunk_bits. */ + x -= d; + if (!(x >= L_(0.0) && x < L_(1.0))) + abort (); + if (bits_needed < chunk_bits) + { + /* store bits_needed bits */ + accu |= d >> (chunk_bits - bits_needed); + *p = accu; + if (p == limbs) + goto done; + p--; + /* hold (chunk_bits - bits_needed) bits */ + accu = d << (GMP_LIMB_BITS - (chunk_bits - bits_needed)); + bits_needed = GMP_LIMB_BITS - (chunk_bits - bits_needed); + } + else + { + /* store chunk_bits bits */ + accu |= d << (bits_needed - chunk_bits); + bits_needed -= chunk_bits; + if (bits_needed == 0) + { + *p = accu; + if (p == limbs) + goto done; + p--; + accu = 0; + bits_needed = GMP_LIMB_BITS; + } + } + } + } + /* We shouldn't get here. */ + abort (); + + done: ; +#ifndef USE_LONG_DOUBLE /* On FreeBSD 6.1/x86, 'long double' numbers sometimes + have excess precision. */ + if (!(x == L_(0.0))) + abort (); +#endif +} + +/* Multiply two sequences of limbs. */ +static void +multiply (mp_limb_t xlimbs[NLIMBS1], mp_limb_t ylimbs[NLIMBS1], + mp_limb_t prod_limbs[2 * NLIMBS1]) +{ + size_t k, i, j; + enum { len1 = NLIMBS1 }; + enum { len2 = NLIMBS1 }; + + for (k = len2; k > 0; ) + prod_limbs[--k] = 0; + for (i = 0; i < len1; i++) + { + mp_limb_t digit1 = xlimbs[i]; + mp_twolimb_t carry = 0; + for (j = 0; j < len2; j++) + { + mp_limb_t digit2 = ylimbs[j]; + carry += (mp_twolimb_t) digit1 * (mp_twolimb_t) digit2; + carry += prod_limbs[i + j]; + prod_limbs[i + j] = (mp_limb_t) carry; + carry = carry >> GMP_LIMB_BITS; + } + prod_limbs[i + len2] = (mp_limb_t) carry; + } +} + +DOUBLE +FUNC (DOUBLE x, DOUBLE y, DOUBLE z) +{ + if (isfinite (x) && isfinite (y)) + { + if (isfinite (z)) + { + /* x, y, z are all finite. */ + if (x == L_(0.0) || y == L_(0.0)) + return z; + if (z == L_(0.0)) + return x * y; + /* x, y, z are all non-zero. + The result is x * y + z. */ + { + int e; /* exponent of x * y + z */ + int sign; + mp_limb_t sum[NLIMBS3]; + size_t sum_len; + + { + int xys; /* sign of x * y */ + int zs; /* sign of z */ + int xye; /* sum of exponents of x and y */ + int ze; /* exponent of z */ + mp_limb_t summand1[NLIMBS3]; + size_t summand1_len; + mp_limb_t summand2[NLIMBS3]; + size_t summand2_len; + + { + mp_limb_t zlimbs[NLIMBS1]; + mp_limb_t xylimbs[2 * NLIMBS1]; + + { + DOUBLE xn; /* normalized part of x */ + DOUBLE yn; /* normalized part of y */ + DOUBLE zn; /* normalized part of z */ + int xe; /* exponent of x */ + int ye; /* exponent of y */ + mp_limb_t xlimbs[NLIMBS1]; + mp_limb_t ylimbs[NLIMBS1]; + + xys = 0; + xn = x; + if (x < 0) + { + xys = 1; + xn = - x; + } + yn = y; + if (y < 0) + { + xys = 1 - xys; + yn = - y; + } + + zs = 0; + zn = z; + if (z < 0) + { + zs = 1; + zn = - z; + } + + /* xn, yn, zn are all positive. + The result is (-1)^xys * xn * yn + (-1)^zs * zn. */ + xn = FREXP (xn, &xe); + yn = FREXP (yn, &ye); + zn = FREXP (zn, &ze); + xye = xe + ye; + /* xn, yn, zn are all < 1.0 and >= 0.5. + The result is + (-1)^xys * 2^xye * xn * yn + (-1)^zs * 2^ze * zn. */ + if (xye < ze - MANT_BIT) + { + /* 2^xye * xn * yn < 2^xye <= 2^(ze-MANT_BIT-1) */ + return z; + } + if (xye - 2 * MANT_BIT > ze) + { + /* 2^ze * zn < 2^ze <= 2^(xye-2*MANT_BIT-1). + We cannot simply do + return x * y; + because it would round differently: A round-to-even + in the multiplication can be a round-up or round-down + here, due to z. So replace z with a value that doesn't + require the use of long bignums but that rounds the + same way. */ + zn = L_(0.5); + ze = xye - 2 * MANT_BIT - 1; + } + /* Convert mantissas of xn, yn, zn to limb sequences: + xlimbs = 2^MANT_BIT * xn + ylimbs = 2^MANT_BIT * yn + zlimbs = 2^MANT_BIT * zn */ + decode (xn, xlimbs); + decode (yn, ylimbs); + decode (zn, zlimbs); + /* Multiply the mantissas of xn and yn: + xylimbs = xlimbs * ylimbs */ + multiply (xlimbs, ylimbs, xylimbs); + } + /* The result is + (-1)^xys * 2^(xye-2*MANT_BIT) * xylimbs + + (-1)^zs * 2^(ze-MANT_BIT) * zlimbs. + Compute + e = min (xye-2*MANT_BIT, ze-MANT_BIT) + then + summand1 = 2^(xye-2*MANT_BIT-e) * xylimbs + summand2 = 2^(ze-MANT_BIT-e) * zlimbs */ + e = MIN (xye - 2 * MANT_BIT, ze - MANT_BIT); + if (e == xye - 2 * MANT_BIT) + { + /* Simply copy the limbs of xylimbs. */ + size_t i; + for (i = 0; i < 2 * NLIMBS1; i++) + summand1[i] = xylimbs[i]; + summand1_len = 2 * NLIMBS1; + } + else + { + size_t ediff = xye - 2 * MANT_BIT - e; + /* Left shift the limbs of xylimbs by ediff bits. */ + size_t ldiff = ediff / GMP_LIMB_BITS; + size_t shift = ediff % GMP_LIMB_BITS; + size_t i; + for (i = 0; i < ldiff; i++) + summand1[i] = 0; + if (shift > 0) + { + mp_limb_t carry = 0; + for (i = 0; i < 2 * NLIMBS1; i++) + { + summand1[ldiff + i] = (xylimbs[i] << shift) | carry; + carry = xylimbs[i] >> (GMP_LIMB_BITS - shift); + } + summand1[ldiff + 2 * NLIMBS1] = carry; + summand1_len = ldiff + 2 * NLIMBS1 + 1; + } + else + { + for (i = 0; i < 2 * NLIMBS1; i++) + summand1[ldiff + i] = xylimbs[i]; + summand1_len = ldiff + 2 * NLIMBS1; + } + /* Estimation of needed array size: + ediff = (xye - 2 * MANT_BIT) - (ze - MANT_BIT) <= MANT_BIT + 1 + therefore + summand1_len + = (ediff + GMP_LIMB_BITS - 1) / GMP_LIMB_BITS + 2 * NLIMBS1 + <= (MANT_BIT + GMP_LIMB_BITS) / GMP_LIMB_BITS + 2 * NLIMBS1 + <= 3 * NLIMBS1 + 1 + = NLIMBS3 */ + if (!(summand1_len <= NLIMBS3)) + abort (); + } + if (e == ze - MANT_BIT) + { + /* Simply copy the limbs of zlimbs. */ + size_t i; + for (i = 0; i < NLIMBS1; i++) + summand2[i] = zlimbs[i]; + summand2_len = NLIMBS1; + } + else + { + size_t ediff = ze - MANT_BIT - e; + /* Left shift the limbs of zlimbs by ediff bits. */ + size_t ldiff = ediff / GMP_LIMB_BITS; + size_t shift = ediff % GMP_LIMB_BITS; + size_t i; + for (i = 0; i < ldiff; i++) + summand2[i] = 0; + if (shift > 0) + { + mp_limb_t carry = 0; + for (i = 0; i < NLIMBS1; i++) + { + summand2[ldiff + i] = (zlimbs[i] << shift) | carry; + carry = zlimbs[i] >> (GMP_LIMB_BITS - shift); + } + summand2[ldiff + NLIMBS1] = carry; + summand2_len = ldiff + NLIMBS1 + 1; + } + else + { + for (i = 0; i < NLIMBS1; i++) + summand2[ldiff + i] = zlimbs[i]; + summand2_len = ldiff + NLIMBS1; + } + /* Estimation of needed array size: + ediff = (ze - MANT_BIT) - (xye - 2 * MANT_BIT) <= 2 * MANT_BIT + therefore + summand2_len + = (ediff + GMP_LIMB_BITS - 1) / GMP_LIMB_BITS + NLIMBS1 + <= (2 * MANT_BIT + GMP_LIMB_BITS - 1) / GMP_LIMB_BITS + NLIMBS1 + <= 3 * NLIMBS1 + 1 + = NLIMBS3 */ + if (!(summand2_len <= NLIMBS3)) + abort (); + } + } + /* The result is + (-1)^xys * 2^e * summand1 + (-1)^zs * 2^e * summand2. */ + if (xys == zs) + { + /* Perform an addition. */ + size_t i; + mp_limb_t carry; + + sign = xys; + carry = 0; + for (i = 0; i < MIN (summand1_len, summand2_len); i++) + { + mp_limb_t digit1 = summand1[i]; + mp_limb_t digit2 = summand2[i]; + sum[i] = digit1 + digit2 + carry; + carry = (carry + ? digit1 >= (mp_limb_t)-1 - digit2 + : digit1 > (mp_limb_t)-1 - digit2); + } + if (summand1_len > summand2_len) + for (; i < summand1_len; i++) + { + mp_limb_t digit1 = summand1[i]; + sum[i] = carry + digit1; + carry = carry && digit1 == (mp_limb_t)-1; + } + else + for (; i < summand2_len; i++) + { + mp_limb_t digit2 = summand2[i]; + sum[i] = carry + digit2; + carry = carry && digit2 == (mp_limb_t)-1; + } + if (carry) + sum[i++] = carry; + sum_len = i; + } + else + { + /* Perform a subtraction. */ + /* Compare summand1 and summand2 by magnitude. */ + while (summand1[summand1_len - 1] == 0) + summand1_len--; + while (summand2[summand2_len - 1] == 0) + summand2_len--; + if (summand1_len > summand2_len) + sign = xys; + else if (summand1_len < summand2_len) + sign = zs; + else + { + size_t i = summand1_len; + for (;;) + { + --i; + if (summand1[i] > summand2[i]) + { + sign = xys; + break; + } + if (summand1[i] < summand2[i]) + { + sign = zs; + break; + } + if (i == 0) + /* summand1 and summand2 are equal. */ + return L_(0.0); + } + } + if (sign == xys) + { + /* Compute summand1 - summand2. */ + size_t i; + mp_limb_t carry; + + carry = 0; + for (i = 0; i < summand2_len; i++) + { + mp_limb_t digit1 = summand1[i]; + mp_limb_t digit2 = summand2[i]; + sum[i] = digit1 - digit2 - carry; + carry = (carry ? digit1 <= digit2 : digit1 < digit2); + } + for (; i < summand1_len; i++) + { + mp_limb_t digit1 = summand1[i]; + sum[i] = digit1 - carry; + carry = carry && digit1 == 0; + } + if (carry) + abort (); + sum_len = summand1_len; + } + else + { + /* Compute summand2 - summand1. */ + size_t i; + mp_limb_t carry; + + carry = 0; + for (i = 0; i < summand1_len; i++) + { + mp_limb_t digit1 = summand1[i]; + mp_limb_t digit2 = summand2[i]; + sum[i] = digit2 - digit1 - carry; + carry = (carry ? digit2 <= digit1 : digit2 < digit1); + } + for (; i < summand2_len; i++) + { + mp_limb_t digit2 = summand2[i]; + sum[i] = digit2 - carry; + carry = carry && digit2 == 0; + } + if (carry) + abort (); + sum_len = summand2_len; + } + } + } + /* The result is + (-1)^sign * 2^e * sum. */ + /* Now perform the rounding to MANT_BIT mantissa bits. */ + while (sum[sum_len - 1] == 0) + sum_len--; + /* Here we know that the most significant limb, sum[sum_len - 1], is + non-zero. */ + { + /* How many bits the sum has. */ + unsigned int sum_bits = + integer_length (sum[sum_len - 1]) + (sum_len - 1) * GMP_LIMB_BITS; + /* How many bits to keep when rounding. */ + unsigned int keep_bits; + /* How many bits to round off. */ + unsigned int roundoff_bits; + if (e + (int) sum_bits >= MIN_EXP) + /* 2^e * sum >= 2^(MIN_EXP-1). + result will be a normalized number. */ + keep_bits = MANT_BIT; + else if (e + (int) sum_bits >= MIN_EXP - MANT_BIT) + /* 2^e * sum >= 2^(MIN_EXP-MANT_BIT-1). + result will be a denormalized number or rounded to zero. */ + keep_bits = e + (int) sum_bits - (MIN_EXP + MANT_BIT); + else + /* 2^e * sum < 2^(MIN_EXP-MANT_BIT-1). Round to zero. */ + return L_(0.0); + /* Note: 0 <= keep_bits <= MANT_BIT. */ + if (sum_bits <= keep_bits) + { + /* Nothing to do. */ + roundoff_bits = 0; + keep_bits = sum_bits; + } + else + { + int round_up; + roundoff_bits = sum_bits - keep_bits; /* > 0, <= sum_bits */ + { +#if HAVE_FEGETROUND && defined FE_TOWARDZERO + /* Cf. */ + int rounding_mode = fegetround (); + if (rounding_mode == FE_TOWARDZERO) + round_up = 0; + else if (rounding_mode == FE_DOWNWARD) + round_up = sign; + else if (rounding_mode == FE_UPWARD) + round_up = !sign; +#else + /* Cf. */ + int rounding_mode = FLT_ROUNDS; + if (rounding_mode == 0) /* toward zero */ + round_up = 0; + else if (rounding_mode == 3) /* toward negative infinity */ + round_up = sign; + else if (rounding_mode == 2) /* toward positive infinity */ + round_up = !sign; +#endif + else + { + /* Round to nearest. */ + round_up = 0; + /* Test bit (roundoff_bits-1). */ + if ((sum[(roundoff_bits - 1) / GMP_LIMB_BITS] + >> ((roundoff_bits - 1) % GMP_LIMB_BITS)) & 1) + { + /* Test bits roundoff_bits-1 .. 0. */ + bool halfway = + ((sum[(roundoff_bits - 1) / GMP_LIMB_BITS] + & (((mp_limb_t) 1 << ((roundoff_bits - 1) % GMP_LIMB_BITS)) - 1)) + == 0); + if (halfway) + { + int i; + for (i = (roundoff_bits - 1) / GMP_LIMB_BITS - 1; i >= 0; i--) + if (sum[i] != 0) + { + halfway = false; + break; + } + } + if (halfway) + /* Round to even. Test bit roundoff_bits. */ + round_up = ((sum[roundoff_bits / GMP_LIMB_BITS] + >> (roundoff_bits % GMP_LIMB_BITS)) & 1); + else + /* Round up. */ + round_up = 1; + } + } + } + /* Perform the rounding. */ + { + size_t i = roundoff_bits / GMP_LIMB_BITS; + { + size_t j = i; + while (j > 0) + sum[--j] = 0; + } + if (round_up) + { + /* Round up. */ + sum[i] = + (sum[i] + | (((mp_limb_t) 1 << (roundoff_bits % GMP_LIMB_BITS)) - 1)) + + 1; + if (sum[i] == 0) + { + /* Propagate carry. */ + while (i < sum_len - 1) + { + ++i; + sum[i] += 1; + if (sum[i] != 0) + break; + } + } + /* sum[i] is the most significant limb that was + incremented. */ + if (i == sum_len - 1 && (sum[i] & (sum[i] - 1)) == 0) + { + /* Through the carry, one more bit is needed. */ + if (sum[i] != 0) + sum_bits += 1; + else + { + /* Instead of requiring one more limb of memory, + perform a shift by one bit, and adjust the + exponent. */ + sum[i] = (mp_limb_t) 1 << (GMP_LIMB_BITS - 1); + e += 1; + } + /* The bit sequence has the form 1000...000. */ + keep_bits = 1; + } + } + else + { + /* Round down. */ + sum[i] &= ((mp_limb_t) -1 << (roundoff_bits % GMP_LIMB_BITS)); + if (i == sum_len - 1 && sum[i] == 0) + /* The entire sum has become zero. */ + return L_(0.0); + } + } + } + /* The result is + (-1)^sign * 2^e * sum + and here we know that + 2^(sum_bits-1) <= sum < 2^sum_bits, + and sum is a multiple of 2^(sum_bits-keep_bits), where + 0 < keep_bits <= MANT_BIT and keep_bits <= sum_bits. + (If keep_bits was initially 0, the rounding either returned zero + or produced a bit sequence of the form 1000...000, setting + keep_bits to 1.) */ + { + /* Split the keep_bits bits into chunks of at most 32 bits. */ + unsigned int chunk_count = (keep_bits - 1) / GMP_LIMB_BITS + 1; + /* 1 <= chunk_count <= ceil (sum_bits / GMP_LIMB_BITS) = sum_len. */ + static const DOUBLE chunk_multiplier = /* 2^-GMP_LIMB_BITS */ + L_(1.0) / ((DOUBLE) (1 << (GMP_LIMB_BITS / 2)) + * (DOUBLE) (1 << ((GMP_LIMB_BITS + 1) / 2))); + unsigned int shift = sum_bits % GMP_LIMB_BITS; + DOUBLE fsum; + if (MANT_BIT <= GMP_LIMB_BITS) + { + /* Since keep_bits <= MANT_BIT <= GMP_LIMB_BITS, + chunk_count is 1. No need for a loop. */ + if (shift == 0) + fsum = (DOUBLE) sum[sum_len - 1]; + else + fsum = (DOUBLE) + ((sum[sum_len - 1] << (GMP_LIMB_BITS - shift)) + | (sum_len >= 2 ? sum[sum_len - 2] >> shift : 0)); + } + else + { + int k; + k = chunk_count - 1; + if (shift == 0) + { + /* First loop round. */ + fsum = (DOUBLE) sum[sum_len - k - 1]; + /* General loop. */ + while (--k >= 0) + { + fsum *= chunk_multiplier; + fsum += (DOUBLE) sum[sum_len - k - 1]; + } + } + else + { + /* First loop round. */ + fsum = (DOUBLE) + ((sum[sum_len - k - 1] << (GMP_LIMB_BITS - shift)) + | (sum_len >= k + 2 ? sum[sum_len - k - 2] >> shift : 0)); + /* General loop. */ + while (--k >= 0) + { + fsum *= chunk_multiplier; + fsum += (DOUBLE) + ((sum[sum_len - k - 1] << (GMP_LIMB_BITS - shift)) + | (sum[sum_len - k - 2] >> shift)); + } + } + } + fsum = LDEXP (fsum, e + (int) sum_bits - GMP_LIMB_BITS); + return (sign ? - fsum : fsum); + } + } + } + } + else + return z; + } + else + return (x * y) + z; +} diff --git a/gnulib/lib/fmaf.c b/gnulib/lib/fmaf.c new file mode 100644 index 0000000..d1f5310 --- /dev/null +++ b/gnulib/lib/fmaf.c @@ -0,0 +1,20 @@ +/* Fused multiply-add. + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible , 2011. */ + +#define USE_FLOAT +#include "fma.c" diff --git a/gnulib/lib/fmal.c b/gnulib/lib/fmal.c new file mode 100644 index 0000000..91d6dd9 --- /dev/null +++ b/gnulib/lib/fmal.c @@ -0,0 +1,37 @@ +/* Fused multiply-add. + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible , 2011. */ + +#include + +#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE + +/* Specification. */ +# include + +long double +fmal (long double x, long double y, long double z) +{ + return fma (x, y, z); +} + +#else + +# define USE_LONG_DOUBLE +# include "fma.c" + +#endif diff --git a/gnulib/lib/fmodf.c b/gnulib/lib/fmodf.c new file mode 100644 index 0000000..35a8a23 --- /dev/null +++ b/gnulib/lib/fmodf.c @@ -0,0 +1,26 @@ +/* Remainder. + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +float +fmodf (float x, float y) +{ + return (float) fmod ((double) x, (double) y); +} diff --git a/gnulib/lib/fnmatch.c b/gnulib/lib/fnmatch.c new file mode 100644 index 0000000..bd25b4c --- /dev/null +++ b/gnulib/lib/fnmatch.c @@ -0,0 +1,351 @@ +/* Copyright (C) 1991-1993, 1996-2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 +#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 + +#include +#include +#include +#include +#include +#include +#include +#include + +#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 +# include +#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 + +# 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) +# 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 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 0000000..e06ff03 --- /dev/null +++ b/gnulib/lib/fnmatch.in.h @@ -0,0 +1,68 @@ +/* Copyright (C) 1991-1993, 1996-1999, 2001-2003, 2005, 2007, 2009-2011 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 . */ +#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 0000000..f35c10f --- /dev/null +++ b/gnulib/lib/fnmatch_loop.c @@ -0,0 +1,1220 @@ +/* Copyright (C) 1991-1993, 1996-2006, 2009-2011 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. */ + const CHAR *p_init = p; + const CHAR *n_init = n; + 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 +# else +# include +# 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, treat as normal character. */ + p = p_init; + n = n_init; + c = L_('['); + goto normal_match; + } + 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 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 0000000..c0a1f16 --- /dev/null +++ b/gnulib/lib/fopen-safer.c @@ -0,0 +1,63 @@ +/* Invoke fopen, but avoid some glitches. + + Copyright (C) 2001, 2004-2006, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +#include + +#include "stdio-safer.h" + +#include +#include +#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 0000000..e9ba6bb --- /dev/null +++ b/gnulib/lib/fopen.c @@ -0,0 +1,110 @@ +/* Open a stream to a file. + Copyright (C) 2007-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible , 2007. */ + +/* If the user's config.h happens to include , let it include only + the system's here, so that orig_fopen doesn't recurse to + rpl_fopen. */ +#define __need_FILE +#include + +/* Get the original definition of fopen. It might be defined as a macro. */ +#include +#undef __need_FILE + +static inline FILE * +orig_fopen (const char *filename, const char *mode) +{ + return fopen (filename, mode); +} + +/* Specification. */ +/* Write "stdio.h" here, not , otherwise OSF/1 5.1 DTK cc eliminates + this include because of the preliminary #include above. */ +#include "stdio.h" + +#include +#include +#include +#include +#include +#include + +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 + 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 + 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/forkpty.c b/gnulib/lib/forkpty.c new file mode 100644 index 0000000..f4dd954 --- /dev/null +++ b/gnulib/lib/forkpty.c @@ -0,0 +1,73 @@ +/* Fork a child process attached to the slave of a pseudo-terminal. + Copyright (C) 2010-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#if HAVE_FORKPTY + +/* Provide a wrapper with the prototype of glibc-2.8 and newer. */ +# undef forkpty +int +rpl_forkpty (int *amaster, char *name, struct termios const *termp, + struct winsize const *winp) +{ + /* Cast away const, for implementations with weaker prototypes. */ + return forkpty (amaster, name, (struct termios *) termp, + (struct winsize *) winp); +} + +#else /* AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 10, mingw */ + +# include +# include + +extern int login_tty (int slave_fd); + +int +forkpty (int *amaster, char *name, + const struct termios *termp, const struct winsize *winp) +{ + int master, slave, pid; + + if (openpty (&master, &slave, name, termp, winp) == -1) + return -1; + + switch (pid = fork ()) + { + case -1: + close (master); + close (slave); + return -1; + + case 0: + /* Child. */ + close (master); + if (login_tty (slave)) + _exit (1); + return 0; + + default: + /* Parent. */ + *amaster = master; + close (slave); + return pid; + } +} + +#endif diff --git a/gnulib/lib/fpending.c b/gnulib/lib/fpending.c new file mode 100644 index 0000000..5ec38cb --- /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-2011 Free Software Foundation, + Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Jim Meyering. */ + +#include + +#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 0000000..d7994f7 --- /dev/null +++ b/gnulib/lib/fpending.h @@ -0,0 +1,34 @@ +/* Declare __fpending. + + Copyright (C) 2000, 2003, 2005-2006, 2009-2011 Free Software Foundation, + Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Written by Jim Meyering. */ + +#include +#include + +#ifndef HAVE_DECL___FPENDING +"this configure-time declaration test was not run" +#endif + +#if HAVE_DECL___FPENDING +# if HAVE_STDIO_EXT_H +# include +# endif +#else +size_t __fpending (FILE *); +#endif diff --git a/gnulib/lib/fprintf.c b/gnulib/lib/fprintf.c new file mode 100644 index 0000000..28f9c5d --- /dev/null +++ b/gnulib/lib/fprintf.c @@ -0,0 +1,77 @@ +/* Formatted output to a stream. + Copyright (C) 2004, 2006-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +/* Specification. */ +#include + +#include +#include +#include +#include + +#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 0000000..e6eb4f2 --- /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 0000000..d55b056 --- /dev/null +++ b/gnulib/lib/fprintftime.h @@ -0,0 +1,29 @@ +/* Generate time strings directly to the output. */ + +/* Copyright (C) 2005, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include +#include + +/* 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 0000000..07403bf --- /dev/null +++ b/gnulib/lib/fpucw.h @@ -0,0 +1,107 @@ +/* Manipulating the FPU control word. + Copyright (C) 2007-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#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 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 0000000..a299d1c --- /dev/null +++ b/gnulib/lib/fpurge.c @@ -0,0 +1,142 @@ +/* Flushing buffers of a FILE stream. + Copyright (C) 2007-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#if HAVE___FPURGE /* glibc >= 2.2, Haiku, Solaris >= 7 */ +# include +#endif +#include + +#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. + 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 + , 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 __minix /* Minix */ + fp->_ptr = fp->_buf; + if (fp->_ptr != NULL) + fp->_count = 0; + return 0; +# elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, NonStop Kernel */ + 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 0000000..243914f --- /dev/null +++ b/gnulib/lib/freadable.c @@ -0,0 +1,47 @@ +/* Retrieve information about a FILE stream. + Copyright (C) 2007-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "freadable.h" + +#include "stdio-impl.h" + +bool +freadable (FILE *fp) +{ + /* Most systems provide FILE as a struct and the necessary bitmask in + , 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 __minix /* Minix */ + return (fp->_flags & _IOREAD) != 0; +#elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, NonStop Kernel */ + 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 0000000..2916fda --- /dev/null +++ b/gnulib/lib/freadable.h @@ -0,0 +1,42 @@ +/* Retrieve information about a FILE stream. + Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include +#include + +/* 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 +# 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 0000000..da1ac78 --- /dev/null +++ b/gnulib/lib/freadahead.c @@ -0,0 +1,89 @@ +/* Retrieve information about a FILE stream. + Copyright (C) 2007-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "freadahead.h" + +#include +#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 __minix /* Minix */ + if ((fp_->_flags & _IOWRITING) != 0) + return 0; + return fp_->_count; +#elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, NonStop Kernel */ + 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 0000000..0ddb826 --- /dev/null +++ b/gnulib/lib/freadahead.h @@ -0,0 +1,38 @@ +/* Retrieve information about a FILE stream. + Copyright (C) 2007-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include +#include + +#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) _GL_ATTRIBUTE_PURE; + +#ifdef __cplusplus +} +#endif diff --git a/gnulib/lib/freading.c b/gnulib/lib/freading.c new file mode 100644 index 0000000..5b95c22 --- /dev/null +++ b/gnulib/lib/freading.c @@ -0,0 +1,70 @@ +/* Retrieve information about a FILE stream. + Copyright (C) 2007-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "freading.h" + +#include "stdio-impl.h" + +/* Don't use glibc's __freading function in glibc < 2.7, see + */ +#if !(HAVE___FREADING && (!defined __GLIBC__ || defined __UCLIBC__ || __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 7))) + +bool +freading (FILE *fp) +{ + /* Most systems provide FILE as a struct and the necessary bitmask in + , 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 __minix /* Minix */ + return (fp->_flags & _IOREADING) != 0; +# elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, NonStop Kernel */ +# if defined __sun /* Solaris */ + return (fp->_flag & _IOREAD) != 0 && (fp->_flag & _IOWRT) == 0; +# else + return (fp->_flag & _IOREAD) != 0; +# endif +# 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 0000000..a19aea6 --- /dev/null +++ b/gnulib/lib/freading.h @@ -0,0 +1,53 @@ +/* Retrieve information about a FILE stream. + Copyright (C) 2007-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include +#include + +/* 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__ || defined __UCLIBC__ || __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 7)) +/* Solaris >= 7, not glibc >= 2.2, but glibc >= 2.7 */ + +# include +# 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 0000000..afd7a3e --- /dev/null +++ b/gnulib/lib/freadptr.c @@ -0,0 +1,111 @@ +/* Retrieve information about a FILE stream. + Copyright (C) 2007-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "freadptr.h" + +#include + +#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 __minix /* Minix */ + if ((fp_->_flags & _IOWRITING) != 0) + return NULL; + size = fp_->_count; + if (size == 0) + return NULL; + *sizep = size; + return (const char *) fp_->_ptr; +#elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, NonStop Kernel */ + 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 0000000..a328546 --- /dev/null +++ b/gnulib/lib/freadptr.h @@ -0,0 +1,39 @@ +/* Retrieve information about a FILE stream. + Copyright (C) 2007-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include +#include + +#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 0000000..4fbad2d --- /dev/null +++ b/gnulib/lib/freadseek.c @@ -0,0 +1,139 @@ +/* Skipping input from a FILE stream. + Copyright (C) 2007-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "freadseek.h" + +#include +#include + +#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 __minix /* Minix */ + fp_->_ptr += increment; + fp_->_count -= increment; +#elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, NonStop Kernel */ + 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 0000000..e8c31dd --- /dev/null +++ b/gnulib/lib/freadseek.h @@ -0,0 +1,42 @@ +/* Skipping input from a FILE stream. + Copyright (C) 2007-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include +#include + +#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 0000000..f1e01fa --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Paul Eggert */ + +#include +#undef free + +#include + +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 0000000..5b02817 --- /dev/null +++ b/gnulib/lib/freopen-safer.c @@ -0,0 +1,103 @@ +/* Invoke freopen, but avoid some glitches. + + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Eric Blake. */ + +#include + +#include "stdio-safer.h" + +#include +#include +#include +#include + +/* 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 0000000..7069ec9 --- /dev/null +++ b/gnulib/lib/freopen.c @@ -0,0 +1,51 @@ +/* Open a stream to a file. + Copyright (C) 2007-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible , 2007. */ + +/* If the user's config.h happens to include , let it include only + the system's here, so that orig_freopen doesn't recurse to + rpl_freopen. */ +#define __need_FILE +#include + +/* Get the original definition of freopen. It might be defined as a macro. */ +#include +#undef __need_FILE + +static inline FILE * +orig_freopen (const char *filename, const char *mode, FILE *stream) +{ + return freopen (filename, mode, stream); +} + +/* Specification. */ +/* Write "stdio.h" here, not , otherwise OSF/1 5.1 DTK cc eliminates + this include because of the preliminary #include above. */ +#include "stdio.h" + +#include + +FILE * +rpl_freopen (const char *filename, const char *mode, FILE *stream) +{ +#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ + if (filename != NULL && 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 0000000..26bdec9 --- /dev/null +++ b/gnulib/lib/frexp.c @@ -0,0 +1,168 @@ +/* Split a double into fraction and mantissa. + Copyright (C) 2007-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paolo Bonzini , 2003, and + Bruno Haible , 2007. */ + +#if ! defined USE_LONG_DOUBLE +# include +#endif + +/* Specification. */ +#include + +#include +#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/frexpf.c b/gnulib/lib/frexpf.c new file mode 100644 index 0000000..2bd5f51 --- /dev/null +++ b/gnulib/lib/frexpf.c @@ -0,0 +1,26 @@ +/* Split a float into fraction and mantissa. + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +float +frexpf (float x, int *expptr) +{ + return (float) frexp ((double) x, expptr); +} diff --git a/gnulib/lib/frexpl.c b/gnulib/lib/frexpl.c new file mode 100644 index 0000000..c468937 --- /dev/null +++ b/gnulib/lib/frexpl.c @@ -0,0 +1,35 @@ +/* Split a 'long double' into fraction and mantissa. + Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE + +/* Specification. */ +# include + +long double +frexpl (long double x, int *expptr) +{ + return frexp (x, expptr); +} + +#else + +# define USE_LONG_DOUBLE +# include "frexp.c" + +#endif diff --git a/gnulib/lib/fseek.c b/gnulib/lib/fseek.c new file mode 100644 index 0000000..bcb76d8 --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +/* Get off_t. */ +#include + +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 0000000..83834a0 --- /dev/null +++ b/gnulib/lib/fseeko.c @@ -0,0 +1,143 @@ +/* An fseeko() function that, together with fflush(), is POSIX compliant. + Copyright (C) 2007-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 + +/* Specification. */ +#include + +/* Get off_t and lseek. */ +#include + +#include "stdio-impl.h" + +int +fseeko (FILE *fp, off_t offset, int whence) +#undef fseeko +#if !HAVE_FSEEKO +# undef fseek +# define fseeko fseek +#endif +{ +#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 __minix /* Minix */ + if (fp_->_ptr == fp_->_buf + && (fp_->_ptr == NULL || fp_->_count == 0)) +#elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, NonStop Kernel */ + 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 (or + if ftell() has created buffers but no I/O has occurred on a + newly-opened stream). We know there are no buffers. */ + off_t pos = lseek (fileno (fp), 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; + fp->_offset = pos; +#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, NonStop Kernel */ + fp->_flag &= ~_IOEOF; +#elif defined __MINT__ /* Atari FreeMiNT */ + fp->__offset = pos; + fp->__eof = 0; +#endif + return 0; + } + return fseeko (fp, offset, whence); +} diff --git a/gnulib/lib/fseterr.c b/gnulib/lib/fseterr.c new file mode 100644 index 0000000..eaad702 --- /dev/null +++ b/gnulib/lib/fseterr.c @@ -0,0 +1,76 @@ +/* Set the error indicator of a stream. + Copyright (C) 2007-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "fseterr.h" + +#include + +#include "stdio-impl.h" + +void +fseterr (FILE *fp) +{ + /* Most systems provide FILE as a struct and the necessary bitmask in + , 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 __minix /* Minix */ + fp->_flags |= _IOERR; +#elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, NonStop Kernel */ + 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 0000000..e4b061b --- /dev/null +++ b/gnulib/lib/fseterr.h @@ -0,0 +1,37 @@ +/* Set the error indicator of a stream. + Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef _FSETERR_H +#define _FSETERR_H + +#include + +#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/fstat.c b/gnulib/lib/fstat.c new file mode 100644 index 0000000..db5b17c --- /dev/null +++ b/gnulib/lib/fstat.c @@ -0,0 +1,82 @@ +/* fstat() replacement. + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* If the user's config.h happens to include , let it include only + the system's here, so that orig_fstat doesn't recurse to + rpl_fstat. */ +#define __need_system_sys_stat_h +#include + +/* Get the original definition of fstat. It might be defined as a macro. */ +#include +#include +#undef __need_system_sys_stat_h + +static inline int +orig_fstat (int fd, struct stat *buf) +{ + return fstat (fd, buf); +} + +/* Specification. */ +/* Write "sys/stat.h" here, not , otherwise OSF/1 5.1 DTK cc + eliminates this include because of the preliminary #include + above. */ +#include "sys/stat.h" + +#include +#include + +#if HAVE_MSVC_INVALID_PARAMETER_HANDLER +# include "msvc-inval.h" +#endif + +#if HAVE_MSVC_INVALID_PARAMETER_HANDLER +static inline int +fstat_nothrow (int fd, struct stat *buf) +{ + int result; + + TRY_MSVC_INVAL + { + result = orig_fstat (fd, buf); + } + CATCH_MSVC_INVAL + { + result = -1; + errno = EBADF; + } + DONE_MSVC_INVAL; + + return result; +} +#else +# define fstat_nothrow orig_fstat +#endif + +int +rpl_fstat (int fd, struct stat *buf) +{ +#if REPLACE_FCHDIR && REPLACE_OPEN_DIRECTORY + /* Handle the case when rpl_open() used a dummy file descriptor to work + around an open() that can't normally visit directories. */ + const char *name = _gl_directory_name (fd); + if (name != NULL) + return stat (name, buf); +#endif + + return fstat_nothrow (fd, buf); +} diff --git a/gnulib/lib/fstatat.c b/gnulib/lib/fstatat.c new file mode 100644 index 0000000..e59be91 --- /dev/null +++ b/gnulib/lib/fstatat.c @@ -0,0 +1,135 @@ +/* Work around an fstatat bug on Solaris 9. + + Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert and Jim Meyering. */ + +/* If the user's config.h happens to include , let it include only + the system's here, so that orig_fstatat doesn't recurse to + rpl_fstatat. */ +#define __need_system_sys_stat_h +#include + +/* Get the original definition of fstatat. It might be defined as a macro. */ +#include +#include +#undef __need_system_sys_stat_h + +#if HAVE_FSTATAT +static inline int +orig_fstatat (int fd, char const *filename, struct stat *buf, int flags) +{ + return fstatat (fd, filename, buf, flags); +} +#endif + +/* Write "sys/stat.h" here, not , otherwise OSF/1 5.1 DTK cc + eliminates this include because of the preliminary #include + above. */ +#include "sys/stat.h" + +#include +#include +#include + +#if HAVE_FSTATAT && HAVE_WORKING_FSTATAT_ZERO_FLAG + +# ifndef LSTAT_FOLLOWS_SLASHED_SYMLINK +# define LSTAT_FOLLOWS_SLASHED_SYMLINK 0 +# endif + +/* 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. + + AIX 7.1 fstatat (AT_FDCWD, ..., 0) always fails, which is a bug. + Work around this bug if FSTATAT_AT_FDCWD_0_BROKEN is nonzero. */ + +int +rpl_fstatat (int fd, char const *file, struct stat *st, int flag) +{ + int result = orig_fstatat (fd, file, st, flag); + size_t len; + + if (LSTAT_FOLLOWS_SLASHED_SYMLINK || 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 = orig_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 && HAVE_WORKING_FSTATAT_ZERO_FLAG) */ + +/* On mingw, the gnulib 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 + 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. + + 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 0000000..595c1f3 --- /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-2011 Free + Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + + 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 + +/* Specification. */ +#include "fstrcmp.h" + +#include +#include +#include +#include +#include + +#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 0000000..0596d25 --- /dev/null +++ b/gnulib/lib/fstrcmp.h @@ -0,0 +1,45 @@ +/* Fuzzy string comparison. + Copyright (C) 1995, 2000, 2002-2003, 2006, 2008-2011 Free Software + Foundation, Inc. + + This file was written by Peter Miller + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . */ + +#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 0000000..a0c39d2 --- /dev/null +++ b/gnulib/lib/fsusage.c @@ -0,0 +1,279 @@ +/* fsusage.c -- return space usage of mounted file systems + + Copyright (C) 1991-1992, 1996, 1998-1999, 2002-2006, 2009-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#include "fsusage.h" + +#include +#include + +#if STAT_STATVFS || STAT_STATVFS64 /* POSIX 1003.1-2001 (and later) with XSI */ +# include +#else +/* Don't include backward-compatibility files unless they're needed. + Eventually we'd like to remove all this cruft. */ +# include +# include +# include +# if HAVE_SYS_PARAM_H +# include +# endif +# if HAVE_SYS_MOUNT_H +# include +# endif +# if HAVE_SYS_VFS_H +# include +# endif +# if HAVE_SYS_FS_S5PARAM_H /* Fujitsu UXP/V */ +# include +# endif +# if defined HAVE_SYS_FILSYS_H && !defined _CRAY +# include /* SVR2 */ +# endif +# if HAVE_SYS_STATFS_H +# include +# endif +# if HAVE_DUSTAT_H /* AIX PS/2 */ +# include +# 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, except glibc/Linux */ + + 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_STATVFS64 /* AIX */ + + struct statvfs64 fsd; + + if (statvfs64 (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 /* OSF/1 */ + + 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 /* glibc/Linux, 4.3BSD, SunOS 4, \ + MacOS X < 10.4, FreeBSD < 5.0, \ + NetBSD < 3.0, OpenBSD < 4.4 */ + + 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 and older NetBSD */ + + 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, old Irix, old AIX, \ + Dolphin */ + +# 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_STATVFS64 \ + || (!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 0000000..86fe9aa --- /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-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Space usage statistics for a file system. Blocks are 512-byte. */ + +#if !defined FSUSAGE_H_ +# define FSUSAGE_H_ + +# include +# include + +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 0000000..325f216 --- /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 + + Copyright (C) 2008-2011 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 . */ + +#include +#include + +#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ + +/* FlushFileBuffers */ +# define WIN32_LEAN_AND_MEAN +# include + +# include + +/* Get _get_osfhandle. */ +# include "msvc-nothrow.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 0000000..74ec986 --- /dev/null +++ b/gnulib/lib/ftell.c @@ -0,0 +1,37 @@ +/* An ftell() function that works around platform bugs. + Copyright (C) 2007-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include +#include + +long +ftell (FILE *fp) +{ + /* Use the replacement ftello function with all its workarounds. */ + off_t offset = ftello (fp); + if (LONG_MIN <= offset && offset <= LONG_MAX) + 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 0000000..fbdc44f --- /dev/null +++ b/gnulib/lib/ftello.c @@ -0,0 +1,77 @@ +/* An ftello() function that works around platform bugs. + Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +/* Get lseek. */ +#include + +#include "stdio-impl.h" + +off_t +ftello (FILE *fp) +#undef ftello +#if !HAVE_FTELLO +# undef ftell +# define ftello ftell +#endif +{ +#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 FTELLO_BROKEN_AFTER_SWITCHING_FROM_READ_TO_WRITE /* Solaris */ + /* The Solaris stdio leaves the _IOREAD flag set after reading from a file + reaches EOF and the program then starts writing to the file. ftello + gets confused by this. */ + if (fp_->_flag & _IOWRT) + { + off_t pos; + + /* Call ftello nevertheless, for the side effects that it does on fp. */ + ftello (fp); + + /* Compute the file position ourselves. */ + pos = lseek (fileno (fp), (off_t) 0, SEEK_CUR); + if (pos >= 0) + { + if ((fp_->_flag & _IONBF) == 0 && fp_->_base != NULL) + pos += fp_->_ptr - fp_->_base; + } + return pos; + } +#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/ftoastr.c b/gnulib/lib/ftoastr.c new file mode 100644 index 0000000..7c99ef0 --- /dev/null +++ b/gnulib/lib/ftoastr.c @@ -0,0 +1,138 @@ +/* floating point to accurate string + + Copyright (C) 2010-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +/* This code can misbehave on some buggy or older platforms, when + operating on arguments on floating types other than 'double', or + when given unusual combinations of options. Gnulib's + snprintf-posix module works around many of these problems. + + This code relies on sprintf, strtod, etc. operating accurately; + otherwise, the resulting strings could be inaccurate or too long. */ + +#include + +#include "ftoastr.h" + +#include "intprops.h" +#include +#include +#include + +#if LENGTH == 3 +# define FLOAT long double +# define FLOAT_DIG LDBL_DIG +# define FLOAT_MIN LDBL_MIN +# define FLOAT_PREC_BOUND _GL_LDBL_PREC_BOUND +# define FTOASTR ldtoastr +# if HAVE_C99_STRTOLD +# define STRTOF strtold +# endif +#elif LENGTH == 2 +# define FLOAT double +# define FLOAT_DIG DBL_DIG +# define FLOAT_MIN DBL_MIN +# define FLOAT_PREC_BOUND _GL_DBL_PREC_BOUND +# define FTOASTR dtoastr +#else +# define LENGTH 1 +# define FLOAT float +# define FLOAT_DIG FLT_DIG +# define FLOAT_MIN FLT_MIN +# define FLOAT_PREC_BOUND _GL_FLT_PREC_BOUND +# define FTOASTR ftoastr +# if HAVE_STRTOF +# define STRTOF strtof +# endif +#endif + +/* On pre-C99 hosts, approximate strtof and strtold with strtod. This + may generate one or two extra digits, but that's better than not + working at all. */ +#ifndef STRTOF +# define STRTOF strtod +#endif + +/* On hosts where it's not known that snprintf works, use sprintf to + implement the subset needed here. Typically BUFSIZE is big enough + and there's little or no performance hit. */ +#if ! GNULIB_SNPRINTF +# undef snprintf +# define snprintf ftoastr_snprintf +static int +ftoastr_snprintf (char *buf, size_t bufsize, char const *format, + int width, int prec, FLOAT x) +{ + char width_0_buffer[LENGTH == 1 ? FLT_BUFSIZE_BOUND + : LENGTH == 2 ? DBL_BUFSIZE_BOUND + : LDBL_BUFSIZE_BOUND]; + int n = width; + if (bufsize < sizeof width_0_buffer) + { + n = sprintf (width_0_buffer, format, 0, prec, x); + if (n < 0) + return n; + if (n < width) + n = width; + } + if (n < bufsize) + n = sprintf (buf, format, width, prec, x); + return n; +} +#endif + +int +FTOASTR (char *buf, size_t bufsize, int flags, int width, FLOAT x) +{ + /* The following method is simple but slow. + For ideas about speeding things up, please see: + + Florian Loitsch, Printing floating-point numbers quickly and accurately + with integers. ACM SIGPLAN notices 46, 6 (June 2010), 233-243 + ; also see the + 2010-03-21 draft . */ + + char format[sizeof "%-+ 0*.*Lg"]; + FLOAT abs_x = x < 0 ? -x : x; + int prec; + + char *p = format; + *p++ = '%'; + + /* Support flags that generate output parsable by strtof. */ + *p = '-'; p += (flags & FTOASTR_LEFT_JUSTIFY ) != 0; + *p = '+'; p += (flags & FTOASTR_ALWAYS_SIGNED ) != 0; + *p = ' '; p += (flags & FTOASTR_SPACE_POSITIVE) != 0; + *p = '0'; p += (flags & FTOASTR_ZERO_PAD ) != 0; + + *p++ = '*'; + *p++ = '.'; + *p++ = '*'; + *p = 'L'; p += 2 < LENGTH; + *p++ = flags & FTOASTR_UPPER_E ? 'G' : 'g'; + *p = '\0'; + + for (prec = abs_x < FLOAT_MIN ? 1 : FLOAT_DIG; ; prec++) + { + int n = snprintf (buf, bufsize, format, width, prec, x); + if (n < 0 + || FLOAT_PREC_BOUND <= prec + || (n < bufsize && STRTOF (buf, NULL) == x)) + return n; + } +} diff --git a/gnulib/lib/ftoastr.h b/gnulib/lib/ftoastr.h new file mode 100644 index 0000000..6264952 --- /dev/null +++ b/gnulib/lib/ftoastr.h @@ -0,0 +1,144 @@ +/* floating point to accurate string + + Copyright (C) 2010-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +#ifndef _GL_FTOASTR_H + +#include "intprops.h" +#include +#include + +/* Store into BUF (of size BUFSIZE) an accurate minimal-precision + string representation of a floating point number. FLAGS affect the + formatting of the number. Pad the output string with spaces as + necessary to width WIDTH bytes, in the style of printf. WIDTH must + be nonnegative. X is the floating-point number to be converted. + + Return the number of bytes stored into BUF, not counting the + terminating null. However, do not overrun BUF: if BUF is too + small, return a fairly tight (but not necessarily exact) upper + bound on the value that would have been returned if BUF had been + big enough. If SIZE is zero, BUF may be a null pointer. On error + (e.g., returned value would exceed INT_MAX), return -1 and set + errno. + + Example: + + char buf[DBL_BUFSIZE_BOUND]; + int r = dtoastr (buf, sizeof buf, 0, 0, 0.1); + + In the C locale, this sets R to 3 and stores "0.1" into BUF. */ + +int ftoastr (char *buf, size_t bufsize, int flags, int width, float x); +int dtoastr (char *buf, size_t bufsize, int flags, int width, double x); +int ldtoastr (char *buf, size_t bufsize, int flags, int width, long double x); + +/* Flag values for ftoastr etc. These can be ORed together. */ +enum + { + /* Left justify within the width; the default is right justification. */ + FTOASTR_LEFT_JUSTIFY = 1, + + /* Output "+" before positive numbers; the default outputs nothing. */ + FTOASTR_ALWAYS_SIGNED = 2, + + /* Output " " before positive numbers; ignored if + FTOASTER_ALWAYS_SIGNED is also given. */ + FTOASTR_SPACE_POSITIVE = 4, + + /* Pad with zeros instead of spaces; ignored if FTOASTR_LEFT_JUSTIFY + is also given. */ + FTOASTR_ZERO_PAD = 8, + + /* Use 'E' instead of 'e' before the exponent. */ + FTOASTR_UPPER_E = 16 + }; + + +/* _GL_FLT_PREC_BOUND is an upper bound on the precision needed to + represent a float value without losing information. Likewise for + _GL_DBL_PREC_BOUND and double, and _GL_LDBL_PREC_BOUND and long double. */ + +#if FLT_RADIX == 10 /* decimal floating point */ + enum { _GL_FLT_PREC_BOUND = FLT_MANT_DIG }; + enum { _GL_DBL_PREC_BOUND = DBL_MANT_DIG }; + enum { _GL_LDBL_PREC_BOUND = LDBL_MANT_DIG }; +#else + +/* An upper bound on the number of bits needed to represent a single + digit in a floating-point fraction. */ +# if FLT_RADIX == 2 /* IEEE 754 floating point, VAX floating point, etc. */ +# define _GL_FLOAT_DIG_BITS_BOUND 1 +# elif FLT_RADIX <= 16 /* IBM hex floating point has FLT_RADIX == 16. */ +# define _GL_FLOAT_DIG_BITS_BOUND 4 +# else /* no machine is this bad, but let's be complete */ +# define _GL_FLOAT_DIG_BITS_BOUND (CHAR_BIT * (int) sizeof (int) - 1) +# endif + +/* An upper bound on the number of decimal digits needed to represent + a floating point number accurately, assuming a fraction contains + DIG digits. For why the "+ 1" is needed, see "Binary to Decimal + Conversion" in David Goldberg's paper "What Every Computer + Scientist Should Know About Floating-Point Arithmetic" + . */ +# define _GL_FLOAT_PREC_BOUND(dig) \ + (INT_BITS_STRLEN_BOUND ((dig) * _GL_FLOAT_DIG_BITS_BOUND) + 1) + + enum { _GL_FLT_PREC_BOUND = _GL_FLOAT_PREC_BOUND ( FLT_MANT_DIG) }; + enum { _GL_DBL_PREC_BOUND = _GL_FLOAT_PREC_BOUND ( DBL_MANT_DIG) }; + enum { _GL_LDBL_PREC_BOUND = _GL_FLOAT_PREC_BOUND (LDBL_MANT_DIG) }; +#endif + + +/* Bound on the number of bytes printed for an exponent in the range + MIN..MAX, where MIN < 0 < MAX; printf always prints a sign and at + least 2 digits. Although the maximum known exponent is 4932 for + IEEE 754 binary128, support tight bounds for exponents up to a + million, just in case. */ +#define _GL_FLOAT_EXPONENT_STRLEN_BOUND(min, max) \ + ( -100 < (min) && (max) < 100 ? 3 \ + : -1000 < (min) && (max) < 1000 ? 4 \ + : -10000 < (min) && (max) < 10000 ? 5 \ + : -100000 < (min) && (max) < 100000 ? 6 \ + : -1000000 < (min) && (max) < 1000000 ? 7 \ + : INT_STRLEN_BOUND (int) /* not a tight bound */) + +/* A reasonably tight bound on the length of a type-T floating value + formatted with ftoastr etc. Room is needed for sign, fraction + digits, decimal point, "e", and exponent. POINTLEN should be a + reasonably tight bound on the string length of the decimal + point. */ +#define _GL_FLOAT_STRLEN_BOUND_L(t, pointlen) \ + (1 + _GL_##t##_PREC_BOUND + pointlen + 1 \ + + _GL_FLOAT_EXPONENT_STRLEN_BOUND (t##_MIN_10_EXP, t##_MAX_10_EXP)) +#define FLT_STRLEN_BOUND_L(pointlen) _GL_FLOAT_STRLEN_BOUND_L ( FLT, pointlen) +#define DBL_STRLEN_BOUND_L(pointlen) _GL_FLOAT_STRLEN_BOUND_L ( DBL, pointlen) +#define LDBL_STRLEN_BOUND_L(pointlen) _GL_FLOAT_STRLEN_BOUND_L (LDBL, pointlen) + +/* Looser bounds that are locale-independent and are integral constant + expressions. */ +#define FLT_STRLEN_BOUND FLT_STRLEN_BOUND_L (MB_LEN_MAX) +#define DBL_STRLEN_BOUND DBL_STRLEN_BOUND_L (MB_LEN_MAX) +#define LDBL_STRLEN_BOUND LDBL_STRLEN_BOUND_L (MB_LEN_MAX) + +/* Looser, locale-independent bounds that include the trailing null byte. */ +#define FLT_BUFSIZE_BOUND ( FLT_STRLEN_BOUND + 1) +#define DBL_BUFSIZE_BOUND ( DBL_STRLEN_BOUND + 1) +#define LDBL_BUFSIZE_BOUND (LDBL_STRLEN_BOUND + 1) + +#endif /* _GL_FTOASTR_H */ diff --git a/gnulib/lib/ftruncate.c b/gnulib/lib/ftruncate.c new file mode 100644 index 0000000..ae1e858 --- /dev/null +++ b/gnulib/lib/ftruncate.c @@ -0,0 +1,43 @@ +/* ftruncate emulations for native Windows. + This file is in the public domain. */ + +#include + +/* Specification. */ +#include + +#if HAVE_CHSIZE + +# include +# include + +# if HAVE_MSVC_INVALID_PARAMETER_HANDLER +# include "msvc-inval.h" +static inline int +chsize_nothrow (int fd, long length) +{ + int result; + + TRY_MSVC_INVAL + { + result = chsize (fd, length); + } + CATCH_MSVC_INVAL + { + result = -1; + errno = EBADF; + } + DONE_MSVC_INVAL; + + return result; +} +# define chsize chsize_nothrow +# endif + +int +ftruncate (int fd, off_t length) +{ + return chsize (fd, length); +} + +#endif diff --git a/gnulib/lib/fts-cycle.c b/gnulib/lib/fts-cycle.c new file mode 100644 index 0000000..6dc60f0 --- /dev/null +++ b/gnulib/lib/fts-cycle.c @@ -0,0 +1,160 @@ +/* Detect cycles in file tree walks. + + Copyright (C) 2003-2006, 2009-2011 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 . */ + +#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 0000000..ccd1980 --- /dev/null +++ b/gnulib/lib/fts.c @@ -0,0 +1,2095 @@ +/* Traverse a file hierarchy. + + Copyright (C) 2004-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/*- + * 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 + +#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 +#endif +#ifdef _LIBC +# include +#else +# include +#endif +#include +#include +#include +#include +#include +#include + +#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 +#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 possible (see max_entries, below), read no more than this many directory + entries at a time. Without this limit (i.e., when using non-NULL + fts_compar), processing a directory with 4,000,000 entries requires ~1GiB + of memory, and handling 64M entries would require 16GiB of memory. */ +#ifndef FTS_MAX_READDIR_ENTRIES +# define FTS_MAX_READDIR_ENTRIES 100000 +#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 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; + +#include "fts-cycle.c" + +#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: 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 +# include +# include +# 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 extra_flags, int *pdir_fd) +{ + int new_fd = openat (fd, dir, + (O_RDONLY | O_DIRECTORY | O_NOCTTY | O_NONBLOCK + | extra_flags)); + DIR *dirp; + + if (new_fd < 0) + return NULL; + set_cloexec_flag (new_fd, true); + dirp = fdopendir (new_fd); + if (dirp) + *pdir_fd = new_fd; + else + { + 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; +} + +/* Restore the initial, pre-traversal, "working directory". + In FTS_CWDFD mode, we merely call cwd_advance_fd, otherwise, + we may actually change the working directory. + Return 0 upon success. Upon failure, set errno and return nonzero. */ +static int +restore_initial_cwd (FTS *sp) +{ + int fail = FCHDIR (sp, ISSET (FTS_CWDFD) ? AT_FDCWD : sp->fts_rfd); + fd_ring_clear (&(sp->fts_fd_ring)); + return fail; +} + +/* 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_SEARCH | O_DIRECTORY | O_NOCTTY | O_NONBLOCK + | (ISSET (FTS_PHYSICAL) ? O_NOFOLLOW : 0) + | (ISSET (FTS_NOATIME) ? O_NOATIME : 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_SEARCH | (ISSET (FTS_NOATIME) ? O_NOATIME : 0)); + 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 (sp->fts_leaf_optimization_works_ht) + hash_free (sp->fts_leaf_optimization_works_ht); + + 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 + +/* 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 + +/* link-count-optimization entry: + map a 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; +} + +/* + * 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 we have so many directory entries that we're reading them + in batches, and we've reached the end of the current batch, + read in a new batch. */ + if (p->fts_link == NULL && p->fts_parent->fts_dirp) + { + p = tmp->fts_parent; + sp->fts_cur = p; + sp->fts_path[p->fts_pathlen] = '\0'; + + if ((p = fts_build (sp, BREAD)) == NULL) + { + if (ISSET(FTS_STOP)) + return NULL; + goto cd_dot_dot; + } + + free(tmp); + goto name; + } + + 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; + } +cd_dot_dot: + + /* 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; +} + +#define closedir_and_clear(dirp) \ + do \ + { \ + closedir (dirp); \ + dirp = NULL; \ + } \ + while (0) + +#define fts_opendir(file, Pdir_fd) \ + opendirat((! ISSET(FTS_NOCHDIR) && ISSET(FTS_CWDFD) \ + ? sp->fts_cwd_fd : AT_FDCWD), \ + file, \ + (((ISSET(FTS_PHYSICAL) \ + && ! (ISSET(FTS_COMFOLLOW) \ + && cur->fts_level == FTS_ROOTLEVEL)) \ + ? O_NOFOLLOW : 0) \ + | (ISSET (FTS_NOATIME) ? O_NOATIME : 0)), \ + Pdir_fd) + +/* + * 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 FTSENT *p, *head; + register size_t nitems; + FTSENT *tail; + 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; + int dir_fd; + FTSENT *cur = sp->fts_cur; + bool continue_readdir = !!cur->fts_dirp; + + /* When cur->fts_dirp is non-NULL, that means we should + continue calling readdir on that existing DIR* pointer + rather than opening a new one. */ + if (continue_readdir) + { + DIR *dp = cur->fts_dirp; + dir_fd = dirfd (dp); + if (dir_fd < 0) + { + closedir_and_clear (cur->fts_dirp); + if (type == BREAD) + { + cur->fts_info = FTS_DNR; + cur->fts_errno = errno; + } + return NULL; + } + } + else + { + /* Open the directory for reading. If this fails, we're done. + If being called from fts_read, set the fts_info field. */ + if ((cur->fts_dirp = fts_opendir(cur->fts_accpath, &dir_fd)) == 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; + } + } + } + + /* Maximum number of readdir entries to read at one time. This + limitation is to avoid reading millions of entries into memory + at once. When an fts_compar function is specified, we have no + choice: we must read all entries into memory before calling that + function. But when no such function is specified, we can read + entries in batches that are large enough to help us with inode- + sorting, yet not so large that we risk exhausting memory. */ + size_t max_entries = (sp->fts_compar == NULL + ? FTS_MAX_READDIR_ENTRIES : SIZE_MAX); + + /* + * 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 (continue_readdir) + { + /* When resuming a short readdir run, we already have + the required dirp and dir_fd. */ + descend = true; + } + else if (nlinks || type == BREAD) { + if (ISSET(FTS_CWDFD)) + { + dir_fd = dup (dir_fd); + if (0 <= 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_and_clear(cur->fts_dirp); + if (ISSET(FTS_CWDFD) && 0 <= dir_fd) + close (dir_fd); + cur->fts_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; + head = NULL; + tail = NULL; + nitems = 0; + while (cur->fts_dirp) { + bool is_dir; + struct dirent *dp = readdir(cur->fts_dirp); + if (dp == NULL) + break; + 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_and_clear(cur->fts_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_and_clear(cur->fts_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; + + /* 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 (max_entries <= nitems) { + /* When there are too many dir entries, leave + fts_dirp open, so that a subsequent fts_read + can take up where we leave off. */ + goto break_without_closedir; + } + } + + if (cur->fts_dirp) + closedir_and_clear(cur->fts_dirp); + + break_without_closedir: + + /* + * 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 (!continue_readdir && 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_SEARCH | O_NOATIME); + 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 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); + } + + 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_dirp = NULL; + 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; + if (p->fts_dirp) + closedir (p->fts_dirp); + 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 _GL_ATTRIBUTE_PURE +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 0000000..a0235a9 --- /dev/null +++ b/gnulib/lib/fts_.h @@ -0,0 +1,272 @@ +/* Traverse a file hierarchy. + + Copyright (C) 2004-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* + * 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 +# else +# undef __THROW +# define __THROW +# undef __BEGIN_DECLS +# undef __END_DECLS +# ifdef __cplusplus +# define __BEGIN_DECLS extern "C" { +# define __END_DECLS } +# else +# define __BEGIN_DECLS +# define __END_DECLS +# endif +# endif + +# include +# include +# include +# include +# 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_NOATIME 0x0800 /* use O_NOATIME during traversal */ + +# define FTS_OPTIONMASK 0x0fff /* 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 */ + + /* 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; + + /* 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 */ + DIR *fts_dirp; /* Dir pointer for any directory + containing more entries than we + read at one time. */ + 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 0000000..44f483c --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#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 0000000..0dc3172 --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU 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 . */ + +#include + +/* 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 0000000..b94f95f --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#ifdef FULL_READ +# include "full-read.h" +#else +# include "full-write.h" +#endif + +#include + +#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 0000000..8a75ae6 --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + + +#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 0000000..0fe8a0a --- /dev/null +++ b/gnulib/lib/futimens.c @@ -0,0 +1,37 @@ +/* Set the access and modification time of an open fd. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Eric Blake */ + +#include + +#include + +#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 (fd, NULL, times); +} diff --git a/gnulib/lib/fwritable.c b/gnulib/lib/fwritable.c new file mode 100644 index 0000000..ededfb3 --- /dev/null +++ b/gnulib/lib/fwritable.c @@ -0,0 +1,47 @@ +/* Retrieve information about a FILE stream. + Copyright (C) 2007-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "fwritable.h" + +#include "stdio-impl.h" + +bool +fwritable (FILE *fp) +{ + /* Most systems provide FILE as a struct and the necessary bitmask in + , 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 __minix /* Minix */ + return (fp->_flags & _IOWRITE) != 0; +#elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, NonStop Kernel */ + 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 0000000..a968136 --- /dev/null +++ b/gnulib/lib/fwritable.h @@ -0,0 +1,42 @@ +/* Retrieve information about a FILE stream. + Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include +#include + +/* 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 +# 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 0000000..6b3a070 --- /dev/null +++ b/gnulib/lib/fwriteerror.c @@ -0,0 +1,181 @@ +/* Detect write error on a stream. + Copyright (C) 2003-2006, 2008-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "fwriteerror.h" + +#include +#include + +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 0000000..eb1927b --- /dev/null +++ b/gnulib/lib/fwriteerror.h @@ -0,0 +1,62 @@ +/* Detect write error on a stream. + Copyright (C) 2003, 2005-2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +/* 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 + +#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 0000000..9b1dc14 --- /dev/null +++ b/gnulib/lib/fwriting.c @@ -0,0 +1,58 @@ +/* Retrieve information about a FILE stream. + Copyright (C) 2007-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "fwriting.h" + +#include "stdio-impl.h" + +bool +fwriting (FILE *fp) +{ + /* Most systems provide FILE as a struct and the necessary bitmask in + , 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 __minix /* Minix */ + return (fp->_flags & _IOWRITING) != 0; +#elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, NonStop Kernel */ + 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 0000000..72af0b8 --- /dev/null +++ b/gnulib/lib/fwriting.h @@ -0,0 +1,53 @@ +/* Retrieve information about a FILE stream. + Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include +#include + +/* 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 +# 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 0000000..f758f8e --- /dev/null +++ b/gnulib/lib/gai_strerror.c @@ -0,0 +1,93 @@ +/* Copyright (C) 1997, 2001-2002, 2004-2006, 2008-2011 Free Software + Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Philip Blundell , 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 +#endif + +#include +#include + +#ifdef _LIBC +# include +#else +# include "gettext.h" +# define _(String) gettext (String) +# define N_(String) String +#endif + +#if HAVE_DECL_GAI_STRERROR + +# include +# undef gai_strerror +# if HAVE_DECL_GAI_STRERRORA +# define gai_strerror gai_strerrorA +# endif + +const char * +rpl_gai_strerror (int code) +{ + return gai_strerror (code); +} + +#else /* !HAVE_DECL_GAI_STRERROR */ + +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 +#endif /* !HAVE_DECL_GAI_STRERROR */ diff --git a/gnulib/lib/gc-gnulib.c b/gnulib/lib/gc-gnulib.c new file mode 100644 index 0000000..c5033c9 --- /dev/null +++ b/gnulib/lib/gc-gnulib.c @@ -0,0 +1,918 @@ +/* gc-gnulib.c --- Common gnulib internal crypto interface functions + * Copyright (C) 2002-2011 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 + +/* Get prototype. */ +#include "gc.h" + +#include +#include + +/* For randomize. */ +#ifdef GNULIB_GC_RANDOM +# include +# include +# include +# include +# include +#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 +# include +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 0000000..3b3facd --- /dev/null +++ b/gnulib/lib/gc-libgcrypt.c @@ -0,0 +1,729 @@ +/* gc-libgcrypt.c --- Crypto wrappers around Libgcrypt for GC. + * Copyright (C) 2002-2011 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 + +/* Get prototype. */ +#include "gc.h" + +#include +#include + +/* Get libgcrypt API. */ +#include +#ifdef GNULIB_GC_MD2 +# include "md2.h" +#endif + +#include + +#ifndef MIN_GCRYPT_VERSION +# define MIN_GCRYPT_VERSION "1.4.4" +#endif + +/* 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 (MIN_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 0000000..b0b42da --- /dev/null +++ b/gnulib/lib/gc-pbkdf2-sha1.c @@ -0,0 +1,103 @@ +/* gc-pbkdf2-sha1.c --- Password-Based Key Derivation Function a'la PKCS#5 + Copyright (C) 2002-2006, 2009-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 + +#include "gc.h" + +#include +#include + +/* 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 0000000..a63ea3e --- /dev/null +++ b/gnulib/lib/gc.h @@ -0,0 +1,317 @@ +/* gc.h --- Header file for implementation agnostic crypto wrapper API. + * Copyright (C) 2002-2005, 2007-2008, 2011 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. + * + */ + +#ifndef GC_H +# define GC_H + +/* Get size_t. */ +# include + +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__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 + a 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 + 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 writes: + + > Simon Josefsson 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 0000000..50c60df --- /dev/null +++ b/gnulib/lib/gcd.c @@ -0,0 +1,87 @@ +/* Arithmetic. + Copyright (C) 2001-2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 + +/* 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 0000000..597b77a --- /dev/null +++ b/gnulib/lib/gcd.h @@ -0,0 +1,34 @@ +/* Arithmetic. + Copyright (C) 2001-2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#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 0000000..0eddbb1 --- /dev/null +++ b/gnulib/lib/gen-uni-tables.c @@ -0,0 +1,9780 @@ +/* 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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +/* 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/ArabicShaping.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/GraphemeBreakProperty.txt \ + /usr/local/share/Unidata/CompositionExclusions.txt \ + /usr/local/share/Unidata/SpecialCasing.txt \ + /usr/local/share/Unidata/CaseFolding.txt \ + 6.0.0 + */ + +#include +#include +#include +#include +#include +#include + +/* ========================================================================= */ + +/* 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_LC (unsigned int ch) +{ + /* See PropertyValueAliases.txt. */ + return (unicode_attributes[ch].name != NULL + && unicode_attributes[ch].category[0] == 'L' + && (unicode_attributes[ch].category[1] == 'u' + || unicode_attributes[ch].category[1] == 'l' + || unicode_attributes[ch].category[1] == 't')); +} + +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 . */\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-uni-tables.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 (LC) + 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_LC = 0x00000007, + 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 'C': return UC_CATEGORY_MASK_LC; + 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-uni-tables.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-uni-tables.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-uni-tables.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-uni-tables.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-uni-tables.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-uni-tables.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-uni-tables.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-uni-tables.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-uni-tables.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-uni-tables.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); + } +} + +/* ========================================================================= */ + +/* Particular values of the word break property. */ + +static bool +is_WBP_MIDNUMLET (unsigned int ch) +{ + return (ch == 0x0027 || ch == 0x002E || ch == 0x2018 || ch == 0x2019 + || ch == 0x2024 || ch == 0xFE52 || ch == 0xFF07 || ch == 0xFF0E); +} + +static bool +is_WBP_MIDLETTER (unsigned int ch) +{ + return (ch == 0x00B7 || ch == 0x05F4 || ch == 0x2027 || ch == 0x003A + || ch == 0x0387 || ch == 0xFE13 || ch == 0xFE55 || ch == 0xFF1A); +} + +/* ========================================================================= */ + +/* 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_CASED, + PROP_CASE_IGNORABLE, + PROP_CHANGES_WHEN_LOWERCASED, + PROP_CHANGES_WHEN_UPPERCASED, + PROP_CHANGES_WHEN_TITLECASED, + PROP_CHANGES_WHEN_CASEFOLDED, + PROP_CHANGES_WHEN_CASEMAPPED, + 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 ("Cased", PROP_CASED) + PROP ("Case_Ignorable", PROP_CASE_IGNORABLE) + PROP ("Changes_When_Lowercased", PROP_CHANGES_WHEN_LOWERCASED) + PROP ("Changes_When_Uppercased", PROP_CHANGES_WHEN_UPPERCASED) + PROP ("Changes_When_Titlecased", PROP_CHANGES_WHEN_TITLECASED) + PROP ("Changes_When_Casefolded", PROP_CHANGES_WHEN_CASEFOLDED) + PROP ("Changes_When_Casemapped", PROP_CHANGES_WHEN_CASEMAPPED) + 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 >= 0xA6E6 && ch <= 0xA6EF) /* BAMUM LETTERS */ + || (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) + /* For some reason, the following are not listed as having property + Default_Ignorable_Code_Point. */ + && !(ch == 0x110BD)) + || ((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 DerivedCoreProperties.txt. */ +static bool +is_property_cased (unsigned int ch) +{ + bool result1 = (is_property_lowercase (ch) + || is_property_uppercase (ch) + || is_category_Lt (ch)); + bool result2 = ((unicode_properties[ch] & (1ULL << PROP_CASED)) != 0); + + if (result1 != result2) + abort (); + return result1; +} + +/* See DerivedCoreProperties.txt. */ +static bool +is_property_case_ignorable (unsigned int ch) +{ + bool result1 = (is_WBP_MIDLETTER (ch) || is_WBP_MIDNUMLET (ch) + || is_category_Mn (ch) + || is_category_Me (ch) + || is_category_Cf (ch) + || is_category_Lm (ch) + || is_category_Sk (ch)); + bool result2 = ((unicode_properties[ch] & (1ULL << PROP_CASE_IGNORABLE)) != 0); + + if (result1 != result2) + abort (); + return result1; +} + +/* See DerivedCoreProperties.txt. */ +static bool +is_property_changes_when_lowercased (unsigned int ch) +{ + bool result1 = ((unicode_properties[ch] & (1ULL << PROP_CHANGES_WHEN_LOWERCASED)) != 0); + bool result2 = (unicode_attributes[ch].name != NULL + && unicode_attributes[ch].lower != NONE + && unicode_attributes[ch].lower != ch); + + if (result1 != result2) + abort (); + return result1; +} + +/* See DerivedCoreProperties.txt. */ +static bool +is_property_changes_when_uppercased (unsigned int ch) +{ + return ((unicode_properties[ch] & (1ULL << PROP_CHANGES_WHEN_UPPERCASED)) != 0); +} + +/* See DerivedCoreProperties.txt. */ +static bool +is_property_changes_when_titlecased (unsigned int ch) +{ + return ((unicode_properties[ch] & (1ULL << PROP_CHANGES_WHEN_TITLECASED)) != 0); +} + +/* See DerivedCoreProperties.txt. */ +static bool +is_property_changes_when_casefolded (unsigned int ch) +{ + return ((unicode_properties[ch] & (1ULL << PROP_CHANGES_WHEN_CASEFOLDED)) != 0); +} + +/* See DerivedCoreProperties.txt. */ +static bool +is_property_changes_when_casemapped (unsigned int ch) +{ + return ((unicode_properties[ch] & (1ULL << PROP_CHANGES_WHEN_CASEMAPPED)) != 0); +} + +/* 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, "") == 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(cased) + PROPERTY(case_ignorable) + PROPERTY(changes_when_lowercased) + PROPERTY(changes_when_uppercased) + PROPERTY(changes_when_titlecased) + PROPERTY(changes_when_casefolded) + PROPERTY(changes_when_casemapped) + 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 +} + +/* ========================================================================= */ + +/* Arabic Shaping. */ + +enum +{ + UC_JOINING_TYPE_U, /* Non_Joining */ + UC_JOINING_TYPE_T, /* Transparent */ + UC_JOINING_TYPE_C, /* Join_Causing */ + UC_JOINING_TYPE_L, /* Left_Joining */ + UC_JOINING_TYPE_R, /* Right_Joining */ + UC_JOINING_TYPE_D /* Dual_Joining */ +}; + +static uint8_t unicode_joining_type[0x110000]; + +enum +{ + UC_JOINING_GROUP_NONE, /* No_Joining_Group */ + UC_JOINING_GROUP_AIN, /* Ain */ + UC_JOINING_GROUP_ALAPH, /* Alaph */ + UC_JOINING_GROUP_ALEF, /* Alef */ + UC_JOINING_GROUP_BEH, /* Beh */ + UC_JOINING_GROUP_BETH, /* Beth */ + UC_JOINING_GROUP_BURUSHASKI_YEH_BARREE, /* Burushaski_Yeh_Barree */ + UC_JOINING_GROUP_DAL, /* Dal */ + UC_JOINING_GROUP_DALATH_RISH, /* Dalath_Rish */ + UC_JOINING_GROUP_E, /* E */ + UC_JOINING_GROUP_FARSI_YEH, /* Farsi_Yeh */ + UC_JOINING_GROUP_FE, /* Fe */ + UC_JOINING_GROUP_FEH, /* Feh */ + UC_JOINING_GROUP_FINAL_SEMKATH, /* Final_Semkath */ + UC_JOINING_GROUP_GAF, /* Gaf */ + UC_JOINING_GROUP_GAMAL, /* Gamal */ + UC_JOINING_GROUP_HAH, /* Hah */ + UC_JOINING_GROUP_HE, /* He */ + UC_JOINING_GROUP_HEH, /* Heh */ + UC_JOINING_GROUP_HEH_GOAL, /* Heh_Goal */ + UC_JOINING_GROUP_HETH, /* Heth */ + UC_JOINING_GROUP_KAF, /* Kaf */ + UC_JOINING_GROUP_KAPH, /* Kaph */ + UC_JOINING_GROUP_KHAPH, /* Khaph */ + UC_JOINING_GROUP_KNOTTED_HEH, /* Knotted_Heh */ + UC_JOINING_GROUP_LAM, /* Lam */ + UC_JOINING_GROUP_LAMADH, /* Lamadh */ + UC_JOINING_GROUP_MEEM, /* Meem */ + UC_JOINING_GROUP_MIM, /* Mim */ + UC_JOINING_GROUP_NOON, /* Noon */ + UC_JOINING_GROUP_NUN, /* Nun */ + UC_JOINING_GROUP_NYA, /* Nya */ + UC_JOINING_GROUP_PE, /* Pe */ + UC_JOINING_GROUP_QAF, /* Qaf */ + UC_JOINING_GROUP_QAPH, /* Qaph */ + UC_JOINING_GROUP_REH, /* Reh */ + UC_JOINING_GROUP_REVERSED_PE, /* Reversed_Pe */ + UC_JOINING_GROUP_SAD, /* Sad */ + UC_JOINING_GROUP_SADHE, /* Sadhe */ + UC_JOINING_GROUP_SEEN, /* Seen */ + UC_JOINING_GROUP_SEMKATH, /* Semkath */ + UC_JOINING_GROUP_SHIN, /* Shin */ + UC_JOINING_GROUP_SWASH_KAF, /* Swash_Kaf */ + UC_JOINING_GROUP_SYRIAC_WAW, /* Syriac_Waw */ + UC_JOINING_GROUP_TAH, /* Tah */ + UC_JOINING_GROUP_TAW, /* Taw */ + UC_JOINING_GROUP_TEH_MARBUTA, /* Teh_Marbuta */ + UC_JOINING_GROUP_TEH_MARBUTA_GOAL, /* Teh_Marbuta_Goal */ + UC_JOINING_GROUP_TETH, /* Teth */ + UC_JOINING_GROUP_WAW, /* Waw */ + UC_JOINING_GROUP_YEH, /* Yeh */ + UC_JOINING_GROUP_YEH_BARREE, /* Yeh_Barree */ + UC_JOINING_GROUP_YEH_WITH_TAIL, /* Yeh_With_Tail */ + UC_JOINING_GROUP_YUDH, /* Yudh */ + UC_JOINING_GROUP_YUDH_HE, /* Yudh_He */ + UC_JOINING_GROUP_ZAIN, /* Zain */ + UC_JOINING_GROUP_ZHAIN /* Zhain */ +}; + +static uint8_t unicode_joining_group[0x110000]; + +static void +fill_arabicshaping (const char *arabicshaping_filename) +{ + FILE *stream; + unsigned int i; + int lineno; + + stream = fopen (arabicshaping_filename, "r"); + if (stream == NULL) + { + fprintf (stderr, "error during fopen of '%s'\n", arabicshaping_filename); + exit (1); + } + + for (i = 0; i < 0x110000; i++) + { + unicode_joining_type[i] = (uint8_t)~(uint8_t)0; + unicode_joining_group[i] = UC_JOINING_GROUP_NONE; + } + + lineno = 0; + for (;;) + { + char buf[100+1]; + char separator1[100+1]; + char padding1[100+1]; + char schematic_name[100+1]; + char separator2[100+1]; + char padding2[100+1]; + char joining_type_name[100+1]; + char separator3[100+1]; + char padding3[100+1]; + char joining_group_name[100+1]; + int joining_type; + int joining_group; + + lineno++; + if (fscanf (stream, "%100[^\n]\n", buf) < 1) + break; + + if (buf[0] == '\0' || buf[0] == '#') + continue; + + if (sscanf (buf, "%X%[;]%[ ]%[^;]%[;]%[ ]%[^;]%[;]%[ ]%100[^\n]", + &i, separator1, padding1, schematic_name, separator2, + padding2, joining_type_name, separator3, padding3, + joining_group_name) != 10) + { + fprintf (stderr, "parse error in '%s':%d\n", + arabicshaping_filename, lineno); + exit (1); + } + if (i >= 0x110000) + abort (); + +#define TRY(name) else if (strcmp (joining_type_name, #name + 16) == 0) joining_type = name; + if (false) {} + TRY(UC_JOINING_TYPE_U) + TRY(UC_JOINING_TYPE_T) + TRY(UC_JOINING_TYPE_C) + TRY(UC_JOINING_TYPE_L) + TRY(UC_JOINING_TYPE_R) + TRY(UC_JOINING_TYPE_D) +#undef TRY + else + { + fprintf (stderr, "unknown joining type value \"%s\" in '%s':%d\n", + joining_type_name, arabicshaping_filename, lineno); + exit (1); + } + + /* Remove trailing spaces. */ + while (joining_group_name[0] != '\0' + && joining_group_name[strlen (joining_group_name) - 1] == ' ') + joining_group_name[strlen (joining_group_name) - 1] = '\0'; + +#define TRY(value,name) else if (strcmp (joining_group_name, name) == 0) joining_group = value; + if (false) {} + TRY(UC_JOINING_GROUP_NONE, "No_Joining_Group") + TRY(UC_JOINING_GROUP_AIN, "AIN") + TRY(UC_JOINING_GROUP_ALAPH, "ALAPH") + TRY(UC_JOINING_GROUP_ALEF, "ALEF") + TRY(UC_JOINING_GROUP_BEH, "BEH") + TRY(UC_JOINING_GROUP_BETH, "BETH") + TRY(UC_JOINING_GROUP_BURUSHASKI_YEH_BARREE, "BURUSHASKI YEH BARREE") + TRY(UC_JOINING_GROUP_DAL, "DAL") + TRY(UC_JOINING_GROUP_DALATH_RISH, "DALATH RISH") + TRY(UC_JOINING_GROUP_E, "E") + TRY(UC_JOINING_GROUP_FARSI_YEH, "FARSI YEH") + TRY(UC_JOINING_GROUP_FE, "FE") + TRY(UC_JOINING_GROUP_FEH, "FEH") + TRY(UC_JOINING_GROUP_FINAL_SEMKATH, "FINAL SEMKATH") + TRY(UC_JOINING_GROUP_GAF, "GAF") + TRY(UC_JOINING_GROUP_GAMAL, "GAMAL") + TRY(UC_JOINING_GROUP_HAH, "HAH") + TRY(UC_JOINING_GROUP_HE, "HE") + TRY(UC_JOINING_GROUP_HEH, "HEH") + TRY(UC_JOINING_GROUP_HEH_GOAL, "HEH GOAL") + TRY(UC_JOINING_GROUP_HETH, "HETH") + TRY(UC_JOINING_GROUP_KAF, "KAF") + TRY(UC_JOINING_GROUP_KAPH, "KAPH") + TRY(UC_JOINING_GROUP_KHAPH, "KHAPH") + TRY(UC_JOINING_GROUP_KNOTTED_HEH, "KNOTTED HEH") + TRY(UC_JOINING_GROUP_LAM, "LAM") + TRY(UC_JOINING_GROUP_LAMADH, "LAMADH") + TRY(UC_JOINING_GROUP_MEEM, "MEEM") + TRY(UC_JOINING_GROUP_MIM, "MIM") + TRY(UC_JOINING_GROUP_NOON, "NOON") + TRY(UC_JOINING_GROUP_NUN, "NUN") + TRY(UC_JOINING_GROUP_NYA, "NYA") + TRY(UC_JOINING_GROUP_PE, "PE") + TRY(UC_JOINING_GROUP_QAF, "QAF") + TRY(UC_JOINING_GROUP_QAPH, "QAPH") + TRY(UC_JOINING_GROUP_REH, "REH") + TRY(UC_JOINING_GROUP_REVERSED_PE, "REVERSED PE") + TRY(UC_JOINING_GROUP_SAD, "SAD") + TRY(UC_JOINING_GROUP_SADHE, "SADHE") + TRY(UC_JOINING_GROUP_SEEN, "SEEN") + TRY(UC_JOINING_GROUP_SEMKATH, "SEMKATH") + TRY(UC_JOINING_GROUP_SHIN, "SHIN") + TRY(UC_JOINING_GROUP_SWASH_KAF, "SWASH KAF") + TRY(UC_JOINING_GROUP_SYRIAC_WAW, "SYRIAC WAW") + TRY(UC_JOINING_GROUP_TAH, "TAH") + TRY(UC_JOINING_GROUP_TAW, "TAW") + TRY(UC_JOINING_GROUP_TEH_MARBUTA, "TEH MARBUTA") + TRY(UC_JOINING_GROUP_TEH_MARBUTA_GOAL, "TEH MARBUTA GOAL") + TRY(UC_JOINING_GROUP_TETH, "TETH") + TRY(UC_JOINING_GROUP_WAW, "WAW") + TRY(UC_JOINING_GROUP_YEH, "YEH") + TRY(UC_JOINING_GROUP_YEH_BARREE, "YEH BARREE") + TRY(UC_JOINING_GROUP_YEH_WITH_TAIL, "YEH WITH TAIL") + TRY(UC_JOINING_GROUP_YUDH, "YUDH") + TRY(UC_JOINING_GROUP_YUDH_HE, "YUDH HE") + TRY(UC_JOINING_GROUP_ZAIN, "ZAIN") + TRY(UC_JOINING_GROUP_ZHAIN, "ZHAIN") +#undef TRY + else + { + fprintf (stderr, "unknown joining group value \"%s\" in '%s':%d\n", + joining_group_name, arabicshaping_filename, lineno); + exit (1); + } + + unicode_joining_type[i] = joining_type; + unicode_joining_group[i] = joining_group; + } + + if (ferror (stream) || fclose (stream)) + { + fprintf (stderr, "error reading from '%s'\n", arabicshaping_filename); + exit (1); + } +} + +/* Convert a Joining_Type value to a C identifier. */ +static const char * +joining_type_as_c_identifier (int joining_type) +{ +#define TRY(value) if (joining_type == value) return #value; + TRY(UC_JOINING_TYPE_U) + TRY(UC_JOINING_TYPE_T) + TRY(UC_JOINING_TYPE_C) + TRY(UC_JOINING_TYPE_L) + TRY(UC_JOINING_TYPE_R) + TRY(UC_JOINING_TYPE_D) +#undef TRY + abort (); +} + +static void +output_joining_type_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, "/* Arabic joining type of Unicode characters. */\n"); + fprintf (stream, "/* Generated automatically by gen-uni-tables.c for Unicode %s. */\n", + version); + + need_comma = false; + for (ch = 0; ch < 0x110000; ch++) + { + int value = unicode_joining_type[ch]; + + if (value != (uint8_t)~(uint8_t)0) + { + if (need_comma) + fprintf (stream, ",\n"); + fprintf (stream, " { 0x%04X, %s }", ch, joining_type_as_c_identifier (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); + } +} + +/* Construction of sparse 3-level tables. */ +#define TABLE joining_type_table +#define ELEMENT uint8_t +#define DEFAULT (uint8_t)~(uint8_t)0 +#define xmalloc malloc +#define xrealloc realloc +#include "3level.h" + +static void +output_joining_type (const char *filename, const char *version) +{ + FILE *stream; + unsigned int ch, i; + struct joining_type_table t; + unsigned int level1_offset, level2_offset, level3_offset; + uint8_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, "/* Arabic joining type of Unicode characters. */\n"); + fprintf (stream, "/* Generated automatically by gen-uni-tables.c for Unicode %s. */\n", + version); + + t.p = 7; + t.q = 9; + joining_type_table_init (&t); + + for (ch = 0; ch < 0x110000; ch++) + { + uint8_t value = unicode_joining_type[ch]; + + joining_type_table_add (&t, ch, value); + } + + joining_type_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 joining_type_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, + (1 << t.p) * 4 / 8); + fprintf (stream, " }\n"); + fprintf (stream, "u_joining_type =\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. */ + level3_packed = + (uint8_t *) calloc ((t.level3_size << t.p) * 4 / 8, sizeof (uint8_t)); + for (i = 0; i < t.level3_size << t.p; i++) + { + unsigned int j = (i * 4) / 8; + unsigned int k = (i * 4) % 8; + uint32_t value = ((unsigned char *) (t.result + level3_offset))[i] & 0x0f; + level3_packed[j] |= (value << k); + } + fprintf (stream, " {"); + if ((t.level3_size << t.p) * 4 / 8 > 8) + fprintf (stream, "\n "); + for (i = 0; i < (t.level3_size << t.p) * 4 / 8; i++) + { + if (i > 0 && (i % 8) == 0) + fprintf (stream, "\n "); + fprintf (stream, " 0x%02x", level3_packed[i]); + if (i+1 < (t.level3_size << t.p) * 4 / 8) + fprintf (stream, ","); + } + if ((t.level3_size << t.p) * 4 / 8 > 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); + } +} + +/* Convert a Joining_Group value to a C identifier. */ +static const char * +joining_group_as_c_identifier (int joining_group) +{ +#define TRY(value) if (joining_group == value) return #value; + TRY(UC_JOINING_GROUP_NONE) + TRY(UC_JOINING_GROUP_AIN) + TRY(UC_JOINING_GROUP_ALAPH) + TRY(UC_JOINING_GROUP_ALEF) + TRY(UC_JOINING_GROUP_BEH) + TRY(UC_JOINING_GROUP_BETH) + TRY(UC_JOINING_GROUP_BURUSHASKI_YEH_BARREE) + TRY(UC_JOINING_GROUP_DAL) + TRY(UC_JOINING_GROUP_DALATH_RISH) + TRY(UC_JOINING_GROUP_E) + TRY(UC_JOINING_GROUP_FARSI_YEH) + TRY(UC_JOINING_GROUP_FE) + TRY(UC_JOINING_GROUP_FEH) + TRY(UC_JOINING_GROUP_FINAL_SEMKATH) + TRY(UC_JOINING_GROUP_GAF) + TRY(UC_JOINING_GROUP_GAMAL) + TRY(UC_JOINING_GROUP_HAH) + TRY(UC_JOINING_GROUP_HE) + TRY(UC_JOINING_GROUP_HEH) + TRY(UC_JOINING_GROUP_HEH_GOAL) + TRY(UC_JOINING_GROUP_HETH) + TRY(UC_JOINING_GROUP_KAF) + TRY(UC_JOINING_GROUP_KAPH) + TRY(UC_JOINING_GROUP_KHAPH) + TRY(UC_JOINING_GROUP_KNOTTED_HEH) + TRY(UC_JOINING_GROUP_LAM) + TRY(UC_JOINING_GROUP_LAMADH) + TRY(UC_JOINING_GROUP_MEEM) + TRY(UC_JOINING_GROUP_MIM) + TRY(UC_JOINING_GROUP_NOON) + TRY(UC_JOINING_GROUP_NUN) + TRY(UC_JOINING_GROUP_NYA) + TRY(UC_JOINING_GROUP_PE) + TRY(UC_JOINING_GROUP_QAF) + TRY(UC_JOINING_GROUP_QAPH) + TRY(UC_JOINING_GROUP_REH) + TRY(UC_JOINING_GROUP_REVERSED_PE) + TRY(UC_JOINING_GROUP_SAD) + TRY(UC_JOINING_GROUP_SADHE) + TRY(UC_JOINING_GROUP_SEEN) + TRY(UC_JOINING_GROUP_SEMKATH) + TRY(UC_JOINING_GROUP_SHIN) + TRY(UC_JOINING_GROUP_SWASH_KAF) + TRY(UC_JOINING_GROUP_SYRIAC_WAW) + TRY(UC_JOINING_GROUP_TAH) + TRY(UC_JOINING_GROUP_TAW) + TRY(UC_JOINING_GROUP_TEH_MARBUTA) + TRY(UC_JOINING_GROUP_TEH_MARBUTA_GOAL) + TRY(UC_JOINING_GROUP_TETH) + TRY(UC_JOINING_GROUP_WAW) + TRY(UC_JOINING_GROUP_YEH) + TRY(UC_JOINING_GROUP_YEH_BARREE) + TRY(UC_JOINING_GROUP_YEH_WITH_TAIL) + TRY(UC_JOINING_GROUP_YUDH) + TRY(UC_JOINING_GROUP_YUDH_HE) + TRY(UC_JOINING_GROUP_ZAIN) + TRY(UC_JOINING_GROUP_ZHAIN) +#undef TRY + abort (); +} + +static void +output_joining_group_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, "/* Arabic joining group of Unicode characters. */\n"); + fprintf (stream, "/* Generated automatically by gen-uni-tables.c for Unicode %s. */\n", + version); + + need_comma = false; + for (ch = 0; ch < 0x110000; ch++) + { + int value = unicode_joining_group[ch]; + + if (value != UC_JOINING_GROUP_NONE) + { + if (need_comma) + fprintf (stream, ",\n"); + fprintf (stream, " { 0x%04X, %s }", ch, joining_group_as_c_identifier (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); + } +} + +static void +output_joining_group (const char *filename, const char *version) +{ + FILE *stream; + unsigned int ch_min, ch_max, ch, i; + + 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, "/* Arabic joining type of Unicode characters. */\n"); + fprintf (stream, "/* Generated automatically by gen-uni-tables.c for Unicode %s. */\n", + version); + + ch_min = 0x10FFFF; + for (ch = 0; ch < 0x110000; ch++) + if (unicode_joining_group[ch] != UC_JOINING_GROUP_NONE) + { + ch_min = ch; + break; + } + + ch_max = 0; + for (ch = 0x10FFFF; ch > 0; ch--) + if (unicode_joining_group[ch] != UC_JOINING_GROUP_NONE) + { + ch_max = ch; + break; + } + + if (!(ch_min <= ch_max)) + abort (); + + /* If the interval [ch_min, ch_max] is too large, we should better use a + 3-level table. */ + if (!(ch_max - ch_min < 0x200)) + abort (); + + fprintf (stream, "#define joining_group_header_0 0x%x\n", ch_min); + fprintf (stream, "static const unsigned char u_joining_group[0x%x - 0x%x] =\n", + ch_max + 1, ch_min); + fprintf (stream, "{"); + for (i = 0; i <= ch_max - ch_min; i++) + { + const char *s; + + ch = ch_min + i; + if ((i % 2) == 0) + fprintf (stream, "\n "); + s = joining_group_as_c_identifier (unicode_joining_group[ch]); + fprintf (stream, " %s", s); + if (i+1 <= ch_max - ch_min) + { + fprintf (stream, ","); + if (((i+1) % 2) != 0) + fprintf (stream, "%*s", 38 - (int) strlen (s), ""); + } + } + fprintf (stream, "\n"); + fprintf (stream, "};\n"); + + if (ferror (stream) || fclose (stream)) + { + fprintf (stderr, "error writing to '%s'\n", filename); + exit (1); + } +} + +/* ========================================================================= */ + +/* 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-uni-tables.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-uni-tables.c for Unicode %s. */\n", + version); + fprintf (stream, "struct named_script { int 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, "%%pic\n"); + fprintf (stream, "%%define string-pool-name script_stringpool\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-uni-tables.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-uni-tables.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 and . 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) + /* 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 says + , should belong to is_punct. */ + && (ch != 0x0E2F) && (ch != 0x0E46)) + /* Theppitak Karoonboonyanan says + , .., .. are is_alpha. */ + || (ch == 0x0E31) + || (ch >= 0x0E34 && ch <= 0x0E3A) + || (ch >= 0x0E47 && ch <= 0x0E4E) + /* Avoid warning for . */ + || (ch == 0x0345) + /* Avoid warnings for ... */ + || (unicode_attributes[ch].category[0] == 'N' + && unicode_attributes[ch].category[1] == 'l') + /* Avoid warnings for ... */ + || (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 "" */ + || (unicode_attributes[ch].name != NULL + && unicode_attributes[ch].category[0] == 'Z' + && unicode_attributes[ch].category[1] == 's' + && !strstr (unicode_attributes[ch].decomposition, ""))); +} + +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 "" */ + || (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, + ""))))); +} + +static bool +is_cntrl (unsigned int ch) +{ + return (unicode_attributes[ch].name != NULL + && (strcmp (unicode_attributes[ch].name, "") == 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, "") + && !is_space (ch)); +} + +static bool +is_print (unsigned int ch) +{ + return (unicode_attributes[ch].name != NULL + && strcmp (unicode_attributes[ch].name, "") + /* 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 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 ? "" : ""), 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-uni-tables.c 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 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 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|\n", ucs_symbol (ch)); + if (!is_print (ch) && (is_graph (ch) || ch == 0x0020)) + fprintf (stderr, + "%s is graph| 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); + } +} + +/* ========================================================================= */ + +/* Non-spacing attribute and width. */ + +/* The 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 bool +is_nonspacing (unsigned int ch) +{ + return (unicode_attributes[ch].name != NULL + && (get_bidi_category (ch) == UC_BIDI_NSM + || is_category_Cc (ch) || is_category_Cf (ch) + || strncmp (unicode_attributes[ch].name, "ZERO WIDTH ", 11) == 0)); +} + +static void +output_nonspacing_property (const char *filename) +{ + FILE *stream; + int ind[0x110000 / 0x200]; + unsigned int i; + unsigned int i_max; + int next_ind; + + stream = fopen (filename, "w"); + if (stream == NULL) + { + fprintf (stderr, "cannot open '%s' for writing\n", filename); + exit (1); + } + + next_ind = 0; + for (i = 0; i < 0x110000 / 0x200; i++) + { + bool nontrivial = false; + unsigned int ch; + + if (i != 0xe0000 / 0x200) /* The 0xe0000 block is handled by code. */ + for (ch = i * 0x200; ch < (i + 1) * 0x200; ch++) + if (is_nonspacing (ch)) + { + nontrivial = true; + break; + } + if (nontrivial) + ind[i] = next_ind++; + else + ind[i] = -1; + } + + fprintf (stream, "static const unsigned char nonspacing_table_data[%d*64] = {\n", + next_ind); + i_max = 0; + for (i = 0; i < 0x110000 / 0x200; i++) + { + bool nontrivial = (ind[i] >= 0); + + if (nontrivial) + { + unsigned int j; + + fprintf (stream, " /* 0x%04x-0x%04x */\n", i * 0x200, (i + 1) * 0x200 - 1); + for (j = 0; j < 8; j++) + { + unsigned int k; + + fprintf (stream, " "); + for (k = 0; k < 8; k++) + { + unsigned int l; + unsigned char bits = 0; + + for (l = 0; l < 8; l++) + { + unsigned int ch = i * 0x200 + j * 0x40 + k * 8 + l; + + if (is_nonspacing (ch)) + bits |= 1 << l; + } + fprintf (stream, " 0x%02x%c", bits, + ind[i] + 1 == next_ind && j == 8 - 1 && k == 8 - 1 ? ' ' : ','); + } + fprintf (stream, " /* 0x%04x-0x%04x */\n", + i * 0x200 + j * 0x40, i * 0x200 + (j + 1) * 0x40 - 1); + } + i_max = i; + } + } + fprintf (stream, "};\n"); + + i_max = ((i_max + 8 - 1) / 8) * 8; + fprintf (stream, "static const signed char nonspacing_table_ind[%u] = {\n", + i_max); + { + unsigned int j; + + for (j = 0; j < i_max / 8; j++) + { + unsigned int k; + + fprintf (stream, " "); + for (k = 0; k < 8; k++) + { + i = j * 8 + k; + fprintf (stream, " %2d%c", ind[i], + j == i_max / 8 - 1 && k == 8 - 1 ? ' ' : ','); + } + fprintf (stream, " /* 0x%04x-0x%04x */\n", + j * 8 * 0x200, (j + 1) * 8 * 0x200 - 1); + } + } + fprintf (stream, "};\n"); + + if (ferror (stream) || fclose (stream)) + { + fprintf (stderr, "error writing to '%s'\n", filename); + exit (1); + } +} + +/* Returns the width of ch as one of 0, '0', '1', '2', 'A'. */ +static char +symbolic_width (unsigned int ch) +{ + /* Test for unassigned character. */ + if (is_property_unassigned_code_value (ch)) + { + /* Unicode TR#11 section "Unassigned and Private-Use Characters". */ + if (ch >= 0xE000 && ch <= 0xF8FF) /* Private Use */ + return 'A'; + if ((ch >= 0x4E00 && ch <= 0x9FFF) /* CJK Unified Ideographs block */ + || (ch >= 0x3400 && ch <= 0x4DBF) /* CJK Unified Ideographs Extension A block */ + || (ch >= 0xF900 && ch <= 0xFAFF) /* CJK Compatibility Ideographs block */ + || (ch >= 0x20000 && ch <= 0x2FFFF) /* Supplementary Ideographic Plane */ + || (ch >= 0x30000 && ch <= 0x3FFFF) /* Tertiary Ideographic Plane */) + return '2'; + return 0; + } + else + { + /* Test for non-spacing or control character. */ + if (is_category_Cc (ch) && ch < 0x00A0) + return 0; + if (is_nonspacing (ch)) + return '0'; + /* Test for double-width character. */ + if (unicode_width[ch] != NULL + && (strcmp (unicode_width[ch], "W") == 0 + || strcmp (unicode_width[ch], "F") == 0)) + return '2'; + /* Test for half-width character. */ + if (unicode_width[ch] != NULL + && strcmp (unicode_width[ch], "H") == 0) + return '1'; + } + /* In ancient CJK encodings, Cyrillic and most other characters are + double-width as well. */ + if (ch >= 0x00A1 && ch < 0x10000) + return 'A'; + return '1'; +} + +static void +output_width_property_test (const char *filename) +{ + FILE *stream; + unsigned int interval_start, interval_end, ch; + char interval_value; + + stream = fopen (filename, "w"); + if (stream == NULL) + { + fprintf (stderr, "cannot open '%s' for writing\n", filename); + exit (1); + } + + interval_value = 0; + interval_start = interval_end = 0; /* avoid GCC warning */ + for (ch = 0; ch < 0x110000; ch++) + { + char value = symbolic_width (ch); + if (value != 0) /* skip Cc control characters and unassigned characters */ + { + if (value == interval_value) + /* Extend the interval. */ + interval_end = ch; + else + { + /* Terminate the interval. */ + if (interval_value != 0) + { + if (interval_end == interval_start) + fprintf (stream, "%04X\t\t%c\n", interval_start, interval_value); + else + fprintf (stream, "%04X..%04X\t%c\n", interval_start, interval_end, interval_value); + } + /* Start a new interval. */ + interval_start = interval_end = ch; + interval_value = value; + } + } + } + /* Terminate the last interval. */ + if (interval_value != 0) + { + if (interval_end == interval_start) + fprintf (stream, "%04X\t\t%c\n", interval_start, interval_value); + else + fprintf (stream, "%04X..%04X\t%c\n", interval_start, interval_end, interval_value); + } + + if (ferror (stream) || fclose (stream)) + { + fprintf (stderr, "error writing to '%s'\n", filename); + exit (1); + } +} + +/* ========================================================================= */ + +/* Line breaking classification. + Updated for Unicode TR #14 revision 26. */ + +enum +{ + /* Values >= 25 are resolved at run time. */ + LBP_BK = 25, /* 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 = 26, /* 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 = 27, /* zero width space */ + LBP_GL = 1, /* non-breaking (glue) */ + LBP_SP = 28, /* 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 = 29, /* contingent break opportunity */ + LBP_CL = 6, /* closing punctuation */ + LBP_CP = 7, /* closing parenthesis */ + LBP_EX = 8, /* exclamation/interrogation */ + LBP_IN = 9, /* inseparable */ + LBP_NS = 10, /* non starter */ + LBP_OP = 11, /* opening punctuation */ + LBP_QU = 12, /* ambiguous quotation */ + LBP_IS = 13, /* infix separator (numeric) */ + LBP_NU = 14, /* numeric */ + LBP_PO = 15, /* postfix (numeric) */ + LBP_PR = 16, /* prefix (numeric) */ + LBP_SY = 17, /* symbols allowing breaks */ + LBP_AI = 30, /* ambiguous (alphabetic or ideograph) */ + LBP_AL = 18, /* ordinary alphabetic and symbol characters */ + LBP_H2 = 19, /* Hangul LV syllable */ + LBP_H3 = 20, /* Hangul LVT syllable */ + LBP_ID = 21, /* ideographic */ + LBP_JL = 22, /* Hangul L Jamo */ + LBP_JV = 23, /* Hangul V Jamo */ + LBP_JT = 24, /* Hangul T Jamo */ + LBP_SA = 31, /* complex context (South East Asian) */ + LBP_XX = 32 /* unknown */ +}; + +/* Returns the line breaking classification for ch, as a bit mask. */ +static int64_t +get_lbp (unsigned int ch) +{ + int64_t 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 |= (int64_t) 1 << LBP_BK; + + if (ch == 0x2060 /* WORD JOINER */ + || ch == 0xFEFF /* ZERO WIDTH NO-BREAK SPACE */) + attr |= (int64_t) 1 << LBP_WJ; + + /* zero width space */ + if (ch == 0x200B /* ZERO WIDTH SPACE */) + attr |= (int64_t) 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 ... */ + /* Extra characters for compatibility with Unicode LineBreak.txt. */ + || ch == 0x0FD9 /* TIBETAN MARK LEADING MCHAN RTAGS */ + || ch == 0x0FDA /* TIBETAN MARK TRAILING MCHAN RTAGS */) + attr |= (int64_t) 1 << LBP_GL; + + /* space */ + if (ch == 0x0020 /* SPACE */) + attr |= (int64_t) 1 << LBP_SP; + + /* break opportunity before and after */ + if (ch == 0x2014 /* EM DASH */) + attr |= (int64_t) 1 << LBP_B2; + + /* break opportunity after */ + if (/* Breaking Spaces */ + 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 */ + /* Tabs */ + || ch == 0x0009 /* tab */ + /* Conditional Hyphens */ + || ch == 0x00AD /* SOFT HYPHEN */ + /* Breaking Hyphens */ + || ch == 0x058A /* ARMENIAN HYPHEN */ + || ch == 0x1400 /* CANADIAN SYLLABICS HYPHEN */ + || ch == 0x2010 /* HYPHEN */ + || ch == 0x2012 /* FIGURE DASH */ + || ch == 0x2013 /* EN DASH */ + /* Visible Word Dividers */ + || 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 */ + /* Historic Word Separators */ + || 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 == 0x2E31 /* WORD SEPARATOR MIDDLE DOT */ + || 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 */ + /* Dandas */ + || 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 */ + /* Tibetan */ + || 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 */ + /* Other Terminating Punctuation */ + || ch == 0x1804 /* MONGOLIAN COLON */ + || ch == 0x1805 /* MONGOLIAN FOUR DOTS */ + || ch == 0x1B5A /* BALINESE PANTI */ + || ch == 0x1B5B /* BALINESE PAMADA */ + || 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 == 0x2D70 /* TIFINAGH SEPARATOR MARK */ + || ch == 0xA4FE /* LISU PUNCTUATION COMMA */ + || ch == 0xA4FF /* LISU PUNCTUATION FULL STOP */ + || ch == 0xA6F3 /* BAMUM FULL STOP */ + || ch == 0xA6F4 /* BAMUM COLON */ + || ch == 0xA6F5 /* BAMUM COMMA */ + || ch == 0xA6F6 /* BAMUM SEMICOLON */ + || ch == 0xA6F7 /* BAMUM QUESTION MARK */ + || ch == 0xA9C7 /* JAVANESE PADA PANGKAT */ + || ch == 0xA9C8 /* JAVANESE PADA LINGSA */ + || ch == 0xA9C9 /* JAVANESE PADA LUNGSI */ + || ch == 0xABEB /* MEETEI MAYEK CHEIKHEI */ + || ch == 0x10857 /* IMPERIAL ARAMAIC SECTION SIGN */ + || ch == 0x10B39 /* AVESTAN ABBREVIATION MARK */ + || ch == 0x10B3A /* TINY TWO DOTS OVER ONE DOT PUNCTUATION */ + || ch == 0x10B3B /* SMALL TWO DOTS OVER ONE DOT PUNCTUATION */ + || ch == 0x10B3C /* LARGE TWO DOTS OVER ONE DOT PUNCTUATION */ + || ch == 0x10B3D /* LARGE ONE DOT OVER TWO DOTS PUNCTUATION */ + || ch == 0x10B3E /* LARGE TWO RINGS OVER ONE RING PUNCTUATION */ + || ch == 0x10B3F /* LARGE ONE RING OVER TWO RINGS PUNCTUATION */ + || ch == 0x11047 /* BRAHMI DANDA */ + || ch == 0x11048 /* BRAHMI DOUBLE DANDA */ + || ch == 0x110BE /* KAITHI SECTION MARK */ + || ch == 0x110BF /* KAITHI DOUBLE SECTION MARK */ + || ch == 0x110C0 /* KAITHI DANDA */ + || ch == 0x110C1 /* KAITHI DOUBLE DANDA */ + || ch == 0x12471 /* CUNEIFORM PUNCTUATION SIGN VERTICAL COLON */ + || ch == 0x12472 /* CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON */ + || ch == 0x12473 /* CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON */) + attr |= (int64_t) 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 |= (int64_t) 1 << LBP_BB; + + /* hyphen */ + if (ch == 0x002D /* HYPHEN-MINUS */) + attr |= (int64_t) 1 << LBP_HY; + + /* contingent break opportunity */ + if (ch == 0xFFFC /* OBJECT REPLACEMENT CHARACTER */) + attr |= (int64_t) 1 << LBP_CB; + + /* closing parenthesis */ + if (ch == 0x0029 /* RIGHT PARENTHESIS */ + || ch == 0x005D /* RIGHT SQUARE BRACKET */) + attr |= (int64_t) 1 << LBP_CP; + + /* closing punctuation */ + if ((unicode_attributes[ch].category[0] == 'P' + && unicode_attributes[ch].category[1] == 'e' + && !(attr & ((int64_t) 1 << LBP_CP))) + || 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 */ + /* Extra characters for compatibility with Unicode LineBreak.txt. */ + || ch == 0x1325B /* EGYPTIAN HIEROGLYPH O006D */ + || ch == 0x1325C /* EGYPTIAN HIEROGLYPH O006E */ + || ch == 0x1325D /* EGYPTIAN HIEROGLYPH O006F */ + || ch == 0x13282 /* EGYPTIAN HIEROGLYPH O033A */ + || ch == 0x13287 /* EGYPTIAN HIEROGLYPH O036B */ + || ch == 0x13289 /* EGYPTIAN HIEROGLYPH O036D */ + || ch == 0x1337A /* EGYPTIAN HIEROGLYPH V011B */ + || ch == 0x1337B /* EGYPTIAN HIEROGLYPH V011C */) + attr |= (int64_t) 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 */ + || 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 |= (int64_t) 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 |= (int64_t) 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 |= (int64_t) 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 */ + /* Extra characters for compatibility with Unicode LineBreak.txt. */ + || ch == 0x13258 /* EGYPTIAN HIEROGLYPH O006A */ + || ch == 0x13259 /* EGYPTIAN HIEROGLYPH O006B */ + || ch == 0x1325A /* EGYPTIAN HIEROGLYPH O006C */ + || ch == 0x13286 /* EGYPTIAN HIEROGLYPH O036A */ + || ch == 0x13288 /* EGYPTIAN HIEROGLYPH O036C */ + || ch == 0x13379 /* EGYPTIAN HIEROGLYPH V011A */) + attr |= (int64_t) 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 |= (int64_t) 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 |= (int64_t) 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 |= (int64_t) 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 == 0x09F2 /* BENGALI RUPEE MARK */ + || ch == 0x09F3 /* BENGALI RUPEE SIGN */ + || ch == 0x09F9 /* BENGALI CURRENCY DENOMINATOR SIXTEEN */ + || ch == 0x0D79 /* MALAYALAM DATE MARK */ + || ch == 0x20B6 /* LIVRE TOURNOIS SIGN */ + || ch == 0xA838 /* NORTH INDIC RUPEE MARK */) + attr |= (int64_t) 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 & ((int64_t) 1 << LBP_PO))) + attr |= (int64_t) 1 << LBP_PR; + + /* symbols allowing breaks */ + if (ch == 0x002F /* SOLIDUS */) + attr |= (int64_t) 1 << LBP_SY; + + if (ch >= 0xAC00 && ch <= 0xD7A3 && ((ch - 0xAC00) % 28) == 0) + attr |= (int64_t) 1 << LBP_H2; + + if (ch >= 0xAC00 && ch <= 0xD7A3 && ((ch - 0xAC00) % 28) != 0) + attr |= (int64_t) 1 << LBP_H3; + + if ((ch >= 0x1100 && ch <= 0x115F) || (ch >= 0xA960 && ch <= 0xA97C)) + attr |= (int64_t) 1 << LBP_JL; + + if ((ch >= 0x1160 && ch <= 0x11A7) || (ch >= 0xD7B0 && ch <= 0xD7C6)) + attr |= (int64_t) 1 << LBP_JV; + + if ((ch >= 0x11A8 && ch <= 0x11FF) || (ch >= 0xD7CB && ch <= 0xD7FB)) + attr |= (int64_t) 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') + && ch != 0x1A7F /* TAI THAM COMBINING CRYPTOGRAMMIC DOT */) + /* Extra characters for compatibility with Unicode LineBreak.txt. */ + || ch == 0x109E /* MYANMAR SYMBOL SHAN ONE */ + || ch == 0x109F /* MYANMAR SYMBOL SHAN EXCLAMATION */ + || ch == 0x19DA /* NEW TAI LUE THAM DIGIT ONE */ + || ch == 0x19DE /* NEW TAI LUE SIGN LAE */ + || ch == 0x19DF /* NEW TAI LUE SIGN LAEV */ + || (ch >= 0x1AA0 && ch <= 0x1AAD) /* TAI THAM SIGN */ + || (ch >= 0xAA77 && ch <= 0xAA79) /* MYANMAR SYMBOL AITON */ + || (ch >= 0xAADE && ch <= 0xAADF) /* TAI VIET SYMBOL */) + && ((ch >= 0x0E00 && ch <= 0x0EFF) /* Thai, Lao */ + || (ch >= 0x1000 && ch <= 0x109F) /* Myanmar */ + || (ch >= 0x1780 && ch <= 0x17FF) /* Khmer */ + || (ch >= 0x1950 && ch <= 0x19DF) /* Tai Le, New Tai Lue */ + || (ch >= 0x1A20 && ch <= 0x1AAF) /* Tai Tham */ + || (ch >= 0xAA60 && ch <= 0xAADF) /* Myanmar Extended-A, Tai Viet */)) + attr |= (int64_t) 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') + && ch != 0x110BD /* KAITHI NUMBER SIGN */)) + if (!(attr & (((int64_t) 1 << LBP_BK) | ((int64_t) 1 << LBP_BA) | ((int64_t) 1 << LBP_GL) | ((int64_t) 1 << LBP_SA) | ((int64_t) 1 << LBP_WJ) | ((int64_t) 1 << LBP_ZW)))) + attr |= (int64_t) 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 <= 0x4DBF) /* CJK Ideograph Extension A */ + || (ch >= 0x4E00 && ch <= 0x9FFF) /* 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 & (((int64_t) 1 << LBP_CM) | ((int64_t) 1 << LBP_NS) | ((int64_t) 1 << LBP_OP) | ((int64_t) 1 << LBP_CL) | ((int64_t) 1 << LBP_CP)))) + /* 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 */ + /* Extra characters for compatibility with Unicode LineBreak.txt. */ + || (ch >= 0x1B000 && ch <= 0x1B001) /* Kana Supplement */ + || (ch >= 0x1F200 && ch <= 0x1F248) /* Enclosed Ideographic Supplement */ + || (ch >= 0x1F250 && ch <= 0x1F251) /* Enclosed Ideographic Supplement */ + || (ch >= 0x2A700 && ch <= 0x2B734) /* CJK Ideograph Extension C */ + || (ch >= 0x2B740 && ch <= 0x2B81D) /* CJK Ideograph Extension D */) + if (!(attr & (((int64_t) 1 << LBP_NS) | ((int64_t) 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 |= (int64_t) 1 << LBP_AI; + else + attr |= (int64_t) 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 */ + /* Extra characters for compatibility with Unicode LineBreak.txt. */ + || ch == 0x110BD /* KAITHI NUMBER SIGN */) + if (!(attr & (((int64_t) 1 << LBP_GL) | ((int64_t) 1 << LBP_B2) | ((int64_t) 1 << LBP_BA) | ((int64_t) 1 << LBP_BB) | ((int64_t) 1 << LBP_HY) | ((int64_t) 1 << LBP_CB) | ((int64_t) 1 << LBP_CL) | ((int64_t) 1 << LBP_CP) | ((int64_t) 1 << LBP_EX) | ((int64_t) 1 << LBP_IN) | ((int64_t) 1 << LBP_NS) | ((int64_t) 1 << LBP_OP) | ((int64_t) 1 << LBP_QU) | ((int64_t) 1 << LBP_IS) | ((int64_t) 1 << LBP_NU) | ((int64_t) 1 << LBP_PO) | ((int64_t) 1 << LBP_PR) | ((int64_t) 1 << LBP_SY) | ((int64_t) 1 << LBP_H2) | ((int64_t) 1 << LBP_H3) | ((int64_t) 1 << LBP_JL) | ((int64_t) 1 << LBP_JV) | ((int64_t) 1 << LBP_JT) | ((int64_t) 1 << LBP_SA) | ((int64_t) 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 */) + || 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 == 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 */ + || 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 |= (int64_t) 1 << LBP_AI; + else + attr |= (int64_t) 1 << LBP_AL; + attr &= ~((int64_t) 1 << LBP_CM); + } + } + else + { + /* Unassigned character. */ + if ((ch >= 0x3400 && ch <= 0x4DBF) /* CJK Unified Ideographs Extension A */ + || (ch >= 0x4E00 && ch <= 0x9FFF) /* CJK Unified Ideographs */ + || (ch >= 0xF900 && ch <= 0xFAFF) /* CJK Compatibility Ideographs */ + || (ch >= 0x20000 && ch <= 0x2A6FF) /* CJK Unified Ideographs Extension B */ + || (ch >= 0x2A700 && ch <= 0x2F7FF) /* CJK Unified Ideographs Extension C, + Supplementary Ideographic Plane (Plane 2) outside of blocks */ + || (ch >= 0x2F800 && ch <= 0x2FFFD) /* CJK Compatibility Ideographs Supplement, + Supplementary Ideographic Plane (Plane 2) outside of blocks */ + || (ch >= 0x30000 && ch <= 0x3FFFD) /* Tertiary Ideographic Plane (Plane 3) outside of blocks */) + attr |= (int64_t) 1 << LBP_ID; + } + + if (attr == 0) + /* unknown */ + attr |= (int64_t) 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++) + { + int64_t attr = get_lbp (i); + if (attr != (int64_t) 1 << LBP_XX) + { + fprintf (stream, "0x%04X", i); +#define PRINT_BIT(attr,bit) \ + if (attr & ((int64_t) 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_CP); + 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_CP) + 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_CP); + 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++) + { + int64_t attr = get_lbp (i); + + /* Now attr should contain exactly one bit. */ + if (attr == 0 || ((attr & (attr - 1)) != 0)) + abort (); + + if (attr != (int64_t) 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_CP); + 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-uni-tables.c 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 . */\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. + Updated for Unicode TR #29 revision 17. */ + +/* 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 != 0x200B && 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 (is_WBP_MIDNUMLET (ch)) + attr |= 1 << WBP_MIDNUMLET; + + if (is_WBP_MIDLETTER (ch)) + 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.c 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 . */\n"); + fprintf (stream, "\n"); + + output_wbp (stream); + + if (ferror (stream) || fclose (stream)) + { + fprintf (stderr, "error writing to '%s'\n", filename); + exit (1); + } +} + +/* ========================================================================= */ + +/* Grapheme break property. + Updated for Unicode TR #29 revision 17. */ + +/* Possible values of the Grapheme_Cluster_Break property. */ +enum +{ + GBP_OTHER = 0, + GBP_CR = 1, + GBP_LF = 2, + GBP_CONTROL = 3, + GBP_EXTEND = 4, + GBP_PREPEND = 5, + GBP_SPACINGMARK = 6, + GBP_L = 7, + GBP_V = 8, + GBP_T = 9, + GBP_LV = 10, + GBP_LVT = 11 +}; + +/* Construction of sparse 3-level tables. */ +#define TABLE gbp_table +#define ELEMENT unsigned char +#define DEFAULT GBP_OTHER +#define xmalloc malloc +#define xrealloc realloc +#include "3level.h" + +/* The grapheme break property from the GraphemeBreakProperty.txt file. */ +int unicode_org_gbp[0x110000]; + +/* Output the unit test data for the grapheme break property. */ +static void +output_gbp_test (const char *filename) +{ + 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 grapheme break property functions.\n"); + fprintf (stream, " Copyright (C) 2010 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 . */\n"); + fprintf (stream, "\n"); + + need_comma = false; + for (ch = 0; ch < 0x110000; ch++) + { + int gbp = unicode_org_gbp[ch]; + const char *gbp_string; + + while (ch + 1 < 0x110000 && unicode_org_gbp[ch + 1] == gbp) + ch++; + + switch (gbp) + { +#define CASE(x) case x: gbp_string = #x; break; + CASE (GBP_OTHER) + CASE (GBP_CR) + CASE (GBP_LF) + CASE (GBP_CONTROL) + CASE (GBP_EXTEND) + CASE (GBP_PREPEND) + CASE (GBP_SPACINGMARK) + CASE (GBP_L) + CASE (GBP_V) + CASE (GBP_T) + CASE (GBP_LV) + CASE (GBP_LVT) +#undef CASE + default: + abort (); + } + + if (need_comma) + fprintf (stream, ",\n"); + fprintf (stream, "{ 0x%04X, %s }", ch + 1, gbp_string); + + need_comma = true; + } + fprintf (stream, "\n"); + + if (ferror (stream) || fclose (stream)) + { + fprintf (stderr, "error writing to '%s'\n", filename); + exit (1); + } +} + +/* Output the per-character grapheme break property table. */ +static void +output_gbp_table (const char *filename, const char *version) +{ + FILE *stream; + unsigned int ch, i; + struct gbp_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, "/* Grapheme break property of Unicode characters. */\n"); + fprintf (stream, "/* Generated automatically by gen-uni-tables.c for Unicode %s. */\n", + version); + + t.p = 7; + t.q = 9; + gbp_table_init (&t); + + for (ch = 0; ch < 0x110000; ch++) + gbp_table_add (&t, ch, unicode_org_gbp[ch]); + + gbp_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 gbrkprop_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) / 2];\n", + t.level3_size, t.p); + fprintf (stream, " }\n"); + fprintf (stream, "unigbrkprop =\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) / 2); + 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) / 2; i++) + { + unsigned char *p = (unsigned char *) (t.result + level3_offset); + unsigned char value0 = p[i * 2]; + unsigned char value1 = p[i * 2 + 1]; + if (i > 0 && (i % 8) == 0) + fprintf (stream, "\n "); + fprintf (stream, " 0x%02x%s", (value1 << 4) + value0, + (i+1 < (t.level3_size << t.p) / 2 ? "," : "")); + } + 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); + } +} + +/* Stores in unicode_org_gbp[] the grapheme breaking property from the + GraphemeBreakProperty.txt file. */ +static void +fill_org_gbp (const char *graphemebreakproperty_filename) +{ + unsigned int i; + FILE *stream; + int lineno = 0; + + for (i = 0; i < 0x110000; i++) + unicode_org_gbp[i] = GBP_OTHER; + + stream = fopen (graphemebreakproperty_filename, "r"); + if (stream == NULL) + { + fprintf (stderr, "error during fopen of '%s'\n", + graphemebreakproperty_filename); + exit (1); + } + + for (;;) + { + char buf[200+1]; + unsigned int i1, i2; + char padding[200+1]; + char propname[200+1]; + int propvalue; + + lineno++; + 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", + graphemebreakproperty_filename); + exit (1); + } + i2 = i1; + } +#define PROP(name,value) \ + if (strcmp (propname, name) == 0) propvalue = value; else + PROP ("CR", GBP_CR) + PROP ("LF", GBP_LF) + PROP ("Control", GBP_CONTROL) + PROP ("Extend", GBP_EXTEND) + PROP ("Prepend", GBP_PREPEND) + PROP ("SpacingMark", GBP_SPACINGMARK) + PROP ("L", GBP_L) + PROP ("V", GBP_V) + PROP ("T", GBP_T) + PROP ("LV", GBP_LV) + PROP ("LVT", GBP_LVT) +#undef PROP + { + fprintf (stderr, "unknown property value '%s' in %s:%d\n", propname, + graphemebreakproperty_filename, lineno); + exit (1); + } + if (!(i1 <= i2 && i2 < 0x110000)) + abort (); + + for (i = i1; i <= i2; i++) + unicode_org_gbp[i] = propvalue; + } + + if (ferror (stream) || fclose (stream)) + { + fprintf (stderr, "error reading from '%s'\n", graphemebreakproperty_filename); + exit (1); + } +} + +/* ========================================================================= */ + +/* Composition and decomposition. + Updated for Unicode TR #15 revision 33. */ + +/* 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, /* A font variant (e.g. a blackletter form). */ + UC_DECOMP_NOBREAK, /* A no-break version of a space or hyphen. */ + UC_DECOMP_INITIAL, /* An initial presentation form (Arabic). */ + UC_DECOMP_MEDIAL, /* A medial presentation form (Arabic). */ + UC_DECOMP_FINAL, /* A final presentation form (Arabic). */ + UC_DECOMP_ISOLATED,/* An isolated presentation form (Arabic). */ + UC_DECOMP_CIRCLE, /* An encircled form. */ + UC_DECOMP_SUPER, /* A superscript form. */ + UC_DECOMP_SUB, /* A subscript form. */ + UC_DECOMP_VERTICAL,/* A vertical layout presentation form. */ + UC_DECOMP_WIDE, /* A wide (or zenkaku) compatibility character. */ + UC_DECOMP_NARROW, /* A narrow (or hankaku) compatibility character. */ + UC_DECOMP_SMALL, /* A small variant form (CNS compatibility). */ + UC_DECOMP_SQUARE, /* A CJK squared font variant. */ + UC_DECOMP_FRACTION,/* A vulgar fraction form. */ + UC_DECOMP_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 ("", UC_DECOMP_FONT) + TYPE ("", UC_DECOMP_NOBREAK) + TYPE ("", UC_DECOMP_INITIAL) + TYPE ("", UC_DECOMP_MEDIAL) + TYPE ("", UC_DECOMP_FINAL) + TYPE ("", UC_DECOMP_ISOLATED) + TYPE ("", UC_DECOMP_CIRCLE) + TYPE ("", UC_DECOMP_SUPER) + TYPE ("", UC_DECOMP_SUB) + TYPE ("", UC_DECOMP_VERTICAL) + TYPE ("", UC_DECOMP_WIDE) + TYPE ("", UC_DECOMP_NARROW) + TYPE ("", UC_DECOMP_SMALL) + TYPE ("", UC_DECOMP_SQUARE) + TYPE ("", UC_DECOMP_FRACTION) + TYPE ("", 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.c 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 . */\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[6]; };\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 (); + + fprintf (stream, "\"\\x%02x\\x%02x\\x%02x\\x%02x\\x%02x\\x%02x\", 0x%04x\n", + (code1 >> 16) & 0xff, (code1 >> 8) & 0xff, code1 & 0xff, + (code2 >> 16) & 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 . */\n"); + fprintf (stream, "\n"); + fprintf (stream, "/* Generated automatically by gen-uni-tables.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-uni-tables.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 + 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 *arabicshaping_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 *graphemebreakproperty_filename; + const char *compositionexclusions_filename; + const char *specialcasing_filename; + const char *casefolding_filename; + const char *version; + + if (argc != 16) + { + fprintf (stderr, "Usage: %s UnicodeData.txt PropList.txt DerivedCoreProperties.txt ArabicShaping.txt Scripts.txt Blocks.txt PropList-3.0.1.txt EastAsianWidth.txt LineBreak.txt WordBreakProperty.txt GraphemeBreakProperty.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]; + arabicshaping_filename = argv[4]; + scripts_filename = argv[5]; + blocks_filename = argv[6]; + proplist30_filename = argv[7]; + eastasianwidth_filename = argv[8]; + linebreak_filename = argv[9]; + wordbreakproperty_filename = argv[10]; + graphemebreakproperty_filename = argv[11]; + compositionexclusions_filename = argv[12]; + specialcasing_filename = argv[13]; + casefolding_filename = argv[14]; + version = argv[15]; + + fill_attributes (unicodedata_filename); + clear_properties (); + fill_properties (proplist_filename); + fill_properties (derivedproplist_filename); + fill_properties30 (proplist30_filename); + fill_arabicshaping (arabicshaping_filename); + fill_scripts (scripts_filename); + fill_blocks (blocks_filename); + fill_width (eastasianwidth_filename); + fill_org_lbp (linebreak_filename); + fill_org_wbp (wordbreakproperty_filename); + fill_org_gbp (graphemebreakproperty_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/combiningclass.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_joining_type_test ("../tests/unictype/test-joiningtype_of.h", version); + output_joining_type ("unictype/joiningtype_of.h", version); + output_joining_group_test ("../tests/unictype/test-joininggroup_of.h", version); + output_joining_group ("unictype/joininggroup_of.h", version); + + output_scripts (version); + output_scripts_byname (version); + output_blocks (version); + output_ident_properties (version); + output_nonspacing_property ("uniwidth/width.c.part"); + output_width_property_test ("../tests/uniwidth/test-uc_width2.sh.part"); + 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_gbp_test ("../tests/unigbrk/test-uc-gbrk-prop.h"); + output_gbp_table ("unigbrk/gbrkprop.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/6.0.0/ucd/UnicodeData.txt \ + /gfs/petix/Volumes/ExtData/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/6.0.0/ucd/PropList.txt \ + /gfs/petix/Volumes/ExtData/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/6.0.0/ucd/DerivedCoreProperties.txt \ + /gfs/petix/Volumes/ExtData/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/6.0.0/ucd/ArabicShaping.txt \ + /gfs/petix/Volumes/ExtData/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/6.0.0/ucd/Scripts.txt \ + /gfs/petix/Volumes/ExtData/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/6.0.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/6.0.0/ucd/EastAsianWidth.txt \ + /gfs/petix/Volumes/ExtData/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/6.0.0/ucd/LineBreak.txt \ + /gfs/petix/Volumes/ExtData/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/6.0.0/ucd/auxiliary/WordBreakProperty.txt \ + /gfs/petix/Volumes/ExtData/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/6.0.0/ucd/auxiliary/GraphemeBreakProperty.txt \ + /gfs/petix/Volumes/ExtData/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/6.0.0/ucd/CompositionExclusions.txt \ + /gfs/petix/Volumes/ExtData/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/6.0.0/ucd/SpecialCasing.txt \ + /gfs/petix/Volumes/ExtData/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/6.0.0/ucd/CaseFolding.txt \ + 6.0.0 \ + && diff unilbrk/lbrkprop_org.txt unilbrk/lbrkprop.txt \ + && diff uniwbrk/wbrkprop_org.txt uniwbrk/wbrkprop.txt + " + * End: + */ diff --git a/gnulib/lib/get-rusage-as.c b/gnulib/lib/get-rusage-as.c new file mode 100644 index 0000000..5567f95 --- /dev/null +++ b/gnulib/lib/get-rusage-as.c @@ -0,0 +1,402 @@ +/* Getter for RLIMIT_AS. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "resource-ext.h" + +/* The "address space size" is defined as the total size of the virtual memory + areas of the current process. This includes + - areas belonging to the executable and shared libraries, + - areas allocated by malloc() or mmap(), + - the stack and environment areas, + - gaps and guard pages (mappings with PROT_NONE), + - other system dependent areas, such as vsyscall or vdso on Linux. + + There are two ways of retrieving the current address space size: + a) by trying setrlimit with various values and observing whether the + kernel allows additional mmap calls, + b) by using system dependent APIs that allow to iterate over the list + of virtual memory areas. + We don't use the mincore() based approach here, because it would be very + slow when applied to an entire address space, especially on 64-bit + platforms. + We define two functions + get_rusage_as_via_setrlimit(), + get_rusage_as_via_iterator(). + + Discussion per platform: + + Linux: + a) setrlimit with RLIMIT_AS works. + b) The /proc/self/maps file contains a list of the virtual memory areas. + Both methods agree, except that on x86_64 systems, the value of + get_rusage_as_via_iterator() is 4 KB higher than + get_rusage_as_via_setrlimit(). + + MacOS X: + a) setrlimit with RLIMIT_AS succeeds but does not really work: The OS + ignores RLIMIT_AS. mmap() of a page always succeeds, therefore + get_rusage_as_via_setrlimit() is always 0. + b) The Mach based API works. + + FreeBSD: + a) setrlimit with RLIMIT_AS works. + b) The /proc/self/maps file contains a list of the virtual memory areas. + + NetBSD: + a) setrlimit with RLIMIT_AS works. + b) The /proc/self/maps file contains a list of the virtual memory areas. + Both methods agree, + + OpenBSD: + a) setrlimit exists, but RLIMIT_AS is not defined. + b) mquery() can be used to find out about the virtual memory areas. + + AIX: + a) setrlimit with RLIMIT_AS succeeds but does not really work: The OS + apparently ignores RLIMIT_AS. mmap() of a page always succeeds, + therefore get_rusage_as_via_setrlimit() is always 0. + b) No VMA iteration API exists. + + HP-UX: + a) setrlimit with RLIMIT_AS works. + b) No VMA iteration API exists. + + IRIX: + a) setrlimit with RLIMIT_AS works. + b) The /proc/$pid file supports ioctls PIOCNMAP and PIOCMAP. + Both methods agree, + + OSF/1: + a) setrlimit with RLIMIT_AS works. + b) The /proc/$pid file supports ioctls PIOCNMAP and PIOCMAP. + The value returned by get_rusage_as_via_setrlimit() is 64 KB higher than + get_rusage_as_via_iterator(). It's not clear why. + + Solaris: + a) setrlimit with RLIMIT_AS works. + b) No VMA iteration API exists. + + Cygwin: + a) setrlimit with RLIMIT_AS always fails when the limit is < 0x80000000. + get_rusage_as_via_setrlimit() therefore produces a wrong value. + b) The /proc/$pid/maps file lists only the memory areas belonging to + the executable and shared libraries, not the anonymous memory. + But the native Win32 API works. + + mingw: + a) There is no setrlimit function. + b) The native Win32 API works. + + BeOS, Haiku: + a) On BeOS, there is no setrlimit function. + On Haiku, setrlimit exists. RLIMIT_AS is defined but unsupported. + b) There is a specific BeOS API: get_next_area_info(). + */ + + +#include /* errno */ +#include /* size_t, abort */ +#include /* open, O_RDONLY */ +#include /* getpagesize, read, close */ + + +/* System support for get_rusage_as_via_setrlimit(). */ + +#if HAVE_SETRLIMIT +# include +# include /* getrlimit, setrlimit */ +#endif + +/* 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 +# include +# include /* mmap, munmap */ +/* Define MAP_FILE when it isn't otherwise. */ +# ifndef MAP_FILE +# define MAP_FILE 0 +# endif +#endif + + +/* System support for get_rusage_as_via_iterator(). */ + +#include "vma-iter.h" + + +#if HAVE_SETRLIMIT && defined RLIMIT_AS && HAVE_SYS_MMAN_H && HAVE_MPROTECT + +static inline uintptr_t +get_rusage_as_via_setrlimit (void) +{ + uintptr_t result; + + struct rlimit orig_limit; + +# 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) + return 0; +# endif + + /* Record the original limit. */ + if (getrlimit (RLIMIT_AS, &orig_limit) < 0) + { + result = 0; + goto done2; + } + + if (orig_limit.rlim_max != RLIM_INFINITY + && (orig_limit.rlim_cur == RLIM_INFINITY + || orig_limit.rlim_cur > orig_limit.rlim_max)) + /* We may not be able to restore the current rlim_cur value. + So bail out. */ + { + result = 0; + goto done2; + } + + { + /* The granularity is a single page. */ + const size_t pagesize = getpagesize (); + + uintptr_t low_bound = 0; + uintptr_t high_bound; + + for (;;) + { + /* Here we know that the address space size is >= low_bound. */ + struct rlimit try_limit; + uintptr_t try_next = 2 * low_bound + pagesize; + + if (try_next < low_bound) + /* Overflow. */ + try_next = ((uintptr_t) (~ 0) / pagesize) * pagesize; + + /* There's no point in trying a value > orig_limit.rlim_max, as + setrlimit would fail anyway. */ + if (orig_limit.rlim_max != RLIM_INFINITY + && orig_limit.rlim_max < try_next) + try_next = orig_limit.rlim_max; + + /* Avoid endless loop. */ + if (try_next == low_bound) + { + /* try_next could not be increased. */ + result = low_bound; + goto done1; + } + + try_limit.rlim_max = orig_limit.rlim_max; + try_limit.rlim_cur = try_next; + if (setrlimit (RLIMIT_AS, &try_limit) == 0) + { + /* Allocate a page of memory, to compare the current address space + size with try_limit.rlim_cur. */ + void *new_page = + mmap (NULL, pagesize, PROT_READ | PROT_WRITE, flags, fd, 0); + + if (new_page != (void *)(-1)) + { + /* The page could be added successfully. Free it. */ + if (munmap (new_page, pagesize) < 0) + abort (); + /* We know that the address space size is + < try_limit.rlim_cur. */ + high_bound = try_next; + break; + } + else + { + /* We know that the address space size is + >= try_limit.rlim_cur. */ + low_bound = try_next; + } + } + else + { + /* Here we expect only EINVAL, not EPERM. */ + if (errno != EINVAL) + abort (); + /* We know that the address space size is + >= try_limit.rlim_cur. */ + low_bound = try_next; + } + } + + /* Here we know that the address space size is + >= low_bound and < high_bound. */ + while (high_bound - low_bound > pagesize) + { + struct rlimit try_limit; + uintptr_t try_next = + low_bound + (((high_bound - low_bound) / 2) / pagesize) * pagesize; + + /* Here low_bound <= try_next < high_bound. */ + try_limit.rlim_max = orig_limit.rlim_max; + try_limit.rlim_cur = try_next; + if (setrlimit (RLIMIT_AS, &try_limit) == 0) + { + /* Allocate a page of memory, to compare the current address space + size with try_limit.rlim_cur. */ + void *new_page = + mmap (NULL, pagesize, PROT_READ | PROT_WRITE, flags, fd, 0); + + if (new_page != (void *)(-1)) + { + /* The page could be added successfully. Free it. */ + if (munmap (new_page, pagesize) < 0) + abort (); + /* We know that the address space size is + < try_limit.rlim_cur. */ + high_bound = try_next; + } + else + { + /* We know that the address space size is + >= try_limit.rlim_cur. */ + low_bound = try_next; + } + } + else + { + /* Here we expect only EINVAL, not EPERM. */ + if (errno != EINVAL) + abort (); + /* We know that the address space size is + >= try_limit.rlim_cur. */ + low_bound = try_next; + } + } + + result = low_bound; + } + + done1: + /* Restore the original rlim_cur value. */ + if (setrlimit (RLIMIT_AS, &orig_limit) < 0) + abort (); + + done2: +# if !HAVE_MAP_ANONYMOUS + close (fd); +# endif + return result; +} + +#else + +static inline uintptr_t +get_rusage_as_via_setrlimit (void) +{ + return 0; +} + +#endif + + +#if VMA_ITERATE_SUPPORTED + +static int +vma_iterate_callback (void *data, uintptr_t start, uintptr_t end, + unsigned int flags) +{ + uintptr_t *totalp = (uintptr_t *) data; + + *totalp += end - start; + return 0; +} + +static inline uintptr_t +get_rusage_as_via_iterator (void) +{ + uintptr_t total = 0; + + vma_iterate (vma_iterate_callback, &total); + + return total; +} + +#else + +static inline uintptr_t +get_rusage_as_via_iterator (void) +{ + return 0; +} + +#endif + + +uintptr_t +get_rusage_as (void) +{ +#if (defined __APPLE__ && defined __MACH__) || defined _AIX || defined __CYGWIN__ /* MacOS X, AIX, Cygwin */ + /* get_rusage_as_via_setrlimit() does not work. + Prefer get_rusage_as_via_iterator(). */ + return get_rusage_as_via_iterator (); +#elif HAVE_SETRLIMIT && defined RLIMIT_AS && HAVE_SYS_MMAN_H && HAVE_MPROTECT + /* Prefer get_rusage_as_via_setrlimit() if it succeeds, + because the caller may want to use the result with setrlimit(). */ + uintptr_t result; + + result = get_rusage_as_via_setrlimit (); + if (result == 0) + result = get_rusage_as_via_iterator (); + return result; +#else + return get_rusage_as_via_iterator (); +#endif +} + + +#ifdef TEST + +#include + +int +main () +{ + printf ("Initially: 0x%08lX 0x%08lX 0x%08lX\n", + get_rusage_as_via_setrlimit (), get_rusage_as_via_iterator (), + get_rusage_as ()); + malloc (0x88); + printf ("After small malloc: 0x%08lX 0x%08lX 0x%08lX\n", + get_rusage_as_via_setrlimit (), get_rusage_as_via_iterator (), + get_rusage_as ()); + malloc (0x8812); + printf ("After medium malloc: 0x%08lX 0x%08lX 0x%08lX\n", + get_rusage_as_via_setrlimit (), get_rusage_as_via_iterator (), + get_rusage_as ()); + malloc (0x281237); + printf ("After large malloc: 0x%08lX 0x%08lX 0x%08lX\n", + get_rusage_as_via_setrlimit (), get_rusage_as_via_iterator (), + get_rusage_as ()); + return 0; +} + +#endif /* TEST */ diff --git a/gnulib/lib/get-rusage-data.c b/gnulib/lib/get-rusage-data.c new file mode 100644 index 0000000..1b9214b --- /dev/null +++ b/gnulib/lib/get-rusage-data.c @@ -0,0 +1,436 @@ +/* Getter for RLIMIT_DATA. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "resource-ext.h" + +/* The "data segment size" is defined as the virtual memory area of the + current process that contains malloc()ed memory. + + There are two ways of retrieving the current data segment size: + a) by trying setrlimit with various values and observing whether the + kernel allows additional sbrk() calls, + b) by using system dependent APIs that allow to iterate over the list + of virtual memory areas. + We define two functions + get_rusage_data_via_setrlimit(), + get_rusage_data_via_iterator(). + + The variant + a') by trying setrlimit with various values and observing whether + additional malloc() calls succeed + is not as good as a), because a malloc() call can be served by already + allocated memory or through mmap(), and because a malloc() of 1 page may + require 2 pages. + + Discussion per platform: + + Linux: + a) setrlimit with RLIMIT_DATA works. + b) The /proc/self/maps file contains a list of the virtual memory areas. + get_rusage_data_via_setrlimit() returns the sum of the length of the + executable's data segment plus the heap VMA (an anonymous memory area), + whereas get_rusage_data_via_iterator() returns only the latter. + Note that malloc() falls back on mmap() for large allocations and also + for small allocations if there is not enough room in the data segment. + + MacOS X: + a) setrlimit with RLIMIT_DATA succeeds but does not really work: The OS + ignores RLIMIT_DATA. Therefore get_rusage_data_via_setrlimit() is + always 0. + b) The Mach based API works. + Note that malloc() falls back on mmap() for large allocations. + + FreeBSD: + a) setrlimit with RLIMIT_DATA works. + b) The /proc/self/maps file contains a list of the virtual memory areas. + + NetBSD: + a) setrlimit with RLIMIT_DATA works. + b) The /proc/self/maps file contains a list of the virtual memory areas. + Both methods agree. + Note that malloc() uses mmap() for large allocations. + + OpenBSD: + a) setrlimit with RLIMIT_DATA works. + b) mquery() can be used to find out about the virtual memory areas. + get_rusage_data_via_setrlimit() works much better than + get_rusage_data_via_iterator(). + Note that malloc() appears to use mmap() for both large and small + allocations. + + AIX: + a) setrlimit with RLIMIT_DATA works. + b) No VMA iteration API exists. + + HP-UX: + a) setrlimit with RLIMIT_DATA works, except on HP-UX 11.00, where it + cannot restore the previous limits, and except on HP-UX 11.11, where + it sometimes has no effect. + b) No VMA iteration API exists. + + IRIX: + a) setrlimit with RLIMIT_DATA works. + b) The /proc/$pid file supports ioctls PIOCNMAP and PIOCMAP. + get_rusage_data_via_setrlimit() works slightly better than + get_rusage_data_via_iterator() before the first malloc() call. + + OSF/1: + a) setrlimit with RLIMIT_DATA works. + b) The /proc/$pid file supports ioctls PIOCNMAP and PIOCMAP. + Both methods agree. + + Solaris: + a) setrlimit with RLIMIT_DATA works. + b) No VMA iteration API exists. + + Cygwin: + a) setrlimit with RLIMIT_DATA always fails. + get_rusage_data_via_setrlimit() therefore produces a wrong value. + b) The /proc/$pid/maps file lists only the memory areas belonging to + the executable and shared libraries, not the anonymous memory. + But the native Win32 API works. + Note that malloc() apparently falls back on mmap() for large allocations. + + mingw: + a) There is no setrlimit function. + b) There is no sbrk() function. + Note that malloc() falls back on VirtualAlloc() for large allocations. + + BeOS, Haiku: + a) On BeOS, there is no setrlimit function. + On Haiku, setrlimit exists. RLIMIT_DATA is defined but unsupported: + getrlimit of RLIMIT_DATA always fails with errno = EINVAL. + b) There is a specific BeOS API: get_next_area_info(). + */ + + +#include /* errno */ +#include /* size_t, abort, malloc, free, sbrk */ +#include /* open, O_RDONLY */ +#include /* getpagesize, read, close */ + + +/* System support for get_rusage_data_via_setrlimit(). */ + +#if HAVE_SETRLIMIT +# include +# include /* getrlimit, setrlimit */ +# include +# include /* strlen, strcmp */ +#endif + + +/* System support for get_rusage_data_via_iterator(). */ + +#include "vma-iter.h" + + +#if HAVE_SETRLIMIT && defined RLIMIT_DATA + +# ifdef _AIX +# define errno_expected() (errno == EINVAL || errno == EFAULT) +# else +# define errno_expected() (errno == EINVAL) +# endif + +static inline uintptr_t +get_rusage_data_via_setrlimit (void) +{ + uintptr_t result; + + struct rlimit orig_limit; + +# ifdef __hpux + /* On HP-UX 11.00, setrlimit() RLIMIT_DATA of does not work: It cannot + restore the previous limits. + On HP-UX 11.11, setrlimit() RLIMIT_DATA of does not work: It sometimes + has no effect on the next sbrk() call. */ + { + struct utsname buf; + + if (uname (&buf) == 0 + && strlen (buf.release) >= 5 + && (strcmp (buf.release + strlen (buf.release) - 5, "11.00") == 0 + || strcmp (buf.release + strlen (buf.release) - 5, "11.11") == 0)) + return 0; + } +# endif + + /* Record the original limit. */ + if (getrlimit (RLIMIT_DATA, &orig_limit) < 0) + return 0; + + if (orig_limit.rlim_max != RLIM_INFINITY + && (orig_limit.rlim_cur == RLIM_INFINITY + || orig_limit.rlim_cur > orig_limit.rlim_max)) + /* We may not be able to restore the current rlim_cur value. + So bail out. */ + return 0; + + { + /* The granularity is a single page. */ + const intptr_t pagesize = getpagesize (); + + uintptr_t low_bound = 0; + uintptr_t high_bound; + + for (;;) + { + /* Here we know that the data segment size is >= low_bound. */ + struct rlimit try_limit; + uintptr_t try_next = 2 * low_bound + pagesize; + + if (try_next < low_bound) + /* Overflow. */ + try_next = ((uintptr_t) (~ 0) / pagesize) * pagesize; + + /* There's no point in trying a value > orig_limit.rlim_max, as + setrlimit would fail anyway. */ + if (orig_limit.rlim_max != RLIM_INFINITY + && orig_limit.rlim_max < try_next) + try_next = orig_limit.rlim_max; + + /* Avoid endless loop. */ + if (try_next == low_bound) + { + /* try_next could not be increased. */ + result = low_bound; + goto done; + } + + try_limit.rlim_max = orig_limit.rlim_max; + try_limit.rlim_cur = try_next; + if (setrlimit (RLIMIT_DATA, &try_limit) == 0) + { + /* Allocate a page of memory, to compare the current data segment + size with try_limit.rlim_cur. */ + void *new_page = sbrk (pagesize); + + if (new_page != (void *)(-1)) + { + /* The page could be added successfully. Free it. */ + sbrk (- pagesize); + /* We know that the data segment size is + < try_limit.rlim_cur. */ + high_bound = try_next; + break; + } + else + { + /* We know that the data segment size is + >= try_limit.rlim_cur. */ + low_bound = try_next; + } + } + else + { + /* Here we expect only EINVAL or (on AIX) EFAULT, not EPERM. */ + if (! errno_expected ()) + abort (); + /* We know that the data segment size is + >= try_limit.rlim_cur. */ + low_bound = try_next; + } + } + + /* Here we know that the data segment size is + >= low_bound and < high_bound. */ + while (high_bound - low_bound > pagesize) + { + struct rlimit try_limit; + uintptr_t try_next = + low_bound + (((high_bound - low_bound) / 2) / pagesize) * pagesize; + + /* Here low_bound <= try_next < high_bound. */ + try_limit.rlim_max = orig_limit.rlim_max; + try_limit.rlim_cur = try_next; + if (setrlimit (RLIMIT_DATA, &try_limit) == 0) + { + /* Allocate a page of memory, to compare the current data segment + size with try_limit.rlim_cur. */ + void *new_page = sbrk (pagesize); + + if (new_page != (void *)(-1)) + { + /* The page could be added successfully. Free it. */ + sbrk (- pagesize); + /* We know that the data segment size is + < try_limit.rlim_cur. */ + high_bound = try_next; + } + else + { + /* We know that the data segment size is + >= try_limit.rlim_cur. */ + low_bound = try_next; + } + } + else + { + /* Here we expect only EINVAL or (on AIX) EFAULT, not EPERM. */ + if (! errno_expected ()) + abort (); + /* We know that the data segment size is + >= try_limit.rlim_cur. */ + low_bound = try_next; + } + } + + result = low_bound; + } + + done: + /* Restore the original rlim_cur value. */ + if (setrlimit (RLIMIT_DATA, &orig_limit) < 0) + abort (); + + return result; +} + +#else + +static inline uintptr_t +get_rusage_data_via_setrlimit (void) +{ + return 0; +} + +#endif + + +#if VMA_ITERATE_SUPPORTED + +struct locals +{ + uintptr_t brk_value; + uintptr_t data_segment_size; +}; + +static int +vma_iterate_callback (void *data, uintptr_t start, uintptr_t end, + unsigned int flags) +{ + struct locals *lp = (struct locals *) data; + + if (start <= lp->brk_value && lp->brk_value - 1 <= end - 1) + { + lp->data_segment_size = end - start; + return 1; + } + return 0; +} + +static inline uintptr_t +get_rusage_data_via_iterator (void) +{ +# if ((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__) || defined __BEOS__ || defined __HAIKU__ + /* On mingw, there is no sbrk() function. + On Haiku, sbrk(0) always returns 0. */ + static void *brk_value; + + if (brk_value == NULL) + { + brk_value = malloc (1); + if (brk_value == NULL) + return 0; + } +# else + void *brk_value; + + brk_value = sbrk (0); + if (brk_value == (void *)-1) + return 0; +# endif + + { + struct locals l; + + l.brk_value = (uintptr_t) brk_value; + l.data_segment_size = 0; + vma_iterate (vma_iterate_callback, &l); + + return l.data_segment_size; + } +} + +#else + +static inline uintptr_t +get_rusage_data_via_iterator (void) +{ + return 0; +} + +#endif + + +uintptr_t +get_rusage_data (void) +{ +#if (defined __APPLE__ && defined __MACH__) || defined __CYGWIN__ /* MacOS X, Cygwin */ + /* get_rusage_data_via_setrlimit() does not work. + Prefer get_rusage_data_via_iterator(). */ + return get_rusage_data_via_iterator (); +#elif HAVE_SETRLIMIT && defined RLIMIT_DATA +# if defined __linux__ || defined __FreeBSD__ || defined __NetBSD__ || defined __OpenBSD__ || defined _AIX || defined __sgi || defined __osf__ || defined __sun /* Linux, FreeBSD, NetBSD, OpenBSD, AIX, IRIX, OSF/1, Solaris */ + /* get_rusage_data_via_setrlimit() works. */ + return get_rusage_data_via_setrlimit (); +# else + /* Prefer get_rusage_data_via_setrlimit() if it succeeds, + because the caller may want to use the result with setrlimit(). */ + uintptr_t result; + + result = get_rusage_data_via_setrlimit (); + if (result == 0) + result = get_rusage_data_via_iterator (); + return result; +# endif +#else + return get_rusage_data_via_iterator (); +#endif +} + + +#ifdef TEST + +#include + +int +main () +{ + printf ("Initially: 0x%08lX 0x%08lX 0x%08lX\n", + get_rusage_data_via_setrlimit (), get_rusage_data_via_iterator (), + get_rusage_data ()); + malloc (0x88); + printf ("After small malloc: 0x%08lX 0x%08lX 0x%08lX\n", + get_rusage_data_via_setrlimit (), get_rusage_data_via_iterator (), + get_rusage_data ()); + malloc (0x8812); + printf ("After medium malloc: 0x%08lX 0x%08lX 0x%08lX\n", + get_rusage_data_via_setrlimit (), get_rusage_data_via_iterator (), + get_rusage_data ()); + malloc (0x281237); + printf ("After large malloc: 0x%08lX 0x%08lX 0x%08lX\n", + get_rusage_data_via_setrlimit (), get_rusage_data_via_iterator (), + get_rusage_data ()); + return 0; +} + +#endif /* TEST */ diff --git a/gnulib/lib/getaddrinfo.c b/gnulib/lib/getaddrinfo.c new file mode 100644 index 0000000..9109d44 --- /dev/null +++ b/gnulib/lib/getaddrinfo.c @@ -0,0 +1,444 @@ +/* Get address information (partial implementation). + Copyright (C) 1997, 2001-2002, 2004-2011 Free Software Foundation, Inc. + Contributed 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 + +/* Don't use __attribute__ __nonnull__ in this compilation unit. Otherwise gcc + optimizes away the sa == NULL test below. */ +#define _GL_ARG_NONNULL(params) + +#include + +#if HAVE_NETINET_IN_H +# include +#endif + +/* Get inet_ntop. */ +#include + +/* Get calloc. */ +#include + +/* Get memcpy, strdup. */ +#include + +/* Get snprintf. */ +#include + +#include + +#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 + +/* gl_sockets_startup */ +#include "sockets.h" + +#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; + } + + gl_sockets_startup (SOCKETS_1_1); + + 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-lgpl.c b/gnulib/lib/getcwd-lgpl.c new file mode 100644 index 0000000..2761422 --- /dev/null +++ b/gnulib/lib/getcwd-lgpl.c @@ -0,0 +1,125 @@ +/* Copyright (C) 2011 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 . */ + +#include + +/* Specification */ +#include + +#include +#include + +#if GNULIB_GETCWD +/* Favor GPL getcwd.c if both getcwd and getcwd-lgpl modules are in use. */ +typedef int dummy; +#else + +/* 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 + (perhaps because the absolute name was longer than PATH_MAX, or + because of missing read/search permissions on parent directories) + or SIZE was too small. If successful, returns BUF. 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. */ + +# undef getcwd +char * +rpl_getcwd (char *buf, size_t size) +{ + char *ptr; + char *result; + + /* Handle single size operations. */ + if (buf) + { + if (!size) + { + errno = EINVAL; + return NULL; + } + return getcwd (buf, size); + } + + if (size) + { + buf = malloc (size); + if (!buf) + { + errno = ENOMEM; + return NULL; + } + result = getcwd (buf, size); + if (!result) + { + int saved_errno = errno; + free (buf); + errno = saved_errno; + } + return result; + } + + /* Flexible sizing requested. Avoid over-allocation for the common + case of a name that fits within a 4k page, minus some space for + local variables, to be sure we don't skip over a guard page. */ + { + char tmp[4032]; + size = sizeof tmp; + ptr = getcwd (tmp, size); + if (ptr) + { + result = strdup (ptr); + if (!result) + errno = ENOMEM; + return result; + } + if (errno != ERANGE) + return NULL; + } + + /* My what a large directory name we have. */ + do + { + size <<= 1; + ptr = realloc (buf, size); + if (ptr == NULL) + { + free (buf); + errno = ENOMEM; + return NULL; + } + buf = ptr; + result = getcwd (buf, size); + } + while (!result && errno == ERANGE); + + if (!result) + { + int saved_errno = errno; + free (buf); + errno = saved_errno; + } + else + { + /* Trim to fit, if possible. */ + result = realloc (buf, strlen (buf) + 1); + if (!result) + result = buf; + } + return result; +} + +#endif diff --git a/gnulib/lib/getcwd.c b/gnulib/lib/getcwd.c new file mode 100644 index 0000000..9b8171c --- /dev/null +++ b/gnulib/lib/getcwd.c @@ -0,0 +1,442 @@ +/* Copyright (C) 1991-1999, 2004-2011 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 . */ + +#if !_LIBC +# include +# include +#endif + +#include +#include +#include +#include +#include + +#include /* For AT_FDCWD on Solaris 9. */ + +/* If this host provides the openat function or if we're using the + gnulib replacement function, then enable code below to make getcwd + more efficient and robust. */ +#if defined HAVE_OPENAT || defined GNULIB_OPENAT +# define HAVE_OPENAT_SUPPORT 1 +#else +# define HAVE_OPENAT_SUPPORT 0 +#endif + +#ifndef __set_errno +# define __set_errno(val) (errno = (val)) +#endif + +#include +#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 +#include +#include + +#if _LIBC +# ifndef mempcpy +# define mempcpy __mempcpy +# endif +#endif + +#ifndef MAX +# define MAX(a, b) ((a) < (b) ? (b) : (a)) +#endif +#ifndef MIN +# define MIN(a, b) ((a) < (b) ? (a) : (b)) +#endif + +#include "pathmax.h" + +/* In this file, PATH_MAX only serves as a threshold for choosing among two + algorithms. */ +#ifndef PATH_MAX +# define PATH_MAX 8192 +#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_RAW_DECL_GETCWD && HAVE_MINIMALLY_WORKING_GETCWD + /* 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. + + But on AIX 5.1..7.1, the system getcwd is not even minimally + working: If the current directory name is slightly longer than + PATH_MAX, it omits the first directory component and returns + this wrong result with errno = 0. */ + +# undef getcwd + dir = getcwd (buf, size); + if (dir || (size && errno == ERANGE)) + return dir; + + /* Solaris getcwd (NULL, 0) fails with errno == EINVAL, but it has + internal magic that lets it work even if an ancestor directory is + inaccessible, which is better in many cases. So in this case try + again with a buffer that's almost always big enough. */ + if (errno == EINVAL && buf == NULL && size == 0) + { + char big_buffer[BIG_FILE_NAME_LENGTH + 1]; + dir = getcwd (big_buffer, sizeof big_buffer); + if (dir) + return strdup (dir); + } + +# 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 (errno != ERANGE && errno != ENAMETOOLONG && errno != ENOENT) + return NULL; +# endif +#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; + 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 0000000..9f5d1a9 --- /dev/null +++ b/gnulib/lib/getdate.h @@ -0,0 +1,3 @@ +/* Obsolete; consider using parse-datetime.h instead. */ +#include "parse-datetime.h" +#define get_date(a, b, c) parse_datetime (a, b, c) diff --git a/gnulib/lib/getdelim.c b/gnulib/lib/getdelim.c new file mode 100644 index 0000000..6580b9d --- /dev/null +++ b/gnulib/lib/getdelim.c @@ -0,0 +1,137 @@ +/* getdelim.c --- Implementation of replacement getdelim function. + Copyright (C) 1994, 1996-1998, 2001, 2003, 2005-2011 Free Software + Foundation, Inc. + + This program is free software; you can 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 + +/* 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 + +#include +#include +#include +#include + +#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 0000000..62efa61 --- /dev/null +++ b/gnulib/lib/getdomainname.c @@ -0,0 +1,83 @@ +/* getdomainname emulation for systems that doesn't have it. + + Copyright (C) 2003, 2006, 2008, 2010-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Simon Josefsson. */ + +#include + +/* Specification. */ +#include + +#include +#include +#include + +#if HAVE_SYSINFO && HAVE_SYS_SYSTEMINFO_H /* IRIX, OSF/1, Solaris */ +# include +#endif + +/* 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) +#undef getdomainname +{ +#if HAVE_GETDOMAINNAME /* MacOS X, FreeBSD, AIX, IRIX, OSF/1 */ + extern int getdomainname (char *, int); + + if (len > INT_MAX) + len = INT_MAX; + return getdomainname (name, (int) len); +#elif HAVE_SYSINFO && HAVE_SYS_SYSTEMINFO_H && defined SI_SRPC_DOMAIN + /* Solaris */ + int ret; + + /* The third argument is a 'long', but the return value must fit in an + 'int', therefore it's better to avoid arguments > INT_MAX. */ + ret = sysinfo (SI_SRPC_DOMAIN, name, len > INT_MAX ? INT_MAX : len); + if (ret < 0) + /* errno is set here. */ + return -1; + if (ret > len) + { + errno = EINVAL; + return -1; + } + return 0; +#else /* HP-UX, Cygwin, mingw */ + 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; +#endif +} diff --git a/gnulib/lib/getdtablesize.c b/gnulib/lib/getdtablesize.c new file mode 100644 index 0000000..a07c4a2 --- /dev/null +++ b/gnulib/lib/getdtablesize.c @@ -0,0 +1,86 @@ +/* getdtablesize() function for platforms that don't have it. + Copyright (C) 2008-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include + +#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ + +#include + +#include "msvc-inval.h" + +#if HAVE_MSVC_INVALID_PARAMETER_HANDLER +static inline int +_setmaxstdio_nothrow (int newmax) +{ + int result; + + TRY_MSVC_INVAL + { + result = _setmaxstdio (newmax); + } + CATCH_MSVC_INVAL + { + result = -1; + } + DONE_MSVC_INVAL; + + return result; +} +# define _setmaxstdio _setmaxstdio_nothrow +#endif + +/* 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 0000000..ccd9fa5 --- /dev/null +++ b/gnulib/lib/getfilecon.c @@ -0,0 +1,87 @@ +/* wrap getfilecon, lgetfilecon, and fgetfilecon + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software; you can redistribute 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 + +#include + +#include +#include +#include + +/* 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 0000000..87e1679 --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Jim Meyering */ + +#include + +#include + +#include +#include +#include + +#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 0000000..9de54bc --- /dev/null +++ b/gnulib/lib/gethostname.c @@ -0,0 +1,104 @@ +/* gethostname emulation for SysV and POSIX.1. + + Copyright (C) 1992, 2003, 2006, 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* David MacKenzie + Windows port by Simon Josefsson */ + +#include + +#if !((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__) +/* Unix API. */ + +/* Specification. */ +#include + +#ifdef HAVE_UNAME +# include +#endif + +#include + +/* 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 + +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 + +/* Get INT_MAX. */ +#include + +/* 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 0000000..3886752 --- /dev/null +++ b/gnulib/lib/gethrxtime.c @@ -0,0 +1,68 @@ +/* gethrxtime -- get high resolution real time + + Copyright (C) 2005-2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +#include + +#include "gethrxtime.h" + +#include +#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 0000000..481f3f5 --- /dev/null +++ b/gnulib/lib/gethrxtime.h @@ -0,0 +1,37 @@ +/* gethrxtime -- get high resolution real time + + Copyright (C) 2005, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* 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 +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 0000000..0528db1 --- /dev/null +++ b/gnulib/lib/getline.c @@ -0,0 +1,29 @@ +/* getline.c --- Implementation of replacement getline function. + Copyright (C) 2005-2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 + +#include + +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 0000000..d324451 --- /dev/null +++ b/gnulib/lib/getloadavg.c @@ -0,0 +1,1046 @@ +/* Get the system load averages. + + Copyright (C) 1985-1989, 1991-1995, 1997, 1999-2000, 2003-2011 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 . */ + +/* 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 +# include +#endif + +/* Specification. */ +#include + +#include +#include + +# include + +/* 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 +# endif + +# 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 , which + conflicts with the definition understood in this file, that this + really is BSD. */ +# undef BSD + +/* NeXT defines FSCALE in . 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 +# include +# include +# include +/* Tru64 4.0D's table.h redefines sys */ +# undef sys +# endif + +# if defined (__osf__) && (defined (mips) || defined (__mips__)) +# define OSF_MIPS +# include +# endif + +/* UTek's /bin/cc on the 4300 has no architecture specific cpp define by + default, but _MACH_IND_SYS_TYPES is defined in . 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 +/* 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 */ +/* 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 + +/* 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 +# else /* NLIST_STRUCT */ +# include +# endif /* NLIST_STRUCT */ + +# ifdef SUNOS_5 +# include +# include +# endif + +# if defined (hpux) && defined (HAVE_PSTAT_GETDYNAMIC) +# include +# 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 +# include +# else /* eunice */ +# include +# 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 +# include +# include +# 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 +# else +# include +# endif +# endif /* NeXT */ + +# ifdef sgi +# include +# endif /* sgi */ + +# ifdef UMAX +# include +# include +# include +# include + +# ifdef UMAX_43 +# include +# include +# include +# include +# include +# else /* Not UMAX_43. */ +# include +# include +# include +# include +# include +# include +# endif /* Not UMAX_43. */ +# endif /* UMAX */ + +# ifdef DGUX +# include +# endif + +# if (defined __linux__ || defined __CYGWIN__ || defined SUNOS_5 \ + || (defined LOAD_AVE_TYPE && ! defined __VMS)) +# include +# endif + +/* 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 if 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 name_list[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 (setting errno) if an error occurred. */ + +int +getloadavg (double loadavg[], int nelem) +{ + int elem = 0; /* Return value. */ + +# ifdef NO_GET_LOAD_AVG +# define LDAV_DONE + errno = ENOSYS; + elem = -1; +# endif + +# if !defined (LDAV_DONE) && defined (HAVE_LIBKSTAT) /* Solaris <= 2.6 */ +/* Use libkstat because we don't have to be root. */ +# define LDAV_DONE + kstat_ctl_t *kc; + kstat_t *ksp; + kstat_named_t *kn; + int saved_errno; + + 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; + } + } + } + + saved_errno = errno; + kstat_close (kc); + errno = saved_errno; +# endif /* HAVE_LIBKSTAT */ + +# if !defined (LDAV_DONE) && defined (hpux) && defined (HAVE_PSTAT_GETDYNAMIC) + /* HP-UX */ +/* 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 /* AIX */ +# 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__)) + /* Linux without glibc, 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, saved_errno; + + fd = open (LINUX_LDAV_FILE, O_RDONLY); + if (fd == -1) + return -1; + count = read (fd, ldavgbuf, sizeof ldavgbuf - 1); + saved_errno = errno; + (void) close (fd); + errno = saved_errno; + if (count <= 0) + return -1; + ldavgbuf[count] = '\0'; + + for (elem = 0; elem < nelem; elem++) + { + double numerator = 0; + double denominator = 1; + + while (*ptr == ' ') + ptr++; + + /* Finish if this number is missing, and report an error if all + were missing. */ + if (! ('0' <= *ptr && *ptr <= '9')) + { + if (elem == 0) + { + errno = ENOTSUP; + return -1; + } + break; + } + + while ('0' <= *ptr && *ptr <= '9') + numerator = 10 * numerator + (*ptr++ - '0'); + + if (*ptr == '.') + for (ptr++; '0' <= *ptr && *ptr <= '9'; ptr++) + numerator = 10 * numerator + (*ptr - '0'), denominator *= 10; + + loadavg[elem++] = numerator / denominator; + } + + return elem; + +# endif /* __linux__ || __CYGWIN__ */ + +# if !defined (LDAV_DONE) && defined (__NetBSD__) /* NetBSD < 0.9 */ +# 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) + { + errno = ENOTSUP; + 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) /* NeXTStep */ +# 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) + { + errno = ENOTSUP; + 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; + memset (&stats, 0, 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)) + /* DJGPP */ +# 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) /* OSF/1 */ +# 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 */ + /* 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) + { + errno = ENOTSUP; + return -1; + } +# endif /* ! defined LDAV_DONE && defined __VMS */ + +# if ! defined LDAV_DONE && defined LOAD_AVE_TYPE && ! defined __VMS + /* IRIX, other old systems */ + + /* 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 (name_list[0].n_name, LDAV_SYMBOL); + strcpy (name_list[1].n_name, ""); +# else /* NLIST_STRUCT */ +# ifdef HAVE_STRUCT_NLIST_N_UN_N_NAME + name_list[0].n_un.n_name = LDAV_SYMBOL; + name_list[1].n_un.n_name = 0; +# else /* not HAVE_STRUCT_NLIST_N_UN_N_NAME */ + name_list[0].n_name = LDAV_SYMBOL; + name_list[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, name_list) +# else /* _AIX */ + knlist (name_list, 1, sizeof (name_list[0])) +# endif + >= 0) + /* Omit "&& name_list[0].n_type != 0 " -- it breaks on Sun386i. */ + { +# ifdef FIXUP_KERNEL_SYMBOL_ADDR + FIXUP_KERNEL_SYMBOL_ADDR (name_list); +# endif + offset = name_list[0].n_value; + } +# endif /* !SUNOS_5 */ +# else /* sgi */ + ptrdiff_t 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 + /* Set the channel to close on exec, so it does not + litter any child's descriptor table. */ +# ifndef O_CLOEXEC +# define O_CLOEXEC 0 +# endif + int fd = open ("/dev/kmem", O_RDONLY | O_CLOEXEC); + if (0 <= fd) + { +# if F_DUPFD_CLOEXEC + if (fd <= STDERR_FILENO) + { + int fd1 = fcntl (fd, F_DUPFD_CLOEXEC, STDERR_FILENO + 1); + close (fd); + fd = fd1; + } +# endif + if (0 <= fd) + { + channel = fd; + 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, name_list); + offset = name_list[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) + { + errno = ENOTSUP; + 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 + errno = ENOSYS; + elem = -1; +# endif + return elem; +} diff --git a/gnulib/lib/getlogin.c b/gnulib/lib/getlogin.c new file mode 100644 index 0000000..56662b0 --- /dev/null +++ b/gnulib/lib/getlogin.c @@ -0,0 +1,41 @@ +/* Provide a working getlogin for systems which lack it. + + Copyright (C) 2010-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible, 2010. */ + +#include + +/* Specification. */ +#include + +#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ +# define WIN32_LEAN_AND_MEAN +# include +#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 0000000..096a1fe --- /dev/null +++ b/gnulib/lib/getlogin_r.c @@ -0,0 +1,88 @@ +/* Provide a working getlogin_r for systems which lack it. + + Copyright (C) 2005-2007, 2010-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 + +/* Specification. */ +#include + +#include +#include + +#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ +# define WIN32_LEAN_AND_MEAN +# include +#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) +{ +#undef getlogin_r +#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; +#elif HAVE_GETLOGIN_R + /* Platform with a getlogin_r() function. */ + int ret = getlogin_r (name, size); + + if (ret == 0 && memchr (name, '\0', size) == NULL) + /* name contains a truncated result. */ + return ERANGE; + return ret; +#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 0000000..fcdf7df --- /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-1998, 2000, 2003-2004, 2006, 2008-2011 Free + Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Originally written by Jan Brittenson, bson@gnu.ai.mit.edu. */ + +#include + +#include "getndelim2.h" + +#include +#include +#include +#include + +#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 +#include + +#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 0000000..0824174 --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef GETNDELIM2_H +#define GETNDELIM2_H 1 + +#include +#include + +#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 0000000..be1296f --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..34534a2 --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef GETNLINE_H +#define GETNLINE_H 1 + +#include +#include + +#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 0000000..7c9f704 --- /dev/null +++ b/gnulib/lib/getopt.c @@ -0,0 +1,1245 @@ +/* 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-2011 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 . */ + +#ifndef _LIBC +# include +#endif + +#include "getopt.h" + +#include +#include +#include +#include + +#ifdef _LIBC +# include +#else +# include "gettext.h" +# define _(msgid) gettext (msgid) +#endif + +#if defined _LIBC && defined USE_IN_LIBIO +# include +#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 (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; + } + else if (optstring[0] == '-' || optstring[0] == '+') + optstring++; + if (optstring[0] == ':') + print_errors = 0; + + /* 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; + unsigned int namelen; + const struct option *p; + const struct option *pfound = NULL; + struct option_list + { + const struct option *p; + struct option_list *next; + } *ambig_list = NULL; + int exact = 0; + int indfound = -1; + int option_index; + + for (nameend = d->__nextchar; *nameend && *nameend != '='; nameend++) + /* Do nothing. */ ; + namelen = nameend - d->__nextchar; + + /* 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, namelen)) + { + if (namelen == (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. */ + struct option_list *newp = malloc (sizeof (*newp)); + newp->p = p; + newp->next = ambig_list; + ambig_list = newp; + } + } + + if (ambig_list != NULL && !exact) + { + if (print_errors) + { + struct option_list first; + first.p = pfound; + first.next = ambig_list; + ambig_list = &first; + +#if defined _LIBC && defined USE_IN_LIBIO + char *buf = NULL; + size_t buflen = 0; + + FILE *fp = open_memstream (&buf, &buflen); + if (fp != NULL) + { + fprintf (fp, + _("%s: option '%s' is ambiguous; possibilities:"), + argv[0], argv[d->optind]); + + do + { + fprintf (fp, " '--%s'", ambig_list->p->name); + ambig_list = ambig_list->next; + } + while (ambig_list != NULL); + + fputc_unlocked ('\n', fp); + + if (__builtin_expect (fclose (fp) != EOF, 1)) + { + _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; possibilities:"), + argv[0], argv[d->optind]); + do + { + fprintf (stderr, " '--%s'", ambig_list->p->name); + ambig_list = ambig_list->next; + } + while (ambig_list != NULL); + + fputc ('\n', stderr); +#endif + } + d->__nextchar += strlen (d->__nextchar); + d->optind++; + d->optopt = 0; + return '?'; + } + + while (ambig_list != NULL) + { + struct option_list *pn = ambig_list->next; + free (ambig_list); + ambig_list = pn; + } + + 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], 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 '--%s' requires an argument\n"), + argv[0], pfound->name); +#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++; + const 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 == ':' || 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; + + if (longopts == NULL) + goto no_longs; + + /* 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 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 '-W %s' is ambiguous\n"), + argv[0], d->optarg) >= 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], d->optarg); +#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 '-W %s' requires 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' requires an argument\n"), + argv[0], pfound->name); +#endif + } + d->__nextchar += strlen (d->__nextchar); + return optstring[0] == ':' ? ':' : '?'; + } + } + else + d->optarg = NULL; + d->__nextchar += strlen (d->__nextchar); + if (longind != NULL) + *longind = option_index; + if (pfound->flag) + { + *(pfound->flag) = pfound->val; + return 0; + } + return pfound->val; + } + + no_longs: + 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 0000000..0f3918a --- /dev/null +++ b/gnulib/lib/getopt.in.h @@ -0,0 +1,253 @@ +/* Declarations for getopt. + Copyright (C) 1989-1994, 1996-1999, 2001, 2003-2007, 2009-2011 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 . */ + +#ifndef _@GUARD_PREFIX@_GETOPT_H + +#if __GNUC__ >= 3 +@PRAGMA_SYSTEM_HEADER@ +#endif +@PRAGMA_COLUMNS@ + +/* The include_next requires a split double-inclusion guard. We must + also inform the replacement unistd.h to not recursively use + ; 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 _@GUARD_PREFIX@_GETOPT_H + +#ifndef __need_getopt +# define _@GUARD_PREFIX@_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 , + 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 +# include +# include +# 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 , but + that does not exist if we are standalone. So: if __GNU_LIBRARY__ is + not defined, include , which will pull in 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 +#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. */ + +# if !GNULIB_defined_struct_option +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; +}; +# define GNULIB_defined_struct_option 1 +# endif + +/* 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 /* _@GUARD_PREFIX@_GETOPT_H */ +#endif /* _@GUARD_PREFIX@_GETOPT_H */ diff --git a/gnulib/lib/getopt1.c b/gnulib/lib/getopt1.c new file mode 100644 index 0000000..3656802 --- /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-1994, 1996-1998, 2004, 2006, 2009-2011 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 . */ + +#ifdef _LIBC +# include +#else +# include +# include "getopt.h" +#endif +#include "getopt_int.h" + +#include + +/* This needs to come after some library #include + to get __GNU_LIBRARY__ defined. */ +#ifdef __GNU_LIBRARY__ +#include +#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 + +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 0000000..9f0c713 --- /dev/null +++ b/gnulib/lib/getopt_int.h @@ -0,0 +1,135 @@ +/* Internal declarations for getopt. + Copyright (C) 1989-1994, 1996-1999, 2001, 2003-2004, 2009-2011 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 . */ + +#ifndef _GETOPT_INT_H +#define _GETOPT_INT_H 1 + +#include + +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. */ + +/* 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 __ord + { + REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER + }; + +/* 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; + + /* See __ord above. */ + enum __ord __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 0000000..d7c1ba8 --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible and Martin Lambers. */ + +#include + +/* Specification. */ +#include + +/* This implementation is only for native Win32 systems. */ +#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ + +# define WIN32_LEAN_AND_MEAN +# include + +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 0000000..c747f35 --- /dev/null +++ b/gnulib/lib/getpass.c @@ -0,0 +1,230 @@ +/* Copyright (C) 1992-2001, 2003-2007, 2009-2011 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 +#endif + +#include "getpass.h" + +#include + +#if !((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__) + +# include + +# if HAVE_DECL___FSETLOCKING && HAVE___FSETLOCKING +# if HAVE_STDIO_EXT_H +# include +# endif +# else +# define __fsetlocking(stream, type) /* empty */ +# endif + +# if HAVE_TERMIOS_H +# include +# 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 , + improved by Simon Josefsson. */ + +/* For PASS_MAX. */ +# include +/* For _getch(). */ +# include +/* For strdup(). */ +# include + +# 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 0000000..251c20a --- /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-2011 Free Software Foundation, Inc. + Contributed by Simon Josefsson , 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 + +# 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 0000000..abe5a40 --- /dev/null +++ b/gnulib/lib/getpeername.c @@ -0,0 +1,49 @@ +/* getpeername.c --- wrappers for Windows getpeername function + + Copyright (C) 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paolo Bonzini */ + +#include + +#define WIN32_LEAN_AND_MEAN +/* Get winsock2.h. */ +#include + +/* Get set_winsock_errno, FD_TO_SOCKET etc. */ +#include "w32sock.h" + +#undef getpeername + +int +rpl_getpeername (int fd, struct sockaddr *addr, socklen_t *addrlen) +{ + SOCKET sock = FD_TO_SOCKET (fd); + + if (sock == INVALID_SOCKET) + { + errno = EBADF; + return -1; + } + else + { + 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 0000000..1c494bb --- /dev/null +++ b/gnulib/lib/getsockname.c @@ -0,0 +1,49 @@ +/* getsockname.c --- wrappers for Windows getsockname function + + Copyright (C) 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paolo Bonzini */ + +#include + +#define WIN32_LEAN_AND_MEAN +/* Get winsock2.h. */ +#include + +/* Get set_winsock_errno, FD_TO_SOCKET etc. */ +#include "w32sock.h" + +#undef getsockname + +int +rpl_getsockname (int fd, struct sockaddr *addr, socklen_t *addrlen) +{ + SOCKET sock = FD_TO_SOCKET (fd); + + if (sock == INVALID_SOCKET) + { + errno = EBADF; + return -1; + } + else + { + 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 0000000..2217664 --- /dev/null +++ b/gnulib/lib/getsockopt.c @@ -0,0 +1,79 @@ +/* getsockopt.c --- wrappers for Windows getsockopt function + + Copyright (C) 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paolo Bonzini */ + +#include + +#define WIN32_LEAN_AND_MEAN +/* Get winsock2.h. */ +#include + +/* Get struct timeval. */ +#include + +/* Get memcpy. */ +#include + +/* 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) +{ + SOCKET sock = FD_TO_SOCKET (fd); + + if (sock == INVALID_SOCKET) + { + errno = EBADF; + return -1; + } + else + { + int r; + + 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, (char *) &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 0000000..ab74d03 --- /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-2011 Free Software + Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 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 . */ + +#if !_LIBC +# include +#endif + +#include +#include + +#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 0000000..1ddd68a --- /dev/null +++ b/gnulib/lib/gettext.h @@ -0,0 +1,286 @@ +/* Convenience header for conditional use of GNU . + Copyright (C) 1995-1998, 2000-2002, 2004-2006, 2009-2011 Free Software + Foundation, Inc. + + This program is free software; you can 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 + +/* 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 a NOP. We don't include + as well because people using "gettext.h" will not include , + and also including would fail on SunOS 4, whereas + is OK. */ +#if defined(__sun) +# include +#endif + +/* Many header files from the libstdc++ coming with g++ 3.3 or newer include + , which chokes if dcgettext is defined as a macro. So include + it now, to make later inclusions of a NOP. */ +#if defined(__cplusplus) && defined(__GNUG__) && (__GNUC__ >= 3) +# include +# if (__GLIBC__ >= 2 && !defined __UCLIBC__) || _GLIBCXX_HAVE_LIBINTL_H +# include +# 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 + +/* Prefer gnulib's setlocale override over libintl's setlocale override. */ +#ifdef GNULIB_defined_setlocale +# undef setlocale +# define setlocale rpl_setlocale +#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 + +#define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS \ + (((__GNUC__ >= 3 || __GNUG__ >= 2) && !defined __STRICT_ANSI__) \ + /* || __STDC_VERSION__ >= 199901L */ ) + +#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS +#include +#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 0000000..6dbb457 --- /dev/null +++ b/gnulib/lib/gettime.c @@ -0,0 +1,48 @@ +/* gettime -- get the system clock + + Copyright (C) 2002, 2004-2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +#include + +#include "timespec.h" + +#include + +/* 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 0000000..ae2a6f1 --- /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-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 + +/* Specification. */ +#include + +#include + +#if HAVE_SYS_TIMEB_H +# include +#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 0000000..dc8089b --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by David MacKenzie. */ + +#include + +#include "getugroups.h" + +#include +#include +#include /* grp.h on alpha OSF1 V2.0 uses "FILE *". */ +#include +#include + +#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 + +# 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 0000000..9df9952 --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include +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 0000000..3ac7c8d --- /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-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by David MacKenzie */ + +#include + +/* Specification. */ +#include + +#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 +#include + +#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 0000000..652b40a --- /dev/null +++ b/gnulib/lib/git-merge-changelog.c @@ -0,0 +1,1676 @@ +/* git-merge-changelog - git "merge" driver for GNU style ChangeLog files. + Copyright (C) 2008-2010 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 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* 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 + + Additionally, for git users: + - 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.) + + Additionally, for bzr users: + - Install the 'extmerge' bzr plug-in listed at + + + - Add to your $HOME/.bazaar/bazaar.conf the line + + external_merge = git-merge-changelog %b %T %o + + - Then, to merge a conflict in a ChangeLog file, use + + $ bzr extmerge ChangeLog + + Additionally, for hg users: + - Add to your $HOME/.hgrc a couple of lines in a section [merge-tools]. + See section merge-tools + for reference. + */ + +/* Use as an alternative to 'diff3': + git-merge-changelog performs the same role as "diff3 -m", just with + reordered arguments: + $ git-merge-changelog %O %A %B + is comparable to + $ diff3 -m %A %O %B + */ + +/* 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 + +#include +#include +#include +#include +#include +#include +#include +#include + +#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 /* */ entries_list; + /* The entries, as a list in opposite direction. */ + gl_list_t /* */ 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 /* */ 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"); + #if 0 /* --split-merged-entry is now on by default. */ + 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"); + #endif + 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 .\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 = true; + + /* 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 */ + 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 \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 /* */ result_entries; + gl_list_t /* */ 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 0000000..c0f1679 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +/* 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 0000000..41cca3c --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +/* 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 0000000..47400e1 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +/* 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 0000000..96b98e8 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +/* 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 0000000..b6bc8b4 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +/* 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 0000000..c5ba2ff --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +/* 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 0000000..0838d9d --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +/* 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 0000000..9056d74 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +/* 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 0000000..3cef1da --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +/* 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 0000000..4e3098f --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +/* 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 0000000..c0a0a2f --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +/* 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 0000000..d3b8a06 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +/* 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 0000000..d2cb1e6 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +/* 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 0000000..d0e2336 --- /dev/null +++ b/gnulib/lib/gl_array_list.c @@ -0,0 +1,680 @@ +/* Sequential list data type implemented by an array. + Copyright (C) 2006-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "gl_array_list.h" + +#include +/* Get memcpy. */ +#include + +/* 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 0000000..72e8062 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#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 0000000..ca2419c --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "gl_array_oset.h" + +#include + +/* 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 0000000..79a6404 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#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 0000000..4151672 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "gl_avltree_list.h" + +#include + +/* -------------------------- 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 0000000..71b6244 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#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 0000000..af473d2 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "gl_avltree_oset.h" + +#include + +/* 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 0000000..9b888cc --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#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 0000000..23152e3 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "gl_avltreehash_list.h" + +#include /* for SIZE_MAX */ +#include + +#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 0000000..2fecb11 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#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 0000000..e7aee8c --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "gl_carray_list.h" + +#include +/* Get memcpy. */ +#include + +/* 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 0000000..bec77fa --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#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 0000000..b724249 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "gl_linked_list.h" + +#include + +/* -------------------------- 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 0000000..cefd90d --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#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 0000000..fb6fbec --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "gl_linkedhash_list.h" + +#include /* for SIZE_MAX */ +#include + +#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 0000000..c9e7c70 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#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 0000000..919a0cd --- /dev/null +++ b/gnulib/lib/gl_list.c @@ -0,0 +1,283 @@ +/* Abstract sequential list data type. + Copyright (C) 2006-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..be60020 --- /dev/null +++ b/gnulib/lib/gl_list.h @@ -0,0 +1,844 @@ +/* Abstract sequential list data type. + Copyright (C) 2006-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#ifndef _GL_LIST_H +#define _GL_LIST_H + +#include +#include + +#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 0000000..40e5073 --- /dev/null +++ b/gnulib/lib/gl_oset.c @@ -0,0 +1,96 @@ +/* Abstract ordered set data type. + Copyright (C) 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..99d0aba --- /dev/null +++ b/gnulib/lib/gl_oset.h @@ -0,0 +1,289 @@ +/* Abstract ordered set data type. + Copyright (C) 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#ifndef _GL_OSET_H +#define _GL_OSET_H + +#include +#include + +#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 0000000..9836b1c --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "gl_rbtree_list.h" + +#include + +/* -------------------------- 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 0000000..0f2acce --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#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 0000000..fa0fb15 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "gl_rbtree_oset.h" + +#include + +/* 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 0000000..91b8269 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#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 0000000..462f91c --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "gl_rbtreehash_list.h" + +#include /* for SIZE_MAX */ +#include + +#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 0000000..7acc746 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#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 0000000..d8f701e --- /dev/null +++ b/gnulib/lib/gl_sublist.c @@ -0,0 +1,479 @@ +/* Sequential list data type backed by another list. + Copyright (C) 2006-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "gl_sublist.h" + +#include + +#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 0000000..1f06905 --- /dev/null +++ b/gnulib/lib/gl_sublist.h @@ -0,0 +1,49 @@ +/* Sequential list data type backed by another list. + Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#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 0000000..f177caa --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..9bc446d --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#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 0000000..a85b904 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..1fe2dcc --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#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 0000000..66959e5 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..7aa3b9e --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#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 0000000..ab4bd50 --- /dev/null +++ b/gnulib/lib/glob-libc.h @@ -0,0 +1,212 @@ +/* Copyright (C) 1991-1992, 1995-1998, 2000-2001, 2004-2007, 2009-2011 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 . */ + +#ifndef _GLOB_H +#define _GLOB_H 1 + +#ifndef __GLOB_GNULIB +# include +#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 +# 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 0000000..fddd02d --- /dev/null +++ b/gnulib/lib/glob.c @@ -0,0 +1,1552 @@ +/* Copyright (C) 1991-2011 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 . */ + +#ifndef _LIBC +# include +#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 + +#include +#include +#include +#include + +/* Outcomment the following line for production quality code. */ +/* #define NDEBUG 1 */ +#include + +#include + +#include /* Needed on stupid SunOS for assert. */ + +#if !defined _LIBC || !defined GLOB_ONLY_P + +#include +#if !defined POSIX && defined _POSIX_VERSION +# define POSIX +#endif + +#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ +# define WINDOWS32 +#endif + +#ifndef WINDOWS32 +# include +#endif + +#include +#ifndef __set_errno +# define __set_errno(val) errno = (val) +#endif + +#include + + +/* In GNU systems, 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 +#include + +/* NAME_MAX is usually defined in or . */ +#include +#ifndef NAME_MAX +# define NAME_MAX (sizeof (((struct dirent *) 0)->d_name)) +#endif + +#include + +#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 __alloca alloca +# define __readdir readdir +# define __glob_pattern_p glob_pattern_p +#endif /* _LIBC */ + +#include + +#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 + { + /* dfd cannot be -1 here, because dirfd never returns -1 on + glibc, or on hosts that have fstatat. */ + 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 0000000..e0d1f85 --- /dev/null +++ b/gnulib/lib/glob.in.h @@ -0,0 +1,91 @@ +/* glob.h -- Find a path matching a pattern. + + Copyright (C) 2005-2007, 2009-2011 Free Software Foundation, Inc. + + Written by Derek Price & 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. */ + +#ifndef _GL_GLOB_H +#define _GL_GLOB_H + +#if @HAVE_SYS_CDEFS_H@ +# include +#endif + +#include + +/* On some systems, such as AIX 5.1, does a "#define stat stat64". + Make sure this definition is seen before glob-libc.h defines types that + rely on 'struct stat'. */ +#include + +#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 definitions of _GL_FUNCDECL_RPL etc. are copied here. */ + +/* The definition of _GL_ARG_NONNULL is copied here. */ + +/* The definition of _GL_WARN_ON_USE 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" + +__BEGIN_DECLS +typedef int (*_gl_glob_errfunc_fn) (const char *, int); +__END_DECLS + +#if defined __cplusplus && defined GNULIB_NAMESPACE +# undef glob +# undef globfree +# undef glob_pattern_p +_GL_CXXALIAS_RPL (glob, int, (const char *_Restrict_ __pattern, int __flags, + _gl_glob_errfunc_fn __errfunc, + glob_t *_Restrict_ __pglob)); +_GL_CXXALIAS_RPL (globfree, void, (glob_t *__pglob)); +_GL_CXXALIAS_RPL (glob_pattern_p, int, (const char *__pattern, int __quote)); +# if 0 /* The C function name is rpl_glob, not glob. */ +_GL_CXXALIASWARN (glob); +_GL_CXXALIASWARN (globfree); +_GL_CXXALIASWARN (glob_pattern_p); +# endif +#endif + +#endif /* _GL_GLOB_H */ diff --git a/gnulib/lib/glthread/cond.c b/gnulib/lib/glthread/cond.c new file mode 100644 index 0000000..124da95 --- /dev/null +++ b/gnulib/lib/glthread/cond.c @@ -0,0 +1,464 @@ +/* Condition variables for multithreading. + Copyright (C) 2008-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 , 2008, + and Bruno Haible , 2008. */ + +#include + +#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 + +/* -------------------------- 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 0000000..e205045 --- /dev/null +++ b/gnulib/lib/glthread/cond.h @@ -0,0 +1,409 @@ +/* Condition variables for multithreading. + Copyright (C) 2005-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 , 2008. + Based on Bruno Haible 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. ) + 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 +#include +#include +#include + +#include "glthread/lock.h" + +/* ========================================================================= */ + +#if USE_POSIX_THREADS + +/* Use the POSIX threads library. */ + +# include + +# 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 + +# 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 +# include + +# 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 + +# define WIN32_LEAN_AND_MEAN /* avoid including junk */ +# include + +# 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 0000000..6e5d3b1 --- /dev/null +++ b/gnulib/lib/glthread/lock.c @@ -0,0 +1,1058 @@ +/* Locking in multithreaded situations. + Copyright (C) 2005-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 , 2005. + Based on GCC's gthr-posix.h, gthr-posix95.h, gthr-solaris.h, + gthr-win32.h. */ + +#include + +#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 0000000..f764d14 --- /dev/null +++ b/gnulib/lib/glthread/lock.h @@ -0,0 +1,928 @@ +/* Locking in multithreaded situations. + Copyright (C) 2005-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 , 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 +#include + +/* ========================================================================= */ + +#if USE_POSIX_THREADS + +/* Use the POSIX threads library. */ + +# include + +# 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 + +# 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 +# include + +# 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 + +# define WIN32_LEAN_AND_MEAN /* avoid including junk */ +# include + +# 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 0000000..d6af6f3 --- /dev/null +++ b/gnulib/lib/glthread/thread.c @@ -0,0 +1,232 @@ +/* Creating and controlling threads. + Copyright (C) 2005-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 , 2005. + Based on GCC's gthr-posix.h, gthr-posix95.h, gthr-solaris.h, + gthr-win32.h. */ + +#include + +/* Specification. */ +#include "glthread/thread.h" + +#include +#include "glthread/lock.h" + +/* ========================================================================= */ + +#if USE_POSIX_THREADS + +#include + +#ifdef PTW32_VERSION + +const gl_thread_t gl_null_thread /* = { .p = NULL } */; + +#endif + +#endif + +/* ========================================================================= */ + +#if USE_WIN32_THREADS + +#include + +/* -------------------------- 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 0000000..be13ed9 --- /dev/null +++ b/gnulib/lib/glthread/thread.h @@ -0,0 +1,401 @@ +/* Creating and controlling threads. + Copyright (C) 2005-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 , 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); + + Getting a reference to the current thread as a pointer, for debugging: + ptr = gl_thread_self_pointer (); + extern void * gl_thread_self_pointer (void); + + Terminating the current thread: + gl_thread_exit (return_value); + extern _Noreturn void gl_thread_exit (void *return_value); + + 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 + + */ + + +#ifndef _GLTHREAD_THREAD_H +#define _GLTHREAD_THREAD_H + +#include +#include + +/* ========================================================================= */ + +#if USE_POSIX_THREADS + +/* Use the POSIX threads library. */ + +# include + +# 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) +# ifdef PTW32_VERSION + /* In pthreads-win32, pthread_t is a struct with a pointer field 'p' and + other fields. */ +# define gl_thread_self() \ + (pthread_in_use () ? pthread_self () : gl_null_thread) +# define gl_thread_self_pointer() \ + (pthread_in_use () ? pthread_self ().p : NULL) +extern const gl_thread_t gl_null_thread; +# else +# define gl_thread_self() \ + (pthread_in_use () ? pthread_self () : (pthread_t) NULL) +# define gl_thread_self_pointer() \ + (pthread_in_use () ? (void *) pthread_self () : NULL) +# endif +# 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 + +# 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 () : NULL) +# define gl_thread_self_pointer() \ + gl_thread_self () +# 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 +# include + +# 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 () : NULL) +# define gl_thread_self_pointer() \ + gl_thread_self () +# 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 + +# define WIN32_LEAN_AND_MEAN /* avoid including junk */ +# include + +# 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_self_pointer() \ + gl_thread_self () +# 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() 0 +# define gl_thread_self_pointer() \ + ((void *) gl_thread_self ()) +# 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 0000000..a8259dc --- /dev/null +++ b/gnulib/lib/glthread/threadlib.c @@ -0,0 +1,74 @@ +/* Multithreading primitives. + Copyright (C) 2005-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 , 2005. */ + +#include + +/* ========================================================================= */ + +#if USE_POSIX_THREADS + +/* Use the POSIX threads library. */ + +# include +# include + +# 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 0000000..9738ff1 --- /dev/null +++ b/gnulib/lib/glthread/tls.c @@ -0,0 +1,61 @@ +/* Thread-local storage in multithreaded situations. + Copyright (C) 2005-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible , 2005. */ + +#include + +#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 0000000..4f39986 --- /dev/null +++ b/gnulib/lib/glthread/tls.h @@ -0,0 +1,299 @@ +/* Thread-local storage in multithreaded situations. + Copyright (C) 2005, 2007-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible , 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 +#include + +/* ========================================================================= */ + +#if USE_POSIX_THREADS + +/* Use the POSIX threads library. */ + +# include + +# 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 + +# 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 + +# 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 + +# define WIN32_LEAN_AND_MEAN /* avoid including junk */ +# include + +/* ------------------------- 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 0000000..0482315 --- /dev/null +++ b/gnulib/lib/glthread/yield.h @@ -0,0 +1,122 @@ +/* Yielding the processor to other threads and processes. + Copyright (C) 2005-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 + +/* ========================================================================= */ + +#if USE_POSIX_THREADS + +/* Use the POSIX threads library. */ + +# include + +# 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 + +# 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 + +# ifdef __cplusplus +extern "C" { +# endif + +# define gl_thread_yield() \ + thr_yield () + +# ifdef __cplusplus +} +# endif + +#endif + +/* ========================================================================= */ + +#if USE_WIN32_THREADS + +# define WIN32_LEAN_AND_MEAN /* avoid including junk */ +# include + +# 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/grantpt.c b/gnulib/lib/grantpt.c new file mode 100644 index 0000000..b757044 --- /dev/null +++ b/gnulib/lib/grantpt.c @@ -0,0 +1,123 @@ +/* Acquire ownership of the slave side of a pseudo-terminal. + Copyright (C) 1998-2002, 2009-2011 Free Software Foundation, Inc. + Contributed by Zack Weinberg , 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 . */ + +#include + +#include + +#include +#include +#include +#include +#include +#include + +#if HAVE_SETRLIMIT +# include +# include +# include +#endif + +#include "configmake.h" +#include "pty-private.h" + +#ifndef _LIBC +# define __builtin_expect(expr,val) (expr) +# define __set_errno(e) errno = (e) +# define __dup2 dup2 +# define __fork fork +# define __setrlimit setrlimit +# define __waitpid waitpid +#endif + +int +grantpt (int fd) +{ +#if defined __OpenBSD__ + /* On OpenBSD, master and slave of a pseudo-terminal are allocated together, + through an ioctl on /dev/ptm. There is no need for grantpt(). */ + if (fcntl (fd, F_GETFD) < 0) + return -1; + return 0; +#else + /* This function is most often called from a process without 'root' + credentials. Use the helper program. */ + int retval = -1; + pid_t pid = __fork (); + if (pid == -1) + goto cleanup; + else if (pid == 0) + { + /* This is executed in the child process. */ + +# if HAVE_SETRLIMIT && defined RLIMIT_CORE + /* Disable core dumps. */ + struct rlimit rl = { 0, 0 }; + __setrlimit (RLIMIT_CORE, &rl); +# endif + + /* We pass the master pseudo terminal as file descriptor PTY_FILENO. */ + if (fd != PTY_FILENO) + if (__dup2 (fd, PTY_FILENO) < 0) + _exit (FAIL_EBADF); + +# ifdef CLOSE_ALL_FDS + CLOSE_ALL_FDS (); +# endif + + execle (_PATH_PT_CHOWN, strrchr (_PATH_PT_CHOWN, '/') + 1, NULL, NULL); + _exit (FAIL_EXEC); + } + else + { + int w; + + if (__waitpid (pid, &w, 0) == -1) + goto cleanup; + if (!WIFEXITED (w)) + __set_errno (ENOEXEC); + else + switch (WEXITSTATUS (w)) + { + case 0: + retval = 0; + break; + case FAIL_EBADF: + __set_errno (EBADF); + break; + case FAIL_EINVAL: + __set_errno (EINVAL); + break; + case FAIL_EACCES: + __set_errno (EACCES); + break; + case FAIL_EXEC: + __set_errno (ENOEXEC); + break; + case FAIL_ENOMEM: + __set_errno (ENOMEM); + break; + + default: + assert(! "getpt: internal error: invalid exit code from pt_chown"); + } + } + + cleanup: + return retval; +#endif +} diff --git a/gnulib/lib/group-member.c b/gnulib/lib/group-member.c new file mode 100644 index 0000000..cc787d1 --- /dev/null +++ b/gnulib/lib/group-member.c @@ -0,0 +1,124 @@ +/* group-member.c -- determine whether group id is in calling user's group list + + Copyright (C) 1994, 1997-1998, 2003, 2005-2006, 2009-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include +#include +#include +#include + +#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/hard-locale.c b/gnulib/lib/hard-locale.c new file mode 100644 index 0000000..26e614b --- /dev/null +++ b/gnulib/lib/hard-locale.c @@ -0,0 +1,72 @@ +/* hard-locale.c -- Determine whether a locale is hard. + + Copyright (C) 1997-1999, 2002-2004, 2006-2007, 2009-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#include "hard-locale.h" + +#include +#include +#include + +#ifdef __GLIBC__ +# define GLIBC_VERSION __GLIBC__ +#elif defined __UCLIBC__ +# define GLIBC_VERSION 2 +#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 0000000..7540628 --- /dev/null +++ b/gnulib/lib/hard-locale.h @@ -0,0 +1,25 @@ +/* Determine whether a locale is hard. + + Copyright (C) 1999, 2003-2004, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef HARD_LOCALE_H_ +# define HARD_LOCALE_H_ 1 + +# include + +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 0000000..743bb57 --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#include "hash-pjw.h" + +#include + +#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 0000000..36b776a --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* 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) _GL_ATTRIBUTE_PURE; diff --git a/gnulib/lib/hash-triple.c b/gnulib/lib/hash-triple.c new file mode 100644 index 0000000..1649377 --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Jim Meyering */ + +#include + +#include "hash-triple.h" + +#include +#include + +#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 0000000..0658d81 --- /dev/null +++ b/gnulib/lib/hash-triple.h @@ -0,0 +1,24 @@ +#ifndef HASH_TRIPLE_H +#define HASH_TRIPLE_H + +#include +#include +#include + +/* 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) _GL_ATTRIBUTE_PURE; +extern size_t triple_hash_no_name (void const *x, size_t table_size) + _GL_ATTRIBUTE_PURE; +extern bool triple_compare (void const *x, void const *y); +extern bool triple_compare_ino_str (void const *x, void const *y) + _GL_ATTRIBUTE_PURE; +extern void triple_free (void *x); + +#endif diff --git a/gnulib/lib/hash.c b/gnulib/lib/hash.c new file mode 100644 index 0000000..0ee32d0 --- /dev/null +++ b/gnulib/lib/hash.c @@ -0,0 +1,1233 @@ +/* hash - hashing table processing. + + Copyright (C) 1998-2004, 2006-2007, 2009-2011 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 . */ + +/* 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 + +#include "hash.h" + +#include "bitrotate.h" +#include "xalloc-oversized.h" + +#include +#include +#include + +#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.8f +#define DEFAULT_GROWTH_FACTOR 1.414f + +/* 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.0f +#define DEFAULT_SHRINK_FACTOR 1.0f + +/* 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); +} + +/* Hash KEY and return a pointer to the selected bucket. + If TABLE->hasher misbehaves, abort. */ +static struct hash_entry * +safe_hasher (const Hash_table *table, const void *key) +{ + size_t n = table->hasher (key, table->n_buckets); + if (! (n < table->n_buckets)) + abort (); + return table->bucket + n; +} + +/* 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 = safe_hasher (table, entry); + struct hash_entry const *cursor; + + 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 = safe_hasher (table, entry); + struct hash_entry const *cursor; + + /* Find next entry in the same bucket. */ + cursor = bucket; + do + { + if (cursor->data == entry && cursor->next) + return cursor->next->data; + cursor = cursor->next; + } + while (cursor != NULL); + + /* 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 _GL_ATTRIBUTE_CONST +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 _GL_ATTRIBUTE_CONST +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 _GL_ATTRIBUTE_PURE +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 = safe_hasher (table, entry); + struct hash_entry *cursor; + + *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 = safe_hasher (dst, data); + + 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 = safe_hasher (dst, data); + + 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; +} + +/* Insert ENTRY into hash TABLE if there is not already a matching entry. + + Return -1 upon memory allocation failure. + Return 1 if insertion succeeded. + Return 0 if there is already a matching entry in the table, + and in that case, if MATCHED_ENT is non-NULL, set *MATCHED_ENT + to that entry. + + This interface is easier to use than hash_insert when you must + distinguish between the latter two cases. More importantly, + hash_insert is unusable for some types of ENTRY values. When using + hash_insert, the only way to distinguish those cases is to compare + the return value and ENTRY. That works only when you can have two + different ENTRY values that point to data that compares "equal". Thus, + when the ENTRY value is a simple scalar, you must use + hash_insert_if_absent. ENTRY must not be NULL. */ +int +hash_insert_if_absent (Hash_table *table, void const *entry, + void const **matched_ent) +{ + void *data; + struct hash_entry *bucket; + + /* The caller cannot insert a NULL entry, since hash_lookup returns NULL + to indicate "not found", and hash_find_entry uses "bucket->data == NULL" + to indicate an empty bucket. */ + 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) + { + if (matched_ent) + *matched_ent = data; + return 0; + } + + /* 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 -1; + + /* If the rehash fails, arrange to return NULL. */ + if (!hash_rehash (table, candidate)) + return -1; + + /* 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 -1; + + /* 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 1; + } + + /* Add ENTRY right in the bucket head. */ + + bucket->data = (void *) entry; + table->n_entries++; + table->n_buckets_used++; + + return 1; +} + +/* hash_insert0 is the deprecated name for hash_insert_if_absent. + . */ +int +hash_insert0 (Hash_table *table, void const *entry, void const **matched_ent) +{ + return hash_insert_if_absent (table, entry, matched_ent); +} + +/* 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, void const *entry) +{ + void const *matched_ent; + int err = hash_insert_if_absent (table, entry, &matched_ent); + return (err == -1 + ? NULL + : (void *) (err == 0 ? matched_ent : 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 0000000..541abc4 --- /dev/null +++ b/gnulib/lib/hash.h @@ -0,0 +1,107 @@ +/* hash - hashing table processing. + Copyright (C) 1998-1999, 2001, 2003, 2009-2011 Free Software Foundation, + Inc. + Written by Jim Meyering , 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 . */ + +/* 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 +# include + +/* The __attribute__ feature is available in gcc versions 2.5 and later. + The warn_unused_result attribute appeared first in gcc-3.4.0. */ +# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) +# define _GL_ATTRIBUTE_WUR __attribute__ ((__warn_unused_result__)) +# else +# define _GL_ATTRIBUTE_WUR /* empty */ +# endif + +# ifndef _GL_ATTRIBUTE_DEPRECATED +/* The __attribute__((__deprecated__)) feature + is available in gcc versions 3.1 and newer. */ +# if __GNUC__ < 3 || (__GNUC__ == 3 && __GNUC_MINOR__ < 1) +# define _GL_ATTRIBUTE_DEPRECATED /* empty */ +# else +# define _GL_ATTRIBUTE_DEPRECATED __attribute__ ((__deprecated__)) +# endif +# 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 *) _GL_ATTRIBUTE_PURE; +size_t hash_get_n_buckets_used (const Hash_table *) _GL_ATTRIBUTE_PURE; +size_t hash_get_n_entries (const Hash_table *) _GL_ATTRIBUTE_PURE; +size_t hash_get_max_bucket_length (const Hash_table *) _GL_ATTRIBUTE_PURE; +bool hash_table_ok (const Hash_table *) _GL_ATTRIBUTE_PURE; +void hash_print_statistics (const Hash_table *, FILE *); +void *hash_lookup (const Hash_table *, const void *); + +/* Walking. */ +void *hash_get_first (const Hash_table *) _GL_ATTRIBUTE_PURE; +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) _GL_ATTRIBUTE_PURE; +void hash_reset_tuning (Hash_tuning *); +Hash_table *hash_initialize (size_t, const Hash_tuning *, + Hash_hasher, Hash_comparator, + Hash_data_freer) _GL_ATTRIBUTE_WUR; +void hash_clear (Hash_table *); +void hash_free (Hash_table *); + +/* Insertion and deletion. */ +bool hash_rehash (Hash_table *, size_t) _GL_ATTRIBUTE_WUR; +void *hash_insert (Hash_table *, const void *) _GL_ATTRIBUTE_WUR; + +/* Deprecate this interface. It has been renamed to hash_insert_if_absent. */ +int hash_insert0 (Hash_table *table, /* FIXME: remove in 2013 */ + const void *entry, + const void **matched_ent) _GL_ATTRIBUTE_DEPRECATED; +int hash_insert_if_absent (Hash_table *table, const void *entry, + const void **matched_ent); +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 0000000..b357a15 --- /dev/null +++ b/gnulib/lib/hmac-md5.c @@ -0,0 +1,81 @@ +/* hmac-md5.c -- hashed message authentication codes + Copyright (C) 2005-2006, 2009-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 + +#include "hmac.h" + +#include "memxor.h" +#include "md5.h" + +#include + +#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 0000000..816bfb2 --- /dev/null +++ b/gnulib/lib/hmac-sha1.c @@ -0,0 +1,81 @@ +/* hmac-sha1.c -- hashed message authentication codes + Copyright (C) 2005-2006, 2009-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 + +#include "hmac.h" + +#include "memxor.h" +#include "sha1.h" + +#include + +#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 0000000..b2eeb7d --- /dev/null +++ b/gnulib/lib/hmac.h @@ -0,0 +1,41 @@ +/* hmac.h -- hashed message authentication codes + Copyright (C) 2005, 2009-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 + +/* 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 0000000..4c261da --- /dev/null +++ b/gnulib/lib/human.c @@ -0,0 +1,470 @@ +/* human.c -- print human readable file size + + Copyright (C) 1996-2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert and Larry McVoy. */ + +#include + +#include "human.h" + +#include +#include +#include +#include + +#include +#include +#include + +/* 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 . */ + +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 0000000..fb8a089 --- /dev/null +++ b/gnulib/lib/human.h @@ -0,0 +1,83 @@ +/* human.h -- print human readable file size + + Copyright (C) 1996-2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert and Larry McVoy. */ + +#ifndef HUMAN_H_ +# define HUMAN_H_ 1 + +# include +# include +# include +# include + +# include + +/* 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 0000000..b603b0b --- /dev/null +++ b/gnulib/lib/i-ring.c @@ -0,0 +1,68 @@ +/* a simple ring buffer + Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Jim Meyering */ + +#include +#include "i-ring.h" + +#include + +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 0000000..ae81f68 --- /dev/null +++ b/gnulib/lib/i-ring.h @@ -0,0 +1,44 @@ +/* definitions for a simple ring buffer + Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include +#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) _GL_ATTRIBUTE_PURE; diff --git a/gnulib/lib/iconv.c b/gnulib/lib/iconv.c new file mode 100644 index 0000000..ecf0d9f --- /dev/null +++ b/gnulib/lib/iconv.c @@ -0,0 +1,450 @@ +/* Character set conversion. + Copyright (C) 1999-2001, 2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 + +/* Specification. */ +#include + +#include + +#if REPLACE_ICONV_UTF +# include +# include +# include +# 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 0000000..6ff3493 --- /dev/null +++ b/gnulib/lib/iconv.in.h @@ -0,0 +1,111 @@ +/* A GNU-like . + + Copyright (C) 2007-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 _@GUARD_PREFIX@_ICONV_H + +#if __GNUC__ >= 3 +@PRAGMA_SYSTEM_HEADER@ +#endif +@PRAGMA_COLUMNS@ + +/* The include_next requires a split double-inclusion guard. */ +#@INCLUDE_NEXT@ @NEXT_ICONV_H@ + +#ifndef _@GUARD_PREFIX@_ICONV_H +#define _@GUARD_PREFIX@_ICONV_H + +/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ + +/* The definition of _GL_ARG_NONNULL is copied here. */ + +/* The definition of _GL_WARN_ON_USE is copied here. */ + + +#if @GNULIB_ICONV@ +# if @REPLACE_ICONV_OPEN@ +/* An iconv_open wrapper that supports the IANA standardized encoding names + ("ISO-8859-1" etc.) as far as possible. */ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define iconv_open rpl_iconv_open +# endif +_GL_FUNCDECL_RPL (iconv_open, iconv_t, + (const char *tocode, const char *fromcode) + _GL_ARG_NONNULL ((1, 2))); +_GL_CXXALIAS_RPL (iconv_open, iconv_t, + (const char *tocode, const char *fromcode)); +# else +_GL_CXXALIAS_SYS (iconv_open, iconv_t, + (const char *tocode, const char *fromcode)); +# endif +_GL_CXXALIASWARN (iconv_open); +#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 @GNULIB_ICONV@ +# if @REPLACE_ICONV@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define iconv rpl_iconv +# endif +_GL_FUNCDECL_RPL (iconv, size_t, + (iconv_t cd, + @ICONV_CONST@ char **inbuf, size_t *inbytesleft, + char **outbuf, size_t *outbytesleft)); +_GL_CXXALIAS_RPL (iconv, size_t, + (iconv_t cd, + @ICONV_CONST@ char **inbuf, size_t *inbytesleft, + char **outbuf, size_t *outbytesleft)); +# else +_GL_CXXALIAS_SYS (iconv, size_t, + (iconv_t cd, + @ICONV_CONST@ char **inbuf, size_t *inbytesleft, + char **outbuf, size_t *outbytesleft)); +# endif +_GL_CXXALIASWARN (iconv); +# ifndef ICONV_CONST +# define ICONV_CONST @ICONV_CONST@ +# endif +#endif + +#if @GNULIB_ICONV@ +# if @REPLACE_ICONV@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define iconv_close rpl_iconv_close +# endif +_GL_FUNCDECL_RPL (iconv_close, int, (iconv_t cd)); +_GL_CXXALIAS_RPL (iconv_close, int, (iconv_t cd)); +# else +_GL_CXXALIAS_SYS (iconv_close, int, (iconv_t cd)); +# endif +_GL_CXXALIASWARN (iconv_close); +#endif + + +#endif /* _@GUARD_PREFIX@_ICONV_H */ +#endif /* _@GUARD_PREFIX@_ICONV_H */ diff --git a/gnulib/lib/iconv_close.c b/gnulib/lib/iconv_close.c new file mode 100644 index 0000000..8061dd0 --- /dev/null +++ b/gnulib/lib/iconv_close.c @@ -0,0 +1,47 @@ +/* Character set conversion. + Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 + +/* Specification. */ +#include + +#include +#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 0000000..6782b99 --- /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 0000000..5a35c83 --- /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 0000000..3672a80 --- /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 0000000..f468ff6 --- /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 0000000..7d7da38 --- /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 0000000..b303169 --- /dev/null +++ b/gnulib/lib/iconv_open.c @@ -0,0 +1,173 @@ +/* Character set conversion. + Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 + +/* Specification. */ +#include + +#include +#include +#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 0000000..7f7286b --- /dev/null +++ b/gnulib/lib/iconveh.h @@ -0,0 +1,41 @@ +/* Character set conversion handler type. + Copyright (C) 2001-2007, 2009-2011 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 . */ + +#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 0000000..9065cc8 --- /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-2011 Free + Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#include "idcache.h" +#include +#include +#include +#include +#include + +#include + +#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 0000000..e7573b8 --- /dev/null +++ b/gnulib/lib/idcache.h @@ -0,0 +1,11 @@ +#ifndef IDCACHE_H +# define IDCACHE_H 1 + +# include + +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 0000000..f4929d4 --- /dev/null +++ b/gnulib/lib/idpriv-drop.c @@ -0,0 +1,129 @@ +/* Dropping uid/gid privileges of the current process permanently. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#include "idpriv.h" + +#include +#include +#include + +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 + + says about setreuid(): "The rule by which the saved uid id is modified + is complicated." Similarly, + 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//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'. + + 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 0000000..801a442 --- /dev/null +++ b/gnulib/lib/idpriv-droptemp.c @@ -0,0 +1,204 @@ +/* Dropping uid/gid privileges of the current process temporarily. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#include "idpriv.h" + +#include +#include +#include +#include + +/* 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 + 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 + 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 0000000..06024c2 --- /dev/null +++ b/gnulib/lib/idpriv.h @@ -0,0 +1,116 @@ +/* Dropping uid/gid privileges of the current process. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#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 + + * Dan Tsafrir, Dilma da Silva, David Wagner: The Murky Issue of Changing + Process Identity: Revising "Setuid Demystified" + + + * Dhruv Mohindra: 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 0000000..f021a1a --- /dev/null +++ b/gnulib/lib/ignore-value.h @@ -0,0 +1,62 @@ +/* ignore a function return without a compiler warning + + Copyright (C) 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Jim Meyering, Eric Blake and Pádraig Brady. */ + +/* Use "ignore_value" 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". */ + +#ifndef _GL_IGNORE_VALUE_H +# define _GL_IGNORE_VALUE_H + +# ifndef _GL_ATTRIBUTE_DEPRECATED +/* The __attribute__((__deprecated__)) feature + is available in gcc versions 3.1 and newer. */ +# if __GNUC__ < 3 || (__GNUC__ == 3 && __GNUC_MINOR__ < 1) +# define _GL_ATTRIBUTE_DEPRECATED /* empty */ +# else +# define _GL_ATTRIBUTE_DEPRECATED __attribute__ ((__deprecated__)) +# endif +# endif + +/* The __attribute__((__warn_unused_result__)) feature + is available in gcc versions 3.4 and newer, + while the typeof feature has been available since 2.7 at least. */ +# if __GNUC__ < 3 || (__GNUC__ == 3 && __GNUC_MINOR__ < 4) +# define ignore_value(x) ((void) (x)) +# else +# define ignore_value(x) (({ __typeof__ (x) __x = (x); (void) __x; })) +# endif + +/* ignore_value works for scalars, pointers and aggregates; + deprecate ignore_ptr. */ +static inline void _GL_ATTRIBUTE_DEPRECATED +ignore_ptr (void *p) { (void) p; } /* deprecated: use ignore_value */ + +#endif diff --git a/gnulib/lib/imaxabs.c b/gnulib/lib/imaxabs.c new file mode 100644 index 0000000..f36bb21 --- /dev/null +++ b/gnulib/lib/imaxabs.c @@ -0,0 +1,26 @@ +/* imaxabs() function: absolute value of 'intmax_t'. + Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +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 0000000..4d25a8a --- /dev/null +++ b/gnulib/lib/imaxdiv.c @@ -0,0 +1,63 @@ +/* imaxdiv() function: division of 'intmax_t'. + Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include + +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 . + 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 0000000..b91ac98 --- /dev/null +++ b/gnulib/lib/imaxtostr.c @@ -0,0 +1,3 @@ +#define anytostr imaxtostr +#define inttype intmax_t +#include "anytostr.c" diff --git a/gnulib/lib/inet_ntop.c b/gnulib/lib/inet_ntop.c new file mode 100644 index 0000000..6b80174 --- /dev/null +++ b/gnulib/lib/inet_ntop.c @@ -0,0 +1,249 @@ +/* inet_ntop.c -- convert IPv4 and IPv6 addresses from binary to text form + + Copyright (C) 2005-2006, 2008-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 + +/* Specification. */ +#include + +#if HAVE_DECL_INET_NTOP + +# undef inet_ntop + +const char * +rpl_inet_ntop (int af, const void *restrict src, + char *restrict dst, socklen_t cnt) +{ + return inet_ntop (af, src, dst, cnt); +} + +#else + +# include +# include +# include + +# 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[4 <= sizeof (int) ? 1 : -1]; + +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 + +#endif diff --git a/gnulib/lib/inet_pton.c b/gnulib/lib/inet_pton.c new file mode 100644 index 0000000..cb1a872 --- /dev/null +++ b/gnulib/lib/inet_pton.c @@ -0,0 +1,268 @@ +/* inet_pton.c -- convert IPv4 and IPv6 addresses from text to binary form + + Copyright (C) 2006, 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* + * 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 + +/* Specification. */ +#include + +#if HAVE_DECL_INET_PTON + +# undef inet_pton + +int +rpl_inet_pton (int af, const char *restrict src, void *restrict dst) +{ + return inet_pton (af, src, dst); +} + +#else + +# include +# include +# include + +# 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 + +#endif diff --git a/gnulib/lib/ino-map.c b/gnulib/lib/ino-map.c new file mode 100644 index 0000000..9133a19 --- /dev/null +++ b/gnulib/lib/ino-map.c @@ -0,0 +1,164 @@ +/* Map an ino_t inode number to a small integer. + + Copyright 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Paul Eggert and Jim Meyering */ + +#include +#include "ino-map.h" + +#include "hash.h" +#include "verify.h" + +#include +#include + +/* A pair that maps an inode number to a mapped inode number; the + latter is a small unique ID for the former. */ +struct ino_map_ent +{ + ino_t ino; + size_t mapped_ino; +}; + +/* A table that manages and indexes these pairs. */ +struct ino_map +{ + /* A table of KEY,VAL pairs, where KEY is the raw ino_t value and + VAL is the small number that it maps to. */ + struct hash_table *map; + + /* The next mapped inode number to hand out. */ + size_t next_mapped_ino; + + /* Cache of the most recently allocated and otherwise-unused storage + for probing the table. */ + struct ino_map_ent *probe; +}; + +/* Hash an inode map entry. */ +static size_t +ino_hash (void const *x, size_t table_size) +{ + struct ino_map_ent const *p = x; + ino_t ino = p->ino; + + /* When INO is wider than size_t, exclusive-OR the words of INO into H. + This avoids loss of info, without applying % to the wider type, + which could be quite slow on some systems. */ + size_t h = ino; + unsigned int i; + unsigned int n_words = sizeof ino / sizeof h + (sizeof ino % sizeof h != 0); + for (i = 1; i < n_words; i++) + h ^= ino >> CHAR_BIT * sizeof h * i; + + return h % table_size; +} + +/* Return true if two inode map entries are the same. */ +static bool +ino_compare (void const *x, void const *y) +{ + struct ino_map_ent const *a = x; + struct ino_map_ent const *b = y; + return a->ino == b->ino; +} + +/* Allocate an inode map that will hand out integers starting with + NEXT_MAPPED_INO. Return NULL if memory is exhausted. */ +struct ino_map * +ino_map_alloc (size_t next_mapped_ino) +{ + struct ino_map *im = malloc (sizeof *im); + + if (im) + { + enum { INITIAL_INO_MAP_TABLE_SIZE = 1021 }; + im->map = hash_initialize (INITIAL_INO_MAP_TABLE_SIZE, NULL, + ino_hash, ino_compare, free); + if (! im->map) + { + free (im); + return NULL; + } + im->next_mapped_ino = next_mapped_ino; + im->probe = NULL; + } + + return im; +} + +/* Free an inode map. */ +void +ino_map_free (struct ino_map *map) +{ + hash_free (map->map); + free (map->probe); + free (map); +} + + +/* Insert into MAP the inode number INO if it's not there already, + and return its nonnegative mapped inode number. + If INO is already in MAP, return the existing mapped inode number. + Return INO_MAP_INSERT_FAILURE on memory or counter exhaustion. */ +size_t +ino_map_insert (struct ino_map *im, ino_t ino) +{ + struct ino_map_ent *ent; + + /* Find space for the probe, reusing the cache if available. */ + struct ino_map_ent *probe = im->probe; + if (probe) + { + /* If repeating a recent query, return the cached result. */ + if (probe->ino == ino) + return probe->mapped_ino; + } + else + { + im->probe = probe = malloc (sizeof *probe); + if (! probe) + return INO_MAP_INSERT_FAILURE; + } + + probe->ino = ino; + ent = hash_insert (im->map, probe); + if (! ent) + return INO_MAP_INSERT_FAILURE; + + if (ent != probe) + { + /* Use the existing entry. */ + probe->mapped_ino = ent->mapped_ino; + } + else + { + /* If adding 1 to map->next_mapped_ino would cause it to + overflow to zero, then it must equal INO_MAP_INSERT_FAILURE, + which is the value that should be returned in that case. + Verify that this works. */ + verify (INO_MAP_INSERT_FAILURE + 1 == 0); + + /* Prepare to allocate a new probe next time; this one is in use. */ + im->probe = NULL; + + /* INO is new; allocate a mapped inode number for it. */ + probe->mapped_ino = im->next_mapped_ino++; + } + + return probe->mapped_ino; +} diff --git a/gnulib/lib/ino-map.h b/gnulib/lib/ino-map.h new file mode 100644 index 0000000..b742291 --- /dev/null +++ b/gnulib/lib/ino-map.h @@ -0,0 +1,19 @@ +#ifndef _GL_INO_MAP_H +# define _GL_INO_MAP_H + +# include + +# undef _GL_ATTRIBUTE_NONNULL +# if __GNUC__ == 3 && __GNUC_MINOR__ >= 3 || 3 < __GNUC__ +# define _GL_ATTRIBUTE_NONNULL(m) __attribute__ ((__nonnull__ (m))) +# else +# define _GL_ATTRIBUTE_NONNULL(m) +# endif + +# define INO_MAP_INSERT_FAILURE ((size_t) -1) + +struct ino_map *ino_map_alloc (size_t); +void ino_map_free (struct ino_map *) _GL_ATTRIBUTE_NONNULL (1); +size_t ino_map_insert (struct ino_map *, ino_t) _GL_ATTRIBUTE_NONNULL (1); + +#endif diff --git a/gnulib/lib/integer_length.c b/gnulib/lib/integer_length.c new file mode 100644 index 0000000..e5ab665 --- /dev/null +++ b/gnulib/lib/integer_length.c @@ -0,0 +1,141 @@ +/* integer_length - find most significant bit in an 'unsigned int'. + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible , 2011. */ + +#include + +/* Specification. */ +#include "integer_length.h" + +#include + +#include "float+.h" + +#define NBITS (sizeof (unsigned int) * CHAR_BIT) + +int +integer_length (unsigned int x) +{ +#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) + if (x == 0) + return 0; + else + return NBITS - __builtin_clz (x); +#else +# if defined DBL_EXPBIT0_WORD && defined DBL_EXPBIT0_BIT + if (NBITS <= DBL_MANT_BIT) + { + /* Use 'double' operations. + Assumes an IEEE 754 'double' implementation. */ +# define DBL_EXP_MASK ((DBL_MAX_EXP - DBL_MIN_EXP) | 7) +# define DBL_EXP_BIAS (DBL_EXP_MASK / 2 - 1) +# define NWORDS \ + ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) + typedef union { double value; unsigned int word[NWORDS]; } + memory_double; + + if (x == 0) + return 0; + else + { + memory_double m; + unsigned int exponent; + + if (1) + { + /* Use a single integer to floating-point conversion. */ + m.value = x; + } + else + { + /* Use a single floating-point subtraction. */ + /* 2^(DBL_MANT_DIG-1). */ + static const double TWO_DBL_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 - 1) / 5)) + * (double) (1U << ((DBL_MANT_DIG - 1 + 1) / 5)) + * (double) (1U << ((DBL_MANT_DIG - 1 + 2) / 5)) + * (double) (1U << ((DBL_MANT_DIG - 1 + 3) / 5)) + * (double) (1U << ((DBL_MANT_DIG - 1 + 4) / 5)); + + /* Construct 2^(DBL_MANT_DIG-1) + x by hand. */ + m.word[DBL_EXPBIT0_WORD] = + (DBL_MANT_DIG + DBL_EXP_BIAS) << DBL_EXPBIT0_BIT; + m.word[1 - DBL_EXPBIT0_WORD] = x; + + /* Subtract 2^(DBL_MANT_DIG-1). */ + m.value = m.value - TWO_DBL_MANT_DIG; + } + + exponent = + (m.word[DBL_EXPBIT0_WORD] >> DBL_EXPBIT0_BIT) & DBL_EXP_MASK; + return exponent - DBL_EXP_BIAS; + } + } + else +# endif + if (NBITS == 32) + { + /* 6 comparisons. */ + if (x != 0) + { + int result = 1; + if (x >= 0x10000) + { + x = x >> 16; + result += 16; + } + if (x >= 0x100) + { + x = x >> 8; + result += 8; + } + if (x >= 0x10) + { + x = x >> 4; + result += 4; + } + if (x >= 0x4) + { + x = x >> 2; + result += 2; + } + if (x >= 0x2) + { + x = x >> 1; + result += 1; + } + return result; + } + else + return 0; + } + else + { + /* Naive loop. + Works for any value of NBITS. */ + int j; + + for (j = NBITS - 1; j >= 0; j--) + if (x & (1U << j)) + return j + 1; + return 0; + } +#endif +} diff --git a/gnulib/lib/integer_length.h b/gnulib/lib/integer_length.h new file mode 100644 index 0000000..d51130f --- /dev/null +++ b/gnulib/lib/integer_length.h @@ -0,0 +1,49 @@ +/* integer_length - find most significant bit in an unsigned integer. + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible , 2011. */ + +#ifndef _INTEGER_LENGTH_H +#define _INTEGER_LENGTH_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* These functions return the minimum number of bits required to represent + the given unsigned integer. + For non-zero values, this is the position of the most significant bit + that is set, plus one. For zero, it is 0. */ + +/* Returns the integer length of x. + The result is >= 0, <= sizeof (unsigned int) * CHAR_BIT. */ +extern int integer_length (unsigned int x); + +/* Returns the integer length of x. + The result is >= 0, <= sizeof (unsigned long) * CHAR_BIT. */ +extern int integer_length_l (unsigned long x); + +#if HAVE_UNSIGNED_LONG_LONG_INT +/* Returns the integer length of x. + The result is >= 0, <= sizeof (unsigned long long) * CHAR_BIT. */ +extern int integer_length_ll (unsigned long long x); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* _INTEGER_LENGTH_H */ diff --git a/gnulib/lib/integer_length_l.c b/gnulib/lib/integer_length_l.c new file mode 100644 index 0000000..483e023 --- /dev/null +++ b/gnulib/lib/integer_length_l.c @@ -0,0 +1,81 @@ +/* integer_length_l - find most significant bit in an 'unsigned long'. + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible , 2011. */ + +#include + +/* Specification. */ +#include "integer_length.h" + +#include +#include + +#undef MIN +#define MIN(a,b) ((a) < (b) ? (a) : (b)) + +#ifdef USE_LONG_LONG +# define FUNC integer_length_ll +# define TYPE unsigned long long +# define GCC_BUILTIN __builtin_clzll +#else +# define FUNC integer_length_l +# define TYPE unsigned long +# define GCC_BUILTIN __builtin_clzl +#endif + +#define NBITS (sizeof (TYPE) * CHAR_BIT) + +/* Modify shift count to be in bounds, even in dead code, otherwise GCC + emits warnings "right shift count >= width of type". */ +#define MSC(i) MIN (i, NBITS - 1) + +int +FUNC (TYPE x) +{ +#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) + if (x == 0) + return 0; + else + return NBITS - GCC_BUILTIN (x); +#else + /* Split x into chunks, and look at one chunk after the other. */ + if (sizeof (TYPE) > 2 * sizeof (unsigned int)) + { + /* Generic loop. */ + size_t i; + + for (i = (sizeof (TYPE) - 1) / sizeof (unsigned int); i >= 2; i--) + { + unsigned int y = x >> (i * sizeof (unsigned int) * CHAR_BIT); + if (y != 0) + return i * sizeof (unsigned int) * CHAR_BIT + integer_length (y); + } + } + + /* Unrolled the last 2 loop rounds. */ + /* i = 1 */ + if (sizeof (TYPE) > 1 * sizeof (unsigned int)) + { + unsigned int y = x >> MSC (1 * sizeof (unsigned int) * CHAR_BIT); + if (y != 0) + return 1 * sizeof (unsigned int) * CHAR_BIT + integer_length (y); + } + + /* i = 0 */ + return integer_length ((unsigned int) x); +#endif +} diff --git a/gnulib/lib/integer_length_ll.c b/gnulib/lib/integer_length_ll.c new file mode 100644 index 0000000..c380486 --- /dev/null +++ b/gnulib/lib/integer_length_ll.c @@ -0,0 +1,20 @@ +/* integer_length_ll - find most significant bit in an 'unsigned long long'. + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible , 2011. */ + +#define USE_LONG_LONG +#include "integer_length_l.c" diff --git a/gnulib/lib/intprops.h b/gnulib/lib/intprops.h new file mode 100644 index 0000000..1f6a539 --- /dev/null +++ b/gnulib/lib/intprops.h @@ -0,0 +1,319 @@ +/* intprops.h -- properties of integer types + + Copyright (C) 2001-2005, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +#ifndef _GL_INTPROPS_H +#define _GL_INTPROPS_H + +#include + +/* Return an integer value, converted to the same type as the integer + expression E after integer type promotion. V is the unconverted value. */ +#define _GL_INT_CONVERT(e, v) (0 * (e) + (v)) + +/* Act like _GL_INT_CONVERT (E, -V) but work around a bug in IRIX 6.5 cc; see + . */ +#define _GL_INT_NEGATE_CONVERT(e, v) (0 * (e) - (v)) + +/* 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 signed integer expression E uses two's complement. */ +#define _GL_INT_TWOS_COMPLEMENT(e) (~ _GL_INT_CONVERT (e, 0) == -1) + +/* True if the arithmetic type T is signed. */ +#define TYPE_SIGNED(t) (! ((t) 0 < (t) -1)) + +/* Return 1 if the integer expression E, after integer promotion, has + a signed type. */ +#define _GL_INT_SIGNED(e) (_GL_INT_NEGATE_CONVERT (e, 1) < 0) + + +/* Minimum and maximum values for integer types and expressions. 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. */ + +/* The maximum and minimum values for the integer type T. */ +#define TYPE_MINIMUM(t) \ + ((t) (! TYPE_SIGNED (t) \ + ? (t) 0 \ + : TYPE_SIGNED_MAGNITUDE (t) \ + ? ~ (t) 0 \ + : ~ TYPE_MAXIMUM (t))) +#define TYPE_MAXIMUM(t) \ + ((t) (! TYPE_SIGNED (t) \ + ? (t) -1 \ + : ((((t) 1 << (sizeof (t) * CHAR_BIT - 2)) - 1) * 2 + 1))) + +/* The maximum and minimum values for the type of the expression E, + after integer promotion. E should not have side effects. */ +#define _GL_INT_MINIMUM(e) \ + (_GL_INT_SIGNED (e) \ + ? - _GL_INT_TWOS_COMPLEMENT (e) - _GL_SIGNED_INT_MAXIMUM (e) \ + : _GL_INT_CONVERT (e, 0)) +#define _GL_INT_MAXIMUM(e) \ + (_GL_INT_SIGNED (e) \ + ? _GL_SIGNED_INT_MAXIMUM (e) \ + : _GL_INT_NEGATE_CONVERT (e, 1)) +#define _GL_SIGNED_INT_MAXIMUM(e) \ + (((_GL_INT_CONVERT (e, 1) << (sizeof ((e) + 0) * CHAR_BIT - 2)) - 1) * 2 + 1) + + +/* Return 1 if the __typeof__ keyword works. This could be done by + 'configure', but for now it's easier to do it by hand. */ +#if 2 <= __GNUC__ || 0x5110 <= __SUNPRO_C +# define _GL_HAVE___TYPEOF__ 1 +#else +# define _GL_HAVE___TYPEOF__ 0 +#endif + +/* Return 1 if the integer type or expression T might be signed. Return 0 + if it is definitely unsigned. This macro does not evaluate its argument, + and expands to an integer constant expression. */ +#if _GL_HAVE___TYPEOF__ +# define _GL_SIGNED_TYPE_OR_EXPR(t) TYPE_SIGNED (__typeof__ (t)) +#else +# define _GL_SIGNED_TYPE_OR_EXPR(t) 1 +#endif + +/* Bound on length of the string representing an unsigned integer + value representable in B bits. log10 (2.0) < 146/485. The + smallest value of B where this bound is not tight is 2621. */ +#define INT_BITS_STRLEN_BOUND(b) (((b) * 146 + 484) / 485) + +/* Bound on length of the string representing an integer type or expression T. + Subtract 1 for the sign bit if T is signed, and then add 1 more for + a minus sign if needed. + + Because _GL_SIGNED_TYPE_OR_EXPR sometimes returns 0 when its argument is + signed, this macro may overestimate the true bound by one byte when + applied to unsigned types of size 2, 4, 16, ... bytes. */ +#define INT_STRLEN_BOUND(t) \ + (INT_BITS_STRLEN_BOUND (sizeof (t) * CHAR_BIT \ + - _GL_SIGNED_TYPE_OR_EXPR (t)) \ + + _GL_SIGNED_TYPE_OR_EXPR (t)) + +/* 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) + + +/* Range overflow checks. + + The INT__RANGE_OVERFLOW macros return 1 if the corresponding C + operators might not yield numerically correct answers due to + arithmetic overflow. They do not rely on undefined or + implementation-defined behavior. Their implementations are simple + and straightforward, but they are a bit harder to use than the + INT__OVERFLOW macros described below. + + Example usage: + + long int i = ...; + long int j = ...; + if (INT_MULTIPLY_RANGE_OVERFLOW (i, j, LONG_MIN, LONG_MAX)) + printf ("multiply would overflow"); + else + printf ("product is %ld", i * j); + + Restrictions on *_RANGE_OVERFLOW macros: + + These macros do not check for all possible numerical problems or + undefined or unspecified behavior: they do not check for division + by zero, for bad shift counts, or for shifting negative numbers. + + These macros may evaluate their arguments zero or multiple times, + so the arguments should not have side effects. The arithmetic + arguments (including the MIN and MAX arguments) must be of the same + integer type after the usual arithmetic conversions, and the type + must have minimum value MIN and maximum MAX. Unsigned types should + use a zero MIN of the proper type. + + These macros are tuned for constant MIN and MAX. For commutative + operations such as A + B, they are also tuned for constant B. */ + +/* Return 1 if A + B would overflow in [MIN,MAX] arithmetic. + See above for restrictions. */ +#define INT_ADD_RANGE_OVERFLOW(a, b, min, max) \ + ((b) < 0 \ + ? (a) < (min) - (b) \ + : (max) - (b) < (a)) + +/* Return 1 if A - B would overflow in [MIN,MAX] arithmetic. + See above for restrictions. */ +#define INT_SUBTRACT_RANGE_OVERFLOW(a, b, min, max) \ + ((b) < 0 \ + ? (max) + (b) < (a) \ + : (a) < (min) + (b)) + +/* Return 1 if - A would overflow in [MIN,MAX] arithmetic. + See above for restrictions. */ +#define INT_NEGATE_RANGE_OVERFLOW(a, min, max) \ + ((min) < 0 \ + ? (a) < - (max) \ + : 0 < (a)) + +/* Return 1 if A * B would overflow in [MIN,MAX] arithmetic. + See above for restrictions. Avoid && and || as they tickle + bugs in Sun C 5.11 2010/08/13 and other compilers; see + . */ +#define INT_MULTIPLY_RANGE_OVERFLOW(a, b, min, max) \ + ((b) < 0 \ + ? ((a) < 0 \ + ? (a) < (max) / (b) \ + : (b) == -1 \ + ? 0 \ + : (min) / (b) < (a)) \ + : (b) == 0 \ + ? 0 \ + : ((a) < 0 \ + ? (a) < (min) / (b) \ + : (max) / (b) < (a))) + +/* Return 1 if A / B would overflow in [MIN,MAX] arithmetic. + See above for restrictions. Do not check for division by zero. */ +#define INT_DIVIDE_RANGE_OVERFLOW(a, b, min, max) \ + ((min) < 0 && (b) == -1 && (a) < - (max)) + +/* Return 1 if A % B would overflow in [MIN,MAX] arithmetic. + See above for restrictions. Do not check for division by zero. + Mathematically, % should never overflow, but on x86-like hosts + INT_MIN % -1 traps, and the C standard permits this, so treat this + as an overflow too. */ +#define INT_REMAINDER_RANGE_OVERFLOW(a, b, min, max) \ + INT_DIVIDE_RANGE_OVERFLOW (a, b, min, max) + +/* Return 1 if A << B would overflow in [MIN,MAX] arithmetic. + See above for restrictions. Here, MIN and MAX are for A only, and B need + not be of the same type as the other arguments. The C standard says that + behavior is undefined for shifts unless 0 <= B < wordwidth, and that when + A is negative then A << B has undefined behavior and A >> B has + implementation-defined behavior, but do not check these other + restrictions. */ +#define INT_LEFT_SHIFT_RANGE_OVERFLOW(a, b, min, max) \ + ((a) < 0 \ + ? (a) < (min) >> (b) \ + : (max) >> (b) < (a)) + + +/* The _GL*_OVERFLOW macros have the same restrictions as the + *_RANGE_OVERFLOW macros, except that they do not assume that operands + (e.g., A and B) have the same type as MIN and MAX. Instead, they assume + that the result (e.g., A + B) has that type. */ +#define _GL_ADD_OVERFLOW(a, b, min, max) \ + ((min) < 0 ? INT_ADD_RANGE_OVERFLOW (a, b, min, max) \ + : (a) < 0 ? (b) <= (a) + (b) \ + : (b) < 0 ? (a) <= (a) + (b) \ + : (a) + (b) < (b)) +#define _GL_SUBTRACT_OVERFLOW(a, b, min, max) \ + ((min) < 0 ? INT_SUBTRACT_RANGE_OVERFLOW (a, b, min, max) \ + : (a) < 0 ? 1 \ + : (b) < 0 ? (a) - (b) <= (a) \ + : (a) < (b)) +#define _GL_MULTIPLY_OVERFLOW(a, b, min, max) \ + (((min) == 0 && (((a) < 0 && 0 < (b)) || ((b) < 0 && 0 < (a)))) \ + || INT_MULTIPLY_RANGE_OVERFLOW (a, b, min, max)) +#define _GL_DIVIDE_OVERFLOW(a, b, min, max) \ + ((min) < 0 ? (b) == _GL_INT_NEGATE_CONVERT (min, 1) && (a) < - (max) \ + : (a) < 0 ? (b) <= (a) + (b) - 1 \ + : (b) < 0 && (a) + (b) <= (a)) +#define _GL_REMAINDER_OVERFLOW(a, b, min, max) \ + ((min) < 0 ? (b) == _GL_INT_NEGATE_CONVERT (min, 1) && (a) < - (max) \ + : (a) < 0 ? (a) % (b) != ((max) - (b) + 1) % (b) \ + : (b) < 0 && ! _GL_UNSIGNED_NEG_MULTIPLE (a, b, max)) + +/* Return a nonzero value if A is a mathematical multiple of B, where + A is unsigned, B is negative, and MAX is the maximum value of A's + type. A's type must be the same as (A % B)'s type. Normally (A % + -B == 0) suffices, but things get tricky if -B would overflow. */ +#define _GL_UNSIGNED_NEG_MULTIPLE(a, b, max) \ + (((b) < -_GL_SIGNED_INT_MAXIMUM (b) \ + ? (_GL_SIGNED_INT_MAXIMUM (b) == (max) \ + ? (a) \ + : (a) % (_GL_INT_CONVERT (a, _GL_SIGNED_INT_MAXIMUM (b)) + 1)) \ + : (a) % - (b)) \ + == 0) + + +/* Integer overflow checks. + + The INT__OVERFLOW macros return 1 if the corresponding C operators + might not yield numerically correct answers due to arithmetic overflow. + They work correctly on all known practical hosts, and do not rely + on undefined behavior due to signed arithmetic overflow. + + Example usage: + + long int i = ...; + long int j = ...; + if (INT_MULTIPLY_OVERFLOW (i, j)) + printf ("multiply would overflow"); + else + printf ("product is %ld", i * j); + + These macros do not check for all possible numerical problems or + undefined or unspecified behavior: they do not check for division + by zero, for bad shift counts, or for shifting negative numbers. + + These macros may evaluate their arguments zero or multiple times, so the + arguments should not have side effects. + + These macros are tuned for their last argument being a constant. + + Return 1 if the integer expressions A * B, A - B, -A, A * B, A / B, + A % B, and A << B would overflow, respectively. */ + +#define INT_ADD_OVERFLOW(a, b) \ + _GL_BINARY_OP_OVERFLOW (a, b, _GL_ADD_OVERFLOW) +#define INT_SUBTRACT_OVERFLOW(a, b) \ + _GL_BINARY_OP_OVERFLOW (a, b, _GL_SUBTRACT_OVERFLOW) +#define INT_NEGATE_OVERFLOW(a) \ + INT_NEGATE_RANGE_OVERFLOW (a, _GL_INT_MINIMUM (a), _GL_INT_MAXIMUM (a)) +#define INT_MULTIPLY_OVERFLOW(a, b) \ + _GL_BINARY_OP_OVERFLOW (a, b, _GL_MULTIPLY_OVERFLOW) +#define INT_DIVIDE_OVERFLOW(a, b) \ + _GL_BINARY_OP_OVERFLOW (a, b, _GL_DIVIDE_OVERFLOW) +#define INT_REMAINDER_OVERFLOW(a, b) \ + _GL_BINARY_OP_OVERFLOW (a, b, _GL_REMAINDER_OVERFLOW) +#define INT_LEFT_SHIFT_OVERFLOW(a, b) \ + INT_LEFT_SHIFT_RANGE_OVERFLOW (a, b, \ + _GL_INT_MINIMUM (a), _GL_INT_MAXIMUM (a)) + +/* Return 1 if the expression A B would overflow, + where OP_RESULT_OVERFLOW (A, B, MIN, MAX) does the actual test, + assuming MIN and MAX are the minimum and maximum for the result type. + Arguments should be free of side effects. */ +#define _GL_BINARY_OP_OVERFLOW(a, b, op_result_overflow) \ + op_result_overflow (a, b, \ + _GL_INT_MINIMUM (0 * (b) + (a)), \ + _GL_INT_MAXIMUM (0 * (b) + (a))) + +#endif /* _GL_INTPROPS_H */ diff --git a/gnulib/lib/inttostr.c b/gnulib/lib/inttostr.c new file mode 100644 index 0000000..c96b5ca --- /dev/null +++ b/gnulib/lib/inttostr.c @@ -0,0 +1,3 @@ +#define anytostr inttostr +#define inttype int +#include "anytostr.c" diff --git a/gnulib/lib/inttostr.h b/gnulib/lib/inttostr.h new file mode 100644 index 0000000..1825f56 --- /dev/null +++ b/gnulib/lib/inttostr.h @@ -0,0 +1,46 @@ +/* inttostr.h -- convert integers to printable strings + + Copyright (C) 2001-2006, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert */ + +#include +#include + +#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 *imaxtostr (intmax_t, char *) __attribute_warn_unused_result__; +char *inttostr (int, char *) __attribute_warn_unused_result__; +char *offtostr (off_t, char *) __attribute_warn_unused_result__; +char *uinttostr (unsigned int, char *) __attribute_warn_unused_result__; +char *umaxtostr (uintmax_t, char *) __attribute_warn_unused_result__; diff --git a/gnulib/lib/inttypes.in.h b/gnulib/lib/inttypes.in.h new file mode 100644 index 0000000..f7c489a --- /dev/null +++ b/gnulib/lib/inttypes.in.h @@ -0,0 +1,1112 @@ +/* Copyright (C) 2006-2011 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 . */ + +/* + * ISO C 99 for platforms that lack it. + * + */ + +#if __GNUC__ >= 3 +@PRAGMA_SYSTEM_HEADER@ +#endif +@PRAGMA_COLUMNS@ + +/* Include the original 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@ + + /* Some pre-C++11 implementations need this. */ +# if defined __cplusplus && ! defined __STDC_FORMAT_MACROS +# define __STDC_FORMAT_MACROS 1 +# endif + +# @INCLUDE_NEXT@ @NEXT_INTTYPES_H@ +# endif +#endif + +#if ! defined INTTYPES_H && ! defined _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H +#define INTTYPES_H + +/* Include or the gnulib replacement. + But avoid namespace pollution on glibc systems. */ +#ifndef __GLIBC__ +# include +#endif +/* Get CHAR_BIT. */ +#include + +#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 ." +#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 _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 + +/* 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@ +# if !GNULIB_defined_imaxdiv_t +typedef struct { intmax_t quot; intmax_t rem; } imaxdiv_t; +# define GNULIB_defined_imaxdiv_t 1 +# endif +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@ +# undef 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@ +# undef 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 0000000..c6ba989 --- /dev/null +++ b/gnulib/lib/ioctl.c @@ -0,0 +1,79 @@ +/* ioctl.c --- wrappers for Windows ioctl function + + Copyright (C) 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paolo Bonzini */ + +#include + +#include + +#include + +#if HAVE_IOCTL + +/* Provide a wrapper with the POSIX prototype. */ +# undef ioctl +int +rpl_ioctl (int fd, int request, ... /* {void *,char *} arg */) +{ + void *buf; + va_list args; + + va_start (args, request); + buf = va_arg (args, void *); + va_end (args); + + /* Cast 'request' so that when the system's ioctl function takes a 64-bit + request argument, the value gets zero-extended, not sign-extended. */ + return ioctl (fd, (unsigned int) request, buf); +} + +#else /* mingw */ + +# include + +# include "fd-hook.h" + +static int +primary_ioctl (int fd, int request, void *arg) +{ + /* We don't support FIONBIO on pipes here. If you want to make pipe + fds non-blocking, use the gnulib 'nonblocking' module, until + gnulib implements fcntl F_GETFL / F_SETFL with O_NONBLOCK. */ + + errno = ENOSYS; + return -1; +} + +int +ioctl (int fd, int request, ... /* {void *,char *} arg */) +{ + void *arg; + va_list args; + + va_start (args, request); + arg = va_arg (args, void *); + va_end (args); + +# if WINDOWS_SOCKETS + return execute_all_ioctl_hooks (primary_ioctl, fd, request, arg); +# else + return primary_ioctl (fd, request, arg); +# endif +} + +#endif diff --git a/gnulib/lib/isapipe.c b/gnulib/lib/isapipe.c new file mode 100644 index 0000000..f6e16d1 --- /dev/null +++ b/gnulib/lib/isapipe.c @@ -0,0 +1,119 @@ +/* Test whether a file descriptor is a pipe. + + Copyright (C) 2006, 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +#include + +#include "isapipe.h" + +#include + +#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ +/* Windows platforms. */ + +/* Get GetFileType. */ +# include + +/* Get _get_osfhandle. */ +# include "msvc-nothrow.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 +# include +# include +# include + +/* 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 0000000..c108e30 --- /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 0000000..65cc54f --- /dev/null +++ b/gnulib/lib/isblank.c @@ -0,0 +1,33 @@ +/* Test whether a character is a blank. + + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +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 0000000..77cd7a2 --- /dev/null +++ b/gnulib/lib/isdir.c @@ -0,0 +1,33 @@ +/* isdir.c -- determine whether a directory exists + + Copyright (C) 1990, 1998, 2006, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#include "isdir.h" + +#include +#include + +/* 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 0000000..80116bc --- /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 0000000..310ac2c --- /dev/null +++ b/gnulib/lib/isfinite.c @@ -0,0 +1,52 @@ +/* Test for finite value (zero, subnormal, or normal, and not infinite or NaN). + Copyright (C) 2007-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 , 2007. */ + +#include + +#include "isnanf-nolibm.h" +#include "isnand-nolibm.h" +#include "isnanl-nolibm.h" + +/* The "cc" compiler on HP-UX 11.11, when optimizing, simplifies the test + x - y == 0.0 to x == y, a simplification which is invalid when x and y + are Infinity. Disable this optimization. */ +#if defined __hpux && !defined __GNUC__ +static float zerof; +static double zerod; +static long double zerol; +#else +# define zerof 0.f +# define zerod 0. +# define zerol 0.L +#endif + +int gl_isfinitef (float x) +{ + return !isnanf (x) && x - x == zerof; +} + +int gl_isfinited (double x) +{ + return !isnand (x) && x - x == zerod; +} + +int gl_isfinitel (long double x) +{ + return !isnanl (x) && x - x == zerol; +} diff --git a/gnulib/lib/isinf.c b/gnulib/lib/isinf.c new file mode 100644 index 0000000..7ccca79 --- /dev/null +++ b/gnulib/lib/isinf.c @@ -0,0 +1,40 @@ +/* Test for positive or negative infinity. + Copyright (C) 2007-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 , 2008. */ + +#include + +#include + +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 0000000..db0c685 --- /dev/null +++ b/gnulib/lib/isnan.c @@ -0,0 +1,177 @@ +/* Test for NaN that does not need libm. + Copyright (C) 2007-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible , 2007. */ + +#include + +/* Specification. */ +#ifdef USE_LONG_DOUBLE +/* Specification found in math.h or isnanl-nolibm.h. */ +extern int rpl_isnanl (long double x) _GL_ATTRIBUTE_CONST; +#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 +#include + +#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_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE + /* 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 __ICC || defined _MSC_VER \ + || defined __DECC || defined __TINYC__ \ + || (defined __sgi && !defined __GNUC__) + /* The Sun C 5.0, Intel ICC 10.0, Microsoft Visual C/C++ 9.0, Compaq (ex-DEC) + 6.4, and TinyCC compilers don't recognize the initializers as constant + expressions. The Compaq compiler also fails when constant-folding + 0.0 / 0.0 even when constant-folding is not required. The Microsoft + Visual C/C++ compiler also fails when constant-folding 1.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) / zero; + DOUBLE minus_inf = -L_(1.0) / zero; + 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_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE + /* 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 0000000..4c49c32 --- /dev/null +++ b/gnulib/lib/isnand-nolibm.h @@ -0,0 +1,33 @@ +/* Test for NaN that does not need libm. + Copyright (C) 2007-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#if HAVE_ISNAND_IN_LIBC +/* Get declaration of isnan macro. */ +# include +# 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 0000000..c47ff25 --- /dev/null +++ b/gnulib/lib/isnand.c @@ -0,0 +1,19 @@ +/* Test for NaN that does not need libm. + Copyright (C) 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible , 2008. */ + +#include "isnan.c" diff --git a/gnulib/lib/isnanf-nolibm.h b/gnulib/lib/isnanf-nolibm.h new file mode 100644 index 0000000..1a1cbf9 --- /dev/null +++ b/gnulib/lib/isnanf-nolibm.h @@ -0,0 +1,33 @@ +/* Test for NaN that does not need libm. + Copyright (C) 2007-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#if HAVE_ISNANF_IN_LIBC +/* Get declaration of isnan macro or (older) isnanf function. */ +# include +# 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 0000000..adb7059 --- /dev/null +++ b/gnulib/lib/isnanf.c @@ -0,0 +1,20 @@ +/* Test for NaN that does not need libm. + Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible , 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 0000000..bf14228 --- /dev/null +++ b/gnulib/lib/isnanl-nolibm.h @@ -0,0 +1,33 @@ +/* Test for NaN that does not need libm. + Copyright (C) 2007-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#if HAVE_ISNANL_IN_LIBC +/* Get declaration of isnan macro or (older) isnanl function. */ +# include +# 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 0000000..1482fb2 --- /dev/null +++ b/gnulib/lib/isnanl.c @@ -0,0 +1,20 @@ +/* Test for NaN that does not need libm. + Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible , 2007. */ + +#define USE_LONG_DOUBLE +#include "isnan.c" diff --git a/gnulib/lib/iswblank.c b/gnulib/lib/iswblank.c new file mode 100644 index 0000000..694f4b9 --- /dev/null +++ b/gnulib/lib/iswblank.c @@ -0,0 +1,27 @@ +/* Test wide character for being blank. + Copyright (C) 2008-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 + +/* Specification. */ +#include + +int +iswblank (wint_t wc) +{ + return wc == ' ' || wc == '\t'; +} diff --git a/gnulib/lib/iswctype-impl.h b/gnulib/lib/iswctype-impl.h new file mode 100644 index 0000000..8a88d6f --- /dev/null +++ b/gnulib/lib/iswctype-impl.h @@ -0,0 +1,22 @@ +/* Test whether a wide character has a given property. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +int +iswctype (wint_t wc, wctype_t desc) +{ + return ((int (*) (wint_t)) desc) (wc); +} diff --git a/gnulib/lib/iswctype.c b/gnulib/lib/iswctype.c new file mode 100644 index 0000000..6f4c362 --- /dev/null +++ b/gnulib/lib/iswctype.c @@ -0,0 +1,23 @@ +/* Test whether a wide character has a given property. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include "iswctype-impl.h" diff --git a/gnulib/lib/itold.c b/gnulib/lib/itold.c new file mode 100644 index 0000000..0236f33 --- /dev/null +++ b/gnulib/lib/itold.c @@ -0,0 +1,28 @@ +/* Replacement for 'int' to 'long double' conversion routine. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +void +_Qp_itoq (long double *result, int a) +{ + /* Convert from 'int' to 'double', then from 'double' to 'long double'. */ + *result = (double) a; +} diff --git a/gnulib/lib/javacomp.c b/gnulib/lib/javacomp.c new file mode 100644 index 0000000..000e308 --- /dev/null +++ b/gnulib/lib/javacomp.c @@ -0,0 +1,2355 @@ +/* Compile a Java program. + Copyright (C) 2001-2003, 2006-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include +#include + +/* Specification. */ +#include "javacomp.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "javaversion.h" +#include "execute.h" +#include "spawn-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 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 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 0000000..e0767d1 --- /dev/null +++ b/gnulib/lib/javacomp.h @@ -0,0 +1,75 @@ +/* Compile a Java program. + Copyright (C) 2001-2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#ifndef _JAVACOMP_H +#define _JAVACOMP_H + +#include + +/* 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 0000000..4afabdf --- /dev/null +++ b/gnulib/lib/javaexec.c @@ -0,0 +1,429 @@ +/* Execute a Java program. + Copyright (C) 2001-2003, 2006-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include +#include + +/* Specification. */ +#include "javaexec.h" + +#include +#include +#include + +#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 0000000..120d590 --- /dev/null +++ b/gnulib/lib/javaexec.h @@ -0,0 +1,50 @@ +/* Execute a Java program. + Copyright (C) 2001-2002, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#ifndef _JAVAEXEC_H +#define _JAVAEXEC_H + +#include + +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 0000000..3346187 --- /dev/null +++ b/gnulib/lib/javaversion.c @@ -0,0 +1,119 @@ +/* Determine the Java version supported by javaexec. + Copyright (C) 2006-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "javaversion.h" + +#include +#include +#include + +#if ENABLE_RELOCATABLE +# include "relocatable.h" +#else +# define relocate(pathname) (pathname) +#endif + +#include "javaexec.h" +#include "spawn-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 0000000..d62585b Binary files /dev/null and b/gnulib/lib/javaversion.class differ diff --git a/gnulib/lib/javaversion.h b/gnulib/lib/javaversion.h new file mode 100644 index 0000000..ef330ba --- /dev/null +++ b/gnulib/lib/javaversion.h @@ -0,0 +1,39 @@ +/* Determine the Java version supported by javaexec. + Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#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 0000000..a8c83d0 --- /dev/null +++ b/gnulib/lib/javaversion.java @@ -0,0 +1,31 @@ +/* Show the Java version. + * Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * 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 0000000..b6588a3 --- /dev/null +++ b/gnulib/lib/langinfo.in.h @@ -0,0 +1,177 @@ +/* Substitute for and wrapper around . + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 for platforms that lack it or have an incomplete one. + * + */ + +#ifndef _@GUARD_PREFIX@_LANGINFO_H + +#if __GNUC__ >= 3 +@PRAGMA_SYSTEM_HEADER@ +#endif +@PRAGMA_COLUMNS@ + +/* The include_next requires a split double-inclusion guard. */ +#if @HAVE_LANGINFO_H@ +# @INCLUDE_NEXT@ @NEXT_LANGINFO_H@ +#endif + +#ifndef _@GUARD_PREFIX@_LANGINFO_H +#define _@GUARD_PREFIX@_LANGINFO_H + + +#if !@HAVE_LANGINFO_H@ + +/* A platform that lacks . */ + +/* Assume that it also lacks and the nl_item type. */ +# if !GNULIB_defined_nl_item +typedef int nl_item; +# define GNULIB_defined_nl_item 1 +# endif + +/* 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 . */ + +# if !@HAVE_LANGINFO_CODESET@ +# define CODESET 10000 +# define GNULIB_defined_CODESET 1 +# endif + +# if !@HAVE_LANGINFO_T_FMT_AMPM@ +# define T_FMT_AMPM 10006 +# define GNULIB_defined_T_FMT_AMPM 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 + +# if !@HAVE_LANGINFO_YESEXPR@ +# define YESEXPR 10053 +# define NOEXPR 10054 +# define GNULIB_defined_YESEXPR 1 +# endif + +#endif + +/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ + +/* The definition of _GL_WARN_ON_USE is copied here. */ + +/* Declare overridden functions. */ + + +/* 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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef nl_langinfo +# define nl_langinfo rpl_nl_langinfo +# endif +_GL_FUNCDECL_RPL (nl_langinfo, char *, (nl_item item)); +_GL_CXXALIAS_RPL (nl_langinfo, char *, (nl_item item)); +# else +# if !@HAVE_NL_LANGINFO@ +_GL_FUNCDECL_SYS (nl_langinfo, char *, (nl_item item)); +# endif +_GL_CXXALIAS_SYS (nl_langinfo, char *, (nl_item item)); +# endif +_GL_CXXALIASWARN (nl_langinfo); +#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 + + +#endif /* _@GUARD_PREFIX@_LANGINFO_H */ +#endif /* _@GUARD_PREFIX@_LANGINFO_H */ diff --git a/gnulib/lib/lchown.c b/gnulib/lib/lchown.c new file mode 100644 index 0000000..406b9c1 --- /dev/null +++ b/gnulib/lib/lchown.c @@ -0,0 +1,117 @@ +/* Provide a stub lchown function for systems that lack it. + + Copyright (C) 1998-1999, 2002, 2004, 2006-2007, 2009-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Jim Meyering */ + +#include + +#include + +#include +#include +#include +#include + +#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) +{ + bool stat_valid = false; + int result; + +# if CHOWN_CHANGE_TIME_BUG + struct stat st; + + 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/ldexpf.c b/gnulib/lib/ldexpf.c new file mode 100644 index 0000000..0460d1a --- /dev/null +++ b/gnulib/lib/ldexpf.c @@ -0,0 +1,31 @@ +/* Multiply a 'float' by a power of 2. + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +/* Avoid some warnings from "gcc -Wshadow". + This file doesn't use the exp() function. */ +#undef exp +#define exp exponent + +float +ldexpf (float x, int exp) +{ + return (float) ldexp ((double) x, exp); +} diff --git a/gnulib/lib/ldexpl.c b/gnulib/lib/ldexpl.c new file mode 100644 index 0000000..7fb3a7d --- /dev/null +++ b/gnulib/lib/ldexpl.c @@ -0,0 +1,89 @@ +/* Emulation for ldexpl. + Contributed by Paolo Bonzini + + Copyright 2002-2003, 2007-2011 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 . */ + +#include + +/* Specification. */ +#include + +#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE + +long double +ldexpl (long double x, int exp) +{ + return ldexp (x, exp); +} + +#else + +# include +# 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; +} + +#endif + +#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/ldtoastr.c b/gnulib/lib/ldtoastr.c new file mode 100644 index 0000000..bf54a35 --- /dev/null +++ b/gnulib/lib/ldtoastr.c @@ -0,0 +1,2 @@ +#define LENGTH 3 +#include "ftoastr.c" diff --git a/gnulib/lib/libunistring.valgrind b/gnulib/lib/libunistring.valgrind new file mode 100644 index 0000000..aba265a --- /dev/null +++ b/gnulib/lib/libunistring.valgrind @@ -0,0 +1,9 @@ +# Suppress valgrind messages in an installed libunistring. + +# Suppress a valgrind message about use of uninitialized memory in freea(). +# This use is OK because it provides only a speedup. +{ + libunistring_freea + Memcheck:Cond + fun:libunistring_freea +} diff --git a/gnulib/lib/linebuffer.c b/gnulib/lib/linebuffer.c new file mode 100644 index 0000000..f15c1c2 --- /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-2011 + Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Richard Stallman. */ + +#include + +#include +#include +#include +#include +#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 0000000..4050fb0 --- /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-2011 Free + Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#if !defined LINEBUFFER_H +# define LINEBUFFER_H + +# include + +/* 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 0000000..b58eb25 --- /dev/null +++ b/gnulib/lib/link.c @@ -0,0 +1,212 @@ +/* Emulate link on platforms that lack it, namely native Windows platforms. + + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 + +#include + +#include +#include +#include +#include + +#if !HAVE_LINK +# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ + +# define WIN32_LEAN_AND_MEAN +# include + +/* 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) +{ + size_t len1; + size_t len2; + struct stat st; + + /* Don't allow IRIX to dereference dangling file2 symlink. */ + if (!lstat (file2, &st)) + { + errno = EEXIST; + return -1; + } + + /* Reject trailing slashes on non-directories. */ + len1 = strlen (file1); + 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. */ + 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); + 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 0000000..7b6d0dd --- /dev/null +++ b/gnulib/lib/linkat.c @@ -0,0 +1,343 @@ +/* Create a hard link relative to open directories. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Eric Blake */ + +#include + +#include + +#include +#include +#include +#include +#include +#include + +#include "areadlink.h" +#include "dirname.h" +#include "filenamecat.h" +#include "openat-priv.h" + +#if HAVE_SYS_PARAM_H +# include +#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 */ + +/* On Solaris, link() doesn't follow symlinks by default, but does so as soon + as a library or executable takes part in the program that has been compiled + with "c99" or "cc -xc99=all" or "cc ... /usr/lib/values-xpg4.o ...". */ +# if LINK_FOLLOWS_SYMLINKS == -1 + +/* Reduce the penalty of link_immediate and link_follow by incorporating the + knowledge that link()'s behaviour depends on the __xpg4 variable. */ +extern int __xpg4; + +static int +solaris_optimized_link_immediate (char const *file1, char const *file2) +{ + if (__xpg4 == 0) + return link (file1, file2); + return link_immediate (file1, file2); +} + +static int +solaris_optimized_link_follow (char const *file1, char const *file2) +{ + if (__xpg4 != 0) + return link (file1, file2); + return link_follow (file1, file2); +} + +# define link_immediate solaris_optimized_link_immediate +# define link_follow solaris_optimized_link_follow + +# endif + +/* 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 & ~AT_SYMLINK_FOLLOW) + { + errno = EINVAL; + return -1; + } + +# if LINKAT_TRAILING_SLASH_BUG + /* 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 linkat() decide whether hard-linking directories is legal. + If fstatat() fails, then linkat() should fail for the same reason; + if fstatat() succeeds, require a directory. */ + struct stat st; + if (fstatat (fd1, file1, &st, flag ? 0 : AT_SYMLINK_NOFOLLOW)) + return -1; + if (!S_ISDIR (st.st_mode)) + { + errno = ENOTDIR; + return -1; + } + } + } +# endif + + if (!flag) + return linkat (fd1, file1, fd2, file2, flag); + + /* 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 0000000..b7d070e --- /dev/null +++ b/gnulib/lib/listen.c @@ -0,0 +1,49 @@ +/* listen.c --- wrappers for Windows listen function + + Copyright (C) 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paolo Bonzini */ + +#include + +#define WIN32_LEAN_AND_MEAN +/* Get winsock2.h. */ +#include + +/* 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); + + if (sock == INVALID_SOCKET) + { + errno = EBADF; + return -1; + } + else + { + 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 0000000..38e36ef --- /dev/null +++ b/gnulib/lib/localcharset.c @@ -0,0 +1,547 @@ +/* Determine a canonical name for the current locale's character encoding. + + Copyright (C) 2000-2006, 2008-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 . */ + +#include + +/* Specification. */ +#include "localcharset.h" + +#include +#include +#include +#include +#include + +#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 +# if HAVE_LANGINFO_CODESET +# include +# else +# if 0 /* see comment below */ +# include +# endif +# endif +# ifdef __CYGWIN__ +# define WIN32_LEAN_AND_MEAN +# include +# endif +#elif defined WIN32_NATIVE +# define WIN32_LEAN_AND_MEAN +# include +#endif +#if defined OS2 +# define INCL_DOS +# include +#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; + 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.7 does not have locales. nl_langinfo (CODESET) always + returns "US-ASCII". 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 0000000..8907ccd --- /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-2011 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 0000000..79c1490 --- /dev/null +++ b/gnulib/lib/locale.in.h @@ -0,0 +1,96 @@ +/* A POSIX . + Copyright (C) 2007-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef _@GUARD_PREFIX@_LOCALE_H + +#if __GNUC__ >= 3 +@PRAGMA_SYSTEM_HEADER@ +#endif +@PRAGMA_COLUMNS@ + +/* The include_next requires a split double-inclusion guard. */ +#@INCLUDE_NEXT@ @NEXT_LOCALE_H@ + +#ifndef _@GUARD_PREFIX@_LOCALE_H +#define _@GUARD_PREFIX@_LOCALE_H + +/* NetBSD 5.0 mis-defines NULL. */ +#include + +/* MacOS X 10.5 defines the locale_t type in . */ +#if @HAVE_XLOCALE_H@ +# include +#endif + +/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ + +/* 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_SETLOCALE@ +# if @REPLACE_SETLOCALE@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef setlocale +# define setlocale rpl_setlocale +# define GNULIB_defined_setlocale 1 +# endif +_GL_FUNCDECL_RPL (setlocale, char *, (int category, const char *locale)); +_GL_CXXALIAS_RPL (setlocale, char *, (int category, const char *locale)); +# else +_GL_CXXALIAS_SYS (setlocale, char *, (int category, const char *locale)); +# endif +_GL_CXXALIASWARN (setlocale); +#elif defined GNULIB_POSIXCHECK +# undef setlocale +# if HAVE_RAW_DECL_SETLOCALE +_GL_WARN_ON_USE (setlocale, "setlocale works differently on native Windows - " + "use gnulib module setlocale for portability"); +# endif +#endif + +#if @GNULIB_DUPLOCALE@ +# if @REPLACE_DUPLOCALE@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef duplocale +# define duplocale rpl_duplocale +# endif +_GL_FUNCDECL_RPL (duplocale, locale_t, (locale_t locale) _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (duplocale, locale_t, (locale_t locale)); +# else +# if @HAVE_DUPLOCALE@ +_GL_CXXALIAS_SYS (duplocale, locale_t, (locale_t locale)); +# endif +# endif +# if @HAVE_DUPLOCALE@ +_GL_CXXALIASWARN (duplocale); +# 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 /* _@GUARD_PREFIX@_LOCALE_H */ +#endif /* _@GUARD_PREFIX@_LOCALE_H */ diff --git a/gnulib/lib/localename.c b/gnulib/lib/localename.c new file mode 100644 index 0000000..8fd5d89 --- /dev/null +++ b/gnulib/lib/localename.c @@ -0,0 +1,2957 @@ +/* Determine name of the currently selected locale. + Copyright (C) 1995-2011 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.1 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +/* Written by Ulrich Drepper , 1995. */ +/* Win32 code written by Tor Lillqvist . */ +/* MacOS X code written by Bruno Haible . */ + +#include + +/* Specification. */ +#ifdef IN_LIBINTL +# include "gettextP.h" +#else +# include "localename.h" +#endif + +#include +#include +#include +#include +#include + +#if HAVE_USELOCALE +/* MacOS X 10.5 defines the locale_t type in . */ +# if defined __APPLE__ && defined __MACH__ +# include +# endif +# include +# if !defined IN_LIBINTL +# include "glthread/lock.h" +# endif +#endif + +#if HAVE_CFLOCALECOPYCURRENT || HAVE_CFPREFERENCESCOPYAPPVALUE +# include +# if HAVE_CFLOCALECOPYCURRENT +# include +# elif HAVE_CFPREFERENCESCOPYAPPVALUE +# include +# 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 +/* 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 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: + /* calls + it "Sepedi"; according to + + + 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 && !defined __UCLIBC__ + /* Work around an incorrect definition of the _NL_LOCALE_NAME macro in + glibc < 2.12. + See . */ + 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_part1_v0 /* used in MacOS X 10.5 */ + { + int32_t __refcount; + void (*__free_extra)(void *); + __darwin_mbstate_t __mbs[10]; + int64_t __magic; + }; + struct _xlocale_part1_v1 /* used in MacOS X >= 10.6.0 */ + { + int32_t __refcount; + void (*__free_extra)(void *); + __darwin_mbstate_t __mbs[10]; + /*pthread_lock_t*/ int __lock; + int64_t __magic; + }; + struct _xlocale_part2 + { + 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_part2 *tlp; + if (((struct _xlocale_part1_v0 *) thread_locale)->__magic + == 0x786C6F63616C6530LL) + /* MacOS X 10.5 */ + tlp = + (struct _xlocale_part2 *) + &((struct _xlocale_part1_v0 *) thread_locale)->__magic; + else if (((struct _xlocale_part1_v1 *) thread_locale)->__magic + == 0x786C6F63616C6530LL) + /* MacOS X >= 10.6.0 */ + tlp = + (struct _xlocale_part2 *) + &((struct _xlocale_part1_v1 *) thread_locale)->__magic; + else + /* Unsupported version of MacOS X: The internals of 'struct _xlocale' + have changed again. */ + return ""; + 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) && !defined __UCLIBC__) +# 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 ), + 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 0000000..118a426 --- /dev/null +++ b/gnulib/lib/localename.h @@ -0,0 +1,95 @@ +/* Determine name of the currently selected locale. + Copyright (C) 2007, 2009-2011 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.1 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#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 , + 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 , + 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 , + 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/log10f.c b/gnulib/lib/log10f.c new file mode 100644 index 0000000..ad50c53 --- /dev/null +++ b/gnulib/lib/log10f.c @@ -0,0 +1,26 @@ +/* Base 10 logarithmic function. + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +float +log10f (float x) +{ + return (float) log10 ((double) x); +} diff --git a/gnulib/lib/logf.c b/gnulib/lib/logf.c new file mode 100644 index 0000000..684e9f3 --- /dev/null +++ b/gnulib/lib/logf.c @@ -0,0 +1,26 @@ +/* Natural logarithmic function. + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +float +logf (float x) +{ + return (float) log ((double) x); +} diff --git a/gnulib/lib/login_tty.c b/gnulib/lib/login_tty.c new file mode 100644 index 0000000..d959df9 --- /dev/null +++ b/gnulib/lib/login_tty.c @@ -0,0 +1,75 @@ +/* Assign a given terminal as controlling terminal and as standard input, + standard output, standard error of the current process. + Copyright (C) 2010-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Currently no specification header. */ + +#include +#include +#include + +int +login_tty (int slave_fd) +{ + int i; + + /* Create a new session. */ + setsid (); + + /* Make fd the controlling terminal for the current process. + On BSD and OSF/1: There is ioctl TIOCSCTTY for this purpose. + On Solaris: + A terminal becomes the controlling terminal of a session + if it is being open()ed, at a moment when + 1. it is not already the controlling terminal of some session, and + 2. the process that open()s it is a session leader that does not have + a controlling terminal. + We assume condition 1, try to ensure condition 2, and then open() it. + */ + for (i = 0; i < 3; i++) + if (i != slave_fd) + close (i); +#ifdef TIOCSCTTY + if (ioctl (slave_fd, TIOCSCTTY, NULL) < 0) + return -1; +#else + { + char *slave_name; + int dummy_fd; + + slave_name = ttyname (slave_fd); + if (slave_name == NULL) + return -1; + dummy_fd = open (slave_name, O_RDWR); + if (dummy_fd < 0) + return -1; + close (dummy_fd); + } +#endif + + /* Assign fd to the standard input, standard output, and standard error of + the current process. */ + for (i = 0; i < 3; i++) + if (slave_fd != i) + if (dup2 (slave_fd, i) < 0) + return -1; + if (slave_fd >= 3) + close (slave_fd); + + return 0; +} diff --git a/gnulib/lib/logl.c b/gnulib/lib/logl.c new file mode 100644 index 0000000..42c50cb --- /dev/null +++ b/gnulib/lib/logl.c @@ -0,0 +1,273 @@ +/* Copyright 2001 by Stephen L. Moshier + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE + +long double +logl (long double x) +{ + return log (x); +} + +#else + +/* 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; +} + +#endif diff --git a/gnulib/lib/long-options.c b/gnulib/lib/long-options.c new file mode 100644 index 0000000..0b86276 --- /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-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Jim Meyering. */ + +#include + +/* Specification. */ +#include "long-options.h" + +#include +#include +#include +#include + +#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 0000000..12d3e0e --- /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-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* 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 0000000..134e8b7 --- /dev/null +++ b/gnulib/lib/lseek.c @@ -0,0 +1,64 @@ +/* An lseek() function that detects pipes. + Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 + +/* Specification. */ +#include + +#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ +/* Windows platforms. */ +/* Get GetFileType. */ +# include +/* Get _get_osfhandle. */ +# include "msvc-nothrow.h" +#else +# include +#endif +#include + +#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 0000000..d786288 --- /dev/null +++ b/gnulib/lib/lstat.c @@ -0,0 +1,97 @@ +/* Work around a bug of lstat on some systems + + Copyright (C) 1997-2006, 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Jim Meyering */ + +/* If the user's config.h happens to include , let it include only + the system's here, so that orig_lstat doesn't recurse to + rpl_lstat. */ +#define __need_system_sys_stat_h +#include + +#if !HAVE_LSTAT +/* On systems that lack symlinks, our replacement 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. */ +# include +# include +# undef __need_system_sys_stat_h + +static inline int +orig_lstat (const char *filename, struct stat *buf) +{ + return lstat (filename, buf); +} + +/* Specification. */ +/* Write "sys/stat.h" here, not , otherwise OSF/1 5.1 DTK cc + eliminates this include because of the preliminary #include + above. */ +# include "sys/stat.h" + +# include +# include + +/* 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 0000000..ef07f6c --- /dev/null +++ b/gnulib/lib/malloc.c @@ -0,0 +1,57 @@ +/* malloc() function that is glibc compatible. + + Copyright (C) 1997-1998, 2006-2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 */ + +#define _GL_USE_STDLIB_ALLOC 1 +#include +/* Only the AC_FUNC_MALLOC macro defines 'malloc' already in config.h. */ +#ifdef malloc +# define NEED_MALLOC_GNU 1 +# undef malloc +/* Whereas the gnulib module 'malloc-gnu' defines HAVE_MALLOC_GNU. */ +#elif GNULIB_MALLOC_GNU && !HAVE_MALLOC_GNU +# define NEED_MALLOC_GNU 1 +#endif + +#include + +#include + +/* 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; + +#if 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 0000000..45d3075 --- /dev/null +++ b/gnulib/lib/malloca.c @@ -0,0 +1,139 @@ +/* Safe automatic memory allocation. + Copyright (C) 2003, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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. */ + +#define _GL_USE_STDLIB_ALLOC 1 +#include + +/* Specification. */ +#include "malloca.h" + +#include "verify.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 (HEADER_SIZE == sizeof (struct header)); +/* 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 0000000..9432161 --- /dev/null +++ b/gnulib/lib/malloca.h @@ -0,0 +1,134 @@ +/* Safe automatic memory allocation. + Copyright (C) 2003-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 +#include +#include + + +#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 struct sa_alignof_helper { char __slot1; type __slot2; }; +# define sa_alignof(type) offsetof (sa_alignof_helper, __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 0000000..52f0a50 --- /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 0000000..6b5966a --- /dev/null +++ b/gnulib/lib/math.in.h @@ -0,0 +1,1381 @@ +/* A GNU-like . + + Copyright (C) 2002-2003, 2007-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef _@GUARD_PREFIX@_MATH_H + +#if __GNUC__ >= 3 +@PRAGMA_SYSTEM_HEADER@ +#endif +@PRAGMA_COLUMNS@ + +/* The include_next requires a split double-inclusion guard. */ +#@INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ @NEXT_AS_FIRST_DIRECTIVE_MATH_H@ + +#ifndef _@GUARD_PREFIX@_MATH_H +#define _@GUARD_PREFIX@_MATH_H + + +/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ + +/* The definition of _GL_ARG_NONNULL is copied here. */ + +/* The definition of _GL_WARN_ON_USE is copied here. */ + +#ifdef __cplusplus +/* Helper macros to define type-generic function FUNC as overloaded functions, + rather than as macros like in C. POSIX declares these with an argument of + real-floating (that is, one of float, double, or long double). */ +# define _GL_MATH_CXX_REAL_FLOATING_DECL_1(func) \ +static inline int \ +_gl_cxx_ ## func ## f (float f) \ +{ \ + return func (f); \ +} \ +static inline int \ +_gl_cxx_ ## func ## d (double d) \ +{ \ + return func (d); \ +} \ +static inline int \ +_gl_cxx_ ## func ## l (long double l) \ +{ \ + return func (l); \ +} +# define _GL_MATH_CXX_REAL_FLOATING_DECL_2(func) \ +inline int \ +func (float f) \ +{ \ + return _gl_cxx_ ## func ## f (f); \ +} \ +inline int \ +func (double d) \ +{ \ + return _gl_cxx_ ## func ## d (d); \ +} \ +inline int \ +func (long double l) \ +{ \ + return _gl_cxx_ ## func ## l (l); \ +} +#endif + +/* 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)) + + +#if @REPLACE_ITOLD@ +/* Pull in a function that fixes the 'int' to 'long double' conversion + of glibc 2.7. */ +_GL_EXTERN_C void _Qp_itoq (long double *, int); +static void (*_gl_math_fix_itold) (long double *, int) = _Qp_itoq; +#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@ +# if !GNULIB_defined_NAN +# undef NAN + /* The Compaq (ex-DEC) C 6.4 compiler and the Microsoft MSVC 9 compiler + choke on the expression 0.0 / 0.0. */ +# if defined __DECC || defined _MSC_VER +static float +_NaN () +{ + static float zero = 0.0f; + return zero / zero; +} +# define NAN (_NaN()) +# else +# define NAN (0.0f / 0.0f) +# endif +# define GNULIB_defined_NAN 1 +# 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 + + +#if @GNULIB_ACOSF@ +# if !@HAVE_ACOSF@ +# undef acosf +_GL_FUNCDECL_SYS (acosf, float, (float x)); +# endif +_GL_CXXALIAS_SYS (acosf, float, (float x)); +_GL_CXXALIASWARN (acosf); +#elif defined GNULIB_POSIXCHECK +# undef acosf +# if HAVE_RAW_DECL_ACOSF +_GL_WARN_ON_USE (acosf, "acosf is unportable - " + "use gnulib module acosf for portability"); +# endif +#endif + +#if @GNULIB_ACOSL@ +# if !@HAVE_ACOSL@ || !@HAVE_DECL_ACOSL@ +_GL_FUNCDECL_SYS (acosl, long double, (long double x)); +# endif +_GL_CXXALIAS_SYS (acosl, long double, (long double x)); +_GL_CXXALIASWARN (acosl); +#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_ASINF@ +# if !@HAVE_ASINF@ +# undef asinf +_GL_FUNCDECL_SYS (asinf, float, (float x)); +# endif +_GL_CXXALIAS_SYS (asinf, float, (float x)); +_GL_CXXALIASWARN (asinf); +#elif defined GNULIB_POSIXCHECK +# undef asinf +# if HAVE_RAW_DECL_ASINF +_GL_WARN_ON_USE (asinf, "asinf is unportable - " + "use gnulib module asinf for portability"); +# endif +#endif + +#if @GNULIB_ASINL@ +# if !@HAVE_ASINL@ || !@HAVE_DECL_ASINL@ +_GL_FUNCDECL_SYS (asinl, long double, (long double x)); +# endif +_GL_CXXALIAS_SYS (asinl, long double, (long double x)); +_GL_CXXALIASWARN (asinl); +#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_ATANF@ +# if !@HAVE_ATANF@ +# undef atanf +_GL_FUNCDECL_SYS (atanf, float, (float x)); +# endif +_GL_CXXALIAS_SYS (atanf, float, (float x)); +_GL_CXXALIASWARN (atanf); +#elif defined GNULIB_POSIXCHECK +# undef atanf +# if HAVE_RAW_DECL_ATANF +_GL_WARN_ON_USE (atanf, "atanf is unportable - " + "use gnulib module atanf for portability"); +# endif +#endif + +#if @GNULIB_ATANL@ +# if !@HAVE_ATANL@ || !@HAVE_DECL_ATANL@ +_GL_FUNCDECL_SYS (atanl, long double, (long double x)); +# endif +_GL_CXXALIAS_SYS (atanl, long double, (long double x)); +_GL_CXXALIASWARN (atanl); +#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_ATAN2F@ +# if !@HAVE_ATAN2F@ +# undef atan2f +_GL_FUNCDECL_SYS (atan2f, float, (float y, float x)); +# endif +_GL_CXXALIAS_SYS (atan2f, float, (float y, float x)); +_GL_CXXALIASWARN (atan2f); +#elif defined GNULIB_POSIXCHECK +# undef atan2f +# if HAVE_RAW_DECL_ATAN2F +_GL_WARN_ON_USE (atan2f, "atan2f is unportable - " + "use gnulib module atan2f for portability"); +# endif +#endif + + +#if @GNULIB_CEILF@ +# if @REPLACE_CEILF@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef ceilf +# define ceilf rpl_ceilf +# endif +_GL_FUNCDECL_RPL (ceilf, float, (float x)); +_GL_CXXALIAS_RPL (ceilf, float, (float x)); +# else +# if !@HAVE_DECL_CEILF@ +_GL_FUNCDECL_SYS (ceilf, float, (float x)); +# endif +_GL_CXXALIAS_SYS (ceilf, float, (float x)); +# endif +_GL_CXXALIASWARN (ceilf); +#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_CEIL@ +# if @REPLACE_CEIL@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define ceil rpl_ceil +# endif +_GL_FUNCDECL_RPL (ceil, double, (double x)); +_GL_CXXALIAS_RPL (ceil, double, (double x)); +# else +_GL_CXXALIAS_SYS (ceil, double, (double x)); +# endif +_GL_CXXALIASWARN (ceil); +#endif + +#if @GNULIB_CEILL@ +# if @REPLACE_CEILL@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef ceill +# define ceill rpl_ceill +# endif +_GL_FUNCDECL_RPL (ceill, long double, (long double x)); +_GL_CXXALIAS_RPL (ceill, long double, (long double x)); +# else +# if !@HAVE_DECL_CEILL@ +_GL_FUNCDECL_SYS (ceill, long double, (long double x)); +# endif +_GL_CXXALIAS_SYS (ceill, long double, (long double x)); +# endif +_GL_CXXALIASWARN (ceill); +#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_COPYSIGNF@ +# if !@HAVE_COPYSIGNF@ +_GL_FUNCDECL_SYS (copysignf, float, (float x, float y)); +# endif +_GL_CXXALIAS_SYS (copysignf, float, (float x, float y)); +_GL_CXXALIASWARN (copysignf); +#elif defined GNULIB_POSIXCHECK +# undef copysignf +# if HAVE_RAW_DECL_COPYSIGNF +_GL_WARN_ON_USE (copysignf, "copysignf is unportable - " + "use gnulib module copysignf for portability"); +# endif +#endif + +#if @GNULIB_COPYSIGN@ +# if !@HAVE_COPYSIGN@ +_GL_FUNCDECL_SYS (copysign, double, (double x, double y)); +# endif +_GL_CXXALIAS_SYS (copysign, double, (double x, double y)); +_GL_CXXALIASWARN (copysign); +#elif defined GNULIB_POSIXCHECK +# undef copysign +# if HAVE_RAW_DECL_COPYSIGN +_GL_WARN_ON_USE (copysign, "copysign is unportable - " + "use gnulib module copysign for portability"); +# endif +#endif + +#if @GNULIB_COPYSIGNL@ +# if !@HAVE_COPYSIGNL@ +_GL_FUNCDECL_SYS (copysignl, long double, (long double x, long double y)); +# endif +_GL_CXXALIAS_SYS (copysignl, long double, (long double x, long double y)); +_GL_CXXALIASWARN (copysignl); +#elif defined GNULIB_POSIXCHECK +# undef copysignl +# if HAVE_RAW_DECL_COPYSIGNL +_GL_WARN_ON_USE (copysign, "copysignl is unportable - " + "use gnulib module copysignl for portability"); +# endif +#endif + + +#if @GNULIB_COSF@ +# if !@HAVE_COSF@ +# undef cosf +_GL_FUNCDECL_SYS (cosf, float, (float x)); +# endif +_GL_CXXALIAS_SYS (cosf, float, (float x)); +_GL_CXXALIASWARN (cosf); +#elif defined GNULIB_POSIXCHECK +# undef cosf +# if HAVE_RAW_DECL_COSF +_GL_WARN_ON_USE (cosf, "cosf is unportable - " + "use gnulib module cosf for portability"); +# endif +#endif + +#if @GNULIB_COSL@ +# if !@HAVE_COSL@ || !@HAVE_DECL_COSL@ +_GL_FUNCDECL_SYS (cosl, long double, (long double x)); +# endif +_GL_CXXALIAS_SYS (cosl, long double, (long double x)); +_GL_CXXALIASWARN (cosl); +#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_COSHF@ +# if !@HAVE_COSHF@ +# undef coshf +_GL_FUNCDECL_SYS (coshf, float, (float x)); +# endif +_GL_CXXALIAS_SYS (coshf, float, (float x)); +_GL_CXXALIASWARN (coshf); +#elif defined GNULIB_POSIXCHECK +# undef coshf +# if HAVE_RAW_DECL_COSHF +_GL_WARN_ON_USE (coshf, "coshf is unportable - " + "use gnulib module coshf for portability"); +# endif +#endif + + +#if @GNULIB_EXPF@ +# if !@HAVE_EXPF@ +# undef expf +_GL_FUNCDECL_SYS (expf, float, (float x)); +# endif +_GL_CXXALIAS_SYS (expf, float, (float x)); +_GL_CXXALIASWARN (expf); +#elif defined GNULIB_POSIXCHECK +# undef expf +# if HAVE_RAW_DECL_EXPF +_GL_WARN_ON_USE (expf, "expf is unportable - " + "use gnulib module expf for portability"); +# endif +#endif + +#if @GNULIB_EXPL@ +# if !@HAVE_EXPL@ || !@HAVE_DECL_EXPL@ +_GL_FUNCDECL_SYS (expl, long double, (long double x)); +# endif +_GL_CXXALIAS_SYS (expl, long double, (long double x)); +_GL_CXXALIASWARN (expl); +#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_FABSF@ +# if !@HAVE_FABSF@ +# undef fabsf +_GL_FUNCDECL_SYS (fabsf, float, (float x)); +# endif +_GL_CXXALIAS_SYS (fabsf, float, (float x)); +_GL_CXXALIASWARN (fabsf); +#elif defined GNULIB_POSIXCHECK +# undef fabsf +# if HAVE_RAW_DECL_FABSF +_GL_WARN_ON_USE (fabsf, "fabsf is unportable - " + "use gnulib module fabsf for portability"); +# endif +#endif + + +#if @GNULIB_FLOORF@ +# if @REPLACE_FLOORF@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef floorf +# define floorf rpl_floorf +# endif +_GL_FUNCDECL_RPL (floorf, float, (float x)); +_GL_CXXALIAS_RPL (floorf, float, (float x)); +# else +# if !@HAVE_DECL_FLOORF@ +_GL_FUNCDECL_SYS (floorf, float, (float x)); +# endif +_GL_CXXALIAS_SYS (floorf, float, (float x)); +# endif +_GL_CXXALIASWARN (floorf); +#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_FLOOR@ +# if @REPLACE_FLOOR@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define floor rpl_floor +# endif +_GL_FUNCDECL_RPL (floor, double, (double x)); +_GL_CXXALIAS_RPL (floor, double, (double x)); +# else +_GL_CXXALIAS_SYS (floor, double, (double x)); +# endif +_GL_CXXALIASWARN (floor); +#endif + +#if @GNULIB_FLOORL@ +# if @REPLACE_FLOORL@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef floorl +# define floorl rpl_floorl +# endif +_GL_FUNCDECL_RPL (floorl, long double, (long double x)); +_GL_CXXALIAS_RPL (floorl, long double, (long double x)); +# else +# if !@HAVE_DECL_FLOORL@ +_GL_FUNCDECL_SYS (floorl, long double, (long double x)); +# endif +_GL_CXXALIAS_SYS (floorl, long double, (long double x)); +# endif +_GL_CXXALIASWARN (floorl); +#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 + + +#if @GNULIB_FMAF@ +# if @REPLACE_FMAF@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef fmaf +# define fmaf rpl_fmaf +# endif +_GL_FUNCDECL_RPL (fmaf, float, (float x, float y, float z)); +_GL_CXXALIAS_RPL (fmaf, float, (float x, float y, float z)); +# else +# if !@HAVE_FMAF@ +_GL_FUNCDECL_SYS (fmaf, float, (float x, float y, float z)); +# endif +_GL_CXXALIAS_SYS (fmaf, float, (float x, float y, float z)); +# endif +_GL_CXXALIASWARN (fmaf); +#elif defined GNULIB_POSIXCHECK +# undef fmaf +# if HAVE_RAW_DECL_FMAF +_GL_WARN_ON_USE (fmaf, "fmaf is unportable - " + "use gnulib module fmaf for portability"); +# endif +#endif + +#if @GNULIB_FMA@ +# if @REPLACE_FMA@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef fma +# define fma rpl_fma +# endif +_GL_FUNCDECL_RPL (fma, double, (double x, double y, double z)); +_GL_CXXALIAS_RPL (fma, double, (double x, double y, double z)); +# else +# if !@HAVE_FMA@ +_GL_FUNCDECL_SYS (fma, double, (double x, double y, double z)); +# endif +_GL_CXXALIAS_SYS (fma, double, (double x, double y, double z)); +# endif +_GL_CXXALIASWARN (fma); +#elif defined GNULIB_POSIXCHECK +# undef fma +# if HAVE_RAW_DECL_FMA +_GL_WARN_ON_USE (fma, "fma is unportable - " + "use gnulib module fma for portability"); +# endif +#endif + +#if @GNULIB_FMAL@ +# if @REPLACE_FMAL@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef fmal +# define fmal rpl_fmal +# endif +_GL_FUNCDECL_RPL (fmal, long double, + (long double x, long double y, long double z)); +_GL_CXXALIAS_RPL (fmal, long double, + (long double x, long double y, long double z)); +# else +# if !@HAVE_FMAL@ +_GL_FUNCDECL_SYS (fmal, long double, + (long double x, long double y, long double z)); +# endif +_GL_CXXALIAS_SYS (fmal, long double, + (long double x, long double y, long double z)); +# endif +_GL_CXXALIASWARN (fmal); +#elif defined GNULIB_POSIXCHECK +# undef fmal +# if HAVE_RAW_DECL_FMAL +_GL_WARN_ON_USE (fmal, "fmal is unportable - " + "use gnulib module fmal for portability"); +# endif +#endif + + +#if @GNULIB_FMODF@ +# if !@HAVE_FMODF@ +# undef fmodf +_GL_FUNCDECL_SYS (fmodf, float, (float x, float y)); +# endif +_GL_CXXALIAS_SYS (fmodf, float, (float x, float y)); +_GL_CXXALIASWARN (fmodf); +#elif defined GNULIB_POSIXCHECK +# undef fmodf +# if HAVE_RAW_DECL_FMODF +_GL_WARN_ON_USE (fmodf, "fmodf is unportable - " + "use gnulib module fmodf 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_FREXPF@ +# if @REPLACE_FREXPF@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef frexpf +# define frexpf rpl_frexpf +# endif +_GL_FUNCDECL_RPL (frexpf, float, (float x, int *expptr) _GL_ARG_NONNULL ((2))); +_GL_CXXALIAS_RPL (frexpf, float, (float x, int *expptr)); +# else +# if !@HAVE_FREXPF@ +# undef frexpf +_GL_FUNCDECL_SYS (frexpf, float, (float x, int *expptr) _GL_ARG_NONNULL ((2))); +# endif +_GL_CXXALIAS_SYS (frexpf, float, (float x, int *expptr)); +# endif +_GL_CXXALIASWARN (frexpf); +#elif defined GNULIB_POSIXCHECK +# undef frexpf +# if HAVE_RAW_DECL_FREXPF +_GL_WARN_ON_USE (frexpf, "frexpf is unportable - " + "use gnulib module frexpf 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_FREXP@ +# if @REPLACE_FREXP@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define frexp rpl_frexp +# endif +_GL_FUNCDECL_RPL (frexp, double, (double x, int *expptr) _GL_ARG_NONNULL ((2))); +_GL_CXXALIAS_RPL (frexp, double, (double x, int *expptr)); +# else +_GL_CXXALIAS_SYS (frexp, double, (double x, int *expptr)); +# endif +_GL_CXXALIASWARN (frexp); +#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 + +/* 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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef frexpl +# define frexpl rpl_frexpl +# endif +_GL_FUNCDECL_RPL (frexpl, long double, + (long double x, int *expptr) _GL_ARG_NONNULL ((2))); +_GL_CXXALIAS_RPL (frexpl, long double, (long double x, int *expptr)); +#else +# if !@HAVE_DECL_FREXPL@ +_GL_FUNCDECL_SYS (frexpl, long double, + (long double x, int *expptr) _GL_ARG_NONNULL ((2))); +# endif +# if @GNULIB_FREXPL@ +_GL_CXXALIAS_SYS (frexpl, long double, (long double x, int *expptr)); +# endif +#endif +#if @GNULIB_FREXPL@ && !(@REPLACE_FREXPL@ && !@HAVE_DECL_FREXPL@) +_GL_CXXALIASWARN (frexpl); +#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_LDEXPF@ +# if !@HAVE_LDEXPF@ +# undef ldexpf +_GL_FUNCDECL_SYS (ldexpf, float, (float x, int exp)); +# endif +_GL_CXXALIAS_SYS (ldexpf, float, (float x, int exp)); +_GL_CXXALIASWARN (ldexpf); +#elif defined GNULIB_POSIXCHECK +# undef ldexpf +# if HAVE_RAW_DECL_LDEXPF +_GL_WARN_ON_USE (ldexpf, "ldexpf is unportable - " + "use gnulib module ldexpf for portability"); +# endif +#endif + +/* Return x * 2^exp. */ +#if @GNULIB_LDEXPL@ && @REPLACE_LDEXPL@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef ldexpl +# define ldexpl rpl_ldexpl +# endif +_GL_FUNCDECL_RPL (ldexpl, long double, (long double x, int exp)); +_GL_CXXALIAS_RPL (ldexpl, long double, (long double x, int exp)); +#else +# if !@HAVE_DECL_LDEXPL@ +_GL_FUNCDECL_SYS (ldexpl, long double, (long double x, int exp)); +# endif +# if @GNULIB_LDEXPL@ +_GL_CXXALIAS_SYS (ldexpl, long double, (long double x, int exp)); +# endif +#endif +#if @GNULIB_LDEXPL@ +_GL_CXXALIASWARN (ldexpl); +#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_LOGB@ +# if !@HAVE_DECL_LOGB@ +_GL_EXTERN_C double logb (double x); +# endif +#elif defined GNULIB_POSIXCHECK +# undef logb +# if HAVE_RAW_DECL_LOGB +_GL_WARN_ON_USE (logb, "logb is unportable - " + "use gnulib module logb for portability"); +# endif +#endif + + +#if @GNULIB_LOGF@ +# if !@HAVE_LOGF@ +# undef logf +_GL_FUNCDECL_SYS (logf, float, (float x)); +# endif +_GL_CXXALIAS_SYS (logf, float, (float x)); +_GL_CXXALIASWARN (logf); +#elif defined GNULIB_POSIXCHECK +# undef logf +# if HAVE_RAW_DECL_LOGF +_GL_WARN_ON_USE (logf, "logf is unportable - " + "use gnulib module logf for portability"); +# endif +#endif + +#if @GNULIB_LOGL@ +# if !@HAVE_LOGL@ || !@HAVE_DECL_LOGL@ +_GL_FUNCDECL_SYS (logl, long double, (long double x)); +# endif +_GL_CXXALIAS_SYS (logl, long double, (long double x)); +_GL_CXXALIASWARN (logl); +#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_LOG10F@ +# if !@HAVE_LOG10F@ +# undef log10f +_GL_FUNCDECL_SYS (log10f, float, (float x)); +# endif +_GL_CXXALIAS_SYS (log10f, float, (float x)); +_GL_CXXALIASWARN (log10f); +#elif defined GNULIB_POSIXCHECK +# undef log10f +# if HAVE_RAW_DECL_LOG10F +_GL_WARN_ON_USE (log10f, "log10f is unportable - " + "use gnulib module log10f for portability"); +# endif +#endif + + +#if @GNULIB_MODFF@ +# if !@HAVE_MODFF@ +# undef modff +_GL_FUNCDECL_SYS (modff, float, (float x, float *iptr) _GL_ARG_NONNULL ((2))); +# endif +_GL_CXXALIAS_SYS (modff, float, (float x, float *iptr)); +_GL_CXXALIASWARN (modff); +#elif defined GNULIB_POSIXCHECK +# undef modff +# if HAVE_RAW_DECL_MODFF +_GL_WARN_ON_USE (modff, "modff is unportable - " + "use gnulib module modff for portability"); +# endif +#endif + + +#if @GNULIB_POWF@ +# if !@HAVE_POWF@ +# undef powf +_GL_FUNCDECL_SYS (powf, float, (float x, float y)); +# endif +_GL_CXXALIAS_SYS (powf, float, (float x, float y)); +_GL_CXXALIASWARN (powf); +#elif defined GNULIB_POSIXCHECK +# undef powf +# if HAVE_RAW_DECL_POWF +_GL_WARN_ON_USE (powf, "powf is unportable - " + "use gnulib module powf for portability"); +# endif +#endif + + +#if @GNULIB_RINTF@ +# if !@HAVE_RINTF@ +_GL_FUNCDECL_SYS (rintf, float, (float x)); +# endif +_GL_CXXALIAS_SYS (rintf, float, (float x)); +_GL_CXXALIASWARN (rintf); +#elif defined GNULIB_POSIXCHECK +# undef rintf +# if HAVE_RAW_DECL_RINTF +_GL_WARN_ON_USE (rintf, "rintf is unportable - " + "use gnulib module rintf for portability"); +# endif +#endif + +#if @GNULIB_RINT@ +# if !@HAVE_RINT@ +_GL_FUNCDECL_SYS (rint, double, (double x)); +# endif +_GL_CXXALIAS_SYS (rint, double, (double x)); +_GL_CXXALIASWARN (rint); +#elif defined GNULIB_POSIXCHECK +# undef rint +# if HAVE_RAW_DECL_RINT +_GL_WARN_ON_USE (rint, "rint is unportable - " + "use gnulib module rint for portability"); +# endif +#endif + +#if @GNULIB_RINTL@ +# if !@HAVE_RINTL@ +_GL_FUNCDECL_SYS (rintl, long double, (long double x)); +# endif +_GL_CXXALIAS_SYS (rintl, long double, (long double x)); +_GL_CXXALIASWARN (rintl); +#elif defined GNULIB_POSIXCHECK +# undef rintl +# if HAVE_RAW_DECL_RINTL +_GL_WARN_ON_USE (rintl, "rintl is unportable - " + "use gnulib module rintl for portability"); +# endif +#endif + + +#if @GNULIB_ROUNDF@ +# if @REPLACE_ROUNDF@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef roundf +# define roundf rpl_roundf +# endif +_GL_FUNCDECL_RPL (roundf, float, (float x)); +_GL_CXXALIAS_RPL (roundf, float, (float x)); +# else +# if !@HAVE_DECL_ROUNDF@ +_GL_FUNCDECL_SYS (roundf, float, (float x)); +# endif +_GL_CXXALIAS_SYS (roundf, float, (float x)); +# endif +_GL_CXXALIASWARN (roundf); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef round +# define round rpl_round +# endif +_GL_FUNCDECL_RPL (round, double, (double x)); +_GL_CXXALIAS_RPL (round, double, (double x)); +# else +# if !@HAVE_DECL_ROUND@ +_GL_FUNCDECL_SYS (round, double, (double x)); +# endif +_GL_CXXALIAS_SYS (round, double, (double x)); +# endif +_GL_CXXALIASWARN (round); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef roundl +# define roundl rpl_roundl +# endif +_GL_FUNCDECL_RPL (roundl, long double, (long double x)); +_GL_CXXALIAS_RPL (roundl, long double, (long double x)); +# else +# if !@HAVE_DECL_ROUNDL@ +_GL_FUNCDECL_SYS (roundl, long double, (long double x)); +# endif +_GL_CXXALIAS_SYS (roundl, long double, (long double x)); +# endif +_GL_CXXALIASWARN (roundl); +#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_SINF@ +# if !@HAVE_SINF@ +# undef sinf +_GL_FUNCDECL_SYS (sinf, float, (float x)); +# endif +_GL_CXXALIAS_SYS (sinf, float, (float x)); +_GL_CXXALIASWARN (sinf); +#elif defined GNULIB_POSIXCHECK +# undef sinf +# if HAVE_RAW_DECL_SINF +_GL_WARN_ON_USE (sinf, "sinf is unportable - " + "use gnulib module sinf for portability"); +# endif +#endif + +#if @GNULIB_SINL@ +# if !@HAVE_SINL@ || !@HAVE_DECL_SINL@ +_GL_FUNCDECL_SYS (sinl, long double, (long double x)); +# endif +_GL_CXXALIAS_SYS (sinl, long double, (long double x)); +_GL_CXXALIASWARN (sinl); +#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_SINHF@ +# if !@HAVE_SINHF@ +# undef sinhf +_GL_FUNCDECL_SYS (sinhf, float, (float x)); +# endif +_GL_CXXALIAS_SYS (sinhf, float, (float x)); +_GL_CXXALIASWARN (sinhf); +#elif defined GNULIB_POSIXCHECK +# undef sinhf +# if HAVE_RAW_DECL_SINHF +_GL_WARN_ON_USE (sinhf, "sinhf is unportable - " + "use gnulib module sinhf for portability"); +# endif +#endif + + +#if @GNULIB_SQRTF@ +# if !@HAVE_SQRTF@ +# undef sqrtf +_GL_FUNCDECL_SYS (sqrtf, float, (float x)); +# endif +_GL_CXXALIAS_SYS (sqrtf, float, (float x)); +_GL_CXXALIASWARN (sqrtf); +#elif defined GNULIB_POSIXCHECK +# undef sqrtf +# if HAVE_RAW_DECL_SQRTF +_GL_WARN_ON_USE (sqrtf, "sqrtf is unportable - " + "use gnulib module sqrtf for portability"); +# endif +#endif + +#if @GNULIB_SQRTL@ +# if !@HAVE_SQRTL@ || !@HAVE_DECL_SQRTL@ +_GL_FUNCDECL_SYS (sqrtl, long double, (long double x)); +# endif +_GL_CXXALIAS_SYS (sqrtl, long double, (long double x)); +_GL_CXXALIASWARN (sqrtl); +#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_TANF@ +# if !@HAVE_TANF@ +# undef tanf +_GL_FUNCDECL_SYS (tanf, float, (float x)); +# endif +_GL_CXXALIAS_SYS (tanf, float, (float x)); +_GL_CXXALIASWARN (tanf); +#elif defined GNULIB_POSIXCHECK +# undef tanf +# if HAVE_RAW_DECL_TANF +_GL_WARN_ON_USE (tanf, "tanf is unportable - " + "use gnulib module tanf for portability"); +# endif +#endif + +#if @GNULIB_TANL@ +# if !@HAVE_TANL@ || !@HAVE_DECL_TANL@ +_GL_FUNCDECL_SYS (tanl, long double, (long double x)); +# endif +_GL_CXXALIAS_SYS (tanl, long double, (long double x)); +_GL_CXXALIASWARN (tanl); +#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_TANHF@ +# if !@HAVE_TANHF@ +# undef tanhf +_GL_FUNCDECL_SYS (tanhf, float, (float x)); +# endif +_GL_CXXALIAS_SYS (tanhf, float, (float x)); +_GL_CXXALIASWARN (tanhf); +#elif defined GNULIB_POSIXCHECK +# undef tanhf +# if HAVE_RAW_DECL_TANHF +_GL_WARN_ON_USE (tanhf, "tanhf is unportable - " + "use gnulib module tanhf for portability"); +# endif +#endif + + +#if @GNULIB_TRUNCF@ +# if @REPLACE_TRUNCF@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define truncf rpl_truncf +# endif +_GL_FUNCDECL_RPL (truncf, float, (float x)); +_GL_CXXALIAS_RPL (truncf, float, (float x)); +# else +# if !@HAVE_DECL_TRUNCF@ +_GL_FUNCDECL_SYS (truncf, float, (float x)); +# endif +_GL_CXXALIAS_SYS (truncf, float, (float x)); +# endif +_GL_CXXALIASWARN (truncf); +#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 @REPLACE_TRUNC@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define trunc rpl_trunc +# endif +_GL_FUNCDECL_RPL (trunc, double, (double x)); +_GL_CXXALIAS_RPL (trunc, double, (double x)); +# else +# if !@HAVE_DECL_TRUNC@ +_GL_FUNCDECL_SYS (trunc, double, (double x)); +# endif +_GL_CXXALIAS_SYS (trunc, double, (double x)); +# endif +_GL_CXXALIASWARN (trunc); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef truncl +# define truncl rpl_truncl +# endif +_GL_FUNCDECL_RPL (truncl, long double, (long double x)); +_GL_CXXALIAS_RPL (truncl, long double, (long double x)); +# else +# if !@HAVE_DECL_TRUNCL@ +_GL_FUNCDECL_SYS (truncl, long double, (long double x)); +# endif +_GL_CXXALIAS_SYS (truncl, long double, (long double x)); +# endif +_GL_CXXALIASWARN (truncl); +#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 + + +/* Definitions of function-like macros come here, after the function + declarations. */ + + +#if @GNULIB_ISFINITE@ +# if @REPLACE_ISFINITE@ +_GL_EXTERN_C int gl_isfinitef (float x); +_GL_EXTERN_C int gl_isfinited (double x); +_GL_EXTERN_C 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 +# ifdef __cplusplus +# ifdef isfinite +_GL_MATH_CXX_REAL_FLOATING_DECL_1 (isfinite) +# undef isfinite +_GL_MATH_CXX_REAL_FLOATING_DECL_2 (isfinite) +# endif +# 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@ +_GL_EXTERN_C int gl_isinff (float x); +_GL_EXTERN_C int gl_isinfd (double x); +_GL_EXTERN_C 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 +# ifdef __cplusplus +# ifdef isinf +_GL_MATH_CXX_REAL_FLOATING_DECL_1 (isinf) +# undef isinf +_GL_MATH_CXX_REAL_FLOATING_DECL_2 (isinf) +# endif +# 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 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 +_GL_EXTERN_C 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 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 +_GL_EXTERN_C int isnand (double x); +# endif +#endif + +#if @GNULIB_ISNANL@ +/* Test for NaN for 'long double' numbers. */ +# if @HAVE_ISNANL@ +/* The original 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 +_GL_EXTERN_C int isnanl (long double x) _GL_ATTRIBUTE_CONST; +# 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_isnanf ((float)(x)) +# else +_GL_EXTERN_C 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 +_GL_EXTERN_C 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_isnanl ((long double)(x)) +# else +_GL_EXTERN_C int rpl_isnanl (long double x) _GL_ATTRIBUTE_CONST; +# 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)) +# elif __GNUC__ >= 4 +# undef isnan +# define isnan(x) \ + (sizeof (x) == sizeof (long double) ? __builtin_isnanl ((long double)(x)) : \ + sizeof (x) == sizeof (double) ? __builtin_isnan ((double)(x)) : \ + __builtin_isnanf ((float)(x))) +# endif +# ifdef __cplusplus +# ifdef isnan +_GL_MATH_CXX_REAL_FLOATING_DECL_1 (isnan) +# undef isnan +_GL_MATH_CXX_REAL_FLOATING_DECL_2 (isnan) +# endif +# else +/* Ensure isnan is a macro. */ +# ifndef isnan +# define isnan isnan +# endif +# 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 +_GL_EXTERN_C int gl_signbitf (float arg); +_GL_EXTERN_C int gl_signbitd (double arg); +_GL_EXTERN_C int gl_signbitl (long double arg); +# if __GNUC__ >= 2 && !defined __STRICT_ANSI__ +# define _GL_NUM_UINT_WORDS(type) \ + ((sizeof (type) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) +# 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[_GL_NUM_UINT_WORDS (float)]; \ + } _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[_GL_NUM_UINT_WORDS (double)]; \ + } _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[_GL_NUM_UINT_WORDS (long double)]; \ + } _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 +# ifdef __cplusplus +# ifdef signbit +_GL_MATH_CXX_REAL_FLOATING_DECL_1 (signbit) +# undef signbit +_GL_MATH_CXX_REAL_FLOATING_DECL_2 (signbit) +# endif +# 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 + + +#endif /* _@GUARD_PREFIX@_MATH_H */ +#endif /* _@GUARD_PREFIX@_MATH_H */ diff --git a/gnulib/lib/mbchar.c b/gnulib/lib/mbchar.c new file mode 100644 index 0000000..c9b0dcd --- /dev/null +++ b/gnulib/lib/mbchar.c @@ -0,0 +1,35 @@ +/* Copyright (C) 2001, 2006, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + + +#include + +#include + +#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 0000000..6dcb6cf --- /dev/null +++ b/gnulib/lib/mbchar.h @@ -0,0 +1,350 @@ +/* Multibyte character data type. + Copyright (C) 2001, 2005-2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible . */ + +/* 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 +#include + +/* Tru64 with Desktop Toolkit C has a bug: must be included before + . + BSD/OS 4.1 has a bug: and must be included before + . */ +#include +#include +#include +#include + +#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) + +/* , 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 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 0000000..8ef387d --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Mitsuru Chinen + and Bruno Haible . */ + +/* 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 +#include +#include +#include + +/* Tru64 with Desktop Toolkit C has a bug: must be included before + . + BSD/OS 4.1 has a bug: and must be included before + . */ +#include +#include +#include + +#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 0000000..38cf6b1 --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible . */ + +/* 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 +#include +#include +#include + +/* Tru64 with Desktop Toolkit C has a bug: must be included before + . + BSD/OS 4.1 has a bug: and must be included before + . */ +#include +#include +#include + +#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 0000000..9f5d083 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "mbmemcasecmp.h" + +#include +#include +#include + +#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 0000000..52b7166 --- /dev/null +++ b/gnulib/lib/mbmemcasecmp.h @@ -0,0 +1,45 @@ +/* Compare two memory areas with possibly different lengths, case-insensitive. + Copyright (C) 2009-2011 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 . */ + +#ifndef MBMEMCASECMP_H +#define MBMEMCASECMP_H + +#include + +#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 0000000..76694cb --- /dev/null +++ b/gnulib/lib/mbmemcasecoll.c @@ -0,0 +1,190 @@ +/* Locale-specific case-ignoring memory comparison. + Copyright (C) 2001, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "mbmemcasecoll.h" + +#include +#include +#include + +/* Get tolower(). */ +#include + +/* Get mbstate_t, mbrtowc(), wcrtomb(). */ +#include + +/* Get towlower(). */ +#include + +#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; + + if (n1 == 0) /* NUL character? */ + n1 = 1; + + 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 0000000..5fbb7da --- /dev/null +++ b/gnulib/lib/mbmemcasecoll.h @@ -0,0 +1,58 @@ +/* Locale-specific case-ignoring memory comparison. + Copyright (C) 2001, 2009-2011 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 . */ + +/* Written by Bruno Haible , 2001. */ + +#ifndef MBMEMCASECOLL_H +#define MBMEMCASECOLL_H + +#include +#include + +#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 0000000..54d2c88 --- /dev/null +++ b/gnulib/lib/mbrlen.c @@ -0,0 +1,32 @@ +/* Recognize multibyte character. + Copyright (C) 1999-2000, 2008-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include + + +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 0000000..7a8e599 --- /dev/null +++ b/gnulib/lib/mbrtowc.c @@ -0,0 +1,396 @@ +/* Convert multibyte character to wide character. + Copyright (C) 1999-2002, 2005-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include + +#if GNULIB_defined_mbstate_t +/* Implement mbrtowc() on top of mbtowc(). */ + +# include +# include + +# 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 (s == NULL) + { + pwc = NULL; + s = ""; + n = 1; + } + + if (n == 0) + return (size_t)(-2); + + /* Here n > 0. */ + + if (pstate == NULL) + pstate = internal_state; + + { + 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__ || defined __UCLIBC__ + /* Work around bug */ + 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_ARG2_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 cannot 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 + { +# if MBRTOWC_NULL_ARG1_BUG + wchar_t dummy; + + if (pwc == NULL) + pwc = &dummy; +# endif + + 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 0000000..dfff49c --- /dev/null +++ b/gnulib/lib/mbscasecmp.c @@ -0,0 +1,98 @@ +/* Case-insensitive string comparison function. + Copyright (C) 1998-1999, 2005-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include + +#include +#include + +#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 0000000..f013808 --- /dev/null +++ b/gnulib/lib/mbscasestr.c @@ -0,0 +1,412 @@ +/* Case-insensitive searching in a string. + Copyright (C) 2005-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include + +#include +#include +#include /* 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 UNIT unsigned char +#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 unsigned char *result; + bool success = + knuth_morris_pratt ((const unsigned char *) haystack, + (const unsigned char *) (needle - 1), + strlen (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 0000000..c43ac66 --- /dev/null +++ b/gnulib/lib/mbschr.c @@ -0,0 +1,52 @@ +/* Searching a string for a character. + Copyright (C) 2007-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include + +#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 0000000..68ac1c7 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include + +#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 0000000..8ac2137 --- /dev/null +++ b/gnulib/lib/mbsinit.c @@ -0,0 +1,61 @@ +/* Test for initial conversion state. + Copyright (C) 2008-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include + +#include "verify.h" + +#if (defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__ + +/* On native Windows, 'mbstate_t' is defined as 'int'. */ + +int +mbsinit (const mbstate_t *ps) +{ + return ps == NULL || *ps == 0; +} + +#else + +/* 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 == NULL || pstate[0] == 0; +} + +#endif diff --git a/gnulib/lib/mbslen.c b/gnulib/lib/mbslen.c new file mode 100644 index 0000000..efddd52 --- /dev/null +++ b/gnulib/lib/mbslen.c @@ -0,0 +1,44 @@ +/* Counting the multibyte characters in a string. + Copyright (C) 2007-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include + +#include + +#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 0000000..3a05dd8 --- /dev/null +++ b/gnulib/lib/mbsncasecmp.c @@ -0,0 +1,99 @@ +/* Case-insensitive string comparison function. + Copyright (C) 1998-1999, 2005-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include + +#include +#include + +#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 0000000..e597d5a --- /dev/null +++ b/gnulib/lib/mbsnlen.c @@ -0,0 +1,45 @@ +/* Counting the multibyte characters in a string. + Copyright (C) 2007-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include + +#include + +#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-impl.h b/gnulib/lib/mbsnrtowcs-impl.h new file mode 100644 index 0000000..719f56b --- /dev/null +++ b/gnulib/lib/mbsnrtowcs-impl.h @@ -0,0 +1,124 @@ +/* Convert string to wide string. + Copyright (C) 2008-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +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/mbsnrtowcs.c b/gnulib/lib/mbsnrtowcs.c new file mode 100644 index 0000000..c37c8f7 --- /dev/null +++ b/gnulib/lib/mbsnrtowcs.c @@ -0,0 +1,33 @@ +/* Convert string to wide string. + Copyright (C) 2008-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include + +#include +#include +#include + +#include "minmax.h" +#include "strnlen1.h" + + +extern mbstate_t _gl_mbsrtowcs_state; + +#include "mbsnrtowcs-impl.h" diff --git a/gnulib/lib/mbspbrk.c b/gnulib/lib/mbspbrk.c new file mode 100644 index 0000000..e61ea9e --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include + +#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 0000000..f331c2b --- /dev/null +++ b/gnulib/lib/mbspcasecmp.c @@ -0,0 +1,94 @@ +/* Case-insensitive string comparison function. + Copyright (C) 1998-1999, 2005-2008, 2010-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include + +#include + +#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. If the two match, return a pointer to the first byte + after this prefix in STRING. Otherwise, return NULL. + Note: This function may, in multibyte locales, return non-NULL 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 0000000..c505c68 --- /dev/null +++ b/gnulib/lib/mbsrchr.c @@ -0,0 +1,49 @@ +/* Searching a string for the last occurrence of a character. + Copyright (C) 2007-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include + +#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-impl.h b/gnulib/lib/mbsrtowcs-impl.h new file mode 100644 index 0000000..e78bbfb --- /dev/null +++ b/gnulib/lib/mbsrtowcs-impl.h @@ -0,0 +1,122 @@ +/* Convert string to wide string. + Copyright (C) 2008-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +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/mbsrtowcs-state.c b/gnulib/lib/mbsrtowcs-state.c new file mode 100644 index 0000000..91073b5 --- /dev/null +++ b/gnulib/lib/mbsrtowcs-state.c @@ -0,0 +1,37 @@ +/* Convert string to wide string. + Copyright (C) 2008-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +#include + +/* 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 . + 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 0000000..69e6dff --- /dev/null +++ b/gnulib/lib/mbsrtowcs.c @@ -0,0 +1,32 @@ +/* Convert string to wide string. + Copyright (C) 2008-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include + +#include +#include +#include + +#include "strnlen1.h" + + +extern mbstate_t _gl_mbsrtowcs_state; + +#include "mbsrtowcs-impl.h" diff --git a/gnulib/lib/mbssep.c b/gnulib/lib/mbssep.c new file mode 100644 index 0000000..42e791e --- /dev/null +++ b/gnulib/lib/mbssep.c @@ -0,0 +1,61 @@ +/* Tokenizing a string. + Copyright (C) 2007-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include + +#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 0000000..ec8d7fa --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include + +#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 0000000..611000e --- /dev/null +++ b/gnulib/lib/mbsstr.c @@ -0,0 +1,382 @@ +/* Searching in a string. + Copyright (C) 2005-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include + +#include +#include /* for NULL, in case a nonstandard string.h lacks it */ + +#include "malloca.h" +#include "mbuiter.h" + +/* Knuth-Morris-Pratt algorithm. */ +#define UNIT unsigned char +#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 unsigned char *result; + bool success = + knuth_morris_pratt ((const unsigned char *) haystack, + (const unsigned char *) (needle - 1), + strlen (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 0000000..89a92e5 --- /dev/null +++ b/gnulib/lib/mbstok_r.c @@ -0,0 +1,66 @@ +/* Tokenizing a string. + Copyright (C) 1999, 2002, 2006-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include + +#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 0000000..ad0eae0 --- /dev/null +++ b/gnulib/lib/mbswidth.c @@ -0,0 +1,193 @@ +/* Determine the number of screen columns needed for a string. + Copyright (C) 2000-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible . */ + +#include + +/* Specification. */ +#include "mbswidth.h" + +/* Get MB_CUR_MAX. */ +#include + +#include + +/* Get isprint(). */ +#include + +/* Get mbstate_t, mbrtowc(), mbsinit(), wcwidth(). */ +#include + +/* Get iswcntrl(). */ +#include + +/* Get INT_MAX. */ +#include + +/* 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. */ +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. */ +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. */ + { + if (w > INT_MAX - width) + goto overflow; + width += w; + } + else + /* An unprintable multibyte character. */ + if (!(flags & MBSW_REJECT_UNPRINTABLE)) + { + if (!iswcntrl (wc)) + { + if (width == INT_MAX) + goto overflow; + width++; + } + } + else + return -1; + + p += bytes; + } + while (! mbsinit (&mbstate)); + } + break; + } + return width; + } + + while (p < plimit) + { + unsigned char c = (unsigned char) *p++; + + if (isprint (c)) + { + if (width == INT_MAX) + goto overflow; + width++; + } + else if (!(flags & MBSW_REJECT_UNPRINTABLE)) + { + if (!iscntrl (c)) + { + if (width == INT_MAX) + goto overflow; + width++; + } + } + else + return -1; + } + return width; + + overflow: + return INT_MAX; +} diff --git a/gnulib/lib/mbswidth.h b/gnulib/lib/mbswidth.h new file mode 100644 index 0000000..9e0e886 --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Avoid a clash of our mbswidth() with a function of the same name defined + in UnixWare 7.1.1 . We need this #include before the #define + below. + However, we don't want to #include on all platforms because + - Tru64 with Desktop Toolkit C has a bug: must be included before + . + - BSD/OS 4.1 has a bug: and must be included before + . */ +#if HAVE_DECL_MBSWIDTH_IN_WCHAR_H +# include +#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/mbtowc-impl.h b/gnulib/lib/mbtowc-impl.h new file mode 100644 index 0000000..1645eb5 --- /dev/null +++ b/gnulib/lib/mbtowc-impl.h @@ -0,0 +1,44 @@ +/* Convert multibyte character to wide character. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* We don't need a static internal state, because the encoding is not state + dependent, and when mbrtowc returns (size_t)(-2). we throw the result + away. */ + +int +mbtowc (wchar_t *pwc, const char *s, size_t n) +{ + if (s == NULL) + return 0; + else + { + mbstate_t state; + wchar_t wc; + size_t result; + + memset (&state, 0, sizeof (mbstate_t)); + result = mbrtowc (&wc, s, n, &state); + if (result == (size_t)-1 || result == (size_t)-2) + { + errno = EILSEQ; + return -1; + } + if (pwc != NULL) + *pwc = wc; + return (wc == 0 ? 0 : result); + } +} diff --git a/gnulib/lib/mbtowc.c b/gnulib/lib/mbtowc.c new file mode 100644 index 0000000..b3848a1 --- /dev/null +++ b/gnulib/lib/mbtowc.c @@ -0,0 +1,26 @@ +/* Convert multibyte character to wide character. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#include + +#include +#include +#include + +#include "mbtowc-impl.h" diff --git a/gnulib/lib/mbuiter.h b/gnulib/lib/mbuiter.h new file mode 100644 index 0000000..178f36e --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible . */ + +/* 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 +#include +#include +#include +#include + +/* Tru64 with Desktop Toolkit C has a bug: must be included before + . + BSD/OS 4.1 has a bug: and must be included before + . */ +#include +#include +#include + +#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 0000000..5ce1be8 --- /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-1997, 1999-2003, 2005-2006, 2008-2011 Free Software + Foundation, Inc. + + This program is free software; you can 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 + +#include "md2.h" + +#include +#include +#include + +#include + +#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 0000000..555aef7 --- /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-2011 Free Software Foundation, + Inc. + + This program is free software; you can 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 +# include + +# 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 0000000..6807a83 --- /dev/null +++ b/gnulib/lib/md4.c @@ -0,0 +1,383 @@ +/* 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-1997, 1999-2003, 2005-2006, 2008-2011 Free Software + Foundation, Inc. + + This program is free software; you can 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 + +#include "md4.h" + +#include +#include +#include +#include +#include + +#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 +# define UNALIGNED_P(p) ((uintptr_t) (p) % alignof (uint32_t) != 0) + 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 0000000..5377eb5 --- /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-2011 Free Software Foundation, + Inc. + + This program is free software; you can 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 +# include + +# 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 0000000..7d575ac --- /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-1997, 1999-2001, 2005-2006, 2008-2011 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 , 1995. */ + +#include + +#include "md5.h" + +#include +#include +#include +#include +#include + +#if USE_UNLOCKED_IO +# include "unlocked-io.h" +#endif + +#ifdef _LIBC +# include +# 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 UNALIGNED_P(p) ((uintptr_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 0000000..8b06466 --- /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-2011 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 +#include + +#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 0000000..6ae7c4f --- /dev/null +++ b/gnulib/lib/memcasecmp.c @@ -0,0 +1,49 @@ +/* Case-insensitive buffer comparator. + Copyright (C) 1996-1997, 2000, 2003, 2006, 2009-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Jim Meyering. */ + +#include + +#include "memcasecmp.h" + +#include +#include + +/* 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 0000000..502b856 --- /dev/null +++ b/gnulib/lib/memcasecmp.h @@ -0,0 +1,22 @@ +/* Case-insensitive buffer comparator. + + Copyright (C) 1996, 1998, 2003, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Jim Meyering. */ + +#include + +int memcasecmp (const void *vs1, const void *vs2, size_t n) _GL_ATTRIBUTE_PURE; diff --git a/gnulib/lib/memchr.c b/gnulib/lib/memchr.c new file mode 100644 index 0000000..6d903b1 --- /dev/null +++ b/gnulib/lib/memchr.c @@ -0,0 +1,172 @@ +/* Copyright (C) 1991, 1993, 1996-1997, 1999-2000, 2003-2004, 2006, 2008-2011 + 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 . */ + +#ifndef _LIBC +# include +#endif + +#include + +#include + +#if defined _LIBC +# include +#else +# define reg_char char +#endif + +#include + +#if HAVE_BP_SYM_H || defined _LIBC +# include +#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 0000000..60f247e --- /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 0000000..2e3c7cd --- /dev/null +++ b/gnulib/lib/memchr2.c @@ -0,0 +1,164 @@ +/* Copyright (C) 1991, 1993, 1996-1997, 1999-2000, 2003-2004, 2006, 2008-2011 + 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 . */ + +#include + +#include "memchr2.h" + +#include +#include +#include + +/* 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 0000000..c34acbd --- /dev/null +++ b/gnulib/lib/memchr2.h @@ -0,0 +1,32 @@ +/* Scan memory for the first of two bytes. + Copyright (C) 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#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) + _GL_ATTRIBUTE_PURE; + +#ifdef __cplusplus +} +#endif diff --git a/gnulib/lib/memchr2.valgrind b/gnulib/lib/memchr2.valgrind new file mode 100644 index 0000000..778fe86 --- /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 0000000..72fb81d --- /dev/null +++ b/gnulib/lib/memcmp.c @@ -0,0 +1,363 @@ +/* Copyright (C) 1991, 1993, 1995, 1997-1998, 2003, 2006, 2009-2011 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 . */ + +#ifndef _LIBC +# include +#endif + +#include + +#include + +#undef memcmp + +#ifdef _LIBC + +# include +# include + +# if __BYTE_ORDER == __BIG_ENDIAN +# define WORDS_BIGENDIAN +# endif + +#else /* Not in the GNU C library. */ + +# include + +/* 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 0000000..14ab666 --- /dev/null +++ b/gnulib/lib/memcmp2.c @@ -0,0 +1,36 @@ +/* Compare two memory areas with possibly different lengths. + Copyright (C) 2009-2011 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 . */ + +#include + +/* Specification. */ +#include "memcmp2.h" + +#include + +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 0000000..21552b2 --- /dev/null +++ b/gnulib/lib/memcmp2.h @@ -0,0 +1,40 @@ +/* Compare two memory areas with possibly different lengths. + Copyright (C) 2009-2011 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 . */ + +#ifndef MEMCMP2_H +#define MEMCMP2_H + +#include + +#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) + _GL_ATTRIBUTE_PURE; + + +#ifdef __cplusplus +} +#endif + +#endif /* MEMCMP2_H */ diff --git a/gnulib/lib/memcoll.c b/gnulib/lib/memcoll.c new file mode 100644 index 0000000..23f6f79 --- /dev/null +++ b/gnulib/lib/memcoll.c @@ -0,0 +1,111 @@ +/* Locale-specific memory comparison. + + Copyright (C) 1999, 2002-2004, 2006, 2009-2011 Free Software Foundation, + Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Contributed by Paul Eggert . */ + +#include + +#include "memcoll.h" + +#include +#include +#include + +/* Compare S1 (with size S1SIZE) and S2 (with length S2SIZE) according + to the LC_COLLATE locale. S1 and S2 are both blocks of memory with + nonzero sizes, and the last byte in each block must be a null byte. + Set errno to an error number if there is an error, and to zero + otherwise. */ +static inline int +strcoll_loop (char const *s1, size_t s1size, char const *s2, size_t s2size) +{ + int diff; + + 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; + s1size -= size1; + s2size -= size2; + + if (s1size == 0) + return - (s2size != 0); + if (s2size == 0) + return 1; + } + + return diff; +} + +/* 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; + + /* 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'; + + diff = strcoll_loop (s1, s1len + 1, s2, s2len + 1); + + s1[s1len] = n1; + s2[s2len] = n2; + } + + return diff; +} + +/* Compare S1 (a memory block of size S1SIZE, with a NUL as last byte) + and S2 (a memory block of size S2SIZE, with a NUL as last byte) + according to the LC_COLLATE locale. S1SIZE and S2SIZE must be > 0. + Set errno to an error number if there is an error, and to zero + otherwise. */ +int +memcoll0 (char const *s1, size_t s1size, char const *s2, size_t s2size) +{ + if (s1size == s2size && memcmp (s1, s2, s1size) == 0) + { + errno = 0; + return 0; + } + else + return strcoll_loop (s1, s1size, s2, s2size); +} diff --git a/gnulib/lib/memcoll.h b/gnulib/lib/memcoll.h new file mode 100644 index 0000000..449907a --- /dev/null +++ b/gnulib/lib/memcoll.h @@ -0,0 +1,28 @@ +/* Locale-specific memory comparison. + + Copyright (C) 1999, 2003, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Contributed by Paul Eggert . */ + +#ifndef MEMCOLL_H_ +# define MEMCOLL_H_ 1 + +# include + +int memcoll (char *, size_t, char *, size_t); +int memcoll0 (char const *, size_t, char const *, size_t); + +#endif /* MEMCOLL_H_ */ diff --git a/gnulib/lib/memcpy.c b/gnulib/lib/memcpy.c new file mode 100644 index 0000000..8d014fe --- /dev/null +++ b/gnulib/lib/memcpy.c @@ -0,0 +1,36 @@ +/* Copyright (C) 1995, 1997, 2000, 2003, 2006, 2009-2011 Free Software + * Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Jim Meyering . */ + +#include + +#include + +/* 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 0000000..06b2dfe --- /dev/null +++ b/gnulib/lib/memmem.c @@ -0,0 +1,76 @@ +/* Copyright (C) 1991-1994, 1996-1998, 2000, 2004, 2007-2011 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 +#endif + +/* Specification of memmem. */ +#include + +#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 0000000..0f04054 --- /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 . */ + +#include + +#include + +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 0000000..feedf57 --- /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-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 + +/* Specification. */ +#include + +/* 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 0000000..d7144d0 --- /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-2011 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 . */ + +#if defined _LIBC +# include +#else +# include +# define reg_char char +#endif + +#include +#include + +#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 0000000..f16bf2e --- /dev/null +++ b/gnulib/lib/memset.c @@ -0,0 +1,30 @@ +/* memset.c -- set an area of memory to a given value + Copyright (C) 1991, 2003, 2009-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 + +#include + +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/memxor.c b/gnulib/lib/memxor.c new file mode 100644 index 0000000..199bccd --- /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-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 + +#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 0000000..cec9e7e --- /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-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 + +/* 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 0000000..e0aa250 --- /dev/null +++ b/gnulib/lib/mgetgroups.c @@ -0,0 +1,195 @@ +/* mgetgroups.c -- return a list of the groups a user or current process is in + + Copyright (C) 2007-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Extracted from coreutils' src/id.c. */ + +#include + +#include "mgetgroups.h" + +#include +#include +#include +#include +#include +#if HAVE_GETGROUPLIST +# include +#endif + +#include "getugroups.h" +#include "xalloc-oversized.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; +} diff --git a/gnulib/lib/mgetgroups.h b/gnulib/lib/mgetgroups.h new file mode 100644 index 0000000..7a572bc --- /dev/null +++ b/gnulib/lib/mgetgroups.h @@ -0,0 +1,22 @@ +/* Get a list of all group IDs associated with a specified user ID. + Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +int mgetgroups (const char *username, gid_t gid, gid_t **groups); +#if GNULIB_XGETGROUPS +int xgetgroups (const char *username, gid_t gid, gid_t **groups); +#endif diff --git a/gnulib/lib/minmax.h b/gnulib/lib/minmax.h new file mode 100644 index 0000000..83650f2 --- /dev/null +++ b/gnulib/lib/minmax.h @@ -0,0 +1,61 @@ +/* MIN, MAX macros. + Copyright (C) 1995, 1998, 2001, 2003, 2005, 2009-2011 Free Software + Foundation, Inc. + + This program is free software; you can 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 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 file + since otherwise we get redefinitions on some systems if is + included after this file. Likewise for . + 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 +#elif HAVE_MINMAX_IN_SYS_PARAM_H +# include +#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 0000000..2d5bb0e --- /dev/null +++ b/gnulib/lib/mkancesdirs.c @@ -0,0 +1,153 @@ +/* Make a file's ancestor directories. + + Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +#include + +#include "mkancesdirs.h" + +#include +#include +#include + +#include +#include + +#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 0000000..5f7b2d6 --- /dev/null +++ b/gnulib/lib/mkancesdirs.h @@ -0,0 +1,4 @@ +#include +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 0000000..566aadb --- /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-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert, David MacKenzie, and Jim Meyering. */ + +#include + +#include "mkdir-p.h" + +#include +#include +#include + +#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 0000000..1766d4f --- /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-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert, David MacKenzie, and Jim Meyering. */ + +#include +#include + +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 0000000..07f97b9 --- /dev/null +++ b/gnulib/lib/mkdir.c @@ -0,0 +1,93 @@ +/* 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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Jim Meyering */ + +#include + +/* Specification. */ +#include + +#include +#include +#include +#include + +#include "dirname.h" + +/* Disable the definition of mkdir to rpl_mkdir (from the + 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 includes and , + which are included in the override. */ +#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 0000000..ed7998d --- /dev/null +++ b/gnulib/lib/mkdirat.c @@ -0,0 +1,34 @@ +/* fd-relative mkdir + Copyright (C) 2005-2006, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Jim Meyering */ + +#include + +#include + +/* 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 0000000..ac38c25 --- /dev/null +++ b/gnulib/lib/mkdtemp.c @@ -0,0 +1,39 @@ +/* Copyright (C) 1999, 2001-2003, 2006-2007, 2009-2011 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 . */ + +/* Extracted from misc/mkdtemp.c. */ + +#include + +/* Specification. */ +#include + +#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 0000000..45b8931 --- /dev/null +++ b/gnulib/lib/mkfifo.c @@ -0,0 +1,58 @@ +/* Create a named fifo. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Eric Blake */ + +#include + +#include + +#include +#include + +#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 0000000..0f2342f --- /dev/null +++ b/gnulib/lib/mkfifoat.c @@ -0,0 +1,55 @@ +/* Create a named fifo relative to an open directory. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Eric Blake */ + +#include + +#include + +#if !HAVE_MKFIFO + +# include + +/* 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 0000000..5bbf62f --- /dev/null +++ b/gnulib/lib/mknod.c @@ -0,0 +1,74 @@ +/* Create a device inode. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Eric Blake */ + +#include + +#include + +#include +#include + +#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 0000000..e078837 --- /dev/null +++ b/gnulib/lib/mknodat.c @@ -0,0 +1,57 @@ +/* Create an inode relative to an open directory. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Eric Blake */ + +#include + +#include + +#if !HAVE_MKNOD + +# include + +/* 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 0000000..3882ab1 --- /dev/null +++ b/gnulib/lib/mkostemp.c @@ -0,0 +1,46 @@ +/* Copyright (C) 1998-1999, 2001, 2005-2007, 2009-2011 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 . */ + +#if !_LIBC +# include +#endif + +#include + +#if !_LIBC +# include "tempname.h" +# define __gen_tempname gen_tempname +# ifndef __GTFILE +# define __GT_FILE GT_FILE +# endif +#endif + +#include + +#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 0000000..f8ff67c --- /dev/null +++ b/gnulib/lib/mkostemps.c @@ -0,0 +1,54 @@ +/* Copyright (C) 1998-1999, 2001, 2005-2007, 2009-2011 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 . */ + +#if !_LIBC +# include +#endif + +#include + +#if !_LIBC +# include +# 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 + +#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 0000000..b0380e8 --- /dev/null +++ b/gnulib/lib/mkstemp-safer.c @@ -0,0 +1,63 @@ +/* Invoke mkstemp, but avoid some glitches. + + Copyright (C) 2005-2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +#include + +#include "stdlib-safer.h" + +#include +#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 0000000..3c8437e --- /dev/null +++ b/gnulib/lib/mkstemp.c @@ -0,0 +1,50 @@ +/* Copyright (C) 1998-1999, 2001, 2005-2007, 2009-2011 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 . */ + +#if !_LIBC +# include +#endif + +#include + +#if !_LIBC +# include "tempname.h" +# define __gen_tempname gen_tempname +# ifndef __GT_FILE +# define __GT_FILE GT_FILE +# endif +#endif + +#include + +#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. + + If you are creating temporary files which will later be removed, + consider using the clean-temp module, which avoids several pitfalls + of using mkstemp directly. */ +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 0000000..16f703e --- /dev/null +++ b/gnulib/lib/mkstemps.c @@ -0,0 +1,54 @@ +/* Copyright (C) 1998-1999, 2001, 2005-2007, 2009-2011 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 . */ + +#if !_LIBC +# include +#endif + +#include + +#if !_LIBC +# include +# 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 + +#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 0000000..4287acf --- /dev/null +++ b/gnulib/lib/mktime-internal.h @@ -0,0 +1,4 @@ +#include +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 0000000..cba2b8b --- /dev/null +++ b/gnulib/lib/mktime.c @@ -0,0 +1,737 @@ +/* Convert a `struct tm' to a time_t value. + Copyright (C) 1993-1999, 2002-2007, 2009-2011 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by 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. */ + +/* Define this to have a standalone program to test this implementation of + mktime. */ +/* #define DEBUG 1 */ + +#ifndef _LIBC +# include +#endif + +/* Some of the code in this file assumes that signed integer overflow + silently wraps around. This assumption can't easily be programmed + around, nor can it be checked for portably at compile-time or + easily eliminated at run-time. + + Define WRAPV to 1 if the assumption is valid. Otherwise, define it + to 0; this forces the use of slower code that, while not guaranteed + by the C Standard, works on all production platforms that we know + about. */ +#ifndef WRAPV +# if (__GNUC__ == 4 && 4 <= __GNUC_MINOR__) || 4 < __GNUC__ +# pragma GCC optimize ("wrapv") +# define WRAPV 1 +# else +# define WRAPV 0 +# endif +#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 + +#include + +#include /* For the real memcpy prototype. */ + +#if DEBUG +# include +# include +/* Make it work even if the system's libc has its own mktime routine. */ +# undef mktime +# define mktime my_mktime +#endif /* DEBUG */ + +/* Verify a requirement at compile-time (unlike assert, which is runtime). */ +#define verify(name, assertion) struct name { char a[(assertion) ? 1 : -1]; } + +/* A signed type that is at least one bit wider than int. */ +#if INT_MAX <= LONG_MAX / 2 +typedef long int long_int; +#else +typedef long long int long_int; +#endif +verify (long_int_is_wide_enough, INT_MAX == INT_MAX * (long_int) 2 / 2); + +/* 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 \ + && (long_int) -1 >> 1 == -1 \ + && ((time_t) -1 >> 1 == -1 || ! TYPE_SIGNED (time_t))) \ + ? (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, or if T is an unsigned integer type. */ +#define TYPE_TWOS_COMPLEMENT(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_MAXIMUM (t))) +#define TYPE_MAXIMUM(t) \ + ((t) (! TYPE_SIGNED (t) \ + ? (t) -1 \ + : ((((t) 1 << (sizeof (t) * CHAR_BIT - 2)) - 1) * 2 + 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 (time_t_is_integer, TYPE_IS_INTEGER (time_t)); +verify (twos_complement_arithmetic, + (TYPE_TWOS_COMPLEMENT (int) + && TYPE_TWOS_COMPLEMENT (long_int) + && TYPE_TWOS_COMPLEMENT (time_t))); + +#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 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 1 if the values A and B differ according to the rules for + tm_isdst: A and B differ if one is zero and the other positive. */ +static int +isdst_differ (int a, int b) +{ + return (!a != !b) & (0 <= a) & (0 <= b); +} + +/* 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); + + /* 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 the average of A and B, even if A + B would overflow. */ +static time_t +time_t_avg (time_t a, time_t b) +{ + return SHR (a, 1) + SHR (b, 1) + (a & b & 1); +} + +/* Return 1 if A + B does not overflow. If time_t is unsigned and if + B's top bit is set, assume that the sum represents A - -B, and + return 1 if the subtraction does not wrap around. */ +static int +time_t_add_ok (time_t a, time_t b) +{ + if (! TYPE_SIGNED (time_t)) + { + time_t sum = a + b; + return (sum < a) == (TIME_T_MIDPOINT <= b); + } + else if (WRAPV) + { + time_t sum = a + b; + return (sum < a) == (b < 0); + } + else + { + time_t avg = time_t_avg (a, b); + return TIME_T_MIN / 2 <= avg && avg <= TIME_T_MAX / 2; + } +} + +/* Return 1 if A + B does not overflow. */ +static int +time_t_int_add_ok (time_t a, int b) +{ + verify (int_no_wider_than_time_t, INT_MAX <= TIME_T_MAX); + if (WRAPV) + { + time_t sum = a + b; + return (sum < a) == (b < 0); + } + else + { + int a_odd = a & 1; + time_t avg = SHR (a, 1) + (SHR (b, 1) + (a_odd & b)); + return TIME_T_MIN / 2 <= avg && avg <= TIME_T_MAX / 2; + } +} + +/* 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); + if (time_t_add_ok (*t, d)) + return *t + d; + } + + /* 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 = time_t_avg (ok, bad); + 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; + int isdst = tp->tm_isdst; + + /* 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 ? -1 - diff : diff; + + /* IRIX 4.0.5 cc miscalculates 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 ? -1 - 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_differ (isdst, 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) + if (time_t_int_add_ok (t, delta * direction)) + { + time_t ot = t + delta * direction; + struct tm otm; + ranged_convert (convert, &ot, &otm); + if (! isdst_differ (isdst, otm.tm_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; + if (! time_t_int_add_ok (t, sec_requested)) + return -1; + t1 = t + sec_requested; + if (! time_t_int_add_ok (t1, sec_adjustment)) + return -1; + t2 = t1 + sec_adjustment; + if (! 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) + | isdst_differ (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 -I. -Wall -W -O2 -g mktime.c -o mktime" +End: +*/ diff --git a/gnulib/lib/modechange.c b/gnulib/lib/modechange.c new file mode 100644 index 0000000..580a460 --- /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-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by David MacKenzie */ + +/* 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 + +#include "modechange.h" +#include +#include "stat-macros.h" +#include "xalloc.h" +#include + +/* 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 0000000..a15aeca --- /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-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#if ! defined MODECHANGE_H_ +# define MODECHANGE_H_ + +# include +# include + +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/modff.c b/gnulib/lib/modff.c new file mode 100644 index 0000000..1b2554c --- /dev/null +++ b/gnulib/lib/modff.c @@ -0,0 +1,29 @@ +/* Get signed integer and fractional parts of a floating-point number. + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +float +modff (float x, float *iptr) +{ + double i; + double frac = modf ((double) x, &i); + *iptr = (float) i; + return (float) frac; +} diff --git a/gnulib/lib/mountlist.c b/gnulib/lib/mountlist.c new file mode 100644 index 0000000..23437bc --- /dev/null +++ b/gnulib/lib/mountlist.c @@ -0,0 +1,951 @@ +/* mountlist.c -- return a list of mounted file systems + + Copyright (C) 1991-1992, 1997-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#include "mountlist.h" + +#include +#include +#include +#include +#include + +#include "xalloc.h" + +#include + +#include + +#include + +#if HAVE_SYS_PARAM_H +# include +#endif + +#if defined MOUNTED_GETFSSTAT /* OSF_1 and Darwin1.3.x */ +# if HAVE_SYS_UCRED_H +# include /* needed on OSF V4.0 for definition of NGROUPS, + NGROUPS is used as an array dimension in ucred.h */ +# include /* needed by powerpc-apple-darwin1.3.7 */ +# endif +# if HAVE_SYS_MOUNT_H +# include +# endif +# if HAVE_SYS_FS_TYPES_H +# include /* 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 +# 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 +#endif + +#ifdef MOUNTED_GETMNTINFO2 /* NetBSD 3.0. */ +# include +#endif + +#ifdef MOUNTED_GETMNT /* Ultrix. */ +# include +# include +#endif + +#ifdef MOUNTED_FS_STAT_DEV /* BeOS. */ +# include +# include +#endif + +#ifdef MOUNTED_FREAD /* SVR2. */ +# include +#endif + +#ifdef MOUNTED_FREAD_FSTYP /* SVR3. */ +# include +# include +# include +#endif + +#ifdef MOUNTED_LISTMNTENT +# include +#endif + +#ifdef MOUNTED_GETMNTENT2 /* SVR4. */ +# include +#endif + +#ifdef MOUNTED_VMOUNT /* AIX. */ +# include +# include +#endif + +#ifdef MOUNTED_INTERIX_STATVFS /* Interix. */ +# include +# include +#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 +#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 + +#ifdef __CYGWIN__ +# include +# define ME_REMOTE me_remote +/* All cygwin mount points include `:' or start with `//'; so it + requires a native Windows call to determine remote disks. */ +static bool +me_remote (char const *fs_name, char const *fs_type _GL_UNUSED) +{ + if (fs_name[0] && fs_name[1] == ':') + { + char drive[4]; + sprintf (drive, "%c:\\", fs_name[0]); + switch (GetDriveType (drive)) + { + case DRIVE_REMOVABLE: + case DRIVE_FIXED: + case DRIVE_CDROM: + case DRIVE_RAMDISK: + return false; + } + } + return true; +} +#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 (NULL, 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. */ + +#ifdef MOUNTED_INTERIX_STATVFS + { + DIR *dirp = opendir ("/dev/fs"); + char node[9 + NAME_MAX]; + + if (!dirp) + goto free_then_fail; + + while (1) + { + struct statvfs dev; + struct dirent entry; + struct dirent *result; + + if (readdir_r (dirp, &entry, &result) || result == NULL) + break; + + strcpy (node, "/dev/fs/"); + strcat (node, entry.d_name); + + if (statvfs (node, &dev) == 0) + { + me = xmalloc (sizeof *me); + me->me_devname = xstrdup (dev.f_mntfromname); + me->me_mountdir = xstrdup (dev.f_mntonname); + me->me_type = xstrdup (dev.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_INTERIX_STATVFS */ + + *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 0000000..926bfdf --- /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-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef MOUNTLIST_H_ +# define MOUNTLIST_H_ + +# include +# include + +/* 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 0000000..92d3c22 --- /dev/null +++ b/gnulib/lib/mpsort.c @@ -0,0 +1,156 @@ +/* Sort a vector of pointers to data. + + Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +#include + +#include "mpsort.h" + +#include + +/* 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 0000000..5e58811 --- /dev/null +++ b/gnulib/lib/mpsort.h @@ -0,0 +1,2 @@ +#include +void mpsort (void const **, size_t, int (*) (void const *, void const *)); diff --git a/gnulib/lib/msvc-inval.c b/gnulib/lib/msvc-inval.c new file mode 100644 index 0000000..31dbeea --- /dev/null +++ b/gnulib/lib/msvc-inval.c @@ -0,0 +1,130 @@ +/* Invalid parameter handler for MSVC runtime libraries. + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software; you can 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 + +/* Specification. */ +#include "msvc-inval.h" + +#if HAVE_MSVC_INVALID_PARAMETER_HANDLER \ + && !(MSVC_INVALID_PARAMETER_HANDLING == SANE_LIBRARY_HANDLING) + +/* Get _invalid_parameter_handler type and _set_invalid_parameter_handler + declaration. */ +# include + +# if MSVC_INVALID_PARAMETER_HANDLING == DEFAULT_HANDLING + +static void cdecl +gl_msvc_invalid_parameter_handler (const wchar_t *expression, + const wchar_t *function, + const wchar_t *file, + unsigned int line, + uintptr_t dummy) +{ +} + +# else + +/* Get declarations of the Win32 API functions. */ +# define WIN32_LEAN_AND_MEAN +# include + +# if defined _MSC_VER + +static void cdecl +gl_msvc_invalid_parameter_handler (const wchar_t *expression, + const wchar_t *function, + const wchar_t *file, + unsigned int line, + uintptr_t dummy) +{ + RaiseException (STATUS_GNULIB_INVALID_PARAMETER, 0, 0, NULL); +} + +# else + +/* An index to thread-local storage. */ +static DWORD tls_index; +static int tls_initialized /* = 0 */; + +/* Used as a fallback only. */ +static struct gl_msvc_inval_per_thread not_per_thread; + +struct gl_msvc_inval_per_thread * +gl_msvc_inval_current (void) +{ + if (!tls_initialized) + { + tls_index = TlsAlloc (); + tls_initialized = 1; + } + if (tls_index == TLS_OUT_OF_INDEXES) + /* TlsAlloc had failed. */ + return ¬_per_thread; + else + { + struct gl_msvc_inval_per_thread *pointer = + (struct gl_msvc_inval_per_thread *) TlsGetValue (tls_index); + if (pointer == NULL) + { + /* First call. Allocate a new 'struct gl_msvc_inval_per_thread'. */ + pointer = + (struct gl_msvc_inval_per_thread *) + malloc (sizeof (struct gl_msvc_inval_per_thread)); + if (pointer == NULL) + /* Could not allocate memory. Use the global storage. */ + pointer = ¬_per_thread; + TlsSetValue (tls_index, pointer); + } + return pointer; + } +} + +static void cdecl +gl_msvc_invalid_parameter_handler (const wchar_t *expression, + const wchar_t *function, + const wchar_t *file, + unsigned int line, + uintptr_t dummy) +{ + struct gl_msvc_inval_per_thread *current = gl_msvc_inval_current (); + if (current->restart_valid) + longjmp (current->restart, 1); + else + /* An invalid parameter notification from outside the gnulib code. + Give the caller a chance to intervene. */ + RaiseException (STATUS_GNULIB_INVALID_PARAMETER, 0, 0, NULL); +} + +# endif + +# endif + +static int gl_msvc_inval_initialized /* = 0 */; + +void +gl_msvc_inval_ensure_handler (void) +{ + if (gl_msvc_inval_initialized == 0) + { + _set_invalid_parameter_handler (gl_msvc_invalid_parameter_handler); + gl_msvc_inval_initialized = 1; + } +} + +#endif diff --git a/gnulib/lib/msvc-inval.h b/gnulib/lib/msvc-inval.h new file mode 100644 index 0000000..5ebc29f --- /dev/null +++ b/gnulib/lib/msvc-inval.h @@ -0,0 +1,223 @@ +/* Invalid parameter handler for MSVC runtime libraries. + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software; you can 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 _MSVC_INVAL_H +#define _MSVC_INVAL_H + +/* With MSVC runtime libraries with the "invalid parameter handler" concept, + functions like fprintf(), dup2(), or close() crash when the caller passes + an invalid argument. But POSIX wants error codes (such as EINVAL or EBADF) + instead. + This file defines macros that turn such an invalid parameter notification + into a non-local exit. An error code can then be produced at the target + of this exit. You can thus write code like + + TRY_MSVC_INVAL + { + + } + CATCH_MSVC_INVAL + { + + } + DONE_MSVC_INVAL; + + This entire block expands to a single statement. + + The handling of invalid parameters can be done in three ways: + + * The default way, which is reasonable for programs (not libraries): + AC_DEFINE([MSVC_INVALID_PARAMETER_HANDLING], [DEFAULT_HANDLING]) + + * The way for libraries that make "hairy" calls (like close(-1), or + fclose(fp) where fileno(fp) is closed, or simply getdtablesize()): + AC_DEFINE([MSVC_INVALID_PARAMETER_HANDLING], [HAIRY_LIBRARY_HANDLING]) + + * The way for libraries that make no "hairy" calls: + AC_DEFINE([MSVC_INVALID_PARAMETER_HANDLING], [SANE_LIBRARY_HANDLING]) + */ + +#define DEFAULT_HANDLING 0 +#define HAIRY_LIBRARY_HANDLING 1 +#define SANE_LIBRARY_HANDLING 2 + +#if HAVE_MSVC_INVALID_PARAMETER_HANDLER \ + && !(MSVC_INVALID_PARAMETER_HANDLING == SANE_LIBRARY_HANDLING) +/* A native Windows platform with the "invalid parameter handler" concept, + and either DEFAULT_HANDLING or HAIRY_LIBRARY_HANDLING. */ + +# if MSVC_INVALID_PARAMETER_HANDLING == DEFAULT_HANDLING +/* Default handling. */ + +# ifdef __cplusplus +extern "C" { +# endif + +/* Ensure that the invalid parameter handler in installed that just returns. + Because we assume no other part of the program installs a different + invalid parameter handler, this solution is multithread-safe. */ +extern void gl_msvc_inval_ensure_handler (void); + +# ifdef __cplusplus +} +# endif + +# define TRY_MSVC_INVAL \ + do \ + { \ + gl_msvc_inval_ensure_handler (); \ + if (1) +# define CATCH_MSVC_INVAL \ + else +# define DONE_MSVC_INVAL \ + } \ + while (0) + +# else +/* Handling for hairy libraries. */ + +# include + +/* Gnulib can define its own status codes, as described in the page + "Raising Software Exceptions" on microsoft.com + . + Our status codes are composed of + - 0xE0000000, mandatory for all user-defined status codes, + - 0x474E550, a API identifier ("GNU"), + - 0, 1, 2, ..., used to distinguish different status codes from the + same API. */ +# define STATUS_GNULIB_INVALID_PARAMETER (0xE0000000 + 0x474E550 + 0) + +# if defined _MSC_VER +/* A compiler that supports __try/__except, as described in the page + "try-except statement" on microsoft.com + . + With __try/__except, we can use the multithread-safe exception handling. */ + +# ifdef __cplusplus +extern "C" { +# endif + +/* Ensure that the invalid parameter handler in installed that raises a + software exception with code STATUS_GNULIB_INVALID_PARAMETER. + Because we assume no other part of the program installs a different + invalid parameter handler, this solution is multithread-safe. */ +extern void gl_msvc_inval_ensure_handler (void); + +# ifdef __cplusplus +} +# endif + +# define TRY_MSVC_INVAL \ + do \ + { \ + gl_msvc_inval_ensure_handler (); \ + __try +# define CATCH_MSVC_INVAL \ + __except (GetExceptionCode () == STATUS_GNULIB_INVALID_PARAMETER \ + ? EXCEPTION_EXECUTE_HANDLER \ + : EXCEPTION_CONTINUE_SEARCH) +# define DONE_MSVC_INVAL \ + } \ + while (0) + +# else +/* Any compiler. + We can only use setjmp/longjmp. */ + +# include + +# ifdef __cplusplus +extern "C" { +# endif + +struct gl_msvc_inval_per_thread +{ + /* The restart that will resume execution at the code between + CATCH_MSVC_INVAL and DONE_MSVC_INVAL. It is enabled only between + TRY_MSVC_INVAL and CATCH_MSVC_INVAL. */ + jmp_buf restart; + + /* Tells whether the contents of restart is valid. */ + int restart_valid; +}; + +/* Ensure that the invalid parameter handler in installed that passes + control to the gl_msvc_inval_restart if it is valid, or raises a + software exception with code STATUS_GNULIB_INVALID_PARAMETER otherwise. + Because we assume no other part of the program installs a different + invalid parameter handler, this solution is multithread-safe. */ +extern void gl_msvc_inval_ensure_handler (void); + +/* Return a pointer to the per-thread data for the current thread. */ +extern struct gl_msvc_inval_per_thread *gl_msvc_inval_current (void); + +# ifdef __cplusplus +} +# endif + +# define TRY_MSVC_INVAL \ + do \ + { \ + struct gl_msvc_inval_per_thread *msvc_inval_current; \ + gl_msvc_inval_ensure_handler (); \ + msvc_inval_current = gl_msvc_inval_current (); \ + /* First, initialize gl_msvc_inval_restart. */ \ + if (setjmp (msvc_inval_current->restart) == 0) \ + { \ + /* Then, mark it as valid. */ \ + msvc_inval_current->restart_valid = 1; +# define CATCH_MSVC_INVAL \ + /* Execution completed. \ + Mark gl_msvc_inval_restart as invalid. */ \ + msvc_inval_current->restart_valid = 0; \ + } \ + else \ + { \ + /* Execution triggered an invalid parameter notification. \ + Mark gl_msvc_inval_restart as invalid. */ \ + msvc_inval_current->restart_valid = 0; +# define DONE_MSVC_INVAL \ + } \ + } \ + while (0) + +# endif + +# endif + +#else +/* A platform that does not need to the invalid parameter handler, + or when SANE_LIBRARY_HANDLING is desired. */ + +/* The braces here avoid GCC warnings like + "warning: suggest explicit braces to avoid ambiguous `else'". */ +# define TRY_MSVC_INVAL \ + do \ + { \ + if (1) +# define CATCH_MSVC_INVAL \ + else +# define DONE_MSVC_INVAL \ + } \ + while (0) + +#endif + +#endif /* _MSVC_INVAL_H */ diff --git a/gnulib/lib/msvc-nothrow.c b/gnulib/lib/msvc-nothrow.c new file mode 100644 index 0000000..0af17b2 --- /dev/null +++ b/gnulib/lib/msvc-nothrow.c @@ -0,0 +1,50 @@ +/* Wrappers that don't throw invalid parameter notifications + with MSVC runtime libraries. + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software; you can 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 + +/* Specification. */ +#include "msvc-nothrow.h" + +/* Get declarations of the Win32 API functions. */ +#define WIN32_LEAN_AND_MEAN +#include + +#include "msvc-inval.h" + +#undef _get_osfhandle + +#if HAVE_MSVC_INVALID_PARAMETER_HANDLER +intptr_t +_gl_nothrow_get_osfhandle (int fd) +{ + intptr_t result; + + TRY_MSVC_INVAL + { + result = _get_osfhandle (fd); + } + CATCH_MSVC_INVAL + { + result = (intptr_t) INVALID_HANDLE_VALUE; + } + DONE_MSVC_INVAL; + + return result; +} +#endif diff --git a/gnulib/lib/msvc-nothrow.h b/gnulib/lib/msvc-nothrow.h new file mode 100644 index 0000000..1ec2888 --- /dev/null +++ b/gnulib/lib/msvc-nothrow.h @@ -0,0 +1,44 @@ +/* Wrappers that don't throw invalid parameter notifications + with MSVC runtime libraries. + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software; you can 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 _MSVC_NOTHROW_H +#define _MSVC_NOTHROW_H + +/* With MSVC runtime libraries with the "invalid parameter handler" concept, + functions like fprintf(), dup2(), or close() crash when the caller passes + an invalid argument. But POSIX wants error codes (such as EINVAL or EBADF) + instead. + This file defines wrappers that turn such an invalid parameter notification + into an error code. */ + +#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ + +/* Get original declaration of _get_osfhandle. */ +# include + +# if HAVE_MSVC_INVALID_PARAMETER_HANDLER + +/* Override _get_osfhandle. */ +extern intptr_t _gl_nothrow_get_osfhandle (int fd); +# define _get_osfhandle _gl_nothrow_get_osfhandle + +# endif + +#endif + +#endif /* _MSVC_NOTHROW_H */ diff --git a/gnulib/lib/nanosleep.c b/gnulib/lib/nanosleep.c new file mode 100644 index 0000000..e08c002 --- /dev/null +++ b/gnulib/lib/nanosleep.c @@ -0,0 +1,274 @@ +/* Provide a replacement for the POSIX nanosleep function. + + Copyright (C) 1999-2000, 2002, 2004-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Jim Meyering + and Bruno Haible for the Woe32 part */ + +#include + +#include + +#include "intprops.h" +#include "sig-handler.h" +#include "verify.h" + +#include +#include +#include +#include +#include + +#include +#include + +#include + + +enum { BILLION = 1000 * 1000 * 1000 }; + +#if HAVE_BUG_BIG_NANOSLEEP + +int +nanosleep (const struct timespec *requested_delay, + struct timespec *remaining_delay) +# undef nanosleep +{ + /* nanosleep mishandles large sleeps due to internal overflow problems. + The worst known case of this is Linux 2.6.9 with glibc 2.3.4, which + can't sleep more than 24.85 days (2^31 milliseconds). Similarly, + 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. */ + + if (requested_delay->tv_nsec < 0 || BILLION <= requested_delay->tv_nsec) + { + errno = EINVAL; + return -1; + } + + { + /* Verify that time_t is large enough. */ + verify (TYPE_MAXIMUM (time_t) / 24 / 24 / 60 / 60); + const time_t limit = 24 * 24 * 60 * 60; + time_t seconds = requested_delay->tv_sec; + struct timespec intermediate; + intermediate.tv_nsec = requested_delay->tv_nsec; + + 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; + return result; + } + intermediate.tv_nsec = 0; + } + intermediate.tv_sec = seconds; + return nanosleep (&intermediate, remaining_delay); + } +} + +#elif (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ +/* Windows platforms. */ + +# define WIN32_LEAN_AND_MEAN +# include + +/* The Win32 function Sleep() has a resolution of about 15 ms and takes + at least 5 ms to execute. We use this function for longer time periods. + Additionally, we use busy-looping over short time periods, to get a + resolution of about 0.01 ms. In order to measure such short timespans, + we use the QueryPerformanceCounter() function. */ + +int +nanosleep (const struct timespec *requested_delay, + struct timespec *remaining_delay) +{ + static bool initialized; + /* Number of performance counter increments per nanosecond, + or zero if it could not be determined. */ + static double ticks_per_nanosecond; + + if (requested_delay->tv_nsec < 0 || BILLION <= requested_delay->tv_nsec) + { + errno = EINVAL; + return -1; + } + + /* For requested delays of one second or more, 15ms resolution is + sufficient. */ + if (requested_delay->tv_sec == 0) + { + if (!initialized) + { + /* Initialize ticks_per_nanosecond. */ + LARGE_INTEGER ticks_per_second; + + if (QueryPerformanceFrequency (&ticks_per_second)) + ticks_per_nanosecond = + (double) ticks_per_second.QuadPart / 1000000000.0; + + initialized = true; + } + if (ticks_per_nanosecond) + { + /* QueryPerformanceFrequency worked. We can use + QueryPerformanceCounter. Use a combination of Sleep and + busy-looping. */ + /* Number of milliseconds to pass to the Sleep function. + Since Sleep can take up to 8 ms less or 8 ms more than requested + (or maybe more if the system is loaded), we subtract 10 ms. */ + int sleep_millis = (int) requested_delay->tv_nsec / 1000000 - 10; + /* Determine how many ticks to delay. */ + LONGLONG wait_ticks = requested_delay->tv_nsec * ticks_per_nanosecond; + /* Start. */ + LARGE_INTEGER counter_before; + if (QueryPerformanceCounter (&counter_before)) + { + /* Wait until the performance counter has reached this value. + We don't need to worry about overflow, because the performance + counter is reset at reboot, and with a frequency of 3.6E6 + ticks per second 63 bits suffice for over 80000 years. */ + LONGLONG wait_until = counter_before.QuadPart + wait_ticks; + /* Use Sleep for the longest part. */ + if (sleep_millis > 0) + Sleep (sleep_millis); + /* Busy-loop for the rest. */ + for (;;) + { + LARGE_INTEGER counter_after; + if (!QueryPerformanceCounter (&counter_after)) + /* QueryPerformanceCounter failed, but succeeded earlier. + Should not happen. */ + break; + if (counter_after.QuadPart >= wait_until) + /* The requested time has elapsed. */ + break; + } + goto done; + } + } + } + /* Implementation for long delays and as fallback. */ + Sleep (requested_delay->tv_sec * 1000 + requested_delay->tv_nsec / 1000000); + + done: + /* Sleep is not interruptible. So there is no remaining delay. */ + if (remaining_delay != NULL) + { + remaining_delay->tv_sec = 0; + remaining_delay->tv_nsec = 0; + } + return 0; +} + +#else +/* Unix platforms lacking nanosleep. */ + +/* 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) + { + if (tv_delay.tv_sec == TYPE_MAXIMUM (time_t)) + tv_delay.tv_usec = 1000000 - 1; /* close enough */ + else + { + tv_delay.tv_sec++; + 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 +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 0000000..1de1546 --- /dev/null +++ b/gnulib/lib/netdb.in.h @@ -0,0 +1,266 @@ +/* Provide a netdb.h header file for systems lacking it (read: MinGW). + Copyright (C) 2008-2011 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 . + It is intended to provide definitions and prototypes needed by an + application. */ + +#ifndef _@GUARD_PREFIX@_NETDB_H + +#if __GNUC__ >= 3 +@PRAGMA_SYSTEM_HEADER@ +#endif +@PRAGMA_COLUMNS@ + +#if @HAVE_NETDB_H@ + +/* The include_next requires a split double-inclusion guard. */ +# @INCLUDE_NEXT@ @NEXT_NETDB_H@ + +#endif + +#ifndef _@GUARD_PREFIX@_NETDB_H +#define _@GUARD_PREFIX@_NETDB_H + +/* Get definitions such as 'socklen_t' on IRIX 6.5 and OSF/1 4.0 and + 'struct hostent' on MinGW. */ +#include + +/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ + +/* The definition of _GL_ARG_NONNULL is copied here. */ + +/* The definition of _GL_WARN_ON_USE is copied here. */ + +/* Declarations for a platform that lacks , or where it is + incomplete. */ + +#if @GNULIB_GETADDRINFO@ + +# if !@HAVE_STRUCT_ADDRINFO@ + +# ifdef __cplusplus +extern "C" { +# endif + +# if !GNULIB_defined_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. */ +}; +# define GNULIB_defined_struct_addrinfo 1 +# endif + +# ifdef __cplusplus +} +# endif + +# 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 + . */ +_GL_FUNCDECL_SYS (getaddrinfo, int, + (const char *restrict nodename, + const char *restrict servname, + const struct addrinfo *restrict hints, + struct addrinfo **restrict res) + _GL_ARG_NONNULL ((4))); +# endif +_GL_CXXALIAS_SYS (getaddrinfo, int, + (const char *restrict nodename, + const char *restrict servname, + const struct addrinfo *restrict hints, + struct addrinfo **restrict res)); +_GL_CXXALIASWARN (getaddrinfo); + +# if !@HAVE_DECL_FREEADDRINFO@ +/* Free `addrinfo' structure AI including associated storage. + For more details, see the POSIX:2001 specification + . */ +_GL_FUNCDECL_SYS (freeaddrinfo, void, (struct addrinfo *ai) + _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (freeaddrinfo, void, (struct addrinfo *ai)); +_GL_CXXALIASWARN (freeaddrinfo); + +# if @REPLACE_GAI_STRERROR@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef gai_strerror +# define gai_strerror rpl_gai_strerror +# endif +_GL_FUNCDECL_RPL (gai_strerror, const char *, (int ecode)); +_GL_CXXALIAS_RPL (gai_strerror, const char *, (int ecode)); +# else +# if !@HAVE_DECL_GAI_STRERROR@ +/* Convert error return from getaddrinfo() to a string. + For more details, see the POSIX:2001 specification + . */ +_GL_FUNCDECL_SYS (gai_strerror, const char *, (int ecode)); +# endif +_GL_CXXALIAS_SYS (gai_strerror, const char *, (int ecode)); +# endif +_GL_CXXALIASWARN (gai_strerror); + +# if !@HAVE_DECL_GETNAMEINFO@ +/* Convert socket address to printable node and service names. + For more details, see the POSIX:2001 specification + . */ +_GL_FUNCDECL_SYS (getnameinfo, int, + (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 +/* Need to cast, because on glibc systems, the seventh parameter is + unsigned int flags. */ +_GL_CXXALIAS_SYS_CAST (getnameinfo, int, + (const struct sockaddr *restrict sa, socklen_t salen, + char *restrict node, socklen_t nodelen, + char *restrict service, socklen_t servicelen, + int flags)); +_GL_CXXALIASWARN (getnameinfo); + +/* Possible flags for getnameinfo. */ +# ifndef NI_NUMERICHOST +# define NI_NUMERICHOST 1 +# endif +# ifndef NI_NUMERICSERV +# define NI_NUMERICSERV 2 +# endif + +#elif defined GNULIB_POSIXCHECK + +# undef getaddrinfo +# if HAVE_RAW_DECL_GETADDRINFO +_GL_WARN_ON_USE (getaddrinfo, "getaddrinfo is unportable - " + "use gnulib module getaddrinfo for portability"); +# endif + +# undef freeaddrinfo +# if HAVE_RAW_DECL_FREEADDRINFO +_GL_WARN_ON_USE (freeaddrinfo, "freeaddrinfo is unportable - " + "use gnulib module getaddrinfo for portability"); +# endif + +# undef gai_strerror +# if HAVE_RAW_DECL_GAI_STRERROR +_GL_WARN_ON_USE (gai_strerror, "gai_strerror is unportable - " + "use gnulib module getaddrinfo for portability"); +# endif + +# undef getnameinfo +# if HAVE_RAW_DECL_GETNAMEINFO +_GL_WARN_ON_USE (getnameinfo, "getnameinfo is unportable - " + "use gnulib module getaddrinfo for portability"); +# endif + +#endif + +#endif /* _@GUARD_PREFIX@_NETDB_H */ +#endif /* _@GUARD_PREFIX@_NETDB_H */ diff --git a/gnulib/lib/netinet_in.in.h b/gnulib/lib/netinet_in.in.h new file mode 100644 index 0000000..467967c --- /dev/null +++ b/gnulib/lib/netinet_in.in.h @@ -0,0 +1,48 @@ +/* Substitute for . + Copyright (C) 2007-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 _@GUARD_PREFIX@_NETINET_IN_H + +#if __GNUC__ >= 3 +@PRAGMA_SYSTEM_HEADER@ +#endif +@PRAGMA_COLUMNS@ + +#if @HAVE_NETINET_IN_H@ + +/* On many platforms, assumes prior inclusion of + . */ +# include + +/* The include_next requires a split double-inclusion guard. */ +# @INCLUDE_NEXT@ @NEXT_NETINET_IN_H@ + +#endif + +#ifndef _@GUARD_PREFIX@_NETINET_IN_H +#define _@GUARD_PREFIX@_NETINET_IN_H + +#if !@HAVE_NETINET_IN_H@ + +/* A platform that lacks . */ + +# include + +#endif + +#endif /* _@GUARD_PREFIX@_NETINET_IN_H */ +#endif /* _@GUARD_PREFIX@_NETINET_IN_H */ diff --git a/gnulib/lib/nl_langinfo.c b/gnulib/lib/nl_langinfo.c new file mode 100644 index 0000000..8406ff1 --- /dev/null +++ b/gnulib/lib/nl_langinfo.c @@ -0,0 +1,270 @@ +/* nl_langinfo() replacement: query locale dependent information. + + Copyright (C) 2007-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#if REPLACE_NL_LANGINFO + +/* Override nl_langinfo with support for added nl_item values. */ + +# include +# include + +# 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_T_FMT_AMPM + case T_FMT_AMPM: + return "%I:%M:%S %p"; +# 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 +# if GNULIB_defined_YESEXPR || !FUNC_NL_LANGINFO_YESEXPR_WORKS + case YESEXPR: + return "^[yY]"; + case NOEXPR: + return "^[nN]"; +# 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 + +# include + +# else + +/* An old Unix platform without locales, such as Linux libc5 or BeOS. */ + +# endif + +# include + +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/nonblocking.c b/gnulib/lib/nonblocking.c new file mode 100644 index 0000000..c356f36 --- /dev/null +++ b/gnulib/lib/nonblocking.c @@ -0,0 +1,153 @@ +/* Non-blocking I/O for pipe or socket descriptors. + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "nonblocking.h" + +#include + +#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ +/* Native Woe32 API. */ + +# include +# include +# include + +/* Get declarations of the Win32 API functions. */ +# define WIN32_LEAN_AND_MEAN +# include + +# include "msvc-nothrow.h" + +int +get_nonblocking_flag (int desc) +{ + HANDLE h = (HANDLE) _get_osfhandle (desc); + if (h == INVALID_HANDLE_VALUE) + { + errno = EBADF; + return -1; + } + if (GetFileType (h) == FILE_TYPE_PIPE) + { + /* h is a pipe or socket. */ + DWORD state; + if (GetNamedPipeHandleState (h, &state, NULL, NULL, NULL, NULL, 0)) + /* h is a pipe. */ + return (state & PIPE_NOWAIT) != 0; + else + /* h is a socket. */ + errno = ENOSYS; + return -1; + } + else + /* Win32 does not support non-blocking on regular files. */ + return 0; +} + +int +set_nonblocking_flag (int desc, bool value) +{ + HANDLE h = (HANDLE) _get_osfhandle (desc); + if (h == INVALID_HANDLE_VALUE) + { + errno = EBADF; + return -1; + } + if (GetFileType (h) == FILE_TYPE_PIPE) + { + /* h is a pipe or socket. */ + DWORD state; + if (GetNamedPipeHandleState (h, &state, NULL, NULL, NULL, NULL, 0)) + { + /* h is a pipe. */ + if ((state & PIPE_NOWAIT) != 0) + { + if (value) + return 0; + state &= ~PIPE_NOWAIT; + } + else + { + if (!value) + return 0; + state |= PIPE_NOWAIT; + } + if (SetNamedPipeHandleState (h, &state, NULL, NULL)) + return 0; + errno = EINVAL; + return -1; + } + else + { + /* h is a socket. */ + int v = value; + return ioctl (desc, FIONBIO, &v); + } + } + else + { + /* Win32 does not support non-blocking on regular files. */ + if (!value) + return 0; + errno = ENOTSUP; + return -1; + } +} + +#else +/* Unix API. */ + +# include + +# if GNULIB_defined_O_NONBLOCK +# error Please port nonblocking to your platform +# endif + +/* We don't need the gnulib replacement of fcntl() here. */ +# undef fcntl + +int +get_nonblocking_flag (int desc) +{ + int fcntl_flags; + + fcntl_flags = fcntl (desc, F_GETFL, 0); + if (fcntl_flags < 0) + return -1; + return (fcntl_flags & O_NONBLOCK) != 0; +} + +int +set_nonblocking_flag (int desc, bool value) +{ + int fcntl_flags; + + fcntl_flags = fcntl (desc, F_GETFL, 0); + if (fcntl_flags < 0) + return -1; + if (((fcntl_flags & O_NONBLOCK) != 0) == value) + return 0; + if (value) + fcntl_flags |= O_NONBLOCK; + else + fcntl_flags &= ~O_NONBLOCK; + return fcntl (desc, F_SETFL, fcntl_flags); +} + +#endif diff --git a/gnulib/lib/nonblocking.h b/gnulib/lib/nonblocking.h new file mode 100644 index 0000000..48a2da8 --- /dev/null +++ b/gnulib/lib/nonblocking.h @@ -0,0 +1,62 @@ +/* Non-blocking I/O for pipe or socket descriptors. + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef _NONBLOCKING_H +#define _NONBLOCKING_H + +#include + +/* Non-blocking I/O is an I/O mode by which read(), write() calls avoid + blocking the current thread. When non-blocking is enabled: + - A read() call returns -1 with errno set to EAGAIN when no data or EOF + information is immediately available. + - A write() call returns -1 with errno set to EAGAIN when it cannot + transport the requested amount of data (but at most one pipe buffer) + without blocking. + Non-blocking I/O is most useful for character devices, pipes, and sockets. + Whether it also works on regular files and block devices is platform + dependent. + + There are three modern alternatives to non-blocking I/O: + - use select() or poll() followed by read() or write() if the descriptor + is ready, + - call read() or write() in separate threads, + - use interfaces. */ + + +#ifdef __cplusplus +extern "C" { +#endif + + +/* Return 1 if I/O to the descriptor DESC is currently non-blocking, 0 + it is blocking, or -1 with errno set if fd is invalid or blocking + status cannot be determined (such as with sockets on mingw). */ +extern int get_nonblocking_flag (int desc); + +/* Specify the non-blocking flag for the descriptor DESC. + Return 0 upon success, or -1 with errno set upon failure. + The default depends on the presence of the O_NONBLOCK flag for files + or pipes opened with open() or on the presence of the SOCK_NONBLOCK + flag for sockets. */ +extern int set_nonblocking_flag (int desc, bool value); + + +#ifdef __cplusplus +} +#endif + +#endif /* _NONBLOCKING_H */ diff --git a/gnulib/lib/nproc.c b/gnulib/lib/nproc.c new file mode 100644 index 0000000..7ebf497 --- /dev/null +++ b/gnulib/lib/nproc.c @@ -0,0 +1,358 @@ +/* Detect the number of processors. + + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 +#include "nproc.h" + +#include +#include + +#if HAVE_PTHREAD_GETAFFINITY_NP && 0 +# include +# include +#endif +#if HAVE_SCHED_GETAFFINITY_LIKE_GLIBC || HAVE_SCHED_GETAFFINITY_NP +# include +#endif + +#include + +#if HAVE_SYS_PSTAT_H +# include +#endif + +#if HAVE_SYS_SYSMP_H +# include +#endif + +#if HAVE_SYS_PARAM_H +# include +#endif + +#if HAVE_SYS_SYSCTL_H +# include +#endif + +#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ +# define WIN32_LEAN_AND_MEAN +# include +#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_GETAFFINITY_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_GETAFFINITY_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 0000000..889bbcc --- /dev/null +++ b/gnulib/lib/nproc.h @@ -0,0 +1,47 @@ +/* Detect the number of processors. + + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 ). + 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 0000000..47492cc --- /dev/null +++ b/gnulib/lib/obstack.c @@ -0,0 +1,420 @@ +/* obstack.c - subroutines used implicitly by object stack macros + + Copyright (C) 1988-1994, 1996-2006, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifdef _LIBC +# include +# include +#else +# include +# 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 /* Random thing to get __GNU_LIBRARY__. */ +#if !defined _LIBC && defined __GNU_LIBRARY__ && __GNU_LIBRARY__ > 1 +# include +# if _GNU_OBSTACK_INTERFACE_VERSION == OBSTACK_INTERFACE_VERSION +# define ELIDE_CODE +# endif +#endif + +#include + +#ifndef ELIDE_CODE + +# include + +/* 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 _Noreturn void print_and_abort (void); +void (*obstack_alloc_failed_handler) (void) = print_and_abort; + +/* Exit value used when `print_and_abort' is used. */ +# include +# 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 +# else +# include "gettext.h" +# endif +# ifndef _ +# define _(msgid) gettext (msgid) +# endif + +# ifdef _LIBC +# include +# endif + +static _Noreturn void +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 0000000..8a8d44b --- /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-2011 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 . */ + +/* 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 + +/* 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 's symbols. Otherwise, include + and use ptrdiff_t. */ + +#ifdef __PTRDIFF_TYPE__ +# define PTR_INT_TYPE __PTRDIFF_TYPE__ +#else +# include +# 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 + +#ifdef __cplusplus +extern "C" { +#endif + +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 0000000..93716c5 --- /dev/null +++ b/gnulib/lib/obstack_printf.c @@ -0,0 +1,92 @@ +/* Formatted output to obstacks. + Copyright (C) 2008-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 + +/* Specification. */ +#include + +#include "obstack.h" +#include "vasnprintf.h" + +#include +#include +#include + +/* 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 0000000..96082aa --- /dev/null +++ b/gnulib/lib/offtostr.c @@ -0,0 +1,3 @@ +#define anytostr offtostr +#define inttype off_t +#include "anytostr.c" diff --git a/gnulib/lib/open-safer.c b/gnulib/lib/open-safer.c new file mode 100644 index 0000000..e8c6a1f --- /dev/null +++ b/gnulib/lib/open-safer.c @@ -0,0 +1,46 @@ +/* Invoke open, but avoid some glitches. + + Copyright (C) 2005-2006, 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +#include + +#include "fcntl-safer.h" + +#include +#include +#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 0000000..8dc36ef --- /dev/null +++ b/gnulib/lib/open.c @@ -0,0 +1,181 @@ +/* Open a descriptor to a file. + Copyright (C) 2007-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible , 2007. */ + +/* If the user's config.h happens to include , let it include only + the system's here, so that orig_open doesn't recurse to + rpl_open. */ +#define __need_system_fcntl_h +#include + +/* Get the original definition of open. It might be defined as a macro. */ +#include +#include +#undef __need_system_fcntl_h + +static inline int +orig_open (const char *filename, int flags, mode_t mode) +{ + return open (filename, flags, mode); +} + +/* Specification. */ +/* Write "fcntl.h" here, not , otherwise OSF/1 5.1 DTK cc eliminates + this include because of the preliminary #include above. */ +#include "fcntl.h" + +#include +#include +#include +#include +#include +#include + +#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 GNULIB_defined_O_NONBLOCK + /* The only known platform that lacks O_NONBLOCK is mingw, but it + also lacks named pipes and Unix sockets, which are the only two + file types that require non-blocking handling in open(). + Therefore, it is safe to ignore O_NONBLOCK here. It is handy + that mingw also lacks openat(), so that is also covered here. */ + flags &= ~O_NONBLOCK; +#endif + +#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 + 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 + 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 + || (O_SEARCH != O_RDONLY && (flags & O_ACCMODE) == O_SEARCH))) + { + 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 + 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 0000000..0d0643b --- /dev/null +++ b/gnulib/lib/openat-die.c @@ -0,0 +1,62 @@ +/* Report a save- or restore-cwd failure in our openat replacement and then exit. + + Copyright (C) 2005-2006, 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#include "openat.h" + +#include + +#ifndef GNULIB_LIBPOSIX +# include "error.h" +#endif + +#include "exitfail.h" + +#include "gettext.h" +#define _(msgid) gettext (msgid) + +void +openat_save_fail (int errnum) +{ +#ifndef GNULIB_LIBPOSIX + error (exit_failure, errnum, + _("unable to record current working directory")); +#endif + /* _Noreturn 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) +{ +#ifndef GNULIB_LIBPOSIX + error (exit_failure, errnum, + _("failed to return to initial working directory")); +#endif + + /* As above. */ + abort (); +} diff --git a/gnulib/lib/openat-priv.h b/gnulib/lib/openat-priv.h new file mode 100644 index 0000000..948b220 --- /dev/null +++ b/gnulib/lib/openat-priv.h @@ -0,0 +1,64 @@ +/* Internals for openat-like functions. + + Copyright (C) 2005-2006, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Jim Meyering */ + +#ifndef _GL_HEADER_OPENAT_PRIV +#define _GL_HEADER_OPENAT_PRIV + +#include +#include +#include + +/* Maximum number of bytes that it is safe to allocate as a single + array on the stack, and that is known as a compile-time constant. + The assumption is that we'll touch the array very quickly, or a + temporary very near the array, provoking an out-of-memory trap. On + some operating systems, there is only one guard page for the stack, + and a page size can be as small as 4096 bytes. Subtract 64 in the + hope that this will let the compiler touch a nearby temporary and + provoke a trap. */ +#define SAFER_ALLOCA_MAX (4096 - 64) + +#define SAFER_ALLOCA(m) ((m) < SAFER_ALLOCA_MAX ? (m) : SAFER_ALLOCA_MAX) + +#if defined PATH_MAX +# define OPENAT_BUFFER_SIZE SAFER_ALLOCA (PATH_MAX) +#elif defined _XOPEN_PATH_MAX +# define OPENAT_BUFFER_SIZE SAFER_ALLOCA (_XOPEN_PATH_MAX) +#else +# define OPENAT_BUFFER_SIZE SAFER_ALLOCA (1024) +#endif + +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 0000000..2e2e966 --- /dev/null +++ b/gnulib/lib/openat-proc.c @@ -0,0 +1,110 @@ +/* Create /proc/self/fd-related names for subfiles of open directories. + + Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +#include + +#include "openat-priv.h" + +#include +#include +#include + +#include +#include +#include +#include + +#include "intprops.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, either because the operating + system support is lacking or because memory is low. */ +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_SEARCH | O_DIRECTORY | O_NOCTTY | O_NONBLOCK); + if (proc_self_fd < 0) + proc_status = -1; + else + { + /* Detect whether /proc/self/fd/%i/../fd exists, where %i is the + number of a file descriptor open on /proc/self/fd. On Linux, + that name resolves to /proc/self/fd, which was opened above. + However, on Solaris, it may resolve to /proc/self/fd/fd, which + cannot exist, since all names in /proc/self/fd are numeric. */ + char dotdot_buf[PROC_SELF_FD_NAME_SIZE_BOUND (sizeof "../fd" - 1)]; + sprintf (dotdot_buf, PROC_SELF_FD_FORMAT, proc_self_fd, "../fd"); + proc_status = access (dotdot_buf, F_OK) ? -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 = buf; + if (OPENAT_BUFFER_SIZE < bufsize) + { + result = malloc (bufsize); + if (! result) + return NULL; + } + 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 0000000..66f327b --- /dev/null +++ b/gnulib/lib/openat-safer.c @@ -0,0 +1,46 @@ +/* Invoke openat, but avoid some glitches. + + Copyright (C) 2005-2006, 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert for open, ported by Eric Blake for openat. */ + +#include + +#include "fcntl-safer.h" + +#include +#include +#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 0000000..354ff80 --- /dev/null +++ b/gnulib/lib/openat.c @@ -0,0 +1,286 @@ +/* provide a replacement openat function + Copyright (C) 2004-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Jim Meyering */ + +/* If the user's config.h happens to include , let it include only + the system's here, so that orig_openat doesn't recurse to + rpl_openat. */ +#define __need_system_fcntl_h +#include + +/* Get the original definition of open. It might be defined as a macro. */ +#include +#include +#undef __need_system_fcntl_h + +#if HAVE_OPENAT +static inline int +orig_openat (int fd, char const *filename, int flags, mode_t mode) +{ + return openat (fd, filename, flags, mode); +} +#endif + +/* Write "fcntl.h" here, not , otherwise OSF/1 5.1 DTK cc eliminates + this include because of the preliminary #include above. */ +#include "fcntl.h" + +#include "openat.h" + +#include +#include +#include +#include +#include +#include + +#if HAVE_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 + 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 + 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_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 + 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 */ + +# include "dosname.h" /* solely for definition of IS_ABSOLUTE_FILE_NAME */ +# include "openat-priv.h" +# include "save-cwd.h" + +/* Replacement for Solaris' openat function. + + 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_SEARCH); + + 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 0000000..eae86ce --- /dev/null +++ b/gnulib/lib/openat.h @@ -0,0 +1,104 @@ +/* provide a replacement openat function + Copyright (C) 2004-2006, 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Jim Meyering */ + +#ifndef _GL_HEADER_OPENAT +#define _GL_HEADER_OPENAT + +#include + +#include +#include +#include +#include + +#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 + +_Noreturn void openat_restore_fail (int); +_Noreturn void openat_save_fail (int); + +/* Using these function names makes application code + slightly more readable than it would be with + fchownat (..., 0) or fchownat (..., AT_SYMLINK_NOFOLLOW). */ + +#if GNULIB_FCHOWNAT + +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); +} + +#endif + +#if GNULIB_FCHMODAT + +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); +} + +#endif + +#if GNULIB_FSTATAT + +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); +} + +#endif + +/* 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. Likewise, + wrappers are not provided for accessat or euidaccessat, so as to + avoid dragging in -lgen on some platforms. */ + +#endif /* _GL_HEADER_OPENAT */ diff --git a/gnulib/lib/opendir-safer.c b/gnulib/lib/opendir-safer.c new file mode 100644 index 0000000..3726f88 --- /dev/null +++ b/gnulib/lib/opendir-safer.c @@ -0,0 +1,76 @@ +/* Invoke opendir, but avoid some glitches. + + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Eric Blake. */ + +#include + +#include "dirent-safer.h" + +#include +#include +#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); + if (f < 0) + { + e = errno; + newdp = NULL; + } + else + { + 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/opendir.c b/gnulib/lib/opendir.c new file mode 100644 index 0000000..20ae75e --- /dev/null +++ b/gnulib/lib/opendir.c @@ -0,0 +1,148 @@ +/* Start reading the entries of a directory. + Copyright (C) 2006-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include +#include + +#if HAVE_OPENDIR + +/* Override opendir(), to keep track of the open file descriptors. + Needed because there is a function dirfd(). */ + +#else + +# include + +# include "dirent-private.h" +# include "filename.h" + +#endif + +#if REPLACE_FCHDIR +# include +#endif + +DIR * +opendir (const char *dir_name) +{ +#if HAVE_OPENDIR +# undef opendir + DIR *dirp; + + dirp = opendir (dir_name); + if (dirp == NULL) + return NULL; + +#else + + char dir_name_mask[MAX_PATH + 1 + 1 + 1]; + int status; + HANDLE current; + WIN32_FIND_DATA entry; + struct gl_directory *dirp; + + if (dir_name[0] == '\0') + { + errno = ENOENT; + return NULL; + } + + /* Make the dir_name absolute, so that we continue reading the same + directory if the current directory changed between this opendir() + call and a subsequent rewinddir() call. */ + if (!GetFullPathName (dir_name, MAX_PATH, dir_name_mask, NULL)) + { + errno = EINVAL; + return NULL; + } + + /* Append the mask. + "*" and "*.*" appear to be equivalent. */ + { + char *p; + + p = dir_name_mask + strlen (dir_name_mask); + if (p > dir_name_mask && !ISSLASH (p[-1])) + *p++ = '\\'; + *p++ = '*'; + *p = '\0'; + } + + /* Start searching the directory. */ + status = -1; + current = FindFirstFile (dir_name_mask, &entry); + if (current == INVALID_HANDLE_VALUE) + { + switch (GetLastError ()) + { + case ERROR_FILE_NOT_FOUND: + status = -2; + break; + case ERROR_PATH_NOT_FOUND: + errno = ENOENT; + return NULL; + case ERROR_DIRECTORY: + errno = ENOTDIR; + return NULL; + case ERROR_ACCESS_DENIED: + errno = EACCES; + return NULL; + default: + errno = EIO; + return NULL; + } + } + + /* Allocate the result. */ + dirp = + (struct gl_directory *) + malloc (offsetof (struct gl_directory, dir_name_mask[0]) + + strlen (dir_name_mask) + 1); + if (dirp == NULL) + { + if (current != INVALID_HANDLE_VALUE) + FindClose (current); + errno = ENOMEM; + return NULL; + } + dirp->status = status; + dirp->current = current; + if (status == -1) + memcpy (&dirp->entry, &entry, sizeof (WIN32_FIND_DATA)); + strcpy (dirp->dir_name_mask, dir_name_mask); + +#endif + +#if REPLACE_FCHDIR + { + int fd = dirfd (dirp); + if (0 <= fd && _gl_register_fd (fd, dir_name) != fd) + { + int saved_errno = errno; + closedir (dirp); + errno = saved_errno; + return NULL; + } + } +#endif + + return dirp; +} diff --git a/gnulib/lib/openpty.c b/gnulib/lib/openpty.c new file mode 100644 index 0000000..d9d9773 --- /dev/null +++ b/gnulib/lib/openpty.c @@ -0,0 +1,136 @@ +/* Open a pseudo-terminal. + Copyright (C) 2010-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#if HAVE_OPENPTY + +/* Provide a wrapper with the prototype of glibc-2.8 and newer. */ +# undef openpty +int +rpl_openpty (int *amaster, int *aslave, char *name, + struct termios const *termp, struct winsize const *winp) +{ + /* Cast away const, for implementations with weaker prototypes. */ + return openpty (amaster, aslave, name, (struct termios *) termp, + (struct winsize *) winp); +} + +#elif (defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__ /* mingw */ + +# include + +int +openpty (int *amaster _GL_UNUSED, int *aslave _GL_UNUSED, + char *name _GL_UNUSED, + struct termios const *termp _GL_UNUSED, + struct winsize const *winp _GL_UNUSED) +{ + /* Mingw lacks pseudo-terminals altogether. */ + errno = ENOSYS; + return -1; +} + +#else /* AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 10 */ + +# include +# include +# include +# include +# include +# include +# if defined __sun || defined __hpux /* Solaris, HP-UX */ +# include +# endif + +int +openpty (int *amaster, int *aslave, char *name, + struct termios const *termp, struct winsize const *winp) +{ + int master; + char *slave_name; + int slave; + +# if HAVE__GETPTY /* IRIX */ + + slave_name = _getpty (&master, O_RDWR, 0622, 0); + if (slave_name == NULL) + return -1; + +# else /* AIX 5.1, HP-UX 11, Solaris 10, mingw */ + + /* This call uses the 'posix_openpt' module. */ + master = posix_openpt (O_RDWR | O_NOCTTY); + if (master < 0) + return -1; + +# endif + + /* This call does not require a dependency to the 'grantpt' module, + because AIX, HP-UX, IRIX, Solaris all have the grantpt() function. */ + if (grantpt (master)) + goto fail; + + /* This call does not require a dependency to the 'unlockpt' module, + because AIX, HP-UX, IRIX, Solaris all have the unlockpt() function. */ + if (unlockpt (master)) + goto fail; + +# if !HAVE__GETPTY /* !IRIX */ + slave_name = ptsname (master); + if (slave_name == NULL) + goto fail; +# endif + + slave = open (slave_name, O_RDWR | O_NOCTTY); + if (slave == -1) + goto fail; + +# if defined __sun || defined __hpux /* Solaris, HP-UX */ + if (ioctl (slave, I_PUSH, "ptem") < 0 + || ioctl (slave, I_PUSH, "ldterm") < 0 +# if defined __sun + || ioctl (slave, I_PUSH, "ttcompat") < 0 +# endif + ) + { + close (slave); + goto fail; + } +# endif + + /* XXX Should we ignore errors here? */ + if (termp) + tcsetattr (slave, TCSAFLUSH, termp); + if (winp) + ioctl (slave, TIOCSWINSZ, winp); + + *amaster = master; + *aslave = slave; + if (name != NULL) + strcpy (name, slave_name); + + return 0; + + fail: + close (master); + return -1; +} + +#endif diff --git a/gnulib/lib/pagealign_alloc.c b/gnulib/lib/pagealign_alloc.c new file mode 100644 index 0000000..cfd301a --- /dev/null +++ b/gnulib/lib/pagealign_alloc.c @@ -0,0 +1,197 @@ +/* Memory allocation aligned to system page boundaries. + + Copyright (C) 2005-2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Derek R. Price . */ + +#include + +#include "pagealign_alloc.h" + +#include +#include + +#include +#include + +#if HAVE_MMAP +# include +#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; + /* We prefer the mmap() approach over the posix_memalign() or malloc() + based approaches, since the latter often waste an entire memory page + per call. */ +#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 0000000..8d4b285 --- /dev/null +++ b/gnulib/lib/pagealign_alloc.h @@ -0,0 +1,54 @@ +/* Memory allocation aligned to system page boundaries. + + Copyright (C) 2005, 2008, 2010-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef _PAGEALIGN_ALLOC_H +# define _PAGEALIGN_ALLOC_H + +# include + +/* 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__)) +# if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) + __attribute__ ((__alloc_size__ (1))) +# endif +# 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__)) +# if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) + __attribute__ ((__alloc_size__ (1))) +# endif +# 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-datetime.h b/gnulib/lib/parse-datetime.h new file mode 100644 index 0000000..e1df247 --- /dev/null +++ b/gnulib/lib/parse-datetime.h @@ -0,0 +1,22 @@ +/* Parse a string into an internal time stamp. + + Copyright (C) 1995, 1997-1998, 2003-2004, 2007, 2009-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include +#include + +bool parse_datetime (struct timespec *, char const *, struct timespec const *); diff --git a/gnulib/lib/parse-datetime.y b/gnulib/lib/parse-datetime.y new file mode 100644 index 0000000..5621adc --- /dev/null +++ b/gnulib/lib/parse-datetime.y @@ -0,0 +1,1617 @@ +%{ +/* Parse a string into an internal time stamp. + + Copyright (C) 1999-2000, 2002-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Originally written by Steven M. Bellovin while + at the University of North Carolina at Chapel Hill. Later tweaked by + a couple of people on Usenet. Completely overhauled by Rich $alz + and Jim Berets in August, 1990. + + Modified by Paul Eggert in August 1999 to do + the right thing about local DST. Also modified by Paul Eggert + 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 + +#include "parse-datetime.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 parse-datetime.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 +#include +#include +#include +#include + +#include "xalloc.h" + +/* Bison's skeleton tests _STDLIB_H, while some stdlib.h headers + use _STDLIB_H_ as witness. Map the latter to the one bison uses. */ +/* FIXME: this is temporary. Remove when we have a mechanism to ensure + that the version we're using is fixed, too. */ +#ifdef _STDLIB_H_ +# undef _STDLIB_H +# define _STDLIB_H 1 +#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) + +/* 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 31 shift/reduce conflicts. */ +%expect 31 + +%union +{ + long int intval; + textint textintval; + struct timespec timespec; + relative_time rel; +} + +%token tAGO +%token tDST + +%token tYEAR_UNIT tMONTH_UNIT tHOUR_UNIT tMINUTE_UNIT tSEC_UNIT +%token tDAY_UNIT tDAY_SHIFT + +%token tDAY tDAYZONE tLOCAL_ZONE tMERIDIAN +%token tMONTH tORDINAL tZONE + +%token tSNUMBER tUNUMBER +%token tSDECIMAL_NUMBER tUDECIMAL_NUMBER + +%type o_colon_minutes +%type seconds signed_seconds unsigned_seconds + +%type relunit relunit_snumber dayshift + +%% + +spec: + timespec + | items + ; + +timespec: + '@' seconds + { + pc->seconds = $2; + pc->timespec_seen = true; + } + ; + +items: + /* empty */ + | items item + ; + +item: + datetime + { pc->times_seen++; pc->dates_seen++; } + | 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 + ; + +datetime: + iso_8601_datetime + ; + +iso_8601_datetime: + iso_8601_date 'T' iso_8601_time + ; + +time: + tUNUMBER tMERIDIAN + { + set_hhmmss (pc, $1.value, 0, 0, 0); + pc->meridian = $2; + } + | tUNUMBER ':' tUNUMBER tMERIDIAN + { + set_hhmmss (pc, $1.value, $3.value, 0, 0); + pc->meridian = $4; + } + | tUNUMBER ':' tUNUMBER ':' unsigned_seconds tMERIDIAN + { + set_hhmmss (pc, $1.value, $3.value, $5.tv_sec, $5.tv_nsec); + pc->meridian = $6; + } + | iso_8601_time + ; + +iso_8601_time: + tUNUMBER zone_offset + { + set_hhmmss (pc, $1.value, 0, 0, 0); + pc->meridian = MER24; + } + | tUNUMBER ':' tUNUMBER o_zone_offset + { + set_hhmmss (pc, $1.value, $3.value, 0, 0); + pc->meridian = MER24; + } + | tUNUMBER ':' tUNUMBER ':' unsigned_seconds o_zone_offset + { + set_hhmmss (pc, $1.value, $3.value, $5.tv_sec, $5.tv_nsec); + pc->meridian = MER24; + } + ; + +o_zone_offset: + /* empty */ + | zone_offset + ; + +zone_offset: + tSNUMBER o_colon_minutes + { + pc->zones_seen++; + pc->time_zone = time_zone_hhmm (pc, $1, $2); + } + ; + +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; + } + ; + +/* Note 'T' is a special case, as it is used as the separator in ISO + 8601 date and time of day representation. */ +zone: + tZONE + { pc->time_zone = $1; } + | 'T' + { pc->time_zone = HOUR(7); } + | tZONE relunit_snumber + { pc->time_zone = $1; + apply_relative_time (pc, $2, 1); } + | 'T' relunit_snumber + { pc->time_zone = HOUR(7); + 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 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; + } + | iso_8601_date + ; + +iso_8601_date: + tUNUMBER tSNUMBER tSNUMBER + { + /* ISO 8601 format. YYYY-MM-DD. */ + pc->year = $1; + pc->month = -$2.value; + pc->day = -$3.value; + } + ; + +rel: + relunit tAGO + { apply_relative_time (pc, $1, $2); } + | 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; } + ; + +%% + +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 }, + { "HENCE", 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 parse_datetime 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. + + Note 'T' is a special case, as it is used as the separator in ISO + 8601 date and time of day representation. */ +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", 'T', 0 }, + { "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 * _GL_ATTRIBUTE_PURE +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 +parse_datetime (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 (! parse_datetime (&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/parse-duration.c b/gnulib/lib/parse-duration.c new file mode 100644 index 0000000..0a8c4ad --- /dev/null +++ b/gnulib/lib/parse-duration.c @@ -0,0 +1,601 @@ +/* Parse a time duration and return a seconds count + Copyright (C) 2008-2011 Free Software Foundation, Inc. + Written by Bruce Korb , 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 . */ + +#include + +/* Specification. */ +#include "parse-duration.h" + +#include +#include +#include +#include +#include +#include + +#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, per SNOBOL. */ +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 * pT; + char * ps; + char * pz = strdup (in_pz); + void * fptr = pz; + time_t res = 0; + + if (pz == NULL) + { + errno = ENOMEM; + return BAD_TIME; + } + + pT = strchr (pz, 'T'); + if (pT != NULL) + { + *(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 0000000..9fd2a36 --- /dev/null +++ b/gnulib/lib/parse-duration.h @@ -0,0 +1,90 @@ +/* Parse a time duration and return a seconds count + Copyright (C) 2008-2011 Free Software Foundation, Inc. + Written by Bruce Korb , 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 . */ + +/* + + 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 + +/* 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/passfd.c b/gnulib/lib/passfd.c new file mode 100644 index 0000000..9458820 --- /dev/null +++ b/gnulib/lib/passfd.c @@ -0,0 +1,202 @@ +/* Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "passfd.h" + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "cloexec.h" + +/* The code that uses CMSG_FIRSTHDR is enabled on + Linux, MacOS X, FreeBSD, OpenBSD, NetBSD, AIX, OSF/1, Cygwin. + The code that uses HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS is enabled on + HP-UX, IRIX, Solaris. */ + +/* MSG_CMSG_CLOEXEC is defined only on Linux, as of 2011. */ +#ifndef MSG_CMSG_CLOEXEC +# define MSG_CMSG_CLOEXEC 0 +#endif + +#if HAVE_SENDMSG +/* sendfd sends the file descriptor fd along the socket + to a process calling recvfd on the other end. + + Return 0 on success, or -1 with errno set in case of error. +*/ +int +sendfd (int sock, int fd) +{ + char byte = 0; + struct iovec iov; + struct msghdr msg; +# ifdef CMSG_FIRSTHDR + struct cmsghdr *cmsg; + char buf[CMSG_SPACE (sizeof fd)]; +# endif + + /* send at least one char */ + memset (&msg, 0, sizeof msg); + iov.iov_base = &byte; + iov.iov_len = 1; + msg.msg_iov = &iov; + msg.msg_iovlen = 1; + msg.msg_name = NULL; + msg.msg_namelen = 0; + +# ifdef CMSG_FIRSTHDR + msg.msg_control = buf; + msg.msg_controllen = sizeof buf; + cmsg = CMSG_FIRSTHDR (&msg); + cmsg->cmsg_level = SOL_SOCKET; + cmsg->cmsg_type = SCM_RIGHTS; + cmsg->cmsg_len = CMSG_LEN (sizeof fd); + /* Initialize the payload: */ + memcpy (CMSG_DATA (cmsg), &fd, sizeof fd); +# elif HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS + msg.msg_accrights = &fd; + msg.msg_accrightslen = sizeof fd; +# else + errno = ENOSYS; + return -1; +# endif + + if (sendmsg (sock, &msg, 0) != iov.iov_len) + return -1; + return 0; +} +#else +int +sendfd (int sock _GL_UNUSED, int fd _GL_UNUSED) +{ + errno = ENOSYS; + return -1; +} +#endif + + +#if HAVE_RECVMSG +/* recvfd receives a file descriptor through the socket. + The flags are a bitmask, possibly including O_CLOEXEC (defined in ). + + Return 0 on success, or -1 with errno set in case of error. +*/ +int +recvfd (int sock, int flags) +{ + char byte = 0; + struct iovec iov; + struct msghdr msg; + int fd = -1; +# ifdef CMSG_FIRSTHDR + struct cmsghdr *cmsg; + char buf[CMSG_SPACE (sizeof fd)]; + int flags_recvmsg = flags & O_CLOEXEC ? MSG_CMSG_CLOEXEC : 0; +# endif + + if ((flags & ~O_CLOEXEC) != 0) + { + errno = EINVAL; + return -1; + } + + /* send at least one char */ + memset (&msg, 0, sizeof msg); + iov.iov_base = &byte; + iov.iov_len = 1; + msg.msg_iov = &iov; + msg.msg_iovlen = 1; + msg.msg_name = NULL; + msg.msg_namelen = 0; + +# ifdef CMSG_FIRSTHDR + msg.msg_control = buf; + msg.msg_controllen = sizeof buf; + cmsg = CMSG_FIRSTHDR (&msg); + cmsg->cmsg_level = SOL_SOCKET; + cmsg->cmsg_type = SCM_RIGHTS; + cmsg->cmsg_len = CMSG_LEN (sizeof fd); + /* Initialize the payload: */ + memcpy (CMSG_DATA (cmsg), &fd, sizeof fd); + msg.msg_controllen = cmsg->cmsg_len; + + if (recvmsg (sock, &msg, flags_recvmsg) < 0) + return -1; + + cmsg = CMSG_FIRSTHDR (&msg); + /* be paranoiac */ + if (cmsg == NULL || cmsg->cmsg_len != CMSG_LEN (sizeof fd) + || cmsg->cmsg_level != SOL_SOCKET || cmsg->cmsg_type != SCM_RIGHTS) + { + /* fake errno: at end the file is not available */ + errno = EACCES; + return -1; + } + + memcpy (&fd, CMSG_DATA (cmsg), sizeof fd); + + /* set close-on-exec flag */ + if (!MSG_CMSG_CLOEXEC && (flags & O_CLOEXEC)) + { + if (set_cloexec_flag (fd, true) < 0) + { + int saved_errno = errno; + (void) close (fd); + errno = saved_errno; + return -1; + } + } + +# elif HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS + msg.msg_accrights = &fd; + msg.msg_accrightslen = sizeof fd; + if (recvmsg (sock, &msg, 0) < 0) + return -1; + + /* set close-on-exec flag */ + if (flags & O_CLOEXEC) + { + if (set_cloexec_flag (fd, true) < 0) + { + int saved_errno = errno; + close (fd); + errno = saved_errno; + return -1; + } + } +# else + errno = ENOSYS; +# endif + + return fd; +} +#else +int +recvfd (int sock _GL_UNUSED, int flags _GL_UNUSED) +{ + errno = ENOSYS; + return -1; +} +#endif diff --git a/gnulib/lib/passfd.h b/gnulib/lib/passfd.h new file mode 100644 index 0000000..048d9c8 --- /dev/null +++ b/gnulib/lib/passfd.h @@ -0,0 +1,32 @@ +/* passfd.h -- definitions and prototypes for passfd.c + + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef PASSFD_H_ +#define PASSFD_H_ 1 + +#ifdef __cplusplus +extern "C" { +#endif + +extern int sendfd (int sock, int fd); +extern int recvfd (int sock, int flags); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/gnulib/lib/pathmax.h b/gnulib/lib/pathmax.h new file mode 100644 index 0000000..9c30995 --- /dev/null +++ b/gnulib/lib/pathmax.h @@ -0,0 +1,84 @@ +/* Define PATH_MAX somehow. Requires sys/types.h. + Copyright (C) 1992, 1999, 2001, 2003, 2005, 2009-2011 Free Software + Foundation, Inc. + + This program is free software; you can 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 + +/* POSIX:2008 defines PATH_MAX to be the maximum number of bytes in a filename, + including the terminating NUL byte. + + PATH_MAX is not defined on systems which have no limit on filename length, + such as GNU/Hurd. + + This file does *not* define PATH_MAX always. Programs that use this file + can handle the GNU/Hurd case in several ways: + - Either with a package-wide handling, or with a per-file handling, + - Either through a + #ifdef PATH_MAX + or through a fallback like + #ifndef PATH_MAX + # define PATH_MAX 8192 + #endif + or through a fallback like + #ifndef PATH_MAX + # define PATH_MAX pathconf ("/", _PC_PATH_MAX) + #endif + */ + +# include + +# include + +# ifndef _POSIX_PATH_MAX +# define _POSIX_PATH_MAX 256 +# endif + +/* Don't include sys/param.h if it already has been. */ +# if defined HAVE_SYS_PARAM_H && !defined PATH_MAX && !defined MAXPATHLEN +# include +# endif + +# if !defined PATH_MAX && defined MAXPATHLEN +# define PATH_MAX MAXPATHLEN +# endif + +# ifdef __hpux +/* On HP-UX, PATH_MAX designates the maximum number of bytes in a filename, + *not* including the terminating NUL byte, and is set to 1023. + Additionally, when _XOPEN_SOURCE is defined to 500 or more, PATH_MAX is + not defined at all any more. */ +# undef PATH_MAX +# define PATH_MAX 1024 +# endif + +# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ +/* The page "Naming Files, Paths, and Namespaces" on msdn.microsoft.com, + section "Maximum Path Length Limitation", + + explains that the maximum size of a filename, including the terminating + NUL byte, is 260 = 3 + 256 + 1. + This is the same value as + - FILENAME_MAX in , + - _MAX_PATH in , + - MAX_PATH in . + Undefine the original value, because mingw's gets it wrong. */ +# undef PATH_MAX +# define PATH_MAX 260 +# endif + +#endif /* _PATHMAX_H */ diff --git a/gnulib/lib/pclose.c b/gnulib/lib/pclose.c new file mode 100644 index 0000000..b171c21 --- /dev/null +++ b/gnulib/lib/pclose.c @@ -0,0 +1,28 @@ +/* Close a stream to a sub-process. + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +/* Native Woe32 API. */ + +int +pclose (FILE *stream) +{ + return _pclose (stream); +} diff --git a/gnulib/lib/perror.c b/gnulib/lib/perror.c new file mode 100644 index 0000000..af4b56c --- /dev/null +++ b/gnulib/lib/perror.c @@ -0,0 +1,49 @@ +/* Print a message describing error code. + Copyright (C) 2008-2011 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 . */ + +#include + +/* Specification. */ +#include + +#include +#include +#include + +#include "strerror-override.h" + +/* Use the system functions, not the gnulib overrides in this file. */ +#undef fprintf + +void +perror (const char *string) +{ + char stackbuf[STACKBUF_LEN]; + int ret; + + /* Our implementation guarantees that this will be a non-empty + string, even if it returns EINVAL; and stackbuf should be sized + large enough to avoid ERANGE. */ + ret = strerror_r (errno, stackbuf, sizeof stackbuf); + if (ret == ERANGE) + abort (); + + if (string != NULL && *string != '\0') + fprintf (stderr, "%s: %s\n", string, stackbuf); + else + fprintf (stderr, "%s\n", stackbuf); +} diff --git a/gnulib/lib/physmem.c b/gnulib/lib/physmem.c new file mode 100644 index 0000000..58ef158 --- /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-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +#include + +#include "physmem.h" + +#include + +#if HAVE_SYS_PSTAT_H +# include +#endif + +#if HAVE_SYS_SYSMP_H +# include +#endif + +#if HAVE_SYS_SYSINFO_H && HAVE_MACHINE_HAL_SYSINFO_H +# include +# include +#endif + +#if HAVE_SYS_TABLE_H +# include +#endif + +#include + +#if HAVE_SYS_PARAM_H +# include +#endif + +#if HAVE_SYS_SYSCTL_H +# include +#endif + +#if HAVE_SYS_SYSTEMCFG_H +# include +#endif + +#ifdef _WIN32 +# define WIN32_LEAN_AND_MEAN +# include +/* 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 +# include + +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 0000000..f4f94cc --- /dev/null +++ b/gnulib/lib/physmem.h @@ -0,0 +1,26 @@ +/* Calculate the size of physical memory. + + Copyright (C) 2000, 2003, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* 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 0000000..8c6cb74 --- /dev/null +++ b/gnulib/lib/pipe-filter-aux.h @@ -0,0 +1,113 @@ +/* Auxiliary code for filtering of data through a subprocess. + Copyright (C) 2001-2003, 2008-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + + +#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. */ +#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 0000000..8f25124 --- /dev/null +++ b/gnulib/lib/pipe-filter-gi.c @@ -0,0 +1,558 @@ +/* Filtering of data through a subprocess. + Copyright (C) 2001-2003, 2008-2011 Free Software Foundation, Inc. + Written by Paolo Bonzini , 2009, + and Bruno Haible , 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 . */ + +#include + +#include "pipe-filter.h" + +#include +#include +#include +#include +#include +#include +#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ +# include +#else +# include +# include +#endif + +#include "error.h" +#include "spawn-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 0000000..d0eb86b --- /dev/null +++ b/gnulib/lib/pipe-filter-ii.c @@ -0,0 +1,467 @@ +/* Filtering of data through a subprocess. + Copyright (C) 2001-2003, 2008-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +#include "pipe-filter.h" + +#include +#include +#include +#include +#include +#include +#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ +# include +#else +# include +# include +#endif + +#include "error.h" +#include "spawn-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) + { + /* Writing to a pipe in non-blocking mode is tricky: The + write() call may fail with EAGAIN, simply because suffcient + space is not available in the pipe. See POSIX:2008 + . + This happens actually on AIX and IRIX, when bufsize >= 8192 + (even though PIPE_BUF and pathconf ("/", _PC_PIPE_BUF) are + both 32768). */ + size_t attempt_to_write = + (bufsize > SSIZE_MAX ? SSIZE_MAX : bufsize); + for (;;) + { + ssize_t nwritten = write (fd[1], buf, attempt_to_write); + if (nwritten < 0) + { + if (errno == EAGAIN) + { + attempt_to_write = attempt_to_write / 2; + if (attempt_to_write == 0) + break; + } + else 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); + break; + } + } + } + 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 0000000..546d5ca --- /dev/null +++ b/gnulib/lib/pipe-filter.h @@ -0,0 +1,237 @@ +/* Filtering of data through a subprocess. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2009, + and Paolo Bonzini , 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 . */ + +#ifndef _PIPE_FILTER_H +#define _PIPE_FILTER_H + +#include +#include + + +#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 . + 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 + and .) 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 0000000..928312b --- /dev/null +++ b/gnulib/lib/pipe-safer.c @@ -0,0 +1,56 @@ +/* Invoke pipe, but avoid some glitches. + Copyright (C) 2005-2006, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Jim Meyering. */ + +#include + +#include "unistd-safer.h" + +#include +#include + +/* 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 0000000..b68a555 --- /dev/null +++ b/gnulib/lib/pipe.c @@ -0,0 +1,51 @@ +/* Create a pipe. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 + +/* Specification. */ +#include + +#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ +/* Native Woe32 API. */ + +/* Get _pipe(). */ +# include + +/* Get _O_BINARY. */ +# include + +int +pipe (int fd[2]) +{ + /* Mingw changes fd to {-1,-1} on failure, but this violates + http://austingroupbugs.net/view.php?id=467 */ + int tmp[2]; + int result = _pipe (tmp, 4096, _O_BINARY); + if (!result) + { + fd[0] = tmp[0]; + fd[1] = tmp[1]; + } + return result; +} + +#else + +# error "This platform lacks a pipe function, and Gnulib doesn't provide a replacement. This is a bug in Gnulib." + +#endif diff --git a/gnulib/lib/pipe.h b/gnulib/lib/pipe.h new file mode 100644 index 0000000..3c1b4b8 --- /dev/null +++ b/gnulib/lib/pipe.h @@ -0,0 +1,2 @@ +/* Obsolete; consider using spawn-pipe.h instead. */ +#include "spawn-pipe.h" diff --git a/gnulib/lib/pipe2-safer.c b/gnulib/lib/pipe2-safer.c new file mode 100644 index 0000000..4249c03 --- /dev/null +++ b/gnulib/lib/pipe2-safer.c @@ -0,0 +1,52 @@ +/* Invoke pipe2, but avoid some glitches. + Copyright (C) 2005-2006, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Eric Blake. */ + +#include + +/* Specification. */ +#include "unistd-safer.h" + +#include +#include + +/* 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 0000000..cd1fe56 --- /dev/null +++ b/gnulib/lib/pipe2.c @@ -0,0 +1,169 @@ +/* Create a pipe, with specific opening flags. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 + +/* Specification. */ +#include + +#include +#include + +#include "binary-io.h" +#include "verify.h" + +#if GNULIB_defined_O_NONBLOCK +# include "nonblocking.h" +#endif + +#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ +/* Native Woe32 API. */ + +# include + +#endif + +int +pipe2 (int fd[2], int flags) +{ + /* Mingw _pipe() corrupts fd on failure; also, if we succeed at + creating the pipe but later fail at changing fcntl, we want + to leave fd unchanged: http://austingroupbugs.net/view.php?id=467 */ + int tmp[2]; + tmp[0] = fd[0]; + tmp[1] = fd[1]; + +#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 + + /* Check the supported flags. */ + if ((flags & ~(O_CLOEXEC | O_NONBLOCK | O_BINARY | O_TEXT)) != 0) + { + errno = EINVAL; + return -1; + } + +#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ +/* Native Woe32 API. */ + + if (_pipe (fd, 4096, flags & ~O_NONBLOCK) < 0) + { + fd[0] = tmp[0]; + fd[1] = tmp[1]; + return -1; + } + + /* O_NONBLOCK handling. + On native Windows platforms, O_NONBLOCK is defined by gnulib. Use the + functions defined by the gnulib module 'nonblocking'. */ +# if GNULIB_defined_O_NONBLOCK + if (flags & O_NONBLOCK) + { + if (set_nonblocking_flag (fd[0], true) != 0 + || set_nonblocking_flag (fd[1], true) != 0) + goto fail; + } +# else + { + verify (O_NONBLOCK == 0); + } +# endif + + return 0; + +#else +/* Unix API. */ + + if (pipe (fd) < 0) + return -1; + + /* POSIX + says that initially, the O_NONBLOCK and FD_CLOEXEC flags are cleared on + both fd[0] and fd[1]. */ + + /* O_NONBLOCK handling. + On Unix platforms, O_NONBLOCK is defined by the system. Use fcntl(). */ + 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; + +#endif + +#if GNULIB_defined_O_NONBLOCK || \ + !((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__) + fail: + { + int saved_errno = errno; + close (fd[0]); + close (fd[1]); + fd[0] = tmp[0]; + fd[1] = tmp[1]; + errno = saved_errno; + return -1; + } +#endif +} diff --git a/gnulib/lib/poll.c b/gnulib/lib/poll.c new file mode 100644 index 0000000..b012ba0 --- /dev/null +++ b/gnulib/lib/poll.c @@ -0,0 +1,605 @@ +/* Emulation for poll(2) + Contributed by Paolo Bonzini. + + Copyright 2001-2003, 2006-2011 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 +#include + +#include + +/* Specification. */ +#include + +#include +#include +#include + +#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ +# define WIN32_NATIVE +# include +# include +# include +# include +# include +# include "msvc-nothrow.h" +#else +# include +# include +# include +# include +#endif + +#ifdef HAVE_SYS_IOCTL_H +# include +#endif +#ifdef HAVE_SYS_FILIO_H +# include +#endif + +#include + +#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 if (GetLastError () == ERROR_BROKEN_PIPE) + happened |= POLLHUP; + + 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 (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); + +restart: + 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) + 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++; + } + + if (!rc && timeout == INFTIM) + { + SwitchToThread(); + goto restart; + } + + return rc; +#endif +} diff --git a/gnulib/lib/poll.in.h b/gnulib/lib/poll.in.h new file mode 100644 index 0000000..722eff1 --- /dev/null +++ b/gnulib/lib/poll.in.h @@ -0,0 +1,104 @@ +/* Header for poll(2) emulation + Contributed by Paolo Bonzini. + + Copyright 2001-2003, 2007, 2009-2011 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 _@GUARD_PREFIX@_POLL_H + +#if __GNUC__ >= 3 +@PRAGMA_SYSTEM_HEADER@ +#endif +@PRAGMA_COLUMNS@ + +/* The include_next requires a split double-inclusion guard. */ +#if @HAVE_POLL_H@ +# @INCLUDE_NEXT@ @NEXT_POLL_H@ +#endif + +#ifndef _@GUARD_PREFIX@_POLL_H +#define _@GUARD_PREFIX@_POLL_H + + +/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ + +/* The definition of _GL_WARN_ON_USE is copied here. */ + + +#if !@HAVE_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 + +# if !GNULIB_defined_poll_types + +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; + +# define GNULIB_defined_poll_types 1 +# endif + +/* Define INFTIM only if doing so conforms to POSIX. */ +# if !defined (_POSIX_C_SOURCE) && !defined (_XOPEN_SOURCE) +# define INFTIM (-1) +# endif + +#endif + + +#if @GNULIB_POLL@ +# if @REPLACE_POLL@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef poll +# define poll rpl_poll +# endif +_GL_FUNCDECL_RPL (poll, int, (struct pollfd *pfd, nfds_t nfd, int timeout)); +_GL_CXXALIAS_RPL (poll, int, (struct pollfd *pfd, nfds_t nfd, int timeout)); +# else +# if !@HAVE_POLL@ +_GL_FUNCDECL_SYS (poll, int, (struct pollfd *pfd, nfds_t nfd, int timeout)); +# endif +_GL_CXXALIAS_SYS (poll, int, (struct pollfd *pfd, nfds_t nfd, int timeout)); +# endif +_GL_CXXALIASWARN (poll); +#elif defined GNULIB_POSIXCHECK +# undef poll +# if HAVE_RAW_DECL_POLL +_GL_WARN_ON_USE (poll, "poll is unportable - " + "use gnulib module poll for portability"); +# endif +#endif + + +#endif /* _@GUARD_PREFIX@_POLL_H */ +#endif /* _@GUARD_PREFIX@_POLL_H */ diff --git a/gnulib/lib/popen-safer.c b/gnulib/lib/popen-safer.c new file mode 100644 index 0000000..07bfb1d --- /dev/null +++ b/gnulib/lib/popen-safer.c @@ -0,0 +1,93 @@ +/* Invoke popen, but avoid some glitches. + + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Eric Blake. */ + +#include + +#include "stdio-safer.h" + +#include +#include +#include + +#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; +#if 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 0000000..4330479 --- /dev/null +++ b/gnulib/lib/popen.c @@ -0,0 +1,103 @@ +/* Open a stream to a sub-process. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Eric Blake , 2009. */ + +#include + +/* Specification. */ +#include + +#if HAVE_POPEN + +# include +# include +# include +# include + +# 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; +} + +#else +/* Native Woe32 API. */ + +# include + +FILE * +popen (const char *filename, const char *mode) +{ + /* Use binary mode by default. */ + if (strcmp (mode, "r") == 0) + mode = "rb"; + else if (strcmp (mode, "w") == 0) + mode = "wb"; + + return _popen (filename, mode); +} + +#endif diff --git a/gnulib/lib/posix_openpt.c b/gnulib/lib/posix_openpt.c new file mode 100644 index 0000000..137db71 --- /dev/null +++ b/gnulib/lib/posix_openpt.c @@ -0,0 +1,108 @@ +/* Open the master side of a pseudo-terminal. + Copyright (C) 2010-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include +#include +#if defined __OpenBSD__ +# include +# include +#endif + +/* posix_openpt() is already provided on + glibc >= 2.2.1 (but is a stub on GNU/Hurd), + MacOS X >= 10.4, + FreeBSD >= 5.1 (lived in src/lib/libc/stdlib/grantpt.c before 8.0), + NetBSD >= 3.0, + AIX >= 5.2, HP-UX >= 11.31, Solaris >= 10, Cygwin >= 1.7. + Thus, this replacement function is compiled on + MacOS X 10.3, OpenBSD 4.9, Minix 3.1.8, + AIX 5.1, HP-UX 11.23, IRIX 6.5, OSF/1 5.1, Solaris 9, + Cygwin 1.5.x, mingw, MSVC 9, Interix 3.5, BeOS. + Among these: + - AIX has /dev/ptc. + - HP-UX 10..11, IRIX 6.5, OSF/1 5.1, Solaris 2.6..9, Cygwin 1.5 + have /dev/ptmx. + - HP-UX 10..11 also has /dev/ptym/clone, but this should not be needed. + - OpenBSD 4.9 has /dev/ptm and the PTMGET ioctl. + - Minix 3.1.8 have a list of pseudo-terminal devices in /dev. + - On native Windows, there are no ttys at all. */ + +int +posix_openpt (int flags) +{ + int master; + +#ifdef _AIX /* AIX */ + + master = open ("/dev/ptc", flags); + +#elif (defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__ /* mingw */ + + /* Mingw lacks pseudo-terminals altogether. */ + master = -1; + errno = ENOSYS; + +#elif defined __OpenBSD__ + + /* On OpenBSD, master and slave of a pseudo-terminal are allocated together, + by opening /dev/ptm and applying the PTMGET ioctl to it. */ + int fd; + struct ptmget data; + + fd = open (PATH_PTMDEV, O_RDWR); + if (fd >= 0) + { + if (ioctl (fd, PTMGET, &data) >= 0) + { + master = data.cfd; + close (data.sfd); + close (fd); + } + else + { + int saved_errno = errno; + close (fd); + errno = saved_errno; + master = -1; + } + } + else + master = -1; + +#else /* MacOS X, Minix, HP-UX, IRIX, OSF/1, Solaris 9, Cygwin 1.5 */ + + /* Most systems that lack posix_openpt() have /dev/ptmx. */ + master = open ("/dev/ptmx", flags); + + /* If all this does not work, we could try to open, one by one: + - On MacOS X: /dev/pty[p-w][0-9a-f] + - On *BSD: /dev/pty[p-sP-S][0-9a-v] + - On Minix: /dev/pty[p-q][0-9a-f] + - On AIX: /dev/ptyp[0-9a-f] + - On HP-UX: /dev/pty[p-r][0-9a-f] + - On OSF/1: /dev/pty[p-q][0-9a-f] + - On Solaris: /dev/pty[p-r][0-9a-f] + */ + +#endif + + return master; +} diff --git a/gnulib/lib/posixtm.c b/gnulib/lib/posixtm.c new file mode 100644 index 0000000..16e333f --- /dev/null +++ b/gnulib/lib/posixtm.c @@ -0,0 +1,235 @@ +/* Parse dates for touch and date. + + Copyright (C) 1989-1991, 1998, 2000-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Yacc-based version written by Jim Kingdon and David MacKenzie. + Rewritten by Jim Meyering. */ + +#include + +#include "posixtm.h" + +#include +#include +#include +#include + +#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 0000000..48aef6a --- /dev/null +++ b/gnulib/lib/posixtm.h @@ -0,0 +1,36 @@ +/* Parse dates for touch and date. + + Copyright (C) 1998, 2003, 2005, 2007-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Yacc-based version written by Jim Kingdon and David MacKenzie. + Rewritten by Jim Meyering. */ + +#ifndef POSIXTM_H_ +# define POSIXTM_H_ + +# include +# include + +/* 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 0000000..d2b88d4 --- /dev/null +++ b/gnulib/lib/posixver.c @@ -0,0 +1,54 @@ +/* Which POSIX version to conform to, for utilities. + + Copyright (C) 2002-2006, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +#include + +#include "posixver.h" + +#include +#include + +#include +#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 0000000..b64f6a2 --- /dev/null +++ b/gnulib/lib/posixver.h @@ -0,0 +1 @@ +int posix2_version (void); diff --git a/gnulib/lib/powf.c b/gnulib/lib/powf.c new file mode 100644 index 0000000..d5a81b9 --- /dev/null +++ b/gnulib/lib/powf.c @@ -0,0 +1,26 @@ +/* Power function. + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +float +powf (float x, float y) +{ + return (float) pow ((double) x, (double) y); +} diff --git a/gnulib/lib/pread.c b/gnulib/lib/pread.c new file mode 100644 index 0000000..6ff753e --- /dev/null +++ b/gnulib/lib/pread.c @@ -0,0 +1,65 @@ +/* replacement pread function + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include + +#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 0000000..5210a91 --- /dev/null +++ b/gnulib/lib/printf-args.c @@ -0,0 +1,188 @@ +/* Decomposed printf argument list. + Copyright (C) 1999, 2002-2003, 2005-2007, 2009-2011 Free Software + Foundation, Inc. + + This program is free software; you can 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 +#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 0000000..e03eb6e --- /dev/null +++ b/gnulib/lib/printf-args.h @@ -0,0 +1,159 @@ +/* Decomposed printf argument list. + Copyright (C) 1999, 2002-2003, 2006-2007, 2011 Free Software + Foundation, Inc. + + This program is free software; you can 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 + +/* Get wchar_t. */ +#if HAVE_WCHAR_T +# include +#endif + +/* Get wint_t. */ +#if HAVE_WINT_T +# include +#endif + +/* Get va_list. */ +#include + + +/* 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; + +/* Number of directly allocated arguments (no malloc() needed). */ +#define N_DIRECT_ALLOC_ARGUMENTS 7 + +typedef struct +{ + size_t count; + argument *arg; + argument direct_alloc_arg[N_DIRECT_ALLOC_ARGUMENTS]; +} +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 0000000..267081c --- /dev/null +++ b/gnulib/lib/printf-frexp.c @@ -0,0 +1,190 @@ +/* Split a double into fraction and mantissa, for hexadecimal printf. + Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#if ! defined USE_LONG_DOUBLE +# include +#endif + +/* Specification. */ +#ifdef USE_LONG_DOUBLE +# include "printf-frexpl.h" +#else +# include "printf-frexp.h" +#endif + +#include +#include +#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 0000000..10dd371 --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* 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 0000000..2de6528 --- /dev/null +++ b/gnulib/lib/printf-frexpl.c @@ -0,0 +1,37 @@ +/* Split a 'long double' into fraction and mantissa, for hexadecimal printf. + Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE + +/* Specification. */ +# include "printf-frexpl.h" + +# include "printf-frexp.h" + +long double +printf_frexpl (long double x, int *expptr) +{ + return printf_frexp (x, expptr); +} + +#else + +# define USE_LONG_DOUBLE +# include "printf-frexp.c" + +#endif diff --git a/gnulib/lib/printf-frexpl.h b/gnulib/lib/printf-frexpl.h new file mode 100644 index 0000000..a8cbcbf --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* 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 0000000..c4e1d37 --- /dev/null +++ b/gnulib/lib/printf-parse.c @@ -0,0 +1,639 @@ +/* Formatted output to strings. + Copyright (C) 1999-2000, 2002-2003, 2006-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 +#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 + +/* Get intmax_t. */ +#if defined IN_LIBINTL || defined IN_LIBASPRINTF +# if HAVE_STDINT_H_WITH_UINTMAX +# include +# endif +# if HAVE_INTTYPES_H_WITH_UINTMAX +# include +# endif +#else +# include +#endif + +/* malloc(), realloc(), free(). */ +#include + +/* memcpy(). */ +#include + +/* errno. */ +#include + +/* 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 = N_DIRECT_ALLOC_DIRECTIVES; + d->dir = d->direct_alloc_dir; + + a->count = 0; + a_allocated = N_DIRECT_ALLOC_ARGUMENTS; + a->arg = a->direct_alloc_arg; + +#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 != a->direct_alloc_arg \ + ? realloc (a->arg, memory_size) \ + : malloc (memory_size)); \ + if (memory == NULL) \ + /* Out of memory. */ \ + goto out_of_memory; \ + if (a->arg == a->direct_alloc_arg) \ + memcpy (memory, a->arg, a->count * sizeof (argument)); \ + 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++; + } +#if __GLIBC__ >= 2 && !defined __UCLIBC__ + else if (*cp == 'I') + { + dp->flags |= FLAG_LOCALIZED; + cp++; + } +#endif + 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 *) (d->dir != d->direct_alloc_dir + ? realloc (d->dir, memory_size) + : malloc (memory_size)); + if (memory == NULL) + /* Out of memory. */ + goto out_of_memory; + if (d->dir == d->direct_alloc_dir) + memcpy (memory, d->dir, d->count * sizeof (DIRECTIVE)); + 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 != a->direct_alloc_arg) + free (a->arg); + if (d->dir != d->direct_alloc_dir) + free (d->dir); + errno = EINVAL; + return -1; + +out_of_memory: + if (a->arg != a->direct_alloc_arg) + free (a->arg); + if (d->dir != d->direct_alloc_dir) + free (d->dir); + 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 0000000..c819f94 --- /dev/null +++ b/gnulib/lib/printf-parse.h @@ -0,0 +1,194 @@ +/* Parse printf format string. + Copyright (C) 1999, 2002-2003, 2005, 2007, 2010-2011 Free Software + Foundation, Inc. + + This program is free software; you can 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. */ + +#if HAVE_FEATURES_H +# include /* for __GLIBC__, __UCLIBC__ */ +#endif + +#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 +#if __GLIBC__ >= 2 && !defined __UCLIBC__ +# define FLAG_LOCALIZED 64 /* I flag, uses localized digits */ +#endif + +/* 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. */ + +/* Number of directly allocated directives (no malloc() needed). */ +#define N_DIRECT_ALLOC_DIRECTIVES 7 + +/* 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_directive direct_alloc_dir[N_DIRECT_ALLOC_DIRECTIVES]; +} +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_directive direct_alloc_dir[N_DIRECT_ALLOC_DIRECTIVES]; +} +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_directive direct_alloc_dir[N_DIRECT_ALLOC_DIRECTIVES]; +} +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_directive direct_alloc_dir[N_DIRECT_ALLOC_DIRECTIVES]; +} +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 0000000..d49b392 --- /dev/null +++ b/gnulib/lib/printf.c @@ -0,0 +1,40 @@ +/* Formatted output to a stream. + Copyright (C) 2007, 2010-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +/* Specification. */ +#include + +#include + +/* 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 0000000..1b5429e --- /dev/null +++ b/gnulib/lib/priv-set.c @@ -0,0 +1,142 @@ +/* Query, remove, or restore a Solaris privilege. + + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Written by David Bartley. */ + +#include +#include "priv-set.h" + +#if HAVE_GETPPRIV && HAVE_PRIV_H + +# include +# include +# include + +/* 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. + 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 previously + removed by a call to priv_set_remove). + 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 0000000..dfdb2ca --- /dev/null +++ b/gnulib/lib/priv-set.h @@ -0,0 +1,50 @@ +/* Query, remove, or restore a Solaris privilege. + + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Written by David Bartley. */ + +#if HAVE_GETPPRIV && HAVE_PRIV_H + +# include + +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 0000000..2465748 --- /dev/null +++ b/gnulib/lib/progname.c @@ -0,0 +1,92 @@ +/* Program name management. + Copyright (C) 2001-2003, 2005-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + + +#include + +/* Specification. */ +#undef ENABLE_RELOCATABLE /* avoid defining set_program_name as a macro */ +#include "progname.h" + +#include /* get program_invocation_name declaration */ +#include +#include +#include + + +/* 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 "/.libs/" or "/.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 / 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 0000000..0844066 --- /dev/null +++ b/gnulib/lib/progname.h @@ -0,0 +1,62 @@ +/* Program name management. + Copyright (C) 2001-2004, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#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 0000000..4a3fa48 --- /dev/null +++ b/gnulib/lib/progreloc.c @@ -0,0 +1,377 @@ +/* Provide relocatable programs. + Copyright (C) 2003-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + + +#define _GL_USE_STDLIB_ALLOC 1 +#include + +/* Specification. */ +#include "progname.h" + +#include +#include +#include +#include +#include +#include +#include + +/* Get declaration of _NSGetExecutablePath on MacOS X 10.2 or newer. */ +#if HAVE_MACH_O_DYLD_H +# include +#endif + +#if (defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__ +# define WIN32_NATIVE +#endif + +#ifdef WIN32_NATIVE +# define WIN32_LEAN_AND_MEAN +# include +#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 + +#ifndef O_EXEC +# define O_EXEC O_RDONLY /* This is often close enough in older systems. */ +#endif + +/* Declare canonicalize_file_name. + The 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, 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 + +/* Use the system functions, not the gnulib overrides in this file. */ +#undef sprintf + +#undef set_program_name + + +#if ENABLE_RELOCATABLE + +#if defined __linux__ || defined __CYGWIN__ +/* 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. */ +#if !defined WIN32_NATIVE + if (access (filename, X_OK) < 0) + return false; +#endif + +#if defined __linux__ || defined __CYGWIN__ + 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 + + 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 + /* Native Win32 only. + On Cygwin, it is better to use the Cygwin provided /proc interface, than + to use native Win32 API and cygwin_conv_to_posix_path, because it supports + longer file names + (see ). */ + 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; + return xstrdup (location); +#else /* Unix */ +# ifdef __linux__ + /* The executable is accessible as /proc//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_EXEC, 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_EXEC, 0); + } + } +# endif +# ifdef __CYGWIN__ + /* The executable is accessible as /proc//exe, at least in + Cygwin >= 1.5. */ + { + char *link; + + link = xreadlink ("/proc/self/exe"); + if (link != NULL) + return link; + if (executable_fd < 0) + executable_fd = open ("/proc/self/exe", O_EXEC, 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 0000000..31fc96a --- /dev/null +++ b/gnulib/lib/propername.c @@ -0,0 +1,318 @@ +/* Localization of proper names. + Copyright (C) 2006-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +/* Without this pragma, gcc 4.7.0 20111124 mistakenly suggests that + the proper_name function might be candidate for attribute 'const' */ +#if (__GNUC__ == 4 && 6 <= __GNUC_MINOR__) || 4 < __GNUC__ +# pragma GCC diagnostic ignored "-Wsuggest-attribute=const" +#endif + +#include + +/* Specification. */ +#include "propername.h" + +#include +#include +#include +#include +#include +#if HAVE_ICONV +# include +#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) \ + && !defined __UCLIBC__) \ + || _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 +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 +# include +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 0000000..997c57b --- /dev/null +++ b/gnulib/lib/propername.h @@ -0,0 +1,106 @@ +/* Localization of proper names. + Copyright (C) 2006, 2008-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +/* 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: + () + + 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) /* NOT attribute const */; + +/* 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/pselect.c b/gnulib/lib/pselect.c new file mode 100644 index 0000000..5b709a2 --- /dev/null +++ b/gnulib/lib/pselect.c @@ -0,0 +1,77 @@ +/* pselect - synchronous I/O multiplexing + + Copyright 2011 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. */ + +/* written by Paul Eggert */ + +#include + +#include + +#include +#include + +/* Examine the size-NFDS file descriptor sets in RFDS, WFDS, and XFDS + to see whether some of their descriptors are ready for reading, + ready for writing, or have exceptions pending. Wait for at most + TIMEOUT seconds, and use signal mask SIGMASK while waiting. A null + pointer parameter stands for no descriptors, an infinite timeout, + or an unaffected signal mask. */ + +int +pselect (int nfds, fd_set *restrict rfds, + fd_set *restrict wfds, fd_set *restrict xfds, + struct timespec const *restrict timeout, + sigset_t const *restrict sigmask) +{ + int select_result; + sigset_t origmask; + struct timeval tv, *tvp; + + if (timeout) + { + if (! (0 <= timeout->tv_nsec && timeout->tv_nsec < 1000000000)) + { + errno = EINVAL; + return -1; + } + + tv.tv_sec = timeout->tv_sec; + tv.tv_usec = (timeout->tv_nsec + 999) / 1000; + tvp = &tv; + } + else + tvp = NULL; + + /* Signal mask munging should be atomic, but this is the best we can + do in this emulation. */ + if (sigmask) + pthread_sigmask (SIG_SETMASK, sigmask, &origmask); + + select_result = select (nfds, rfds, wfds, xfds, tvp); + + if (sigmask) + { + int select_errno = errno; + pthread_sigmask (SIG_SETMASK, &origmask, NULL); + errno = select_errno; + } + + return select_result; +} diff --git a/gnulib/lib/pt_chown.c b/gnulib/lib/pt_chown.c new file mode 100644 index 0000000..ccc04fd --- /dev/null +++ b/gnulib/lib/pt_chown.c @@ -0,0 +1,162 @@ +/* pt_chown - helper program for `grantpt'. + Copyright (C) 1998-1999, 2009-2011 Free Software Foundation, Inc. + Contributed by C. Scott Ananian , 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 . */ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "pty-private.h" + +/* For security reasons, we try to minimize the dependencies on libraries + outside libc. This means, in particular: + - No use of gettext(), since it's usually implemented in libintl. + - No use of error() or argp, since they rely on gettext by default. */ + + +static int +do_pt_chown (void) +{ + char *pty; + struct stat st; + struct group *p; + gid_t gid; + + /* Check that PTY_FILENO is a valid master pseudo terminal. */ + pty = ptsname (PTY_FILENO); + if (pty == NULL) + return errno == EBADF ? FAIL_EBADF : FAIL_EINVAL; + + /* Check that the returned slave pseudo terminal is a + character device. */ + if (stat (pty, &st) < 0 || !S_ISCHR (st.st_mode)) + return FAIL_EINVAL; + + /* Get the group ID of the special `tty' group. */ + p = getgrnam (TTY_GROUP); + gid = p ? p->gr_gid : getgid (); + + /* Set the owner to the real user ID, and the group to that special + group ID. */ + if (st.st_gid != gid && chown (pty, getuid (), gid) < 0) + return FAIL_EACCES; + + /* Set the permission mode to readable and writable by the owner, + and writable by the group. */ + if ((st.st_mode & (S_IRWXU|S_IRWXG|S_IRWXO)) != (S_IRUSR|S_IWUSR|S_IWGRP) + && chmod (pty, S_IRUSR|S_IWUSR|S_IWGRP) < 0) + return FAIL_EACCES; + + return 0; +} + + +int +main (int argc, char *argv[]) +{ + uid_t euid = geteuid (); + + if (argc == 1 && euid == 0) + { + /* Normal invocation of this program is with no arguments and + with privileges. */ + return do_pt_chown (); + } + + /* It would be possible to drop setuid/setgid privileges here. But it is not + really needed, since the code below only calls strcmp and [f]printf. */ + + { + int do_help = 0; + int do_version = 0; + int remaining; + + for (remaining = 1; remaining < argc; remaining++) + { + const char *arg = argv[remaining]; + + if (arg[0] == '-') + { + if (strcmp (arg, "--") == 0) + { + remaining++; + break; + } + else if (strcmp (arg, "--help") == 0) + do_help = 1; + else if (strcmp (arg, "--version") == 0) + do_version = 1; + else + { + fprintf (stderr, "pt_chown: invalid option: %s\n", arg); + return EXIT_FAILURE; + } + } + else + break; + } + + if (remaining < argc) + { + fprintf (stderr, "pt_chown: too many arguments\n"); + return EXIT_FAILURE; + } + + if (do_help) + { + printf ("Usage: pt_chown [OPTION...]\n"); + printf ("Set the owner, group and access permission of the slave pseudo terminal\n" + "corresponding to the master pseudo terminal passed on file descriptor %d.\n" + "This is the helper program for the 'grantpt' function. It is not intended\n" + "to be run directly from the command line.\n", + PTY_FILENO); + printf ("\n"); + printf (" --help Give this help list\n"); + printf (" --version Print program version\n"); + printf ("\n"); + printf ("The owner is set to the current user, the group is set to '%s', and the\n" + "access permission is set to '%o'.\n", + TTY_GROUP, S_IRUSR|S_IWUSR|S_IWGRP); + printf ("Please report bugs to .\n"); + return EXIT_SUCCESS; + } + + if (do_version) + { + printf ("pt_chown (GNU %s) %s\n", "libc", "2.11"); + printf ("Copyright (C) %s Free Software Foundation, Inc.\n" + "This is free software; see the source for copying conditions. There is NO\n" + "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n", + "1999"); + return EXIT_SUCCESS; + } + } + + /* Check if we are properly installed. */ + if (euid != 0) + { + fprintf (stderr, "pt_chown: needs to be installed setuid 'root'\n"); + return FAIL_EXEC; + } + + return EXIT_SUCCESS; +} diff --git a/gnulib/lib/pthread.in.h b/gnulib/lib/pthread.in.h new file mode 100644 index 0000000..c05c7c9 --- /dev/null +++ b/gnulib/lib/pthread.in.h @@ -0,0 +1,274 @@ +/* Implement a trivial subset of POSIX 1003.1-2008 pthread.h. + + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 and Glen Lenker. */ + +#ifndef _@GUARD_PREFIX@_PTHREAD_H_ + +#if __GNUC__ >= 3 +@PRAGMA_SYSTEM_HEADER@ +#endif +@PRAGMA_COLUMNS@ + +/* The include_next requires a split double-inclusion guard. */ +#if @HAVE_PTHREAD_H@ +# @INCLUDE_NEXT@ @NEXT_PTHREAD_H@ +#endif + +#ifndef _@GUARD_PREFIX@_PTHREAD_H_ +#define _@GUARD_PREFIX@_PTHREAD_H_ + +#include +#include +#include +#include +#include + +#if ! @HAVE_PTHREAD_T@ +# if !GNULIB_defined_pthread_types + typedef int pthread_t; + typedef int pthread_attr_t; + typedef int pthread_barrier_t; + typedef int pthread_barrierattr_t; + typedef int pthread_cond_t; + typedef int pthread_condattr_t; + typedef int pthread_key_t; + typedef int pthread_mutex_t; + typedef int pthread_mutexattr_t; + typedef int pthread_once_t; + typedef int pthread_rwlock_t; + typedef int pthread_rwlockattr_t; +# define GNULIB_defined_pthread_types 1 +# endif +#endif + +#ifndef PTHREAD_COND_INITIALIZER +#define PTHREAD_COND_INITIALIZER { 0 } +#define PTHREAD_MUTEX_INITIALIZER { 0 } +#define PTHREAD_ONCE_INIT { 0 } +#define PTHREAD_RWLOCK_INITIALIZER { 0 } + +#define PTHREAD_BARRIER_SERIAL_THREAD (-1) + +#define PTHREAD_CANCEL_DEFERRED 0 +#define PTHREAD_CANCEL_ASYNCHRONOUS 1 + +#define PTHREAD_CANCEL_ENABLE 0 +#define PTHREAD_CANCEL_DISABLE 1 + +#define PTHREAD_CANCELED ((void *) -1) + +#define PTHREAD_CREATE_JOINABLE 0 +#define PTHREAD_CREATE_DETACHED 1 + +#define PTHREAD_INHERIT_SCHED 0 +#define PTHREAD_EXPLICIT_SCHED 1 + +#define PTHREAD_MUTEX_DEFAULT PTHREAD_MUTEX_NORMAL +#define PTHREAD_MUTEX_NORMAL 0 +#define PTHREAD_MUTEX_ERRORCHECK 1 +#define PTHREAD_MUTEX_RECURSIVE 2 + +#define PTHREAD_MUTEX_STALLED 0 +#define PTHREAD_MUTEX_ROBUST 1 + +#define PTHREAD_PRIO_NONE 0 +#define PTHREAD_PRIO_INHERIT 1 +#define PTHREAD_PRIO_PROTECT 2 + +#define PTHREAD_PROCESS_PRIVATE 0 +#define PTHREAD_PROCESS_SHARED 1 + +#define PTHREAD_SCOPE_SYSTEM 0 +#define PTHREAD_SCOPE_PROCESS 1 +#endif + +#if ! @HAVE_PTHREAD_T@ + +# if !GNULIB_defined_pthread_functions + +/* Provide substitutes for the thread functions that should work + adequately on a single-threaded implementation, where + pthread_create always fails. The goal is to let programs compile + on non-pthread hosts with minimal runtime overhead. + + Omit interfaces that have not been analyzed and for which we do not + know what to do, so that they elicit a compile-time error for + now. */ + +static inline int +pthread_cond_destroy (pthread_cond_t *cond) +{ + /* COND is never seriously used. */ + return 0; +} + +static inline int +pthread_cond_init (pthread_cond_t *restrict cond, + pthread_condattr_t const *restrict attr) +{ + /* COND is never seriously used. */ + return 0; +} + +static inline int +pthread_cond_signal (pthread_cond_t *cond) +{ + /* No threads can currently be blocked on COND. */ + return 0; +} + +static inline int +pthread_cond_wait (pthread_cond_t *restrict cond, + pthread_mutex_t *restrict mutex) +{ + /* Properly-written applications never come here. */ + abort (); + return 0; +} + +static inline int +pthread_create (pthread_t *restrict thread, + pthread_attr_t const *restrict attr, + void * (*start_routine) (void*), void *restrict arg) +{ + /* Do not create a thread. */ + return EAGAIN; +} + +static inline void +pthread_exit (void *value) +{ + /* There is just one thread, so the process exits. */ + exit (0); +} + +static inline int +pthread_join (pthread_t thread, void **pvalue) +{ + /* Properly-written applications never come here. */ + abort (); + return 0; +} + +static inline int +pthread_mutexattr_destroy (pthread_mutexattr_t *attr) +{ + return 0; +} + +static inline int +pthread_mutexattr_init (pthread_mutexattr_t *attr) +{ + return 0; +} + +static inline int +pthread_mutexattr_settype (pthread_mutexattr_t *attr, int attr_type) +{ + return 0; +} + +static inline int +pthread_mutex_destroy (pthread_mutex_t *mutex) +{ + /* MUTEX is never seriously used. */ + return 0; +} + +static inline int +pthread_mutex_init (pthread_mutex_t *restrict mutex, + pthread_mutexattr_t const *restrict attr) +{ + /* MUTEX is never seriously used. */ + return 0; +} + +static inline int +pthread_mutex_lock (pthread_mutex_t *mutex) +{ + /* There is only one thread, so it always gets the lock. This + implementation does not support PTHREAD_MUTEX_ERRORCHECK. */ + return 0; +} + +static inline int +pthread_mutex_trylock (pthread_mutex_t *mutex) +{ + return pthread_mutex_lock (mutex); +} + +static inline int +pthread_mutex_unlock (pthread_mutex_t *mutex) +{ + /* There is only one thread, so it always unlocks successfully. + This implementation does not support robust mutexes or + PTHREAD_MUTEX_ERRORCHECK. */ + return 0; +} + +# define GNULIB_defined_pthread_functions 1 +# endif + +#endif + +#if ! @HAVE_PTHREAD_SPINLOCK_T@ + +# if !GNULIB_defined_pthread_spinlock_t + +/* Approximate spinlocks with mutexes. */ + +typedef pthread_mutex_t pthread_spinlock_t; + +static inline int +pthread_spin_init (pthread_spinlock_t *lock, int pshared) +{ + return pthread_mutex_init (lock, NULL); +} + +static inline int +pthread_spin_destroy (pthread_spinlock_t *lock) +{ + return pthread_mutex_destroy (lock); +} + +static inline int +pthread_spin_lock (pthread_spinlock_t *lock) +{ + return pthread_mutex_lock (lock); +} + +static inline int +pthread_spin_trylock (pthread_spinlock_t *lock) +{ + return pthread_mutex_trylock (lock); +} + +static inline int +pthread_spin_unlock (pthread_spinlock_t *lock) +{ + return pthread_mutex_unlock (lock); +} + +# define GNULIB_defined_pthread_spinlock_t 1 +# endif + +#endif + +#endif /* _@GUARD_PREFIX@_PTHREAD_H_ */ +#endif /* _@GUARD_PREFIX@_PTHREAD_H_ */ diff --git a/gnulib/lib/pthread_sigmask.c b/gnulib/lib/pthread_sigmask.c new file mode 100644 index 0000000..11d549c --- /dev/null +++ b/gnulib/lib/pthread_sigmask.c @@ -0,0 +1,69 @@ +/* POSIX compatible signal blocking for threads. + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include +#include + +#if PTHREAD_SIGMASK_UNBLOCK_BUG +# include +#endif + +int +pthread_sigmask (int how, const sigset_t *new_mask, sigset_t *old_mask) +#undef pthread_sigmask +{ +#if HAVE_PTHREAD_SIGMASK + int ret = pthread_sigmask (how, new_mask, old_mask); +# if PTHREAD_SIGMASK_INEFFECTIVE + if (ret == 0) + { + /* Detect whether pthread_sigmask is currently ineffective. + Don't cache the information: libpthread.so could be dynamically + loaded after the program started and after pthread_sigmask was + called for the first time. */ + if (pthread_sigmask (1729, NULL, NULL) == 0) + { + /* pthread_sigmask is currently ineffective. The program is not + linked to -lpthread. So use sigprocmask instead. */ + return (sigprocmask (how, new_mask, old_mask) < 0 ? errno : 0); + } + } +# endif +# if PTHREAD_SIGMASK_FAILS_WITH_ERRNO + if (ret == -1) + return errno; +# endif +# if PTHREAD_SIGMASK_UNBLOCK_BUG + if (ret == 0 + && new_mask != NULL + && (how == SIG_UNBLOCK || how == SIG_SETMASK)) + { + /* Give the OS the opportunity to raise signals that were pending before + the pthread_sigmask call and have now been unblocked. */ + usleep (1); + } +# endif + return ret; +#else + int ret = sigprocmask (how, new_mask, old_mask); + return (ret < 0 ? errno : 0); +#endif +} diff --git a/gnulib/lib/ptsname.c b/gnulib/lib/ptsname.c new file mode 100644 index 0000000..102a65c --- /dev/null +++ b/gnulib/lib/ptsname.c @@ -0,0 +1,32 @@ +/* Determine name of the slave side of a pseudo-terminal. + Copyright (C) 1998, 2002, 2010-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#include + +/* Static buffer for `ptsname'. */ +static char buffer[64]; + + +/* Return the pathname of the pseudo terminal slave associated with + the master FD is open on, or NULL on errors. + The returned storage is good until the next call to this function. */ +char * +ptsname (int fd) +{ + return ptsname_r (fd, buffer, sizeof (buffer)) != 0 ? NULL : buffer; +} diff --git a/gnulib/lib/ptsname_r.c b/gnulib/lib/ptsname_r.c new file mode 100644 index 0000000..e7f2d5b --- /dev/null +++ b/gnulib/lib/ptsname_r.c @@ -0,0 +1,85 @@ +/* Determine name of the slave side of a pseudo-terminal. + Copyright (C) 1998, 2002, 2010-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#include + +#include +#include +#include +#include + +#ifdef _LIBC +# include +#else +# ifndef _PATH_TTY +# define _PATH_TTY "/dev/tty" +# endif +# ifndef _PATH_DEV +# define _PATH_DEV "/dev/" +# endif + +# define __set_errno(e) errno = (e) +# define __isatty isatty +# define __stat stat +# define __ttyname_r ttyname_r +# define __ptsname_r ptsname_r + +#endif + + +/* Store at most BUFLEN characters of the pathname of the slave pseudo + terminal associated with the master FD is open on in BUF. + Return 0 on success, otherwise an error number. */ +int +__ptsname_r (int fd, char *buf, size_t buflen) +{ + int save_errno = errno; + int err; + struct stat st; + + if (buf == NULL) + { + __set_errno (EINVAL); + return EINVAL; + } + + if (!__isatty (fd)) + /* We rely on isatty to set errno properly (i.e. EBADF or ENOTTY). */ + return errno; + + if (buflen < strlen (_PATH_TTY) + 3) + { + __set_errno (ERANGE); + return ERANGE; + } + + err = __ttyname_r (fd, buf, buflen); + if (err != 0) + { + __set_errno (err); + return errno; + } + + buf[sizeof (_PATH_DEV) - 1] = 't'; + + if (__stat (buf, &st) < 0) + return errno; + + __set_errno (save_errno); + return 0; +} diff --git a/gnulib/lib/pty-private.h b/gnulib/lib/pty-private.h new file mode 100644 index 0000000..dcd94d7 --- /dev/null +++ b/gnulib/lib/pty-private.h @@ -0,0 +1,46 @@ +/* Interface to the pt_chown program. + Copyright (C) 1998-1999, 2009-2011 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Zack Weinberg , 1998. + + 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 2.1 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 the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#ifndef _PTY_PRIVATE_H +#define _PTY_PRIVATE_H 1 + +/* The group slave pseudo terminals belong to. */ +#define TTY_GROUP "tty" + +/* The file descriptor connected to the master pseudo terminal. */ +#define PTY_FILENO 3 + +/* Path to the helper program that implements `grantpt' in user space. */ +#define _PATH_PT_CHOWN PKGLIBEXECDIR "/pt_chown" + +/* Test whether given TTY is really a Unix98 pseudo terminal. */ +/* #define unix98_pseudo_p(Dev) ... */ + +/* Exit codes for the helper program. */ +enum /* failure modes */ +{ + FAIL_EBADF = 1, + FAIL_EINVAL, + FAIL_EACCES, + FAIL_EXEC, + FAIL_ENOMEM +}; + +#endif /* pty-private.h */ diff --git a/gnulib/lib/pty.in.h b/gnulib/lib/pty.in.h new file mode 100644 index 0000000..b24dd10 --- /dev/null +++ b/gnulib/lib/pty.in.h @@ -0,0 +1,132 @@ +/* Substitute for and wrapper around . + Copyright (C) 2010-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 _@GUARD_PREFIX@_PTY_H + +#if __GNUC__ >= 3 +@PRAGMA_SYSTEM_HEADER@ +#endif +@PRAGMA_COLUMNS@ + +/* The include_next requires a split double-inclusion guard. */ +#if @HAVE_PTY_H@ +# @INCLUDE_NEXT@ @NEXT_PTY_H@ +#endif + +#ifndef _@GUARD_PREFIX@_PTY_H +#define _@GUARD_PREFIX@_PTY_H + +/* Some platforms declare this in a different header than glibc. */ +#if @HAVE_UTIL_H@ +# include +#endif +#if @HAVE_LIBUTIL_H@ +/* is a prerequisite of on FreeBSD 8.0. */ +# include +# include +#endif + +/* Get 'struct termios' and 'struct winsize'. */ +#include +#if defined _AIX +# include +#endif +/* Mingw lacks 'struct termios' and 'struct winsize', but a forward + declaration of an opaque type is sufficient to allow compilation of + a stub openpty(). */ +struct termios; +struct winsize; + +/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ + +/* The definition of _GL_WARN_ON_USE is copied here. */ + + +/* Declare overridden functions. */ + +#if @GNULIB_FORKPTY@ +/* Create pseudo tty master slave pair and set terminal attributes + according to TERMP and WINP. Fork a child process attached to the + slave end. Return a handle for the master end in *AMASTER, and + return the name of the slave end in NAME. */ +# if @REPLACE_FORKPTY@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef forkpty +# define forkpty rpl_forkpty +# endif +_GL_FUNCDECL_RPL (forkpty, int, + (int *amaster, char *name, + struct termios const *termp, struct winsize const *winp)); +_GL_CXXALIAS_RPL (forkpty, int, + (int *amaster, char *name, + struct termios const *termp, struct winsize const *winp)); +# else +# if !@HAVE_FORKPTY@ +_GL_FUNCDECL_SYS (forkpty, int, + (int *amaster, char *name, + struct termios const *termp, struct winsize const *winp)); +# endif +_GL_CXXALIAS_SYS (forkpty, int, + (int *amaster, char *name, + struct termios const *termp, struct winsize const *winp)); +# endif +_GL_CXXALIASWARN (forkpty); +#elif defined GNULIB_POSIXCHECK +# undef forkpty +# if HAVE_RAW_DECL_FORKPTY +_GL_WARN_ON_USE (forkpty, "forkpty is not declared consistently - " + "use gnulib module forkpty for portability"); +# endif +#endif + +#if @GNULIB_OPENPTY@ +/* Create pseudo tty master slave pair and set terminal attributes + according to TERMP and WINP. Return handles for both ends in + *AMASTER and *ASLAVE, and return the name of the slave end in NAME. */ +# if @REPLACE_OPENPTY@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef openpty +# define openpty rpl_openpty +# endif +_GL_FUNCDECL_RPL (openpty, int, + (int *amaster, int *aslave, char *name, + struct termios const *termp, struct winsize const *winp)); +_GL_CXXALIAS_RPL (openpty, int, + (int *amaster, int *aslave, char *name, + struct termios const *termp, struct winsize const *winp)); +# else +# if !@HAVE_OPENPTY@ +_GL_FUNCDECL_SYS (openpty, int, + (int *amaster, int *aslave, char *name, + struct termios const *termp, struct winsize const *winp)); +# endif +_GL_CXXALIAS_SYS (openpty, int, + (int *amaster, int *aslave, char *name, + struct termios const *termp, struct winsize const *winp)); +# endif +_GL_CXXALIASWARN (openpty); +#elif defined GNULIB_POSIXCHECK +# undef openpty +# if HAVE_RAW_DECL_OPENPTY +_GL_WARN_ON_USE (openpty, "openpty is not declared consistently - " + "use gnulib module openpty for portability"); +# endif +#endif + + +#endif /* _@GUARD_PREFIX@_PTY_H */ +#endif /* _@GUARD_PREFIX@_PTY_H */ diff --git a/gnulib/lib/putenv.c b/gnulib/lib/putenv.c new file mode 100644 index 0000000..2da3376 --- /dev/null +++ b/gnulib/lib/putenv.c @@ -0,0 +1,134 @@ +/* Copyright (C) 1991, 1994, 1997-1998, 2000, 2003-2011 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 . */ + +#include + +/* Specification. */ +#include + +#include + +/* Include errno.h *after* sys/types.h to work around header problems + on AIX 3.2.5. */ +#include +#ifndef __set_errno +# define __set_errno(ev) ((errno) = (ev)) +#endif + +#include +#include + +#if _LIBC +# if HAVE_GNU_LD +# define environ __environ +# else +extern char **environ; +# endif +#endif + +#if _LIBC +/* This lock protects against simultaneous modifications of `environ'. */ +# include +__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/pwrite.c b/gnulib/lib/pwrite.c new file mode 100644 index 0000000..f8ef3b6 --- /dev/null +++ b/gnulib/lib/pwrite.c @@ -0,0 +1,64 @@ +/* Write block to given position in file without changing file pointer. + POSIX version. + Copyright (C) 1997-1999, 2002, 2011 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include + +#define __libc_lseek(f,o,w) lseek (f, o, w) +#define __set_errno(Val) errno = (Val) +#define __libc_write(f,b,n) write (f, b, n) + +/* Note: This implementation of pwrite is not multithread-safe. */ + +ssize_t +pwrite (int fd, const 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_write (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/quote.c b/gnulib/lib/quote.c new file mode 100644 index 0000000..1989c8c --- /dev/null +++ b/gnulib/lib/quote.c @@ -0,0 +1,40 @@ +/* quote.c - quote arguments for output + + Copyright (C) 1998-2001, 2003, 2005-2006, 2009-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert */ + +#include + +#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 0000000..d0acb51 --- /dev/null +++ b/gnulib/lib/quote.h @@ -0,0 +1,20 @@ +/* quote.h - prototypes for quote.c + + Copyright (C) 1998-2001, 2003, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + + +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 0000000..03fbfe7 --- /dev/null +++ b/gnulib/lib/quotearg.c @@ -0,0 +1,895 @@ +/* quotearg.c - quote arguments for output + + Copyright (C) 1998-2002, 2004-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert */ + +/* Without this pragma, gcc 4.7.0 20111124 mistakenly suggests that + the quoting_options_from_style function might be candidate for + attribute 'pure' */ +#if (__GNUC__ == 4 && 6 <= __GNUC_MINOR__) || 4 < __GNUC__ +# pragma GCC diagnostic ignored "-Wsuggest-attribute=pure" +#endif + +#include + +#include "quotearg.h" + +#include "xalloc.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#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 /* NOT PURE!! */ +quoting_options_from_style (enum quoting_style style) +{ + struct quoting_options o = { 0 }; + if (style == custom_quoting_style) + abort (); + o.style = style; + 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 + + 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 0000000..2756d76 --- /dev/null +++ b/gnulib/lib/quotearg.h @@ -0,0 +1,389 @@ +/* quotearg.h - quote arguments for output + + Copyright (C) 1998-2002, 2004, 2006, 2008-2011 Free Software Foundation, + Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert */ + +#ifndef QUOTEARG_H_ +# define QUOTEARG_H_ 1 + +# include + +/* 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 0000000..aee33e8 --- /dev/null +++ b/gnulib/lib/raise.c @@ -0,0 +1,79 @@ +/* Provide a non-threads replacement for the POSIX raise function. + + Copyright (C) 2002-2003, 2005-2006, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Jim Meyering and Bruno Haible */ + +#include + +/* Specification. */ +#include + +#if HAVE_RAISE +/* Native Windows platform. */ + +# include + +# include "msvc-inval.h" + +# undef raise + +# if HAVE_MSVC_INVALID_PARAMETER_HANDLER +static inline int +raise_nothrow (int sig) +{ + int result; + + TRY_MSVC_INVAL + { + result = raise (sig); + } + CATCH_MSVC_INVAL + { + result = -1; + errno = EINVAL; + } + DONE_MSVC_INVAL; + + return result; +} +# else +# define raise_nothrow raise +# endif + +#else +/* An old Unix platform. */ + +# include + +# define rpl_raise raise + +#endif + +int +rpl_raise (int sig) +{ +#if GNULIB_defined_signal_blocking && GNULIB_defined_SIGPIPE + if (sig == SIGPIPE) + return _gl_raise_SIGPIPE (); +#endif + +#if HAVE_RAISE + return raise_nothrow (sig); +#else + return kill (getpid (), sig); +#endif +} diff --git a/gnulib/lib/random_r.c b/gnulib/lib/random_r.c new file mode 100644 index 0000000..288a72c --- /dev/null +++ b/gnulib/lib/random_r.c @@ -0,0 +1,423 @@ +/* + Copyright (C) 1995, 2005, 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* + 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 + +/* 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 +#include +#include +#include +#include + + +/* 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 0000000..095a50a --- /dev/null +++ b/gnulib/lib/rawmemchr.c @@ -0,0 +1,136 @@ +/* Searching in a string. + Copyright (C) 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +/* 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 0000000..6363923 --- /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 0000000..3bf9b84 --- /dev/null +++ b/gnulib/lib/read-file.c @@ -0,0 +1,189 @@ +/* read-file.c -- read file contents into a string + Copyright (C) 2006, 2009-2011 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 + +#include "read-file.h" + +/* Get fstat. */ +#include + +/* Get ftello. */ +#include + +/* Get SIZE_MAX. */ +#include + +/* Get malloc, realloc, free. */ +#include + +/* Get errno. */ +#include + +/* 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 = BUFSIZ; + + /* For a regular file, allocate a buffer that has exactly the right + size. This avoids the need to do dynamic reallocations later. */ + { + struct stat st; + + if (fstat (fileno (stream), &st) >= 0 && S_ISREG (st.st_mode)) + { + off_t pos = ftello (stream); + + if (pos >= 0 && pos < st.st_size) + { + off_t alloc_off = st.st_size - pos; + + /* '1' below, accounts for the trailing NUL. */ + if (SIZE_MAX - 1 < alloc_off) + { + errno = ENOMEM; + return NULL; + } + + alloc = alloc_off + 1; + } + } + } + + if (!(buf = malloc (alloc))) + return NULL; /* errno is ENOMEM. */ + + { + size_t size = 0; /* number of bytes read so far */ + int save_errno; + + for (;;) + { + /* This reads 1 more than the size of a regular file + so that we get eof immediately. */ + size_t requested = alloc - size; + size_t count = fread (buf + size, 1, requested, stream); + size += count; + + if (count != requested) + { + save_errno = errno; + if (ferror (stream)) + break; + + /* Shrink the allocated memory if possible. */ + if (size < alloc - 1) + { + char *smaller_buf = realloc (buf, size + 1); + if (smaller_buf != NULL) + buf = smaller_buf; + } + + buf[size] = '\0'; + *length = size; + return buf; + } + + { + char *new_buf; + + if (alloc == SIZE_MAX) + { + save_errno = ENOMEM; + break; + } + + if (alloc < SIZE_MAX - alloc / 2) + alloc = alloc + alloc / 2; + else + alloc = SIZE_MAX; + + if (!(new_buf = realloc (buf, alloc))) + { + save_errno = errno; + break; + } + + buf = new_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 0000000..60f3ab1 --- /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-2011 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 + +/* Get FILE. */ +#include + +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/read.c b/gnulib/lib/read.c new file mode 100644 index 0000000..1bae389 --- /dev/null +++ b/gnulib/lib/read.c @@ -0,0 +1,85 @@ +/* POSIX compatible read() function. + Copyright (C) 2008-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ + +# include +# include + +# define WIN32_LEAN_AND_MEAN /* avoid including junk */ +# include + +# include "msvc-inval.h" +# include "msvc-nothrow.h" + +# undef read + +# if HAVE_MSVC_INVALID_PARAMETER_HANDLER +static inline ssize_t +read_nothrow (int fd, void *buf, size_t count) +{ + ssize_t result; + + TRY_MSVC_INVAL + { + result = read (fd, buf, count); + } + CATCH_MSVC_INVAL + { + result = -1; + errno = EBADF; + } + DONE_MSVC_INVAL; + + return result; +} +# else +# define read_nothrow read +# endif + +ssize_t +rpl_read (int fd, void *buf, size_t count) +{ + ssize_t ret = read_nothrow (fd, buf, count); + +# if GNULIB_NONBLOCKING + if (ret < 0 + && GetLastError () == ERROR_NO_DATA) + { + HANDLE h = (HANDLE) _get_osfhandle (fd); + if (GetFileType (h) == FILE_TYPE_PIPE) + { + /* h is a pipe or socket. */ + DWORD state; + if (GetNamedPipeHandleState (h, &state, NULL, NULL, NULL, NULL, 0) + && (state & PIPE_NOWAIT) != 0) + /* h is a pipe in non-blocking mode. + Change errno from EINVAL to EAGAIN. */ + errno = EAGAIN; + } + } +# endif + + return ret; +} + +#endif diff --git a/gnulib/lib/readdir.c b/gnulib/lib/readdir.c new file mode 100644 index 0000000..04858b0 --- /dev/null +++ b/gnulib/lib/readdir.c @@ -0,0 +1,98 @@ +/* Read the next entry of a directory. + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include +#include + +#include "dirent-private.h" + +struct dirent * +readdir (DIR *dirp) +{ + char type; + struct dirent *result; + + /* There is no need to add code to produce entries for "." and "..". + According to the POSIX:2008 section "4.12 Pathname Resolution" + + "." and ".." are syntactic entities. + POSIX also says: + "If entries for dot or dot-dot exist, one entry shall be returned + for dot and one entry shall be returned for dot-dot; otherwise, + they shall not be returned." */ + + switch (dirp->status) + { + case -2: + /* End of directory already reached. */ + return NULL; + case -1: + break; + case 0: + if (!FindNextFile (dirp->current, &dirp->entry)) + { + switch (GetLastError ()) + { + case ERROR_NO_MORE_FILES: + dirp->status = -2; + return NULL; + default: + errno = EIO; + return NULL; + } + } + break; + default: + errno = dirp->status; + return NULL; + } + + dirp->status = 0; + + if (dirp->entry.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + type = DT_DIR; + else if (dirp->entry.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) + type = DT_LNK; + else if ((dirp->entry.dwFileAttributes + & ~(FILE_ATTRIBUTE_READONLY + | FILE_ATTRIBUTE_HIDDEN + | FILE_ATTRIBUTE_SYSTEM + | FILE_ATTRIBUTE_ARCHIVE + | FILE_ATTRIBUTE_NORMAL + | FILE_ATTRIBUTE_TEMPORARY + | FILE_ATTRIBUTE_SPARSE_FILE + | FILE_ATTRIBUTE_COMPRESSED + | FILE_ATTRIBUTE_NOT_CONTENT_INDEXED + | FILE_ATTRIBUTE_ENCRYPTED)) == 0) + /* Devices like COM1, LPT1, NUL would also have the attributes 0x20 but + they cannot occur here. */ + type = DT_REG; + else + type = DT_UNKNOWN; + + /* Reuse the memory of dirp->entry for the result. */ + result = + (struct dirent *) + ((char *) dirp->entry.cFileName - offsetof (struct dirent, d_name[0])); + result->d_type = type; + + return result; +} diff --git a/gnulib/lib/readline.c b/gnulib/lib/readline.c new file mode 100644 index 0000000..72a93c3 --- /dev/null +++ b/gnulib/lib/readline.c @@ -0,0 +1,55 @@ +/* readline.c --- Simple implementation of readline. + Copyright (C) 2005-2007, 2009-2011 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 . */ + +#include + +/* 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 + if the real library is present on the system. */ + +/* Get specification. */ +#include "readline.h" + +#include +#include + +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 0000000..ac77b53 --- /dev/null +++ b/gnulib/lib/readline.h @@ -0,0 +1,34 @@ +/* readline.h --- Simple implementation of readline. + Copyright (C) 2005, 2009-2011 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 . */ + +#ifndef GL_READLINE_H +#define GL_READLINE_H + +#if HAVE_READLINE_READLINE_H +/* makes use of the FILE type without including + itself. */ +# include +# include +#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 0000000..35d045b --- /dev/null +++ b/gnulib/lib/readlink.c @@ -0,0 +1,74 @@ +/* Stub for readlink(). + Copyright (C) 2003-2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include +#include +#include + +#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/readlinkat.c b/gnulib/lib/readlinkat.c new file mode 100644 index 0000000..63d0378 --- /dev/null +++ b/gnulib/lib/readlinkat.c @@ -0,0 +1,47 @@ +/* Read a symlink relative to an open directory. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Eric Blake */ + +#include + +#include + +/* 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/readtokens.c b/gnulib/lib/readtokens.c new file mode 100644 index 0000000..672bc8f --- /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-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + 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 + +#include "readtokens.h" + +#include +#include +#include +#include + +#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 0000000..a98979b --- /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-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Written by Jim Meyering. */ + +#ifndef READTOKENS_H +# define READTOKENS_H + +# include + +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 0000000..26feaf7 --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Written by Jim Meyering. */ + +#include + +#include + +#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 0000000..5e9a6ab --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Written by Jim Meyering. */ + +#ifndef READTOKENS0_H +# define READTOKENS0_H 1 + +# include +# include +# include +# 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 0000000..38453eb --- /dev/null +++ b/gnulib/lib/readutmp.c @@ -0,0 +1,161 @@ +/* GNU's read utmp module. + + Copyright (C) 1992-2001, 2003-2006, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by jla; revised by djm */ + +#include + +#include "readutmp.h" + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#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 0000000..2c0e34d --- /dev/null +++ b/gnulib/lib/readutmp.h @@ -0,0 +1,216 @@ +/* Declarations for GNU's read utmp module. + + Copyright (C) 1992-2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by jla; revised by djm */ + +#ifndef __READUTMP_H__ +# define __READUTMP_H__ + +# include + +/* 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 +# 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 +# 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 +# if !HAVE_DECL_GETUTENT + struct utmp *getutent (void); +# 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 0000000..0c96ffa --- /dev/null +++ b/gnulib/lib/realloc.c @@ -0,0 +1,79 @@ +/* realloc() function that is glibc compatible. + + Copyright (C) 1997, 2003-2004, 2006-2007, 2009-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Jim Meyering and Bruno Haible */ + +#define _GL_USE_STDLIB_ALLOC 1 +#include + +/* Only the AC_FUNC_REALLOC macro defines 'realloc' already in config.h. */ +#ifdef realloc +# define NEED_REALLOC_GNU 1 +/* Whereas the gnulib module 'realloc-gnu' defines HAVE_REALLOC_GNU. */ +#elif GNULIB_REALLOC_GNU && !HAVE_REALLOC_GNU +# define NEED_REALLOC_GNU 1 +#endif + +/* Infer the properties of the system's malloc function. + The gnulib module 'malloc-gnu' defines HAVE_MALLOC_GNU. */ +#if GNULIB_MALLOC_GNU && HAVE_MALLOC_GNU +# define SYSTEM_MALLOC_GLIBC_COMPATIBLE 1 +#endif + +#include + +#include + +/* 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 0000000..4755f63 --- /dev/null +++ b/gnulib/lib/recv.c @@ -0,0 +1,49 @@ +/* recv.c --- wrappers for Windows recv function + + Copyright (C) 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paolo Bonzini */ + +#include + +#define WIN32_LEAN_AND_MEAN +/* Get winsock2.h. */ +#include + +/* Get set_winsock_errno, FD_TO_SOCKET etc. */ +#include "w32sock.h" + +#undef recv + +ssize_t +rpl_recv (int fd, void *buf, size_t len, int flags) +{ + SOCKET sock = FD_TO_SOCKET (fd); + + if (sock == INVALID_SOCKET) + { + errno = EBADF; + return -1; + } + else + { + 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 0000000..5ce2b12 --- /dev/null +++ b/gnulib/lib/recvfrom.c @@ -0,0 +1,58 @@ +/* recvfrom.c --- wrappers for Windows recvfrom function + + Copyright (C) 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paolo Bonzini */ + +#include + +#define WIN32_LEAN_AND_MEAN +/* Get winsock2.h. */ +#include + +/* Get set_winsock_errno, FD_TO_SOCKET etc. */ +#include "w32sock.h" + +#undef recvfrom + +ssize_t +rpl_recvfrom (int fd, void *buf, size_t len, int flags, struct sockaddr *from, + socklen_t *fromlen) +{ + SOCKET sock = FD_TO_SOCKET (fd); + + if (sock == INVALID_SOCKET) + { + errno = EBADF; + return -1; + } + else + { + int frombufsize = (from != NULL ? *fromlen : 0); + 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/ref-add.sin b/gnulib/lib/ref-add.sin new file mode 100644 index 0000000..528f96f --- /dev/null +++ b/gnulib/lib/ref-add.sin @@ -0,0 +1,30 @@ +# Add this package to a list of references stored in a text file. +# +# Copyright (C) 2000, 2009-2011 Free Software Foundation, Inc. +# +# This program is free software; you can 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 . +# +/^# Packages using this file: / { + s/# Packages using this file:// + ta + :a + s/ @PACKAGE@ / @PACKAGE@ / + tb + s/ $/ @PACKAGE@ / + :b + s/^/# Packages using this file:/ +} diff --git a/gnulib/lib/ref-del.sin b/gnulib/lib/ref-del.sin new file mode 100644 index 0000000..5d98665 --- /dev/null +++ b/gnulib/lib/ref-del.sin @@ -0,0 +1,25 @@ +# Remove this package from a list of references stored in a text file. +# +# Copyright (C) 2000, 2009-2011 Free Software Foundation, Inc. +# +# This program is free software; you can 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 . +# +/^# Packages using this file: / { + s/# Packages using this file:// + s/ @PACKAGE@ / / + s/^/# Packages using this file:/ +} diff --git a/gnulib/lib/regcomp.c b/gnulib/lib/regcomp.c new file mode 100644 index 0000000..81c5d4a --- /dev/null +++ b/gnulib/lib/regcomp.c @@ -0,0 +1,3876 @@ +/* Extended regular expression matching and search library. + Copyright (C) 2002-2011 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Isamu Hasegawa . + + This program is free software; you can 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 (®exp, 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 (®exp); + 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 (®exp, 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 (®exp); + + 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 : + CAT + / \ + / \ + 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 (¤t_token, regexp, syntax | RE_CARET_ANCHORS_HERE); + tree = parse_reg_exp (regexp, preg, ¤t_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 + |: + ALT + / \ + / \ + + + 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 + : + CAT + / \ + / \ + + + 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 "", + it must not be "". */ + 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 + (): + SUBEXP + | + +*/ + +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; /* {} 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 "{n,m}" to "...{0,}". */ + 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 {0,n} as ((...?)?)?... 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 (const reg_syntax_t syntax, + bitset_t sbcset, + re_charset_t *mbcset, + Idx *range_alloc, + const bracket_elem_t *start_elem, + const bracket_elem_t *end_elem) +# else /* not RE_ENABLE_I18N */ +build_range_exp (const reg_syntax_t syntax, + bitset_t sbcset, + const bracket_elem_t *start_elem, + const 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 (BE ((syntax & RE_NO_EMPTY_RANGES) + && wcscoll (cmp_buf, cmp_buf + 4) > 0, 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 (syntax, sbcset, + dfa->mb_cur_max > 1 ? mbcset : NULL, + &range_alloc, &start_elem, &end_elem); +# else + *err = build_range_exp (syntax, 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 [::], [..], and + [==]. */ + +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 + /* 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-quote.c b/gnulib/lib/regex-quote.c new file mode 100644 index 0000000..8b4cdb7 --- /dev/null +++ b/gnulib/lib/regex-quote.c @@ -0,0 +1,216 @@ +/* Construct a regular expression from a literal string. + Copyright (C) 1995, 2010-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2010. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "regex-quote.h" + +#include + +#include "mbuiter.h" +#include "xalloc.h" + +/* Characters that are special in a BRE. */ +static const char bre_special[] = "$^.*[]\\"; + +/* Characters that are special in an ERE. */ +static const char ere_special[] = "$^.*[]\\+?{}()|"; + +struct regex_quote_spec +regex_quote_spec_posix (int cflags, bool anchored) +{ + struct regex_quote_spec result; + + strcpy (result.special, cflags != 0 ? ere_special : bre_special); + result.multibyte = true; + result.anchored = anchored; + + return result; +} + +/* Syntax bit values, defined in GNU . We don't include it here, + otherwise this module would need to depend on gnulib module 'regex'. */ +#define RE_BK_PLUS_QM 0x00000002 +#define RE_INTERVALS 0x00000200 +#define RE_LIMITED_OPS 0x00000400 +#define RE_NEWLINE_ALT 0x00000800 +#define RE_NO_BK_BRACES 0x00001000 +#define RE_NO_BK_PARENS 0x00002000 +#define RE_NO_BK_VBAR 0x00008000 + +struct regex_quote_spec +regex_quote_spec_gnu (unsigned long /*reg_syntax_t*/ syntax, bool anchored) +{ + struct regex_quote_spec result; + char *p; + + p = result.special; + memcpy (p, bre_special, sizeof (bre_special) - 1); + p += sizeof (bre_special) - 1; + if ((syntax & RE_LIMITED_OPS) == 0 && (syntax & RE_BK_PLUS_QM) == 0) + { + *p++ = '+'; + *p++ = '?'; + } + if ((syntax & RE_INTERVALS) != 0 && (syntax & RE_NO_BK_BRACES) != 0) + { + *p++ = '{'; + *p++ = '}'; + } + if ((syntax & RE_NO_BK_PARENS) != 0) + { + *p++ = '('; + *p++ = ')'; + } + if ((syntax & RE_LIMITED_OPS) == 0 && (syntax & RE_NO_BK_VBAR) != 0) + *p++ = '|'; + if ((syntax & RE_NEWLINE_ALT) != 0) + *p++ = '\n'; + *p = '\0'; + + result.multibyte = true; + result.anchored = anchored; + + return result; +} + +/* Characters that are special in a PCRE. */ +static const char pcre_special[] = "$^.*[]\\+?{}()|"; + +/* Options bit values, defined in . We don't include it here, because + it is not a standard header. */ +#define PCRE_ANCHORED 0x00000010 +#define PCRE_EXTENDED 0x00000008 + +struct regex_quote_spec +regex_quote_spec_pcre (int options, bool anchored) +{ + struct regex_quote_spec result; + char *p; + + p = result.special; + memcpy (p, bre_special, sizeof (pcre_special) - 1); + p += sizeof (pcre_special) - 1; + if (options & PCRE_EXTENDED) + { + *p++ = ' '; + *p++ = '\t'; + *p++ = '\n'; + *p++ = '\v'; + *p++ = '\f'; + *p++ = '\r'; + *p++ = '#'; + } + *p = '\0'; + + /* PCRE regular expressions consist of UTF-8 characters of options contains + PCRE_UTF8 and of single bytes otherwise. */ + result.multibyte = false; + /* If options contains PCRE_ANCHORED, the anchoring is implicit. */ + result.anchored = (options & PCRE_ANCHORED ? 0 : anchored); + + return result; +} + +size_t +regex_quote_length (const char *string, const struct regex_quote_spec *spec) +{ + const char *special = spec->special; + size_t length; + + length = 0; + if (spec->anchored) + length += 2; /* for '^' at the beginning and '$' at the end */ + if (spec->multibyte) + { + mbui_iterator_t iter; + + for (mbui_init (iter, string); mbui_avail (iter); mbui_advance (iter)) + { + /* We know that special contains only ASCII characters. */ + if (mb_len (mbui_cur (iter)) == 1 + && strchr (special, * mbui_cur_ptr (iter))) + length += 1; + length += mb_len (mbui_cur (iter)); + } + } + else + { + const char *iter; + + for (iter = string; *iter != '\0'; iter++) + { + if (strchr (special, *iter)) + length += 1; + length += 1; + } + } + + return length; +} + +char * +regex_quote_copy (char *p, const char *string, const struct regex_quote_spec *spec) +{ + const char *special = spec->special; + + if (spec->anchored) + *p++ = '^'; + if (spec->multibyte) + { + mbui_iterator_t iter; + + for (mbui_init (iter, string); mbui_avail (iter); mbui_advance (iter)) + { + /* We know that special contains only ASCII characters. */ + if (mb_len (mbui_cur (iter)) == 1 + && strchr (special, * mbui_cur_ptr (iter))) + *p++ = '\\'; + memcpy (p, mbui_cur_ptr (iter), mb_len (mbui_cur (iter))); + p += mb_len (mbui_cur (iter)); + } + } + else + { + const char *iter; + + for (iter = string; *iter != '\0'; iter++) + { + if (strchr (special, *iter)) + *p++ = '\\'; + *p++ = *iter++; + } + } + if (spec->anchored) + *p++ = '$'; + + return p; +} + +char * +regex_quote (const char *string, const struct regex_quote_spec *spec) +{ + size_t length = regex_quote_length (string, spec); + char *result = XNMALLOC (length + 1, char); + char *p; + + p = result; + p = regex_quote_copy (p, string, spec); + *p = '\0'; + return result; +} diff --git a/gnulib/lib/regex-quote.h b/gnulib/lib/regex-quote.h new file mode 100644 index 0000000..402dfaa --- /dev/null +++ b/gnulib/lib/regex-quote.h @@ -0,0 +1,88 @@ +/* Construct a regular expression from a literal string. + Copyright (C) 1995, 2010-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2010. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef _REGEX_QUOTE_H +#define _REGEX_QUOTE_H + +#include +#include + + +/* Specifies a quotation task for converting a fixed string to a regular + expression pattern. */ +struct regex_quote_spec +{ + /* True if the regular expression pattern consists of multibyte characters + (in the encoding given by the LC_CTYPE category of the locale), + false if it consists of single bytes or UTF-8 characters. */ + unsigned int /*bool*/ multibyte : 1; + /* True if the regular expression pattern shall match only entire lines. */ + unsigned int /*bool*/ anchored : 1; + /* Set of characters that need to be escaped (all ASCII), as a + NUL-terminated string. */ + char special[30 + 1]; +}; + + +/* Creates a quotation task that produces a POSIX regular expression, that is, + a pattern that can be compiled with regcomp(). + CFLAGS can be 0 or REG_EXTENDED. + If it is 0, the result is a Basic Regular Expression (BRE) + . + If it is REG_EXTENDED, the result is an Extended Regular Expression (ERE) + . + If ANCHORED is false, the regular expression will match substrings of lines. + If ANCHORED is true, it will match only complete lines, */ +extern struct regex_quote_spec + regex_quote_spec_posix (int cflags, bool anchored); + +/* Creates a quotation task that produces a regular expression that can be + compiled with the GNU API function re_compile_pattern(). + SYNTAX describes the syntax of the regular expression (such as + RE_SYNTAX_POSIX_BASIC, RE_SYNTAX_POSIX_EXTENDED, RE_SYNTAX_EMACS, all + defined in ). It must be the same value as 're_syntax_options' + at the moment of the re_compile_pattern() call. + If ANCHORED is false, the regular expression will match substrings of lines. + If ANCHORED is true, it will match only complete lines, */ +extern struct regex_quote_spec + regex_quote_spec_gnu (unsigned long /*reg_syntax_t*/ syntax, bool anchored); + +/* Creates a quotation task that produces a PCRE regular expression, that is, + a pattern that can be compiled with pcre_compile(). + OPTIONS is the same value as the second argument passed to pcre_compile(). + If ANCHORED is false, the regular expression will match substrings of lines. + If ANCHORED is true, it will match only complete lines, */ +extern struct regex_quote_spec + regex_quote_spec_pcre (int options, bool anchored); + + +/* Returns the number of bytes needed for the quoted string. */ +extern size_t + regex_quote_length (const char *string, const struct regex_quote_spec *spec); + +/* Copies the quoted string to p and returns the incremented p. + There must be room for regex_quote_length (string, spec) + 1 bytes at p. */ +extern char * + regex_quote_copy (char *p, + const char *string, const struct regex_quote_spec *spec); + +/* Returns the freshly allocated quoted string. */ +extern char * + regex_quote (const char *string, const struct regex_quote_spec *spec); + + +#endif /* _REGEX_QUOTE_H */ diff --git a/gnulib/lib/regex.c b/gnulib/lib/regex.c new file mode 100644 index 0000000..af47056 --- /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-2011 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Isamu Hasegawa . + + This program is free software; you can 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 + +/* 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 , which correctly + #undefs RE_DUP_MAX and sets it to the right value. */ +#include +#include + +#include +#include "regex_internal.h" + +#include "regex_internal.c" +#include "regcomp.c" +#include "regexec.c" + +/* Binary backward compatibility. */ +#if _LIBC +# include +# 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 0000000..2a17ff3 --- /dev/null +++ b/gnulib/lib/regex.h @@ -0,0 +1,675 @@ +/* Definitions for data structures and routines for the regular + expression library. + Copyright (C) 1985, 1989-1993, 1995-1998, 2000-2003, 2005-2006, 2009-2011 + 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 + +/* 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 \ matches . + If not set, then \ 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 a regex or + immediately after an alternation, open-group or \} 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 , 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 `re_compile_pattern' 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 + 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__)) \ + && !defined __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 0000000..26c5dc6 --- /dev/null +++ b/gnulib/lib/regex_internal.c @@ -0,0 +1,1741 @@ +/* Extended regular expression matching and search library. + Copyright (C) 2002-2011 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Isamu Hasegawa . + + This program is free software; you can 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: + (0), (1), (0), (1), + Then wide character buffer will be: + , WEOF , , WEOF , + 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; + size_t mbclen; + +#if 0 /* dead code: buf is set but never used */ + unsigned char buf[6]; + if (BE (pstr->trans != NULL, 0)) + { + int i = mlen < 6 ? mlen : 6; + while (--i >= 0) + buf[i] = pstr->trans[p[i]]; + } +#endif + /* 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 0000000..20cc833 --- /dev/null +++ b/gnulib/lib/regex_internal.h @@ -0,0 +1,866 @@ +/* Extended regular expression matching and search library. + Copyright (C) 2002-2011 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Isamu Hasegawa . + + This program is free software; you can 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 +#include +#include +#include +#include +#include + +#include +#ifndef _LIBC +# include "localcharset.h" +#endif +#include + +#include +#include +#include +#if defined _LIBC +# include +#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 +# include +# include +# endif +#endif + +/* This is for other GNU distributions with internationalized messages. */ +#if (HAVE_LIBINTL_H && ENABLE_NLS) || defined _LIBC +# include +# 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_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 && !defined __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 +# define internal_function +#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 + +#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 +# undef alloca +# define alloca(n) malloc (n) +# 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 + 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 0000000..7776f9b --- /dev/null +++ b/gnulib/lib/regexec.c @@ -0,0 +1,4417 @@ +/* Extended regular expression matching and search library. + Copyright (C) 2002-2011 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Isamu Hasegawa . + + This program is free software; you can 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 +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: + ( ) + ( ) + ( ) */ + 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); + if (BE (state->trtable == NULL, 0)) + return false; + 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 + + /* 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 && defined __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 0000000..68ceb71 --- /dev/null +++ b/gnulib/lib/relocatable.c @@ -0,0 +1,496 @@ +/* Provide relocatable packages. + Copyright (C) 2003-2006, 2008-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2003. + + This program is free software: you can redistribute 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 program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + + +/* Tell glibc's to provide a prototype for getline(). + This must come before because may include + , and once has been included, it's too late. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif + +#define _GL_USE_STDLIB_ALLOC 1 +#include + +/* Specification. */ +#include "relocatable.h" + +#if ENABLE_RELOCATABLE + +#include +#include +#include +#include + +#ifdef NO_XMALLOC +# define xmalloc malloc +#else +# include "xalloc.h" +#endif + +#if (defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__ +# define WIN32_LEAN_AND_MEAN +# include +#endif + +#if DEPENDS_ON_LIBCHARSET +# include +#endif +#if DEPENDS_ON_LIBICONV && HAVE_ICONV +# include +#endif +#if DEPENDS_ON_LIBINTL && ENABLE_NLS +# include +#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, 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 + +/* Whether to enable the more costly support for relocatable libraries. + It allows libraries to be have been installed with a different original + prefix than the program. But it is quite costly, especially on Cygwin + platforms, see below. Therefore we enable it by default only on native + Win32 platforms. */ +#ifndef ENABLE_COSTLY_RELOCATABLE +# if (defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__ +# define ENABLE_COSTLY_RELOCATABLE 1 +# else +# define ENABLE_COSTLY_RELOCATABLE 0 +# endif +#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 && ENABLE_COSTLY_RELOCATABLE) + +/* 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 && ENABLE_COSTLY_RELOCATABLE + +/* Full pathname of shared library, or NULL. */ +static char *shared_library_fullname; + +#if (defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__ +/* Native Win32 only. + On Cygwin, it is better to use the Cygwin provided /proc interface, than + to use native Win32 API and cygwin_conv_to_posix_path, because it supports + longer file names + (see ). */ + +/* 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; + + shared_library_fullname = strdup (location); + } + + return TRUE; +} + +#else /* Unix */ + +static void +find_shared_library_fullname () +{ +#if (defined __linux__ && (__GLIBC__ >= 2 || defined __UCLIBC__)) || defined __CYGWIN__ + /* Linux has /proc/self/maps. glibc 2 and uClibc have the getline() + function. + Cygwin >= 1.5 has /proc/self/maps and the getline() function too. + But it is costly: ca. 0.3 ms on Linux, 3 ms on Cygwin 1.5, and 5 ms on + Cygwin 1.7. */ + 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 / Unix */ + +/* 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 && ENABLE_COSTLY_RELOCATABLE + 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 0000000..80c43e6 --- /dev/null +++ b/gnulib/lib/relocatable.h @@ -0,0 +1,81 @@ +/* Provide relocatable packages. + Copyright (C) 2003, 2005, 2008-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2003. + + This program is free software: you can redistribute 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 program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#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 0000000..5422896 --- /dev/null +++ b/gnulib/lib/relocwrapper.c @@ -0,0 +1,198 @@ +/* Relocating wrapper program. + Copyright (C) 2003, 2005-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +/* Dependencies: + relocwrapper + -> progname + -> progreloc + -> areadlink + -> careadlinkat + -> allocator + -> readlink + -> canonicalize-lgpl + -> malloca + -> readlink + -> relocatable + -> setenv + -> malloca + -> 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(). + */ + +#define _GL_USE_STDLIB_ALLOC 1 +#include + +#include +#include +#include +#include +#include + +#include "progname.h" +#include "relocatable.h" +#include "c-ctype.h" +#include "verify.h" + +/* Use the system functions, not the gnulib overrides in this file. */ +#undef fprintf + +/* 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. */ +verify (sizeof (libdirs) / sizeof (libdirs[0]) > 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 0000000..0fb5b32 --- /dev/null +++ b/gnulib/lib/remove.c @@ -0,0 +1,43 @@ +/* Remove a file or directory. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Eric Blake */ + +#include + +#include + +#include +#include + +#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 0000000..e498f65 --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Volker Borchert, Eric Blake. */ + +#include + +#include + +#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 +# include +# include +# include +# include + +# define WIN32_LEAN_AND_MEAN +# include + +# 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 +# include +# include +# include +# include +# include + +# 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 0000000..bcb5f1e --- /dev/null +++ b/gnulib/lib/renameat.c @@ -0,0 +1,157 @@ +/* Rename a file relative to open directories. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Eric Blake */ + +#include + +#include + +#if HAVE_RENAMEAT + +# include +# include +# include +# include +# include + +# 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/resource-ext.h b/gnulib/lib/resource-ext.h new file mode 100644 index 0000000..145ce25 --- /dev/null +++ b/gnulib/lib/resource-ext.h @@ -0,0 +1,47 @@ +/* Extra functions for resource usage. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef _RESOURCE_EXT_H +#define _RESOURCE_EXT_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +/* Returns the amount of address space currently in use by the current + process, or zero if unknown. + This is the quantity which is limited by setrlimit(RLIMIT_AS,...). + Note: This function always returns zero on AIX. */ +extern uintptr_t get_rusage_as (void); + +/* Returns the size of the data segment, or zero if unknown. + This is the quantity which is limited by setrlimit(RLIMIT_DATA,...). + Note: This function always returns zero on HP-UX 11.00. + Note: The total size of all malloc()ed memory is bounded by the size of + the data segment only on the following platforms: + FreeBSD, AIX, HP-UX 11.23 and newer, IRIX, OSF/1, Solaris, BeOS, Haiku. */ +extern uintptr_t get_rusage_data (void); + + +#ifdef __cplusplus +} +#endif + +#endif /* _RESOURCE_EXT_H */ diff --git a/gnulib/lib/rewinddir.c b/gnulib/lib/rewinddir.c new file mode 100644 index 0000000..bfb9108 --- /dev/null +++ b/gnulib/lib/rewinddir.c @@ -0,0 +1,49 @@ +/* Restart reading the entries of a directory from the beginning. + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include + +#include "dirent-private.h" + +void +rewinddir (DIR *dirp) +{ + /* Like in closedir(). */ + if (dirp->current != INVALID_HANDLE_VALUE) + FindClose (dirp->current); + + /* Like in opendir(). */ + dirp->status = -1; + dirp->current = FindFirstFile (dirp->dir_name_mask, &dirp->entry); + if (dirp->current == INVALID_HANDLE_VALUE) + { + switch (GetLastError ()) + { + case ERROR_FILE_NOT_FOUND: + dirp->status = -2; + break; + default: + /* Save the error code for the next readdir() call. */ + dirp->status = ENOENT; + break; + } + } +} diff --git a/gnulib/lib/rijndael-alg-fst.c b/gnulib/lib/rijndael-alg-fst.c new file mode 100644 index 0000000..a24c80f --- /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-2011 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 + +/** + * rijndael-alg-fst.c + * + * @version 3.0 (December 2000) + * + * Optimised ANSI C code for the Rijndael cipher (now AES) + * + * @author Vincent Rijmen + * @author Antoon Bosselaers + * @author Paulo Barreto + * + * 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 0000000..2cfe1fc --- /dev/null +++ b/gnulib/lib/rijndael-alg-fst.h @@ -0,0 +1,67 @@ +/* rijndael-alg-fst.h --- Rijndael cipher implementation. + * Copyright (C) 2005, 2009-2011 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 + * @author Antoon Bosselaers + * @author Paulo Barreto + * + * 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 +#include + +#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 0000000..3da0d5b --- /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-2011 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 + +/** + * rijndael-api-fst.c + * + * @version 2.9 (December 2000) + * + * Optimised ANSI C code for the Rijndael cipher (now AES) + * + * @author Vincent Rijmen + * @author Antoon Bosselaers + * @author Paulo Barreto + * + * 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 + * Markus Friedl + * John Skodon + */ + +#include "rijndael-alg-fst.h" +#include "rijndael-api-fst.h" + +#include +#include +#include + +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 0000000..f024a4b --- /dev/null +++ b/gnulib/lib/rijndael-api-fst.h @@ -0,0 +1,207 @@ +/* rijndael-api-fst.h --- Rijndael cipher implementation. + * Copyright (C) 2005, 2009-2011 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 + * @author Antoon Bosselaers + * @author Paulo Barreto + * + * 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 + * Markus Friedl + * John Skodon + */ + +#ifndef __RIJNDAEL_API_FST_H +#define __RIJNDAEL_API_FST_H + +#include "rijndael-alg-fst.h" + +#include + +/* 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/rint.c b/gnulib/lib/rint.c new file mode 100644 index 0000000..7eefe7a --- /dev/null +++ b/gnulib/lib/rint.c @@ -0,0 +1,112 @@ +/* Round according to the current rounding mode. + Copyright (C) 2007, 2010-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 ! defined USE_LONG_DOUBLE +# include +#endif + +/* Specification. */ +#include + +#include +#include + +#undef MIN + +#ifdef USE_LONG_DOUBLE +# define RINT rintl +# define DOUBLE long double +# define MANT_DIG LDBL_MANT_DIG +# define MIN LDBL_MIN +# define L_(literal) literal##L +#elif ! defined USE_FLOAT +# define RINT rint +# define DOUBLE double +# define MANT_DIG DBL_MANT_DIG +# define MIN DBL_MIN +# define L_(literal) literal +#else /* defined USE_FLOAT */ +# define RINT rintf +# define DOUBLE float +# define MANT_DIG FLT_MANT_DIG +# define MIN FLT_MIN +# define L_(literal) literal##f +#endif + +/* -0.0. See minus-zero.h. */ +#if defined __hpux || defined __sgi || defined __ICC +# define MINUS_ZERO (-MIN * MIN) +#else +# define MINUS_ZERO L_(-0.0) +#endif + +DOUBLE +RINT (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 z = x; + + /* Consider the current rounding mode, cf. + . + This implementation supports only rounds-to-nearest. */ + if (FLT_ROUNDS != 1) + abort (); + + 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) + { + /* Round to the next integer. */ + z += TWO_MANT_DIG; + z -= TWO_MANT_DIG; + } + } + else if (z < L_(0.0)) + { + /* Avoid rounding error for x = -(0.5 - 2^(-MANT_DIG-1)). */ + if (z > - L_(0.5)) + z = MINUS_ZERO; + /* Avoid rounding errors for values near -2^k, where k >= MANT_DIG-1. */ + else if (z > -TWO_MANT_DIG) + { + /* Round to the next integer. */ + z -= TWO_MANT_DIG; + z += TWO_MANT_DIG; + } + } + return z; +} diff --git a/gnulib/lib/rintf.c b/gnulib/lib/rintf.c new file mode 100644 index 0000000..948b679 --- /dev/null +++ b/gnulib/lib/rintf.c @@ -0,0 +1,19 @@ +/* Round according to the current rounding mode. + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software; you can 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 "rint.c" diff --git a/gnulib/lib/rintl.c b/gnulib/lib/rintl.c new file mode 100644 index 0000000..d26935e --- /dev/null +++ b/gnulib/lib/rintl.c @@ -0,0 +1,36 @@ +/* Round according to the current rounding mode. + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software; you can 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 + +#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE + +/* Specification. */ +# include + +long double +rintl (long double x) +{ + return rint (x); +} + +#else + +# define USE_LONG_DOUBLE +# include "rint.c" + +#endif diff --git a/gnulib/lib/rmdir.c b/gnulib/lib/rmdir.c new file mode 100644 index 0000000..d7395a5 --- /dev/null +++ b/gnulib/lib/rmdir.c @@ -0,0 +1,53 @@ +/* Work around rmdir bugs. + + Copyright (C) 1988, 1990, 1999, 2003-2006, 2009-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#include + +#include +#include + +#include "dosname.h" + +#undef rmdir + +/* Remove directory DIR. + Return 0 if successful, -1 if not. */ + +int +rpl_rmdir (char const *dir) +{ + /* 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; +} diff --git a/gnulib/lib/round.c b/gnulib/lib/round.c new file mode 100644 index 0000000..a6c778e --- /dev/null +++ b/gnulib/lib/round.c @@ -0,0 +1,170 @@ +/* Round toward nearest, breaking ties away from zero. + Copyright (C) 2007, 2010-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 , 2007. + Based heavily on code by Bruno Haible. */ + +#if ! defined USE_LONG_DOUBLE +# include +#endif + +/* Specification. */ +#include + +#include + +#undef MIN + +#ifdef USE_LONG_DOUBLE +# define ROUND roundl +# define FLOOR floorl +# define CEIL ceill +# define DOUBLE long double +# define MANT_DIG LDBL_MANT_DIG +# define MIN LDBL_MIN +# 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 MIN DBL_MIN +# 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 MIN FLT_MIN +# define L_(literal) literal##f +# define HAVE_FLOOR_AND_CEIL HAVE_FLOORF_AND_CEILF +#endif + +/* -0.0. See minus-zero.h. */ +#if defined __hpux || defined __sgi || defined __ICC +# define MINUS_ZERO (-MIN * MIN) +#else +# define MINUS_ZERO L_(-0.0) +#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 = MINUS_ZERO; + /* 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 0000000..a9b9be7 --- /dev/null +++ b/gnulib/lib/roundf.c @@ -0,0 +1,19 @@ +/* Round toward nearest, breaking ties away from zero. + Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 0000000..9cf81db --- /dev/null +++ b/gnulib/lib/roundl.c @@ -0,0 +1,36 @@ +/* Round toward nearest, breaking ties away from zero. + Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 + +#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE + +/* Specification. */ +# include + +long double +roundl (long double x) +{ + return round (x); +} + +#else + +# define USE_LONG_DOUBLE +# include "round.c" + +#endif diff --git a/gnulib/lib/rpmatch.c b/gnulib/lib/rpmatch.c new file mode 100644 index 0000000..ecc7917 --- /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-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include +#include + +#if ENABLE_NLS +# include +# include +# include +# if HAVE_LANGINFO_YESEXPR +# include +# endif +# include +# 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 0000000..482a59a --- /dev/null +++ b/gnulib/lib/safe-alloc.c @@ -0,0 +1,121 @@ +/* safe-alloc.c: safer memory allocation + + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify 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 . */ + +/* Written by Daniel Berrange , 2008 */ + +#include + +/* Specification. */ +#include "safe-alloc.h" + +#include +#include +#include + + +/* 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 0000000..269d1bf --- /dev/null +++ b/gnulib/lib/safe-alloc.h @@ -0,0 +1,121 @@ +/* safe-alloc.h: safer memory allocation + + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify 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 . */ + +/* Written by Daniel Berrange , 2008 */ + +#ifndef SAFE_ALLOC_H_ +# define SAFE_ALLOC_H_ + +# include + +#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 _GL_ATTRIBUTE_RETURN_CHECK +# if __GNUC_PREREQ (3, 4) +# define _GL_ATTRIBUTE_RETURN_CHECK __attribute__((__warn_unused_result__)) +# else +# define _GL_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) + _GL_ATTRIBUTE_RETURN_CHECK; + +int +safe_alloc_realloc_n (void *ptrptr, size_t size, size_t count) + _GL_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 0000000..d9cb330 --- /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-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#ifdef SAFE_WRITE +# include "safe-write.h" +#else +# include "safe-read.h" +#endif + +/* Get ssize_t. */ +#include +#include + +#include + +#ifdef EINTR +# define IS_EINTR(x) ((x) == EINTR) +#else +# define IS_EINTR(x) 0 +#endif + +#include + +#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 + . + 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 0000000..7174de7 --- /dev/null +++ b/gnulib/lib/safe-read.h @@ -0,0 +1,47 @@ +/* An interface to read() that retries after interrupts. + Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Some system calls may be interrupted and fail with errno = EINTR in the + following situations: + - The process is stopped and restarted (signal SIGSTOP and SIGCONT, user + types Ctrl-Z) on some platforms: MacOS X. + - The process receives a signal for which a signal handler was installed + with sigaction() with an sa_flags field that does not contain + SA_RESTART. + - The process receives a signal for which a signal handler was installed + with signal() and for which no call to siginterrupt(sig,0) was done, + on some platforms: AIX, HP-UX, IRIX, OSF/1, Solaris. + + This module provides a wrapper around read() that handles EINTR. */ + +#include + +#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 0000000..94f9e91 --- /dev/null +++ b/gnulib/lib/safe-write.c @@ -0,0 +1,18 @@ +/* An interface to write that retries after interrupts. + Copyright (C) 2002, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#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 0000000..07c84ee --- /dev/null +++ b/gnulib/lib/safe-write.h @@ -0,0 +1,37 @@ +/* An interface to write() that retries after interrupts. + Copyright (C) 2002, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Some system calls may be interrupted and fail with errno = EINTR in the + following situations: + - The process is stopped and restarted (signal SIGSTOP and SIGCONT, user + types Ctrl-Z) on some platforms: MacOS X. + - The process receives a signal for which a signal handler was installed + with sigaction() with an sa_flags field that does not contain + SA_RESTART. + - The process receives a signal for which a signal handler was installed + with signal() and for which no call to siginterrupt(sig,0) was done, + on some platforms: AIX, HP-UX, IRIX, OSF/1, Solaris. + + This module provides a wrapper around write() that handles EINTR. */ + +#include + +#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 0000000..d434b94 --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#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 0000000..3debcbf --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Jim Meyering */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#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 0000000..6206cba --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef SAME_H_ +# define SAME_H_ 1 + +# include + +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 0000000..5f8eb7c --- /dev/null +++ b/gnulib/lib/save-cwd.c @@ -0,0 +1,99 @@ +/* save-cwd.c -- Save and restore current working directory. + + Copyright (C) 1995, 1997-1998, 2003-2006, 2009-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Jim Meyering. */ + +#include + +#include "save-cwd.h" + +#include +#include +#include +#include +#include + +#include "chdir-long.h" +#include "unistd--.h" +#include "cloexec.h" + +#if GNULIB_FCNTL_SAFER +# include "fcntl--.h" +#else +# define GNULIB_FCNTL_SAFER 0 +#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 getcwd) 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. This module works for most cases with just + the getcwd-lgpl module, but to be truly robust, use the getcwd module. + + 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_SEARCH); + if (!GNULIB_FCNTL_SAFER) + cwd->desc = fd_safer (cwd->desc); + if (cwd->desc < 0) + { + cwd->name = getcwd (NULL, 0); + return cwd->name ? 0 : -1; + } + + set_cloexec_flag (cwd->desc, true); + 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 0000000..983f890 --- /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-2011 Free Software Foundation, + Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* 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 0000000..3e8762a --- /dev/null +++ b/gnulib/lib/savedir.c @@ -0,0 +1,145 @@ +/* savedir.c -- save the list of files in a directory in a string + + Copyright (C) 1990, 1997-2001, 2003-2006, 2009-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by David MacKenzie . */ + +#include + +#include "savedir.h" + +#include + +#include + +#include "dirent--.h" +#ifndef _D_EXACT_NAMLEN +# define _D_EXACT_NAMLEN(dp) strlen ((dp)->d_name) +#endif + +#include +#include +#include + +#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. + If DIRP is NULL, return NULL without affecting errno. */ + +char * +streamsavedir (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 (save_errno != 0) + { + free (name_space); + errno = save_errno; + return NULL; + } + return name_space; +} + +/* Like savedirstreamp (DIRP), except also close DIRP. */ + +static char * +savedirstream (DIR *dirp) +{ + char *name_space = streamsavedir (dirp); + if (dirp && closedir (dirp) != 0) + { + int save_errno = errno; + 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. */ + +/* deprecated */ +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 0000000..d935b16 --- /dev/null +++ b/gnulib/lib/savedir.h @@ -0,0 +1,29 @@ +/* Save the list of files in a directory in a string. + + Copyright (C) 1997, 1999, 2001, 2003, 2005, 2009-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by David MacKenzie . */ + +#ifndef _GL_SAVEDIR_H +#define _GL_SAVEDIR_H + +#include +char *streamsavedir (DIR *dirp); +char *savedir (char const *dir); +char *fdsavedir (int fd); /* deprecated */ + +#endif diff --git a/gnulib/lib/savewd.c b/gnulib/lib/savewd.c new file mode 100644 index 0000000..f19e98e --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +#include + +#include "savewd.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "dosname.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_SEARCH); + 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_SEARCH | 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 0000000..96c8c52 --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +#ifndef SAVEWD_H +# define SAVEWD_H 1 + +#include +#include + +/* 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 0000000..824fe17 --- /dev/null +++ b/gnulib/lib/scandir.c @@ -0,0 +1,188 @@ +/* Copyright (C) 1992-1998, 2000, 2002-2003, 2009-2011 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 + +#include + +#include +#include +#include +#if _LIBC +# include +#endif + +#if ! defined __builtin_expect && __GNUC__ < 3 +# define __builtin_expect(expr, expected) (expr) +#endif + +#undef select + +#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 + +#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 0000000..fc2e171 --- /dev/null +++ b/gnulib/lib/sched.in.h @@ -0,0 +1,57 @@ +/* Replacement for platforms that lack it. + Copyright (C) 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef _@GUARD_PREFIX@_SCHED_H + +#if __GNUC__ >= 3 +@PRAGMA_SYSTEM_HEADER@ +#endif +@PRAGMA_COLUMNS@ + +/* The include_next requires a split double-inclusion guard. */ +#if @HAVE_SCHED_H@ +# @INCLUDE_NEXT@ @NEXT_SCHED_H@ +#endif + +#ifndef _@GUARD_PREFIX@_SCHED_H +#define _@GUARD_PREFIX@_SCHED_H + +/* Get pid_t. + This is needed on glibc 2.11 (see + glibc bug ) + and MacOS X 10.5. */ +#include + +#if !@HAVE_STRUCT_SCHED_PARAM@ + +# if !GNULIB_defined_struct_sched_param +struct sched_param +{ + int sched_priority; +}; +# define GNULIB_defined_struct_sched_param 1 +# endif + +#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 /* _@GUARD_PREFIX@_SCHED_H */ +#endif /* _@GUARD_PREFIX@_SCHED_H */ diff --git a/gnulib/lib/se-context.in.h b/gnulib/lib/se-context.in.h new file mode 100644 index 0000000..cb7419a --- /dev/null +++ b/gnulib/lib/se-context.in.h @@ -0,0 +1,28 @@ +#ifndef SELINUX_CONTEXT_H +# define SELINUX_CONTEXT_H + +# include + +/* 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 0000000..aa871f5 --- /dev/null +++ b/gnulib/lib/se-selinux.in.h @@ -0,0 +1,97 @@ +/* Replacement for platforms that lack it. + Copyright (C) 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef _@GUARD_PREFIX@_SELINUX_SELINUX_H +# define _@GUARD_PREFIX@_SELINUX_SELINUX_H + +# if __GNUC__ >= 3 +@PRAGMA_SYSTEM_HEADER@ +# endif +@PRAGMA_COLUMNS@ + +# if HAVE_SELINUX_SELINUX_H + +#@INCLUDE_NEXT@ @NEXT_SELINUX_SELINUX_H@ + +# else + +# include +# include + +/* The definition of _GL_UNUSED_PARAMETER is copied here. */ + +# if !GNULIB_defined_security_types + +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; } + +# define GNULIB_defined_security_types 1 +# endif + +# endif +#endif /* _@GUARD_PREFIX@_SELINUX_SELINUX_H */ diff --git a/gnulib/lib/search.in.h b/gnulib/lib/search.in.h new file mode 100644 index 0000000..332cccc --- /dev/null +++ b/gnulib/lib/search.in.h @@ -0,0 +1,207 @@ +/* A GNU-like . + + Copyright (C) 2007-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef _@GUARD_PREFIX@_SEARCH_H + +#if __GNUC__ >= 3 +@PRAGMA_SYSTEM_HEADER@ +#endif +@PRAGMA_COLUMNS@ + +/* The include_next requires a split double-inclusion guard. */ +#if @HAVE_SEARCH_H@ +# @INCLUDE_NEXT@ @NEXT_SEARCH_H@ +#endif + +#ifndef _@GUARD_PREFIX@_SEARCH_H +#define _@GUARD_PREFIX@_SEARCH_H + + +/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ + +/* The definition of _GL_ARG_NONNULL is copied here. */ + +/* The definition of _GL_WARN_ON_USE is copied here. */ + + +#if @GNULIB_TSEARCH@ +# if @REPLACE_TSEARCH@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define tsearch rpl_tsearch +# define tfind rpl_tfind +# define tdelete rpl_tdelete +# define twalk rpl_twalk +# endif +# endif + +/* See , + + for details. */ + +# if !@HAVE_TSEARCH@ +# if !GNULIB_defined_search_types +typedef enum +{ + preorder, + postorder, + endorder, + leaf +} +VISIT; +# define GNULIB_defined_search_types 1 +# endif +# endif + +# ifdef __cplusplus +extern "C" { +# endif +# if !GNULIB_defined_search_fn_types +typedef int (*_gl_search_compar_fn) (const void *, const void *); +typedef void (*_gl_search_action_fn) (const void *, VISIT, int); +# define GNULIB_defined_search_fn_types 1 +# endif +# ifdef __cplusplus +} +# 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. */ +# if @REPLACE_TSEARCH@ +_GL_FUNCDECL_RPL (tsearch, void *, + (const void *key, void **vrootp, + _gl_search_compar_fn compar) + _GL_ARG_NONNULL ((1, 2, 3))); +_GL_CXXALIAS_RPL (tsearch, void *, + (const void *key, void **vrootp, + _gl_search_compar_fn compar)); +# else +# if !@HAVE_TSEARCH@ +_GL_FUNCDECL_SYS (tsearch, void *, + (const void *key, void **vrootp, + _gl_search_compar_fn compar) + _GL_ARG_NONNULL ((1, 2, 3))); +# endif +_GL_CXXALIAS_SYS (tsearch, void *, + (const void *key, void **vrootp, + _gl_search_compar_fn compar)); +# endif +_GL_CXXALIASWARN (tsearch); + +/* Searches an element in the tree *VROOTP that compares equal to KEY. + If one is found, it is returned. Otherwise, NULL is returned. */ +# if @REPLACE_TSEARCH@ +_GL_FUNCDECL_RPL (tfind, void *, + (const void *key, void *const *vrootp, + _gl_search_compar_fn compar) + _GL_ARG_NONNULL ((1, 2, 3))); +_GL_CXXALIAS_RPL (tfind, void *, + (const void *key, void *const *vrootp, + _gl_search_compar_fn compar)); +# else +# if !@HAVE_TSEARCH@ +_GL_FUNCDECL_SYS (tfind, void *, + (const void *key, void *const *vrootp, + _gl_search_compar_fn compar) + _GL_ARG_NONNULL ((1, 2, 3))); +# endif +/* Need to cast, because on Cygwin 1.5.x systems, the second parameter is + void **vrootp. */ +_GL_CXXALIAS_SYS_CAST (tfind, void *, + (const void *key, void *const *vrootp, + _gl_search_compar_fn compar)); +# endif +_GL_CXXALIASWARN (tfind); + +/* 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. */ +# if @REPLACE_TSEARCH@ +_GL_FUNCDECL_RPL (tdelete, void *, + (const void *key, void **vrootp, + _gl_search_compar_fn compar) + _GL_ARG_NONNULL ((1, 2, 3))); +_GL_CXXALIAS_RPL (tdelete, void *, + (const void *key, void **vrootp, + _gl_search_compar_fn compar)); +# else +# if !@HAVE_TSEARCH@ +_GL_FUNCDECL_SYS (tdelete, void *, + (const void *key, void **vrootp, + _gl_search_compar_fn compar) + _GL_ARG_NONNULL ((1, 2, 3))); +# endif +_GL_CXXALIAS_SYS (tdelete, void *, + (const void *key, void **vrootp, + _gl_search_compar_fn compar)); +# endif +_GL_CXXALIASWARN (tdelete); + +/* 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). */ +# if @REPLACE_TSEARCH@ +_GL_FUNCDECL_RPL (twalk, void, + (const void *vroot, _gl_search_action_fn action) + _GL_ARG_NONNULL ((2))); +_GL_CXXALIAS_RPL (twalk, void, + (const void *vroot, _gl_search_action_fn action)); +# else +# if !@HAVE_TSEARCH@ +_GL_FUNCDECL_SYS (twalk, void, + (const void *vroot, _gl_search_action_fn action) + _GL_ARG_NONNULL ((2))); +# endif +_GL_CXXALIAS_SYS (twalk, void, + (const void *vroot, _gl_search_action_fn action)); +# endif +_GL_CXXALIASWARN (twalk); + +#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 + + +#endif /* _@GUARD_PREFIX@_SEARCH_H */ +#endif /* _@GUARD_PREFIX@_SEARCH_H */ diff --git a/gnulib/lib/select.c b/gnulib/lib/select.c new file mode 100644 index 0000000..aee0ac2 --- /dev/null +++ b/gnulib/lib/select.c @@ -0,0 +1,492 @@ +/* Emulation for select(2) + Contributed by Paolo Bonzini. + + Copyright 2008-2011 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 +#include +#include + +#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ +/* Native Win32. */ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "msvc-nothrow.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 if (GetLastError () == ERROR_BROKEN_PIPE) + ; + + 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 * 1000 + 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 + +#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 0000000..0aa918f --- /dev/null +++ b/gnulib/lib/selinux-at.c @@ -0,0 +1,72 @@ +/* openat-style fd-relative functions for SE Linux + Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Jim Meyering */ + +#include + +#include "selinux-at.h" +#include "openat.h" + +#include +#include +#include +#include + +#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 0000000..5fa3333 --- /dev/null +++ b/gnulib/lib/selinux-at.h @@ -0,0 +1,52 @@ +/* Prototypes for openat-style fd-relative SELinux functions + Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include +#include + +/* 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 0000000..cd21482 --- /dev/null +++ b/gnulib/lib/send.c @@ -0,0 +1,49 @@ +/* send.c --- wrappers for Windows send function + + Copyright (C) 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paolo Bonzini */ + +#include + +#define WIN32_LEAN_AND_MEAN +/* Get winsock2.h. */ +#include + +/* Get set_winsock_errno, FD_TO_SOCKET etc. */ +#include "w32sock.h" + +#undef send + +ssize_t +rpl_send (int fd, const void *buf, size_t len, int flags) +{ + SOCKET sock = FD_TO_SOCKET (fd); + + if (sock == INVALID_SOCKET) + { + errno = EBADF; + return -1; + } + else + { + 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 0000000..95efab8 --- /dev/null +++ b/gnulib/lib/sendto.c @@ -0,0 +1,50 @@ +/* sendto.c --- wrappers for Windows sendto function + + Copyright (C) 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paolo Bonzini */ + +#include + +#define WIN32_LEAN_AND_MEAN +/* Get winsock2.h. */ +#include + +/* Get set_winsock_errno, FD_TO_SOCKET etc. */ +#include "w32sock.h" + +#undef sendto + +ssize_t +rpl_sendto (int fd, const void *buf, size_t len, int flags, + const struct sockaddr *to, socklen_t tolen) +{ + SOCKET sock = FD_TO_SOCKET (fd); + + if (sock == INVALID_SOCKET) + { + errno = EBADF; + return -1; + } + else + { + 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 0000000..d0fc6f8 --- /dev/null +++ b/gnulib/lib/set-mode-acl.c @@ -0,0 +1,684 @@ +/* set-mode-acl.c - set access control list equivalent to a mode + + Copyright (C) 2002-2003, 2005-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Written by Paul Eggert and Andreas Gruenbacher, and Bruno Haible. */ + +#include + +#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 !HAVE_ACL_TYPE_EXTENDED + /* 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_INSIDE_ACL || (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 (name, desc, mode); + } + return 0; + +# else /* 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. 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_FACL && defined GETACLCNT /* Solaris, Cygwin, not HP-UX */ + + int done_setacl = 0; + +# 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 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 & (OLD_ACE_OWNER | OLD_ACE_GROUP | OLD_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[6]; + int count; + int ret; + + if (convention) + { + /* Running on Solaris 10. */ + entries[0].a_type = OLD_ALLOW; + entries[0].a_flags = OLD_ACE_OWNER; + entries[0].a_who = 0; /* irrelevant */ + entries[0].a_access_mask = (mode >> 6) & 7; + entries[1].a_type = OLD_ALLOW; + entries[1].a_flags = OLD_ACE_GROUP; + entries[1].a_who = 0; /* irrelevant */ + entries[1].a_access_mask = (mode >> 3) & 7; + entries[2].a_type = OLD_ALLOW; + entries[2].a_flags = OLD_ACE_OTHER; + entries[2].a_who = 0; + entries[2].a_access_mask = mode & 7; + count = 3; + } + else + { + /* Running on Solaris 10 (newer version) or Solaris 11. + The details here were found through "/bin/ls -lvd somefiles". */ + entries[0].a_type = NEW_ACE_ACCESS_DENIED_ACE_TYPE; + entries[0].a_flags = NEW_ACE_OWNER; + entries[0].a_who = 0; /* irrelevant */ + entries[0].a_access_mask = 0; + entries[1].a_type = NEW_ACE_ACCESS_ALLOWED_ACE_TYPE; + entries[1].a_flags = NEW_ACE_OWNER; + entries[1].a_who = 0; /* irrelevant */ + entries[1].a_access_mask = NEW_ACE_WRITE_NAMED_ATTRS + | NEW_ACE_WRITE_ATTRIBUTES + | NEW_ACE_WRITE_ACL + | NEW_ACE_WRITE_OWNER; + if (mode & 0400) + entries[1].a_access_mask |= NEW_ACE_READ_DATA; + else + entries[0].a_access_mask |= NEW_ACE_READ_DATA; + if (mode & 0200) + entries[1].a_access_mask |= NEW_ACE_WRITE_DATA | NEW_ACE_APPEND_DATA; + else + entries[0].a_access_mask |= NEW_ACE_WRITE_DATA | NEW_ACE_APPEND_DATA; + if (mode & 0100) + entries[1].a_access_mask |= NEW_ACE_EXECUTE; + else + entries[0].a_access_mask |= NEW_ACE_EXECUTE; + entries[2].a_type = NEW_ACE_ACCESS_DENIED_ACE_TYPE; + entries[2].a_flags = NEW_ACE_GROUP | NEW_ACE_IDENTIFIER_GROUP; + entries[2].a_who = 0; /* irrelevant */ + entries[2].a_access_mask = 0; + entries[3].a_type = NEW_ACE_ACCESS_ALLOWED_ACE_TYPE; + entries[3].a_flags = NEW_ACE_GROUP | NEW_ACE_IDENTIFIER_GROUP; + entries[3].a_who = 0; /* irrelevant */ + entries[3].a_access_mask = 0; + if (mode & 0040) + entries[3].a_access_mask |= NEW_ACE_READ_DATA; + else + entries[2].a_access_mask |= NEW_ACE_READ_DATA; + if (mode & 0020) + entries[3].a_access_mask |= NEW_ACE_WRITE_DATA | NEW_ACE_APPEND_DATA; + else + entries[2].a_access_mask |= NEW_ACE_WRITE_DATA | NEW_ACE_APPEND_DATA; + if (mode & 0010) + entries[3].a_access_mask |= NEW_ACE_EXECUTE; + else + entries[2].a_access_mask |= NEW_ACE_EXECUTE; + entries[4].a_type = NEW_ACE_ACCESS_DENIED_ACE_TYPE; + entries[4].a_flags = NEW_ACE_EVERYONE; + entries[4].a_who = 0; + entries[4].a_access_mask = NEW_ACE_WRITE_NAMED_ATTRS + | NEW_ACE_WRITE_ATTRIBUTES + | NEW_ACE_WRITE_ACL + | NEW_ACE_WRITE_OWNER; + entries[5].a_type = NEW_ACE_ACCESS_ALLOWED_ACE_TYPE; + entries[5].a_flags = NEW_ACE_EVERYONE; + entries[5].a_who = 0; + entries[5].a_access_mask = NEW_ACE_READ_NAMED_ATTRS + | NEW_ACE_READ_ATTRIBUTES + | NEW_ACE_READ_ACL + | NEW_ACE_SYNCHRONIZE; + if (mode & 0004) + entries[5].a_access_mask |= NEW_ACE_READ_DATA; + else + entries[4].a_access_mask |= NEW_ACE_READ_DATA; + if (mode & 0002) + entries[5].a_access_mask |= NEW_ACE_WRITE_DATA | NEW_ACE_APPEND_DATA; + else + entries[4].a_access_mask |= NEW_ACE_WRITE_DATA | NEW_ACE_APPEND_DATA; + if (mode & 0001) + entries[5].a_access_mask |= NEW_ACE_EXECUTE; + else + entries[4].a_access_mask |= NEW_ACE_EXECUTE; + count = 6; + } + if (desc != -1) + ret = facl (desc, ACE_SETACL, count, entries); + else + ret = acl (name, ACE_SETACL, count, entries); + if (ret < 0 && errno != EINVAL && errno != ENOTSUP) + { + if (errno == ENOSYS) + return chmod_or_fchmod (name, desc, mode); + return -1; + } + if (ret == 0) + done_setacl = 1; + } +# endif + + if (!done_setacl) + { + 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 || errno == EOPNOTSUPP) + 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; + +# elif HAVE_GETACL /* HP-UX */ + + struct stat statbuf; + int ret; + + if (desc != -1) + ret = fstat (desc, &statbuf); + else + ret = stat (name, &statbuf); + if (ret < 0) + return -1; + + { + struct acl_entry entries[3]; + + 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 || errno == ENOTSUP)) + return -1; + +# if HAVE_ACLV_H /* HP-UX >= 11.11 */ + { + struct acl entries[4]; + + 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 = CLASS_OBJ; + entries[2].a_id = 0; + entries[2].a_perm = (mode >> 3) & 7; + entries[3].a_type = OTHER_OBJ; + entries[3].a_id = 0; + entries[3].a_perm = mode & 7; + + ret = aclsort (sizeof (entries) / sizeof (struct acl), 1, entries); + if (ret > 0) + abort (); + if (ret < 0) + { + if (0) + return chmod_or_fchmod (name, desc, mode); + return -1; + } + + ret = acl ((char *) name, ACL_SET, + sizeof (entries) / sizeof (struct acl), entries); + if (ret < 0) + { + if (errno == ENOSYS || errno == EOPNOTSUPP || errno == EINVAL) + return chmod_or_fchmod (name, desc, mode); + return -1; + } + } +# else + return chmod_or_fchmod (name, desc, mode); +# endif + } + + 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; + +# elif HAVE_ACLSORT /* NonStop Kernel */ + + struct acl entries[4]; + 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 = CLASS_OBJ; + entries[2].a_id = 0; + entries[2].a_perm = (mode >> 3) & 7; + entries[3].a_type = OTHER_OBJ; + entries[3].a_id = 0; + entries[3].a_perm = mode & 7; + + ret = aclsort (sizeof (entries) / sizeof (struct acl), 1, entries); + if (ret > 0) + abort (); + if (ret < 0) + { + if (0) + return chmod_or_fchmod (name, desc, mode); + return -1; + } + + ret = acl ((char *) name, ACL_SET, + sizeof (entries) / sizeof (struct acl), entries); + if (ret < 0) + { + if (0) + 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; + +# 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 0000000..0a5f67d --- /dev/null +++ b/gnulib/lib/setenv.c @@ -0,0 +1,390 @@ +/* Copyright (C) 1992, 1995-2003, 2005-2011 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 . */ + +#if !_LIBC +# define _GL_USE_STDLIB_ALLOC 1 +# include +#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 + +/* Specification. */ +#include + +#include +#ifndef __set_errno +# define __set_errno(ev) ((errno) = (ev)) +#endif + +#include +#if _LIBC || HAVE_UNISTD_H +# include +#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 +__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 +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) +{ + char **ep; + 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) + { + /* It's easier to set errno to ENOMEM than to rely on the + 'malloc-posix' and 'realloc-posix' gnulib modules. */ + __set_errno (ENOMEM); + 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 = (char *) 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 +# if !HAVE_DECL_SETENV +extern int setenv (const char *, const char *, int); +# endif +# 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/sethostname.c b/gnulib/lib/sethostname.c new file mode 100644 index 0000000..6555921 --- /dev/null +++ b/gnulib/lib/sethostname.c @@ -0,0 +1,162 @@ +/* sethostname emulation for glibc compliance. + + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Ben Walton */ + +#include + +#if !((defined _WIN32 || defined __WIN32__) || defined __CYGWIN__) +/* Unix API. */ + +/* Specification. */ +#include + +#include +#include +#include + +/* Set up to LEN chars of NAME as system hostname. + Return 0 if ok, set errno and return -1 on error. */ + +int +sethostname (const char *name, size_t len) +{ + /* Ensure the string isn't too long. glibc does allow setting an + empty hostname so no point in enforcing a lower bound. */ + if (len > HOST_NAME_MAX) + { + errno = EINVAL; + return -1; + } + +#ifdef __minix /* Minix */ + { + FILE *hostf; + int r = 0; + + /* glibc returns EFAULT, EINVAL, and EPERM on error. None of + these are appropriate for us to set, even if they may match the + situation, during failed open/write/close operations, so we + leave errno alone and rely on what the system sets up. */ + hostf = fopen ("/etc/hostname.file", "w"); + if (hostf == NULL) + r = -1; + else + { + fprintf (hostf, "%.*s\n", (int) len, name); + if (ferror (hostf)) + { + /* Close hostf, preserving the errno from the fprintf call. */ + int saved_errno = errno; + fclose (hostf); + errno = saved_errno; + r = -1; + } + else + { + if (fclose (hostf)) + /* fclose sets errno on failure. */ + r = -1; + } + } + + return r; + } +#else + /* For platforms that we don't have a better option for, simply bail + out. */ + errno = ENOSYS; + return -1; +#endif +} + +#else +/* Native Windows API. Also used on Cygwin. */ + +/* Ensure that declares SetComputerNameEx. */ +#undef _WIN32_WINNT +#define _WIN32_WINNT 0x500 + +#define WIN32_LEAN_AND_MEAN + +/* Specification. */ +#include + +#include +#include +#include + +#include +/* The mingw header files don't define GetComputerNameEx, SetComputerNameEx. */ +#ifndef GetComputerNameEx +# define GetComputerNameEx GetComputerNameExA +#endif +#ifndef SetComputerNameEx +# define SetComputerNameEx SetComputerNameExA +#endif + +/* Set up to LEN chars of NAME as system hostname. + Return 0 if ok, set errno and return -1 on error. */ + +int +sethostname (const char *name, size_t len) +{ + char name_asciz[HOST_NAME_MAX + 1]; + char old_name[HOST_NAME_MAX + 1]; + DWORD old_name_len; + + /* Ensure the string isn't too long. glibc does allow setting an + empty hostname so no point in enforcing a lower bound. */ + if (len > HOST_NAME_MAX) + { + errno = EINVAL; + return -1; + } + + /* Prepare a NUL-terminated copy of name. */ + memcpy (name_asciz, name, len); + name_asciz[len] = '\0'; + + /* Save the old NetBIOS name. */ + old_name_len = sizeof (old_name) - 1; + if (! GetComputerNameEx (ComputerNamePhysicalNetBIOS, + old_name, &old_name_len)) + old_name_len = 0; + + /* Set both the NetBIOS and the first part of the IP / DNS name. */ + if (! SetComputerNameEx (ComputerNamePhysicalNetBIOS, name_asciz)) + { + errno = (GetLastError () == ERROR_ACCESS_DENIED ? EPERM : EINVAL); + return -1; + } + if (! SetComputerNameEx (ComputerNamePhysicalDnsHostname, name_asciz)) + { + errno = (GetLastError () == ERROR_ACCESS_DENIED ? EPERM : EINVAL); + /* Restore the old NetBIOS name. */ + if (old_name_len > 0) + { + old_name[old_name_len] = '\0'; + SetComputerNameEx (ComputerNamePhysicalNetBIOS, old_name); + } + return -1; + } + + /* Note that the new host name becomes effective only after a reboot! */ + return 0; +} + +#endif diff --git a/gnulib/lib/setlocale.c b/gnulib/lib/setlocale.c new file mode 100644 index 0000000..0cef00f --- /dev/null +++ b/gnulib/lib/setlocale.c @@ -0,0 +1,938 @@ +/* Set the current locale. + Copyright (C) 2009, 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible , 2009. */ + +#include + +/* Override setlocale() so that when the default locale is requested + (locale = ""), the environment variables LC_ALL, LC_*, and LANG are + considered. + Also include all the functionality from libintl's setlocale() override. */ + +/* Please keep this file in sync with + gettext/gettext-runtime/intl/setlocale.c ! */ + +/* Specification. */ +#include + +#include +#include + +#include "localename.h" + +#if 1 + +# undef setlocale + +/* Return string representation of locale category CATEGORY. */ +static const char * +category_to_name (int category) +{ + const char *retval; + + switch (category) + { + case LC_COLLATE: + retval = "LC_COLLATE"; + break; + case LC_CTYPE: + retval = "LC_CTYPE"; + break; + case LC_MONETARY: + retval = "LC_MONETARY"; + break; + case LC_NUMERIC: + retval = "LC_NUMERIC"; + break; + case LC_TIME: + retval = "LC_TIME"; + break; + case LC_MESSAGES: + retval = "LC_MESSAGES"; + break; + default: + /* If you have a better idea for a default value let me know. */ + retval = "LC_XXX"; + } + + return retval; +} + +# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ + +/* The native Win32 setlocale() function expects locale names of the form + "German" or "German_Germany" or "DEU", but not "de" or "de_DE". We need + to convert the names from the form with ISO 639 language code and ISO 3166 + country code to the form with English names or with three-letter identifier. + The three-letter identifiers known by a Windows XP SP2 or SP3 are: + AFK Afrikaans_South Africa.1252 + ARA Arabic_Saudi Arabia.1256 + ARB Arabic_Lebanon.1256 + ARE Arabic_Egypt.1256 + ARG Arabic_Algeria.1256 + ARH Arabic_Bahrain.1256 + ARI Arabic_Iraq.1256 + ARJ Arabic_Jordan.1256 + ARK Arabic_Kuwait.1256 + ARL Arabic_Libya.1256 + ARM Arabic_Morocco.1256 + ARO Arabic_Oman.1256 + ARQ Arabic_Qatar.1256 + ARS Arabic_Syria.1256 + ART Arabic_Tunisia.1256 + ARU Arabic_U.A.E..1256 + ARY Arabic_Yemen.1256 + AZE Azeri (Latin)_Azerbaijan.1254 + BEL Belarusian_Belarus.1251 + BGR Bulgarian_Bulgaria.1251 + BSB Bosnian_Bosnia and Herzegovina.1250 + BSC Bosnian (Cyrillic)_Bosnia and Herzegovina.1250 (wrong encoding!) + CAT Catalan_Spain.1252 + CHH Chinese_Hong Kong S.A.R..950 + CHI Chinese_Singapore.936 + CHS Chinese_People's Republic of China.936 + CHT Chinese_Taiwan.950 + CSY Czech_Czech Republic.1250 + CYM Welsh_United Kingdom.1252 + DAN Danish_Denmark.1252 + DEA German_Austria.1252 + DEC German_Liechtenstein.1252 + DEL German_Luxembourg.1252 + DES German_Switzerland.1252 + DEU German_Germany.1252 + ELL Greek_Greece.1253 + ENA English_Australia.1252 + ENB English_Caribbean.1252 + ENC English_Canada.1252 + ENG English_United Kingdom.1252 + ENI English_Ireland.1252 + ENJ English_Jamaica.1252 + ENL English_Belize.1252 + ENP English_Republic of the Philippines.1252 + ENS English_South Africa.1252 + ENT English_Trinidad and Tobago.1252 + ENU English_United States.1252 + ENW English_Zimbabwe.1252 + ENZ English_New Zealand.1252 + ESA Spanish_Panama.1252 + ESB Spanish_Bolivia.1252 + ESC Spanish_Costa Rica.1252 + ESD Spanish_Dominican Republic.1252 + ESE Spanish_El Salvador.1252 + ESF Spanish_Ecuador.1252 + ESG Spanish_Guatemala.1252 + ESH Spanish_Honduras.1252 + ESI Spanish_Nicaragua.1252 + ESL Spanish_Chile.1252 + ESM Spanish_Mexico.1252 + ESN Spanish_Spain.1252 + ESO Spanish_Colombia.1252 + ESP Spanish_Spain.1252 + ESR Spanish_Peru.1252 + ESS Spanish_Argentina.1252 + ESU Spanish_Puerto Rico.1252 + ESV Spanish_Venezuela.1252 + ESY Spanish_Uruguay.1252 + ESZ Spanish_Paraguay.1252 + ETI Estonian_Estonia.1257 + EUQ Basque_Spain.1252 + FAR Farsi_Iran.1256 + FIN Finnish_Finland.1252 + FOS Faroese_Faroe Islands.1252 + FPO Filipino_Philippines.1252 + FRA French_France.1252 + FRB French_Belgium.1252 + FRC French_Canada.1252 + FRL French_Luxembourg.1252 + FRM French_Principality of Monaco.1252 + FRS French_Switzerland.1252 + FYN Frisian_Netherlands.1252 + GLC Galician_Spain.1252 + HEB Hebrew_Israel.1255 + HRB Croatian_Bosnia and Herzegovina.1250 + HRV Croatian_Croatia.1250 + HUN Hungarian_Hungary.1250 + IND Indonesian_Indonesia.1252 + IRE Irish_Ireland.1252 + ISL Icelandic_Iceland.1252 + ITA Italian_Italy.1252 + ITS Italian_Switzerland.1252 + IUK Inuktitut (Latin)_Canada.1252 + JPN Japanese_Japan.932 + KKZ Kazakh_Kazakhstan.1251 + KOR Korean_Korea.949 + KYR Kyrgyz_Kyrgyzstan.1251 + LBX Luxembourgish_Luxembourg.1252 + LTH Lithuanian_Lithuania.1257 + LVI Latvian_Latvia.1257 + MKI FYRO Macedonian_Former Yugoslav Republic of Macedonia.1251 + MON Mongolian_Mongolia.1251 + MPD Mapudungun_Chile.1252 + MSB Malay_Brunei Darussalam.1252 + MSL Malay_Malaysia.1252 + MWK Mohawk_Canada.1252 + NLB Dutch_Belgium.1252 + NLD Dutch_Netherlands.1252 + NON Norwegian-Nynorsk_Norway.1252 + NOR Norwegian (Bokmål)_Norway.1252 + NSO Northern Sotho_South Africa.1252 + PLK Polish_Poland.1250 + PTB Portuguese_Brazil.1252 + PTG Portuguese_Portugal.1252 + QUB Quechua_Bolivia.1252 + QUE Quechua_Ecuador.1252 + QUP Quechua_Peru.1252 + RMC Romansh_Switzerland.1252 + ROM Romanian_Romania.1250 + RUS Russian_Russia.1251 + SKY Slovak_Slovakia.1250 + SLV Slovenian_Slovenia.1250 + SMA Sami (Southern)_Norway.1252 + SMB Sami (Southern)_Sweden.1252 + SME Sami (Northern)_Norway.1252 + SMF Sami (Northern)_Sweden.1252 + SMG Sami (Northern)_Finland.1252 + SMJ Sami (Lule)_Norway.1252 + SMK Sami (Lule)_Sweden.1252 + SMN Sami (Inari)_Finland.1252 + SMS Sami (Skolt)_Finland.1252 + SQI Albanian_Albania.1250 + SRB Serbian (Cyrillic)_Serbia and Montenegro.1251 + SRL Serbian (Latin)_Serbia and Montenegro.1250 + SRN Serbian (Cyrillic)_Bosnia and Herzegovina.1251 + SRS Serbian (Latin)_Bosnia and Herzegovina.1250 + SVE Swedish_Sweden.1252 + SVF Swedish_Finland.1252 + SWK Swahili_Kenya.1252 + THA Thai_Thailand.874 + TRK Turkish_Turkey.1254 + TSN Tswana_South Africa.1252 + TTT Tatar_Russia.1251 + UKR Ukrainian_Ukraine.1251 + URD Urdu_Islamic Republic of Pakistan.1256 + USA English_United States.1252 + UZB Uzbek (Latin)_Uzbekistan.1254 + VIT Vietnamese_Viet Nam.1258 + XHO Xhosa_South Africa.1252 + ZHH Chinese_Hong Kong S.A.R..950 + ZHI Chinese_Singapore.936 + ZHM Chinese_Macau S.A.R..950 + ZUL Zulu_South Africa.1252 + */ + +/* Table from ISO 639 language code, optionally with country or script suffix, + to English name. + Keep in sync with the gl_locale_name_from_win32_LANGID function in + localename.c! */ +struct table_entry +{ + const char *code; + const char *english; +}; +static const struct table_entry language_table[] = + { + { "af", "Afrikaans" }, + { "am", "Amharic" }, + { "ar", "Arabic" }, + { "arn", "Mapudungun" }, + { "as", "Assamese" }, + { "az@cyrillic", "Azeri (Cyrillic)" }, + { "az@latin", "Azeri (Latin)" }, + { "ba", "Bashkir" }, + { "be", "Belarusian" }, + { "ber", "Tamazight" }, + { "ber@arabic", "Tamazight (Arabic)" }, + { "ber@latin", "Tamazight (Latin)" }, + { "bg", "Bulgarian" }, + { "bin", "Edo" }, + { "bn", "Bengali" }, + { "bn_BD", "Bengali (Bangladesh)" }, + { "bn_IN", "Bengali (India)" }, + { "bnt", "Sutu" }, + { "bo", "Tibetan" }, + { "br", "Breton" }, + { "bs", "BSB" }, /* "Bosnian (Latin)" */ + { "bs@cyrillic", "BSC" }, /* Bosnian (Cyrillic) */ + { "ca", "Catalan" }, + { "chr", "Cherokee" }, + { "co", "Corsican" }, + { "cpe", "Hawaiian" }, + { "cs", "Czech" }, + { "cy", "Welsh" }, + { "da", "Danish" }, + { "de", "German" }, + { "dsb", "Lower Sorbian" }, + { "dv", "Divehi" }, + { "el", "Greek" }, + { "en", "English" }, + { "es", "Spanish" }, + { "et", "Estonian" }, + { "eu", "Basque" }, + { "fa", "Farsi" }, + { "ff", "Fulfulde" }, + { "fi", "Finnish" }, + { "fo", "Faroese" }, /* "Faeroese" does not work */ + { "fr", "French" }, + { "fy", "Frisian" }, + { "ga", "IRE" }, /* Gaelic (Ireland) */ + { "gd", "Gaelic (Scotland)" }, + { "gd", "Scottish Gaelic" }, + { "gl", "Galician" }, + { "gn", "Guarani" }, + { "gsw", "Alsatian" }, + { "gu", "Gujarati" }, + { "ha", "Hausa" }, + { "he", "Hebrew" }, + { "hi", "Hindi" }, + { "hr", "Croatian" }, + { "hsb", "Upper Sorbian" }, + { "hu", "Hungarian" }, + { "hy", "Armenian" }, + { "id", "Indonesian" }, + { "ig", "Igbo" }, + { "ii", "Yi" }, + { "is", "Icelandic" }, + { "it", "Italian" }, + { "iu", "IUK" }, /* Inuktitut */ + { "ja", "Japanese" }, + { "ka", "Georgian" }, + { "kk", "Kazakh" }, + { "kl", "Greenlandic" }, + { "km", "Cambodian" }, + { "km", "Khmer" }, + { "kn", "Kannada" }, + { "ko", "Korean" }, + { "kok", "Konkani" }, + { "kr", "Kanuri" }, + { "ks", "Kashmiri" }, + { "ks_IN", "Kashmiri_India" }, + { "ks_PK", "Kashmiri (Arabic)_Pakistan" }, + { "ky", "Kyrgyz" }, + { "la", "Latin" }, + { "lb", "Luxembourgish" }, + { "lo", "Lao" }, + { "lt", "Lithuanian" }, + { "lv", "Latvian" }, + { "mi", "Maori" }, + { "mk", "FYRO Macedonian" }, + { "mk", "Macedonian" }, + { "ml", "Malayalam" }, + { "mn", "Mongolian" }, + { "mni", "Manipuri" }, + { "moh", "Mohawk" }, + { "mr", "Marathi" }, + { "ms", "Malay" }, + { "mt", "Maltese" }, + { "my", "Burmese" }, + { "nb", "NOR" }, /* Norwegian Bokmål */ + { "ne", "Nepali" }, + { "nic", "Ibibio" }, + { "nl", "Dutch" }, + { "nn", "NON" }, /* Norwegian Nynorsk */ + { "no", "Norwegian" }, + { "nso", "Northern Sotho" }, + { "nso", "Sepedi" }, + { "oc", "Occitan" }, + { "om", "Oromo" }, + { "or", "Oriya" }, + { "pa", "Punjabi" }, + { "pap", "Papiamentu" }, + { "pl", "Polish" }, + { "prs", "Dari" }, + { "ps", "Pashto" }, + { "pt", "Portuguese" }, + { "qu", "Quechua" }, + { "qut", "K'iche'" }, + { "rm", "Romansh" }, + { "ro", "Romanian" }, + { "ru", "Russian" }, + { "rw", "Kinyarwanda" }, + { "sa", "Sanskrit" }, + { "sah", "Yakut" }, + { "sd", "Sindhi" }, + { "se", "Sami (Northern)" }, + { "se", "Northern Sami" }, + { "si", "Sinhalese" }, + { "sk", "Slovak" }, + { "sl", "Slovenian" }, + { "sma", "Sami (Southern)" }, + { "sma", "Southern Sami" }, + { "smj", "Sami (Lule)" }, + { "smj", "Lule Sami" }, + { "smn", "Sami (Inari)" }, + { "smn", "Inari Sami" }, + { "sms", "Sami (Skolt)" }, + { "sms", "Skolt Sami" }, + { "so", "Somali" }, + { "sq", "Albanian" }, + { "sr", "Serbian (Latin)" }, + { "sr@cyrillic", "SRB" }, /* Serbian (Cyrillic) */ + { "sw", "Swahili" }, + { "syr", "Syriac" }, + { "ta", "Tamil" }, + { "te", "Telugu" }, + { "tg", "Tajik" }, + { "th", "Thai" }, + { "ti", "Tigrinya" }, + { "tk", "Turkmen" }, + { "tl", "Filipino" }, + { "tn", "Tswana" }, + { "tr", "Turkish" }, + { "ts", "Tsonga" }, + { "tt", "Tatar" }, + { "ug", "Uighur" }, + { "uk", "Ukrainian" }, + { "ur", "Urdu" }, + { "uz", "Uzbek" }, + { "uz", "Uzbek (Latin)" }, + { "uz@cyrillic", "Uzbek (Cyrillic)" }, + { "ve", "Venda" }, + { "vi", "Vietnamese" }, + { "wen", "Sorbian" }, + { "wo", "Wolof" }, + { "xh", "Xhosa" }, + { "yi", "Yiddish" }, + { "yo", "Yoruba" }, + { "zh", "Chinese" }, + { "zu", "Zulu" } + }; + +/* Table from ISO 3166 country code to English name. + Keep in sync with the gl_locale_name_from_win32_LANGID function in + localename.c! */ +static const struct table_entry country_table[] = + { + { "AE", "U.A.E." }, + { "AF", "Afghanistan" }, + { "AL", "Albania" }, + { "AM", "Armenia" }, + { "AN", "Netherlands Antilles" }, + { "AR", "Argentina" }, + { "AT", "Austria" }, + { "AU", "Australia" }, + { "AZ", "Azerbaijan" }, + { "BA", "Bosnia and Herzegovina" }, + { "BD", "Bangladesh" }, + { "BE", "Belgium" }, + { "BG", "Bulgaria" }, + { "BH", "Bahrain" }, + { "BN", "Brunei Darussalam" }, + { "BO", "Bolivia" }, + { "BR", "Brazil" }, + { "BT", "Bhutan" }, + { "BY", "Belarus" }, + { "BZ", "Belize" }, + { "CA", "Canada" }, + { "CG", "Congo" }, + { "CH", "Switzerland" }, + { "CI", "Cote d'Ivoire" }, + { "CL", "Chile" }, + { "CM", "Cameroon" }, + { "CN", "People's Republic of China" }, + { "CO", "Colombia" }, + { "CR", "Costa Rica" }, + { "CS", "Serbia and Montenegro" }, + { "CZ", "Czech Republic" }, + { "DE", "Germany" }, + { "DK", "Denmark" }, + { "DO", "Dominican Republic" }, + { "DZ", "Algeria" }, + { "EC", "Ecuador" }, + { "EE", "Estonia" }, + { "EG", "Egypt" }, + { "ER", "Eritrea" }, + { "ES", "Spain" }, + { "ET", "Ethiopia" }, + { "FI", "Finland" }, + { "FO", "Faroe Islands" }, + { "FR", "France" }, + { "GB", "United Kingdom" }, + { "GD", "Caribbean" }, + { "GE", "Georgia" }, + { "GL", "Greenland" }, + { "GR", "Greece" }, + { "GT", "Guatemala" }, + { "HK", "Hong Kong" }, + { "HK", "Hong Kong S.A.R." }, + { "HN", "Honduras" }, + { "HR", "Croatia" }, + { "HT", "Haiti" }, + { "HU", "Hungary" }, + { "ID", "Indonesia" }, + { "IE", "Ireland" }, + { "IL", "Israel" }, + { "IN", "India" }, + { "IQ", "Iraq" }, + { "IR", "Iran" }, + { "IS", "Iceland" }, + { "IT", "Italy" }, + { "JM", "Jamaica" }, + { "JO", "Jordan" }, + { "JP", "Japan" }, + { "KE", "Kenya" }, + { "KG", "Kyrgyzstan" }, + { "KH", "Cambodia" }, + { "KR", "South Korea" }, + { "KW", "Kuwait" }, + { "KZ", "Kazakhstan" }, + { "LA", "Laos" }, + { "LB", "Lebanon" }, + { "LI", "Liechtenstein" }, + { "LK", "Sri Lanka" }, + { "LT", "Lithuania" }, + { "LU", "Luxembourg" }, + { "LV", "Latvia" }, + { "LY", "Libya" }, + { "MA", "Morocco" }, + { "MC", "Principality of Monaco" }, + { "MD", "Moldava" }, + { "MD", "Moldova" }, + { "ME", "Montenegro" }, + { "MK", "Former Yugoslav Republic of Macedonia" }, + { "ML", "Mali" }, + { "MM", "Myanmar" }, + { "MN", "Mongolia" }, + { "MO", "Macau S.A.R." }, + { "MT", "Malta" }, + { "MV", "Maldives" }, + { "MX", "Mexico" }, + { "MY", "Malaysia" }, + { "NG", "Nigeria" }, + { "NI", "Nicaragua" }, + { "NL", "Netherlands" }, + { "NO", "Norway" }, + { "NP", "Nepal" }, + { "NZ", "New Zealand" }, + { "OM", "Oman" }, + { "PA", "Panama" }, + { "PE", "Peru" }, + { "PH", "Philippines" }, + { "PK", "Islamic Republic of Pakistan" }, + { "PL", "Poland" }, + { "PR", "Puerto Rico" }, + { "PT", "Portugal" }, + { "PY", "Paraguay" }, + { "QA", "Qatar" }, + { "RE", "Reunion" }, + { "RO", "Romania" }, + { "RS", "Serbia" }, + { "RU", "Russia" }, + { "RW", "Rwanda" }, + { "SA", "Saudi Arabia" }, + { "SE", "Sweden" }, + { "SG", "Singapore" }, + { "SI", "Slovenia" }, + { "SK", "Slovak" }, + { "SN", "Senegal" }, + { "SO", "Somalia" }, + { "SR", "Suriname" }, + { "SV", "El Salvador" }, + { "SY", "Syria" }, + { "TH", "Thailand" }, + { "TJ", "Tajikistan" }, + { "TM", "Turkmenistan" }, + { "TN", "Tunisia" }, + { "TR", "Turkey" }, + { "TT", "Trinidad and Tobago" }, + { "TW", "Taiwan" }, + { "TZ", "Tanzania" }, + { "UA", "Ukraine" }, + { "US", "United States" }, + { "UY", "Uruguay" }, + { "VA", "Vatican" }, + { "VE", "Venezuela" }, + { "VN", "Viet Nam" }, + { "YE", "Yemen" }, + { "ZA", "South Africa" }, + { "ZW", "Zimbabwe" } + }; + +/* Given a string STRING, find the set of indices i such that TABLE[i].code is + the given STRING. It is a range [lo,hi-1]. */ +typedef struct { size_t lo; size_t hi; } range_t; +static void +search (const struct table_entry *table, size_t table_size, const char *string, + range_t *result) +{ + /* The table is sorted. Perform a binary search. */ + size_t hi = table_size; + size_t lo = 0; + while (lo < hi) + { + /* Invariant: + for i < lo, strcmp (table[i].code, string) < 0, + for i >= hi, strcmp (table[i].code, string) > 0. */ + size_t mid = (hi + lo) >> 1; /* >= lo, < hi */ + int cmp = strcmp (table[mid].code, string); + if (cmp < 0) + lo = mid + 1; + else if (cmp > 0) + hi = mid; + else + { + /* Found an i with + strcmp (language_table[i].code, string) == 0. + Find the entire interval of such i. */ + { + size_t i; + + for (i = mid; i > lo; ) + { + i--; + if (strcmp (table[i].code, string) < 0) + { + lo = i + 1; + break; + } + } + } + { + size_t i; + + for (i = mid; i < hi; i++) + { + if (strcmp (table[i].code, string) > 0) + { + hi = i; + break; + } + } + } + /* The set of i with + strcmp (language_table[i].code, string) == 0 + is the interval [lo, hi-1]. */ + break; + } + } + result->lo = lo; + result->hi = hi; +} + +/* Like setlocale, but accept also locale names in the form ll or ll_CC, + where ll is an ISO 639 language code and CC is an ISO 3166 country code. */ +static char * +setlocale_unixlike (int category, const char *locale) +{ + char *result; + char llCC_buf[64]; + char ll_buf[64]; + char CC_buf[64]; + + /* First, try setlocale with the original argument unchanged. */ + result = setlocale (category, locale); + if (result != NULL) + return result; + + /* Otherwise, assume the argument is in the form + language[_territory][.codeset][@modifier] + and try to map it using the tables. */ + if (strlen (locale) < sizeof (llCC_buf)) + { + /* Second try: Remove the codeset part. */ + { + const char *p = locale; + char *q = llCC_buf; + + /* Copy the part before the dot. */ + for (; *p != '\0' && *p != '.'; p++, q++) + *q = *p; + if (*p == '.') + /* Skip the part up to the '@', if any. */ + for (; *p != '\0' && *p != '@'; p++) + ; + /* Copy the part starting with '@', if any. */ + for (; *p != '\0'; p++, q++) + *q = *p; + *q = '\0'; + } + /* llCC_buf now contains + language[_territory][@modifier] + */ + if (strcmp (llCC_buf, locale) != 0) + { + result = setlocale (category, llCC_buf); + if (result != NULL) + return result; + } + /* Look it up in language_table. */ + { + range_t range; + size_t i; + + search (language_table, + sizeof (language_table) / sizeof (language_table[0]), + llCC_buf, + &range); + + for (i = range.lo; i < range.hi; i++) + { + /* Try the replacement in language_table[i]. */ + result = setlocale (category, language_table[i].english); + if (result != NULL) + return result; + } + } + /* Split language[_territory][@modifier] + into ll_buf = language[@modifier] + and CC_buf = territory + */ + { + const char *underscore = strchr (llCC_buf, '_'); + if (underscore != NULL) + { + const char *territory_start = underscore + 1; + const char *territory_end = strchr (territory_start, '@'); + if (territory_end == NULL) + territory_end = territory_start + strlen (territory_start); + + memcpy (ll_buf, llCC_buf, underscore - llCC_buf); + strcpy (ll_buf + (underscore - llCC_buf), territory_end); + + memcpy (CC_buf, territory_start, territory_end - territory_start); + CC_buf[territory_end - territory_start] = '\0'; + + { + /* Look up ll_buf in language_table + and CC_buf in country_table. */ + range_t language_range; + + search (language_table, + sizeof (language_table) / sizeof (language_table[0]), + ll_buf, + &language_range); + if (language_range.lo < language_range.hi) + { + range_t country_range; + + search (country_table, + sizeof (country_table) / sizeof (country_table[0]), + CC_buf, + &country_range); + if (country_range.lo < country_range.hi) + { + size_t i; + size_t j; + + for (i = language_range.lo; i < language_range.hi; i++) + for (j = country_range.lo; j < country_range.hi; j++) + { + /* Concatenate the replacements. */ + const char *part1 = language_table[i].english; + size_t part1_len = strlen (part1); + const char *part2 = country_table[j].english; + size_t part2_len = strlen (part2) + 1; + char buf[64+64]; + + if (!(part1_len + 1 + part2_len <= sizeof (buf))) + abort (); + memcpy (buf, part1, part1_len); + buf[part1_len] = '_'; + memcpy (buf + part1_len + 1, part2, part2_len); + + /* Try the concatenated replacements. */ + result = setlocale (category, buf); + if (result != NULL) + return result; + } + } + + /* Try omitting the country entirely. This may set a locale + corresponding to the wrong country, but is better than + failing entirely. */ + { + size_t i; + + for (i = language_range.lo; i < language_range.hi; i++) + { + /* Try only the language replacement. */ + result = + setlocale (category, language_table[i].english); + if (result != NULL) + return result; + } + } + } + } + } + } + } + + /* Failed. */ + return NULL; +} + +# else +# define setlocale_unixlike setlocale +# endif + +# if LC_MESSAGES == 1729 + +/* The system does not store an LC_MESSAGES locale category. Do it here. */ +static char lc_messages_name[64] = "C"; + +/* Like setlocale, but support also LC_MESSAGES. */ +static char * +setlocale_single (int category, const char *locale) +{ + if (category == LC_MESSAGES) + { + if (locale != NULL) + { + lc_messages_name[sizeof (lc_messages_name) - 1] = '\0'; + strncpy (lc_messages_name, locale, sizeof (lc_messages_name) - 1); + } + return lc_messages_name; + } + else + return setlocale_unixlike (category, locale); +} + +# else +# define setlocale_single setlocale_unixlike +# endif + +char * +rpl_setlocale (int category, const char *locale) +{ + if (locale != NULL && locale[0] == '\0') + { + /* A request to the set the current locale to the default locale. */ + if (category == LC_ALL) + { + /* Set LC_CTYPE first. Then the other categories. */ + static int const categories[] = + { + LC_NUMERIC, + LC_TIME, + LC_COLLATE, + LC_MONETARY, + LC_MESSAGES + }; + char *saved_locale; + const char *base_name; + unsigned int i; + + /* Back up the old locale, in case one of the steps fails. */ + saved_locale = setlocale (LC_ALL, NULL); + if (saved_locale == NULL) + return NULL; + saved_locale = strdup (saved_locale); + if (saved_locale == NULL) + return NULL; + + /* Set LC_CTYPE category. Set all other categories (except possibly + LC_MESSAGES) to the same value in the same call; this is likely to + save calls. */ + base_name = + gl_locale_name_environ (LC_CTYPE, category_to_name (LC_CTYPE)); + if (base_name == NULL) + base_name = gl_locale_name_default (); + + if (setlocale_unixlike (LC_ALL, base_name) == NULL) + goto fail; +# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ + /* On native Windows, setlocale(LC_ALL,...) may succeed but set the + LC_CTYPE category to an invalid value ("C") when it does not + support the specified encoding. Report a failure instead. */ + if (strchr (base_name, '.') != NULL + && strcmp (setlocale (LC_CTYPE, NULL), "C") == 0) + goto fail; +# endif + + for (i = 0; i < sizeof (categories) / sizeof (categories[0]); i++) + { + int cat = categories[i]; + const char *name; + + name = gl_locale_name_environ (cat, category_to_name (cat)); + if (name == NULL) + name = gl_locale_name_default (); + + /* If name is the same as base_name, it has already been set + through the setlocale call before the loop. */ + if (strcmp (name, base_name) != 0 +# if LC_MESSAGES == 1729 + || cat == LC_MESSAGES +# endif + ) + if (setlocale_single (cat, name) == NULL) + goto fail; + } + + /* All steps were successful. */ + free (saved_locale); + return setlocale (LC_ALL, NULL); + + fail: + if (saved_locale[0] != '\0') /* don't risk an endless recursion */ + setlocale (LC_ALL, saved_locale); + free (saved_locale); + return NULL; + } + else + { + const char *name = + gl_locale_name_environ (category, category_to_name (category)); + if (name == NULL) + name = gl_locale_name_default (); + + return setlocale_single (category, name); + } + } + else + { +# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ + if (category == LC_ALL && locale != NULL && strchr (locale, '.') != NULL) + { + char *saved_locale; + + /* Back up the old locale. */ + saved_locale = setlocale (LC_ALL, NULL); + if (saved_locale == NULL) + return NULL; + saved_locale = strdup (saved_locale); + if (saved_locale == NULL) + return NULL; + + if (setlocale_unixlike (LC_ALL, locale) == NULL) + { + free (saved_locale); + return NULL; + } + + /* On native Windows, setlocale(LC_ALL,...) may succeed but set the + LC_CTYPE category to an invalid value ("C") when it does not + support the specified encoding. Report a failure instead. */ + if (strcmp (setlocale (LC_CTYPE, NULL), "C") == 0) + { + if (saved_locale[0] != '\0') /* don't risk an endless recursion */ + setlocale (LC_ALL, saved_locale); + free (saved_locale); + return NULL; + } + + /* It was really successful. */ + free (saved_locale); + return setlocale (LC_ALL, NULL); + } + else +# endif + return setlocale_single (category, locale); + } +} + +#endif diff --git a/gnulib/lib/setsockopt.c b/gnulib/lib/setsockopt.c new file mode 100644 index 0000000..6a7ca5e --- /dev/null +++ b/gnulib/lib/setsockopt.c @@ -0,0 +1,65 @@ +/* setsockopt.c --- wrappers for Windows setsockopt function + + Copyright (C) 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paolo Bonzini */ + +#include + +#define WIN32_LEAN_AND_MEAN +/* Get winsock2.h. */ +#include + +/* Get struct timeval. */ +#include + +/* 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) +{ + SOCKET sock = FD_TO_SOCKET (fd); + int r; + + if (sock == INVALID_SOCKET) + { + errno = EBADF; + return -1; + } + else + { + 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 0000000..bd8f10f --- /dev/null +++ b/gnulib/lib/settime.c @@ -0,0 +1,59 @@ +/* settime -- set the system clock + + Copyright (C) 2002, 2004-2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +#include + +#include "timespec.h" + +#include +#include + +#include + +/* 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 0000000..2efd926 --- /dev/null +++ b/gnulib/lib/sh-quote.c @@ -0,0 +1,107 @@ +/* Shell quoting. + Copyright (C) 2001-2004, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "sh-quote.h" + +#include + +#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 0000000..339a7c6 --- /dev/null +++ b/gnulib/lib/sh-quote.h @@ -0,0 +1,36 @@ +/* Shell quoting. + Copyright (C) 2001-2002, 2004, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +/* 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 + +/* 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 0000000..828810b --- /dev/null +++ b/gnulib/lib/sha1.c @@ -0,0 +1,427 @@ +/* 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-2006, 2008-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 -- Expansion function fix +*/ + +#include + +#include "sha1.h" + +#include +#include +#include +#include + +#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 UNALIGNED_P(p) ((uintptr_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 0000000..d3fedbf --- /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-2011 Free Software + Foundation, Inc. + + This program is free software; you can 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 +# include + +# 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 0000000..aa529c6 --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by David Madore, considerably copypasting from + Scott G. Miller's sha1.c +*/ + +#include + +#include "sha256.h" + +#include +#include +#include +#include + +#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 UNALIGNED_P(p) ((uintptr_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 0000000..9f6bf14 --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef SHA256_H +# define SHA256_H 1 + +# include +# include + +# 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 0000000..1c5117f --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by David Madore, considerably copypasting from + Scott G. Miller's sha1.c +*/ + +#include + +#include "sha512.h" + +#include +#include +#include +#include + +#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 UNALIGNED_P(p) ((uintptr_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 0000000..af8b354 --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef SHA512_H +# define SHA512_H 1 + +# include + +# 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 0000000..1c302a2 --- /dev/null +++ b/gnulib/lib/shutdown.c @@ -0,0 +1,49 @@ +/* shutdown.c --- wrappers for Windows shutdown function + + Copyright (C) 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paolo Bonzini */ + +#include + +#define WIN32_LEAN_AND_MEAN +/* Get winsock2.h. */ +#include + +/* 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); + + if (sock == INVALID_SOCKET) + { + errno = EBADF; + return -1; + } + else + { + 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 0000000..abb660c --- /dev/null +++ b/gnulib/lib/sig-handler.h @@ -0,0 +1,44 @@ +/* Convenience declarations when working with . + + Copyright (C) 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef _GL_SIG_HANDLER_H +#define _GL_SIG_HANDLER_H + +#include + +/* 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 0000000..70faa66 --- /dev/null +++ b/gnulib/lib/sig2str.c @@ -0,0 +1,345 @@ +/* sig2str.c -- convert between signal names and numbers + + Copyright (C) 2002, 2004, 2006, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +#include + +#include +#include +#include +#include +#include + +#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 where possible. */ +#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 SIGSEGV + NUMNAME (SEGV), +#endif + /* On Haiku, SIGSEGV == SIGBUS, but we prefer SIGSEGV to match + strsignal.c output, so SIGBUS must be listed second. */ +#ifdef SIGBUS + NUMNAME (BUS), +#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 0000000..03ff1e0 --- /dev/null +++ b/gnulib/lib/sig2str.h @@ -0,0 +1,43 @@ +/* sig2str.h -- convert between signal names and numbers + + Copyright (C) 2002, 2005, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +#include + +/* 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 0000000..e6a55da --- /dev/null +++ b/gnulib/lib/sigaction.c @@ -0,0 +1,204 @@ +/* POSIX compatible signal blocking. + Copyright (C) 2008-2011 Free Software Foundation, Inc. + Written by Eric Blake , 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 . */ + +#include + +/* Specification. */ +#include + +#include +#include +#include + +/* 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 0000000..104bc68 --- /dev/null +++ b/gnulib/lib/siglist.h @@ -0,0 +1,132 @@ +/* Canonical list of all signal names. + Copyright (C) 1996-1999, 2008-2011 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 . */ + +/* 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 (via ). 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. */ + +/* Duplicate values (such as SIGBUS==SIGSEGV on Haiku) favor the last + list entry. */ + +/* 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 0000000..e18e0b2 --- /dev/null +++ b/gnulib/lib/signal.in.h @@ -0,0 +1,447 @@ +/* A GNU-like . + + Copyright (C) 2006-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#if __GNUC__ >= 3 +@PRAGMA_SYSTEM_HEADER@ +#endif +@PRAGMA_COLUMNS@ + +#if defined __need_sig_atomic_t || defined __need_sigset_t || defined _GL_ALREADY_INCLUDING_SIGNAL_H || (defined _SIGNAL_H && !defined __SIZEOF_PTHREAD_MUTEX_T) +/* Special invocation convention: + - Inside glibc header files. + - On glibc systems we have a sequence of nested includes + -> -> . + In this situation, the functions are not yet declared, therefore we cannot + provide the C++ aliases. + - On glibc systems with GCC 4.3 we have a sequence of nested includes + -> -> -> . + In this situation, some of the functions are not yet declared, therefore + we cannot provide the C++ aliases. */ + +# @INCLUDE_NEXT@ @NEXT_SIGNAL_H@ + +#else +/* Normal invocation convention. */ + +#ifndef _@GUARD_PREFIX@_SIGNAL_H + +#define _GL_ALREADY_INCLUDING_SIGNAL_H + +/* Define pid_t, uid_t. + Also, mingw defines sigset_t not in , but in . + On Solaris 10, includes , which eventually includes + us; so include now, before the second inclusion guard. */ +#include + +/* The include_next requires a split double-inclusion guard. */ +#@INCLUDE_NEXT@ @NEXT_SIGNAL_H@ + +#undef _GL_ALREADY_INCLUDING_SIGNAL_H + +#ifndef _@GUARD_PREFIX@_SIGNAL_H +#define _@GUARD_PREFIX@_SIGNAL_H + +/* MacOS X 10.3, FreeBSD 6.4, OpenBSD 3.8, OSF/1 4.0, Solaris 2.6 declare + pthread_sigmask in , not in . + But avoid namespace pollution on glibc systems.*/ +#if (@GNULIB_PTHREAD_SIGMASK@ || defined GNULIB_POSIXCHECK) \ + && ((defined __APPLE__ && defined __MACH__) || defined __FreeBSD__ || defined __OpenBSD__ || defined __osf__ || defined __sun) \ + && ! defined __GLIBC__ +# include +#endif + +/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ + +/* The definition of _GL_ARG_NONNULL is copied here. */ + +/* The definition of _GL_WARN_ON_USE is copied here. */ + +/* 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@ +# if !GNULIB_defined_sig_atomic_t +typedef int rpl_sig_atomic_t; +# undef sig_atomic_t +# define sig_atomic_t rpl_sig_atomic_t +# define GNULIB_defined_sig_atomic_t 1 +# endif +#endif + +/* A set or mask of signals. */ +#if !@HAVE_SIGSET_T@ +# if !GNULIB_defined_sigset_t +typedef unsigned int sigset_t; +# define GNULIB_defined_sigset_t 1 +# endif +#endif + +/* Define sighandler_t, the type of signal handlers. A GNU extension. */ +#if !@HAVE_SIGHANDLER_T@ +# ifdef __cplusplus +extern "C" { +# endif +# if !GNULIB_defined_sighandler_t +typedef void (*sighandler_t) (int); +# define GNULIB_defined_sighandler_t 1 +# endif +# ifdef __cplusplus +} +# endif +#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 + + +/* Maximum signal number + 1. */ +#ifndef NSIG +# if defined __TANDEM +# define NSIG 32 +# endif +#endif + + +#if @GNULIB_PTHREAD_SIGMASK@ +# if @REPLACE_PTHREAD_SIGMASK@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef pthread_sigmask +# define pthread_sigmask rpl_pthread_sigmask +# endif +_GL_FUNCDECL_RPL (pthread_sigmask, int, + (int how, const sigset_t *new_mask, sigset_t *old_mask)); +_GL_CXXALIAS_RPL (pthread_sigmask, int, + (int how, const sigset_t *new_mask, sigset_t *old_mask)); +# else +# if !@HAVE_PTHREAD_SIGMASK@ +_GL_FUNCDECL_SYS (pthread_sigmask, int, + (int how, const sigset_t *new_mask, sigset_t *old_mask)); +# endif +_GL_CXXALIAS_SYS (pthread_sigmask, int, + (int how, const sigset_t *new_mask, sigset_t *old_mask)); +# endif +_GL_CXXALIASWARN (pthread_sigmask); +#elif defined GNULIB_POSIXCHECK +# undef pthread_sigmask +# if HAVE_RAW_DECL_PTHREAD_SIGMASK +_GL_WARN_ON_USE (pthread_sigmask, "pthread_sigmask is not portable - " + "use gnulib module pthread_sigmask for portability"); +# endif +#endif + + +#if @GNULIB_RAISE@ +# if @REPLACE_RAISE@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef raise +# define raise rpl_raise +# endif +_GL_FUNCDECL_RPL (raise, int, (int sig)); +_GL_CXXALIAS_RPL (raise, int, (int sig)); +# else +# if !@HAVE_RAISE@ +_GL_FUNCDECL_SYS (raise, int, (int sig)); +# endif +_GL_CXXALIAS_SYS (raise, int, (int sig)); +# endif +_GL_CXXALIASWARN (raise); +#elif defined GNULIB_POSIXCHECK +# undef raise +/* Assume raise is always declared. */ +_GL_WARN_ON_USE (raise, "raise can crash on native Windows - " + "use gnulib module raise for portability"); +#endif + + +#if @GNULIB_SIGPROCMASK@ +# if !@HAVE_POSIX_SIGNALBLOCKING@ + +# ifndef GNULIB_defined_signal_blocking +# define GNULIB_defined_signal_blocking 1 +# endif + +/* Maximum signal number + 1. */ +# ifndef NSIG +# define NSIG 32 +# endif + +/* This code supports only 32 signals. */ +# if !GNULIB_defined_verify_NSIG_constraint +typedef int verify_NSIG_constraint[NSIG <= 32 ? 1 : -1]; +# define GNULIB_defined_verify_NSIG_constraint 1 +# endif + +# endif + +/* Test whether a given signal is contained in a signal set. */ +# if @HAVE_POSIX_SIGNALBLOCKING@ +/* This function is defined as a macro on MacOS X. */ +# if defined __cplusplus && defined GNULIB_NAMESPACE +# undef sigismember +# endif +# else +_GL_FUNCDECL_SYS (sigismember, int, (const sigset_t *set, int sig) + _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (sigismember, int, (const sigset_t *set, int sig)); +_GL_CXXALIASWARN (sigismember); + +/* Initialize a signal set to the empty set. */ +# if @HAVE_POSIX_SIGNALBLOCKING@ +/* This function is defined as a macro on MacOS X. */ +# if defined __cplusplus && defined GNULIB_NAMESPACE +# undef sigemptyset +# endif +# else +_GL_FUNCDECL_SYS (sigemptyset, int, (sigset_t *set) _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (sigemptyset, int, (sigset_t *set)); +_GL_CXXALIASWARN (sigemptyset); + +/* Add a signal to a signal set. */ +# if @HAVE_POSIX_SIGNALBLOCKING@ +/* This function is defined as a macro on MacOS X. */ +# if defined __cplusplus && defined GNULIB_NAMESPACE +# undef sigaddset +# endif +# else +_GL_FUNCDECL_SYS (sigaddset, int, (sigset_t *set, int sig) + _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (sigaddset, int, (sigset_t *set, int sig)); +_GL_CXXALIASWARN (sigaddset); + +/* Remove a signal from a signal set. */ +# if @HAVE_POSIX_SIGNALBLOCKING@ +/* This function is defined as a macro on MacOS X. */ +# if defined __cplusplus && defined GNULIB_NAMESPACE +# undef sigdelset +# endif +# else +_GL_FUNCDECL_SYS (sigdelset, int, (sigset_t *set, int sig) + _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (sigdelset, int, (sigset_t *set, int sig)); +_GL_CXXALIASWARN (sigdelset); + +/* Fill a signal set with all possible signals. */ +# if @HAVE_POSIX_SIGNALBLOCKING@ +/* This function is defined as a macro on MacOS X. */ +# if defined __cplusplus && defined GNULIB_NAMESPACE +# undef sigfillset +# endif +# else +_GL_FUNCDECL_SYS (sigfillset, int, (sigset_t *set) _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (sigfillset, int, (sigset_t *set)); +_GL_CXXALIASWARN (sigfillset); + +/* Return the set of those blocked signals that are pending. */ +# if !@HAVE_POSIX_SIGNALBLOCKING@ +_GL_FUNCDECL_SYS (sigpending, int, (sigset_t *set) _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (sigpending, int, (sigset_t *set)); +_GL_CXXALIASWARN (sigpending); + +/* 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. */ +# if !@HAVE_POSIX_SIGNALBLOCKING@ +# 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; */ +_GL_FUNCDECL_SYS (sigprocmask, int, + (int operation, const sigset_t *set, sigset_t *old_set)); +# endif +_GL_CXXALIAS_SYS (sigprocmask, int, + (int operation, const sigset_t *set, sigset_t *old_set)); +_GL_CXXALIASWARN (sigprocmask); + +/* Install the handler FUNC for signal SIG, and return the previous + handler. */ +# ifdef __cplusplus +extern "C" { +# endif +# if !GNULIB_defined_function_taking_int_returning_void_t +typedef void (*_gl_function_taking_int_returning_void_t) (int); +# define GNULIB_defined_function_taking_int_returning_void_t 1 +# endif +# ifdef __cplusplus +} +# endif +# if !@HAVE_POSIX_SIGNALBLOCKING@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define signal rpl_signal +# endif +_GL_FUNCDECL_RPL (signal, _gl_function_taking_int_returning_void_t, + (int sig, _gl_function_taking_int_returning_void_t func)); +_GL_CXXALIAS_RPL (signal, _gl_function_taking_int_returning_void_t, + (int sig, _gl_function_taking_int_returning_void_t func)); +# else +_GL_CXXALIAS_SYS (signal, _gl_function_taking_int_returning_void_t, + (int sig, _gl_function_taking_int_returning_void_t func)); +# endif +_GL_CXXALIASWARN (signal); + +# if !@HAVE_POSIX_SIGNALBLOCKING@ && GNULIB_defined_SIGPIPE +/* Raise signal SIGPIPE. */ +_GL_EXTERN_C int _gl_raise_SIGPIPE (void); +# endif + +#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@ + +# if !GNULIB_defined_siginfo_types + +/* 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; + +# define GNULIB_defined_siginfo_types 1 +# endif + +# endif /* !@HAVE_SIGINFO_T@ */ + +/* We assume that platforms which lack the sigaction() function also lack + the 'struct sigaction' type, and vice versa. */ + +# if !GNULIB_defined_struct_sigaction + +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 + +# define GNULIB_defined_struct_sigaction 1 +# endif + +_GL_FUNCDECL_SYS (sigaction, int, (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@ */ + +_GL_CXXALIAS_SYS (sigaction, int, (int, const struct sigaction *restrict, + struct sigaction *restrict)); +_GL_CXXALIASWARN (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 + + +#endif /* _@GUARD_PREFIX@_SIGNAL_H */ +#endif /* _@GUARD_PREFIX@_SIGNAL_H */ +#endif diff --git a/gnulib/lib/signbitd.c b/gnulib/lib/signbitd.c new file mode 100644 index 0000000..4042349 --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include +#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 0000000..3ec472f --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include +#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 0000000..4453d8f --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include +#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 0000000..43cf870 --- /dev/null +++ b/gnulib/lib/sigpipe-die.c @@ -0,0 +1,82 @@ +/* Report a SIGPIPE signal and exit. + Copyright (C) 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible , 2008. */ + +#include + +/* Specification. */ +#include "sigpipe-die.h" + +#include +#include + +#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 0000000..2e1ac27 --- /dev/null +++ b/gnulib/lib/sigpipe-die.h @@ -0,0 +1,63 @@ +/* Report a SIGPIPE signal and exit. + Copyright (C) 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible , 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 + + +/* Emit an error message indicating a SIGPIPE signal, and terminate the + process with an error code. */ +extern _Noreturn void sigpipe_die (void); + +/* 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 0000000..d696189 --- /dev/null +++ b/gnulib/lib/sigprocmask.c @@ -0,0 +1,349 @@ +/* POSIX compatible signal blocking. + Copyright (C) 2006-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include + +#include +#include +#include + +#if HAVE_MSVC_INVALID_PARAMETER_HANDLER +# include "msvc-inval.h" +#endif + +/* 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); + +#if HAVE_MSVC_INVALID_PARAMETER_HANDLER +static inline handler_t +signal_nothrow (int sig, handler_t handler) +{ + handler_t result; + + TRY_MSVC_INVAL + { + result = signal (sig, handler); + } + CATCH_MSVC_INVAL + { + result = SIG_ERR; + errno = EINVAL; + } + DONE_MSVC_INVAL; + + return result; +} +# define signal signal_nothrow +#endif + +/* 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); + } +} +# undef signal +# 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 SIGPIPE. */ +int +_gl_raise_SIGPIPE (void) +{ + if (blocked_set & (1U << SIGPIPE)) + pending_array[SIGPIPE] = 1; + else + { + handler_t handler = SIGPIPE_handler; + if (handler == SIG_DFL) + exit (128 + SIGPIPE); + else if (handler != SIG_IGN) + (*handler) (SIGPIPE); + } + return 0; +} +#endif diff --git a/gnulib/lib/sincosl.c b/gnulib/lib/sincosl.c new file mode 100644 index 0000000..44f489c --- /dev/null +++ b/gnulib/lib/sincosl.c @@ -0,0 +1,907 @@ +/* Quad-precision floating point trigonometric functions on <-pi/4,pi/4>. + Copyright (C) 1999, 2006-2007, 2009-2011 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Jakub Jelinek + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "trigl.h" + +#include +#include + +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 + k and l such that x = k + l, where fabsl(l) <= 1.0/256 with 83 + possible values for k. We look up cosl(k) and sinl(k) in + pre-computed tables, compute cosl(l) and sinl(l) using a + Chebyshev polynomial of degree 10(11) and compute + sinl(k+l) = sinl(k)cosl(l) + cosl(k)sinl(l). + Furthermore write k = 0.1484375 + h. */ + 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; + /* We rely on this expression not being "contracted" by the compiler + (cf. ISO C 99 section 6.5 paragraph 8). */ + z = + sincosl_table[index + SINCOSL_SIN_HI] + + (sincosl_table[index + SINCOSL_COS_HI] * sin_l + + (sincosl_table[index + SINCOSL_SIN_HI] * cos_l_m1 + + (sincosl_table[index + SINCOSL_SIN_LO] * (1 + cos_l_m1) + + sincosl_table[index + SINCOSL_COS_LO] * 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 + k and l such that x = k + l, where fabsl(l) <= 1.0/256 with 83 + possible values for k. We look up cosl(k) and sinl(k) in + pre-computed tables, compute cosl(l) and sinl(l) using a + Chebyshev polynomial of degree 10(11) and compute + cosl(k+l) = cosl(k)cosl(l) - sinl(k)sinl(l). + Furthermore write k = 0.1484375 + h. */ + 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; + /* We rely on this expression not being "contracted" by the compiler + (cf. ISO C 99 section 6.5 paragraph 8). */ + z = + sincosl_table [index + SINCOSL_COS_HI] + - (sincosl_table [index + SINCOSL_SIN_HI] * sin_l + - (sincosl_table [index + SINCOSL_COS_HI] * cos_l_m1 + + (sincosl_table [index + SINCOSL_COS_LO] * (1 + cos_l_m1) + - sincosl_table [index + SINCOSL_SIN_LO] * sin_l))); + 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/sinf.c b/gnulib/lib/sinf.c new file mode 100644 index 0000000..e6a1d55 --- /dev/null +++ b/gnulib/lib/sinf.c @@ -0,0 +1,26 @@ +/* Sine function. + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +float +sinf (float x) +{ + return (float) sin ((double) x); +} diff --git a/gnulib/lib/sinhf.c b/gnulib/lib/sinhf.c new file mode 100644 index 0000000..e44f30b --- /dev/null +++ b/gnulib/lib/sinhf.c @@ -0,0 +1,26 @@ +/* Hyperbolic sine function. + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +float +sinhf (float x) +{ + return (float) sinh ((double) x); +} diff --git a/gnulib/lib/sinl.c b/gnulib/lib/sinl.c new file mode 100644 index 0000000..3949e49 --- /dev/null +++ b/gnulib/lib/sinl.c @@ -0,0 +1,116 @@ +/* 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 + +/* Specification. */ +#include + +#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE + +long double +sinl (long double x) +{ + return sin (x); +} + +#else + +/* 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]); + } + } +} + +#endif + +#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 0000000..6becfb1 --- /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-2011 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 +/* Get SIZE_MAX declaration on systems like glibc 2. */ +# if HAVE_STDINT_H +# include +# 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 0000000..45b9d80 --- /dev/null +++ b/gnulib/lib/sleep.c @@ -0,0 +1,76 @@ +/* Pausing execution of the current thread. + Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include + +#include + +#include "verify.h" + +#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ + +# define WIN32_LEAN_AND_MEAN /* avoid including junk */ +# include + +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. Similarly, Linux 2.6.9 with glibc 2.3.4 has a too + small return value when asked to sleep more than 24.85 days. */ +unsigned int +rpl_sleep (unsigned int seconds) +{ + /* This requires int larger than 16 bits. */ + verify (UINT_MAX / 24 / 24 / 60 / 60); + const unsigned int limit = 24 * 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 0000000..dc435a0 --- /dev/null +++ b/gnulib/lib/snprintf.c @@ -0,0 +1,72 @@ +/* Formatted output to strings. + Copyright (C) 2004, 2006-2011 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 + +/* Specification. */ +#include + +#include +#include +#include +#include +#include + +#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 0000000..af6be25 --- /dev/null +++ b/gnulib/lib/socket.c @@ -0,0 +1,49 @@ +/* socket.c --- wrappers for Windows socket function + + Copyright (C) 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paolo Bonzini */ + +#include + +#define WIN32_LEAN_AND_MEAN +/* Get winsock2.h. */ +#include + +/* 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 0000000..39939b0 --- /dev/null +++ b/gnulib/lib/sockets.c @@ -0,0 +1,154 @@ +/* sockets.c --- wrappers for Windows socket functions + + Copyright (C) 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Simon Josefsson */ + +#include + +/* Specification. */ +#include "sockets.h" + +#if WINDOWS_SOCKETS + +/* This includes winsock2.h on MinGW. */ +# include + +# include "fd-hook.h" +# include "msvc-nothrow.h" + +/* Get set_winsock_errno, FD_TO_SOCKET etc. */ +# include "w32sock.h" + +static int +close_fd_maybe_socket (const struct fd_hook *remaining_list, + gl_close_fn primary, + int fd) +{ + /* Note about multithread-safety: There is a race condition where, between + our calls to closesocket() and the primary close(), some other thread + could make system calls that allocate precisely the same HANDLE value + as sock; then the primary close() would call CloseHandle() on it. */ + 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 (remaining_list, primary, fd); +} + +static int +ioctl_fd_maybe_socket (const struct fd_hook *remaining_list, + gl_ioctl_fn primary, + int fd, int request, void *arg) +{ + 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. */ + if (ioctlsocket (sock, request, arg) < 0) + { + set_winsock_errno (); + return -1; + } + else + return 0; + } + else + /* Some other type of file descriptor. */ + return execute_ioctl_hooks (remaining_list, primary, fd, request, arg); +} + +static struct fd_hook fd_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_fd_hook (close_fd_maybe_socket, ioctl_fd_maybe_socket, + &fd_sockets_hook); + + initialized_sockets_version = version; + } +#endif + + return 0; +} + +int +gl_sockets_cleanup (void) +{ +#if WINDOWS_SOCKETS + int err; + + initialized_sockets_version = 0; + + unregister_fd_hook (&fd_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 0000000..68bf731 --- /dev/null +++ b/gnulib/lib/sockets.h @@ -0,0 +1,62 @@ +/* sockets.h - wrappers for Windows socket functions + + Copyright (C) 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* 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) +#if !WINDOWS_SOCKETS + _GL_ATTRIBUTE_CONST +#endif + ; + +int gl_sockets_cleanup (void) +#if !WINDOWS_SOCKETS + _GL_ATTRIBUTE_CONST +#endif + ; + +/* 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 + +#include "msvc-nothrow.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-pipe.c b/gnulib/lib/spawn-pipe.c new file mode 100644 index 0000000..742987f --- /dev/null +++ b/gnulib/lib/spawn-pipe.c @@ -0,0 +1,450 @@ +/* Creation of subprocesses, communicating via pipes. + Copyright (C) 2001-2004, 2006-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + + +#include + +/* Specification. */ +#include "spawn-pipe.h" + +#include +#include +#include +#include +#include + +#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 +# include "w32spawn.h" + +#else + +/* Unix API. */ +# include + +#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; + int saved_errno; + + /* 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 a 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 (child == -1) + saved_errno = errno; + 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, saved_errno, + _("%s subprocess failed"), progname); + if (pipe_stdout) + close (ifd[0]); + if (pipe_stdin) + close (ofd[1]); + errno = saved_errno; + 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]); + } + errno = err; + 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/spawn-pipe.h b/gnulib/lib/spawn-pipe.h new file mode 100644 index 0000000..c69f87a --- /dev/null +++ b/gnulib/lib/spawn-pipe.h @@ -0,0 +1,147 @@ +/* Creation of subprocesses, communicating via pipes. + Copyright (C) 2001-2003, 2006, 2008-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#ifndef _SPAWN_PIPE_H +#define _SPAWN_PIPE_H + +/* Get pid_t. */ +#include +#include +#include + +#include + + +#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, with errno set, 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 /* _SPAWN_PIPE_H */ diff --git a/gnulib/lib/spawn.c b/gnulib/lib/spawn.c new file mode 100644 index 0000000..f72061a --- /dev/null +++ b/gnulib/lib/spawn.c @@ -0,0 +1,33 @@ +/* Copyright (C) 2000, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include + +#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 0000000..5cc9acf --- /dev/null +++ b/gnulib/lib/spawn.in.h @@ -0,0 +1,881 @@ +/* Definitions for POSIX spawn interface. + Copyright (C) 2000, 2003-2004, 2008-2011 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 . */ + +#ifndef _@GUARD_PREFIX@_SPAWN_H + +#if __GNUC__ >= 3 +@PRAGMA_SYSTEM_HEADER@ +#endif +@PRAGMA_COLUMNS@ + +/* The include_next requires a split double-inclusion guard. */ +#if @HAVE_SPAWN_H@ +# @INCLUDE_NEXT@ @NEXT_SPAWN_H@ +#endif + +#ifndef _@GUARD_PREFIX@_SPAWN_H +#define _@GUARD_PREFIX@_SPAWN_H + +/* Get definitions of 'struct sched_param' and 'sigset_t'. + But avoid namespace pollution on glibc systems. */ +#if !(defined __GLIBC__ && !defined __UCLIBC__) +# include +# include +#endif + +#include + +#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__)) \ + && !defined __STRICT_ANSI__)) \ + && !defined __GNUG__) +# define _Restrict_arr_ _Restrict_ +# else +# define _Restrict_arr_ +# endif +#endif + +/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ + +/* 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@ +# if !GNULIB_defined_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; +# define GNULIB_defined_posix_spawnattr_t 1 +# endif +#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@ +# if !GNULIB_defined_posix_spawn_file_actions_t +typedef struct +{ + int _allocated; + int _used; + struct __spawn_action *_actions; + int __pad[16]; +} posix_spawn_file_actions_t; +# define GNULIB_defined_posix_spawn_file_actions_t 1 +# endif +#endif + + +/* Flags to be set in the `posix_spawnattr_t'. */ +#if @HAVE_POSIX_SPAWN@ +/* Use the values from the system, but provide the missing ones. */ +# ifndef POSIX_SPAWN_SETSCHEDPARAM +# define POSIX_SPAWN_SETSCHEDPARAM 0 +# endif +# ifndef POSIX_SPAWN_SETSCHEDULER +# define POSIX_SPAWN_SETSCHEDULER 0 +# endif +#else +# 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 +#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 > 0 ? POSIX_SPAWN_SETSCHEDPARAM - 1 : 0) \ + | POSIX_SPAWN_SETSCHEDULER \ + | (POSIX_SPAWN_SETSCHEDULER > 0 ? POSIX_SPAWN_SETSCHEDULER - 1 : 0)) \ + + 1) +#if !GNULIB_defined_verify_POSIX_SPAWN_USEVFORK_no_overlap +typedef int verify_POSIX_SPAWN_USEVFORK_no_overlap + [(((POSIX_SPAWN_RESETIDS | POSIX_SPAWN_SETPGROUP + | POSIX_SPAWN_SETSIGDEF | POSIX_SPAWN_SETSIGMASK + | POSIX_SPAWN_SETSCHEDPARAM | POSIX_SPAWN_SETSCHEDULER) + & POSIX_SPAWN_USEVFORK) + == 0) + ? 1 : -1]; +# define GNULIB_defined_verify_POSIX_SPAWN_USEVFORK_no_overlap 1 +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define posix_spawn rpl_posix_spawn +# endif +_GL_FUNCDECL_RPL (posix_spawn, int, + (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))); +_GL_CXXALIAS_RPL (posix_spawn, int, + (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_])); +# else +# if !@HAVE_POSIX_SPAWN@ +_GL_FUNCDECL_SYS (posix_spawn, int, + (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 +_GL_CXXALIAS_SYS (posix_spawn, int, + (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_])); +# endif +_GL_CXXALIASWARN (posix_spawn); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define posix_spawnp rpl_posix_spawnp +# endif +_GL_FUNCDECL_RPL (posix_spawnp, int, + (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))); +_GL_CXXALIAS_RPL (posix_spawnp, int, + (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[])); +# else +# if !@HAVE_POSIX_SPAWN@ +_GL_FUNCDECL_SYS (posix_spawnp, int, + (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 +_GL_CXXALIAS_SYS (posix_spawnp, int, + (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[])); +# endif +_GL_CXXALIASWARN (posix_spawnp); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define posix_spawnattr_init rpl_posix_spawnattr_init +# endif +_GL_FUNCDECL_RPL (posix_spawnattr_init, int, (posix_spawnattr_t *__attr) + __THROW _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (posix_spawnattr_init, int, (posix_spawnattr_t *__attr)); +# else +# if !@HAVE_POSIX_SPAWN@ +_GL_FUNCDECL_SYS (posix_spawnattr_init, int, (posix_spawnattr_t *__attr) + __THROW _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (posix_spawnattr_init, int, (posix_spawnattr_t *__attr)); +# endif +_GL_CXXALIASWARN (posix_spawnattr_init); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define posix_spawnattr_destroy rpl_posix_spawnattr_destroy +# endif +_GL_FUNCDECL_RPL (posix_spawnattr_destroy, int, (posix_spawnattr_t *__attr) + __THROW _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (posix_spawnattr_destroy, int, (posix_spawnattr_t *__attr)); +# else +# if !@HAVE_POSIX_SPAWN@ +_GL_FUNCDECL_SYS (posix_spawnattr_destroy, int, (posix_spawnattr_t *__attr) + __THROW _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (posix_spawnattr_destroy, int, (posix_spawnattr_t *__attr)); +# endif +_GL_CXXALIASWARN (posix_spawnattr_destroy); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define posix_spawnattr_getsigdefault rpl_posix_spawnattr_getsigdefault +# endif +_GL_FUNCDECL_RPL (posix_spawnattr_getsigdefault, int, + (const posix_spawnattr_t *_Restrict_ __attr, + sigset_t *_Restrict_ __sigdefault) + __THROW _GL_ARG_NONNULL ((1, 2))); +_GL_CXXALIAS_RPL (posix_spawnattr_getsigdefault, int, + (const posix_spawnattr_t *_Restrict_ __attr, + sigset_t *_Restrict_ __sigdefault)); +# else +# if !@HAVE_POSIX_SPAWN@ +_GL_FUNCDECL_SYS (posix_spawnattr_getsigdefault, int, + (const posix_spawnattr_t *_Restrict_ __attr, + sigset_t *_Restrict_ __sigdefault) + __THROW _GL_ARG_NONNULL ((1, 2))); +# endif +_GL_CXXALIAS_SYS (posix_spawnattr_getsigdefault, int, + (const posix_spawnattr_t *_Restrict_ __attr, + sigset_t *_Restrict_ __sigdefault)); +# endif +_GL_CXXALIASWARN (posix_spawnattr_getsigdefault); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define posix_spawnattr_setsigdefault rpl_posix_spawnattr_setsigdefault +# endif +_GL_FUNCDECL_RPL (posix_spawnattr_setsigdefault, int, + (posix_spawnattr_t *_Restrict_ __attr, + const sigset_t *_Restrict_ __sigdefault) + __THROW _GL_ARG_NONNULL ((1, 2))); +_GL_CXXALIAS_RPL (posix_spawnattr_setsigdefault, int, + (posix_spawnattr_t *_Restrict_ __attr, + const sigset_t *_Restrict_ __sigdefault)); +# else +# if !@HAVE_POSIX_SPAWN@ +_GL_FUNCDECL_SYS (posix_spawnattr_setsigdefault, int, + (posix_spawnattr_t *_Restrict_ __attr, + const sigset_t *_Restrict_ __sigdefault) + __THROW _GL_ARG_NONNULL ((1, 2))); +# endif +_GL_CXXALIAS_SYS (posix_spawnattr_setsigdefault, int, + (posix_spawnattr_t *_Restrict_ __attr, + const sigset_t *_Restrict_ __sigdefault)); +# endif +_GL_CXXALIASWARN (posix_spawnattr_setsigdefault); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define posix_spawnattr_getsigmask rpl_posix_spawnattr_getsigmask +# endif +_GL_FUNCDECL_RPL (posix_spawnattr_getsigmask, int, + (const posix_spawnattr_t *_Restrict_ __attr, + sigset_t *_Restrict_ __sigmask) + __THROW _GL_ARG_NONNULL ((1, 2))); +_GL_CXXALIAS_RPL (posix_spawnattr_getsigmask, int, + (const posix_spawnattr_t *_Restrict_ __attr, + sigset_t *_Restrict_ __sigmask)); +# else +# if !@HAVE_POSIX_SPAWN@ +_GL_FUNCDECL_SYS (posix_spawnattr_getsigmask, int, + (const posix_spawnattr_t *_Restrict_ __attr, + sigset_t *_Restrict_ __sigmask) + __THROW _GL_ARG_NONNULL ((1, 2))); +# endif +_GL_CXXALIAS_SYS (posix_spawnattr_getsigmask, int, + (const posix_spawnattr_t *_Restrict_ __attr, + sigset_t *_Restrict_ __sigmask)); +# endif +_GL_CXXALIASWARN (posix_spawnattr_getsigmask); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define posix_spawnattr_setsigmask rpl_posix_spawnattr_setsigmask +# endif +_GL_FUNCDECL_RPL (posix_spawnattr_setsigmask, int, + (posix_spawnattr_t *_Restrict_ __attr, + const sigset_t *_Restrict_ __sigmask) + __THROW _GL_ARG_NONNULL ((1, 2))); +_GL_CXXALIAS_RPL (posix_spawnattr_setsigmask, int, + (posix_spawnattr_t *_Restrict_ __attr, + const sigset_t *_Restrict_ __sigmask)); +# else +# if !@HAVE_POSIX_SPAWN@ +_GL_FUNCDECL_SYS (posix_spawnattr_setsigmask, int, + (posix_spawnattr_t *_Restrict_ __attr, + const sigset_t *_Restrict_ __sigmask) + __THROW _GL_ARG_NONNULL ((1, 2))); +# endif +_GL_CXXALIAS_SYS (posix_spawnattr_setsigmask, int, + (posix_spawnattr_t *_Restrict_ __attr, + const sigset_t *_Restrict_ __sigmask)); +# endif +_GL_CXXALIASWARN (posix_spawnattr_setsigmask); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define posix_spawnattr_getflags rpl_posix_spawnattr_getflags +# endif +_GL_FUNCDECL_RPL (posix_spawnattr_getflags, int, + (const posix_spawnattr_t *_Restrict_ __attr, + short int *_Restrict_ __flags) + __THROW _GL_ARG_NONNULL ((1, 2))); +_GL_CXXALIAS_RPL (posix_spawnattr_getflags, int, + (const posix_spawnattr_t *_Restrict_ __attr, + short int *_Restrict_ __flags)); +# else +# if !@HAVE_POSIX_SPAWN@ +_GL_FUNCDECL_SYS (posix_spawnattr_getflags, int, + (const posix_spawnattr_t *_Restrict_ __attr, + short int *_Restrict_ __flags) + __THROW _GL_ARG_NONNULL ((1, 2))); +# endif +_GL_CXXALIAS_SYS (posix_spawnattr_getflags, int, + (const posix_spawnattr_t *_Restrict_ __attr, + short int *_Restrict_ __flags)); +# endif +_GL_CXXALIASWARN (posix_spawnattr_getflags); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define posix_spawnattr_setflags rpl_posix_spawnattr_setflags +# endif +_GL_FUNCDECL_RPL (posix_spawnattr_setflags, int, + (posix_spawnattr_t *__attr, short int __flags) + __THROW _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (posix_spawnattr_setflags, int, + (posix_spawnattr_t *__attr, short int __flags)); +# else +# if !@HAVE_POSIX_SPAWN@ +_GL_FUNCDECL_SYS (posix_spawnattr_setflags, int, + (posix_spawnattr_t *__attr, short int __flags) + __THROW _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (posix_spawnattr_setflags, int, + (posix_spawnattr_t *__attr, short int __flags)); +# endif +_GL_CXXALIASWARN (posix_spawnattr_setflags); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define posix_spawnattr_getpgroup rpl_posix_spawnattr_getpgroup +# endif +_GL_FUNCDECL_RPL (posix_spawnattr_getpgroup, int, + (const posix_spawnattr_t *_Restrict_ __attr, + pid_t *_Restrict_ __pgroup) + __THROW _GL_ARG_NONNULL ((1, 2))); +_GL_CXXALIAS_RPL (posix_spawnattr_getpgroup, int, + (const posix_spawnattr_t *_Restrict_ __attr, + pid_t *_Restrict_ __pgroup)); +# else +# if !@HAVE_POSIX_SPAWN@ +_GL_FUNCDECL_SYS (posix_spawnattr_getpgroup, int, + (const posix_spawnattr_t *_Restrict_ __attr, + pid_t *_Restrict_ __pgroup) + __THROW _GL_ARG_NONNULL ((1, 2))); +# endif +_GL_CXXALIAS_SYS (posix_spawnattr_getpgroup, int, + (const posix_spawnattr_t *_Restrict_ __attr, + pid_t *_Restrict_ __pgroup)); +# endif +_GL_CXXALIASWARN (posix_spawnattr_getpgroup); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define posix_spawnattr_setpgroup rpl_posix_spawnattr_setpgroup +# endif +_GL_FUNCDECL_RPL (posix_spawnattr_setpgroup, int, + (posix_spawnattr_t *__attr, pid_t __pgroup) + __THROW _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (posix_spawnattr_setpgroup, int, + (posix_spawnattr_t *__attr, pid_t __pgroup)); +# else +# if !@HAVE_POSIX_SPAWN@ +_GL_FUNCDECL_SYS (posix_spawnattr_setpgroup, int, + (posix_spawnattr_t *__attr, pid_t __pgroup) + __THROW _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (posix_spawnattr_setpgroup, int, + (posix_spawnattr_t *__attr, pid_t __pgroup)); +# endif +_GL_CXXALIASWARN (posix_spawnattr_setpgroup); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define posix_spawnattr_getschedpolicy rpl_posix_spawnattr_getschedpolicy +# endif +_GL_FUNCDECL_RPL (posix_spawnattr_getschedpolicy, int, + (const posix_spawnattr_t *_Restrict_ __attr, + int *_Restrict_ __schedpolicy) + __THROW _GL_ARG_NONNULL ((1, 2))); +_GL_CXXALIAS_RPL (posix_spawnattr_getschedpolicy, int, + (const posix_spawnattr_t *_Restrict_ __attr, + int *_Restrict_ __schedpolicy)); +# else +# if !@HAVE_POSIX_SPAWN@ || POSIX_SPAWN_SETSCHEDULER == 0 +_GL_FUNCDECL_SYS (posix_spawnattr_getschedpolicy, int, + (const posix_spawnattr_t *_Restrict_ __attr, + int *_Restrict_ __schedpolicy) + __THROW _GL_ARG_NONNULL ((1, 2))); +# endif +_GL_CXXALIAS_SYS (posix_spawnattr_getschedpolicy, int, + (const posix_spawnattr_t *_Restrict_ __attr, + int *_Restrict_ __schedpolicy)); +# endif +_GL_CXXALIASWARN (posix_spawnattr_getschedpolicy); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define posix_spawnattr_setschedpolicy rpl_posix_spawnattr_setschedpolicy +# endif +_GL_FUNCDECL_RPL (posix_spawnattr_setschedpolicy, int, + (posix_spawnattr_t *__attr, int __schedpolicy) + __THROW _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (posix_spawnattr_setschedpolicy, int, + (posix_spawnattr_t *__attr, int __schedpolicy)); +# else +# if !@HAVE_POSIX_SPAWN@ || POSIX_SPAWN_SETSCHEDULER == 0 +_GL_FUNCDECL_SYS (posix_spawnattr_setschedpolicy, int, + (posix_spawnattr_t *__attr, int __schedpolicy) + __THROW _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (posix_spawnattr_setschedpolicy, int, + (posix_spawnattr_t *__attr, int __schedpolicy)); +# endif +_GL_CXXALIASWARN (posix_spawnattr_setschedpolicy); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define posix_spawnattr_getschedparam rpl_posix_spawnattr_getschedparam +# endif +_GL_FUNCDECL_RPL (posix_spawnattr_getschedparam, int, + (const posix_spawnattr_t *_Restrict_ __attr, + struct sched_param *_Restrict_ __schedparam) + __THROW _GL_ARG_NONNULL ((1, 2))); +_GL_CXXALIAS_RPL (posix_spawnattr_getschedparam, int, + (const posix_spawnattr_t *_Restrict_ __attr, + struct sched_param *_Restrict_ __schedparam)); +# else +# if !@HAVE_POSIX_SPAWN@ || POSIX_SPAWN_SETSCHEDPARAM == 0 +_GL_FUNCDECL_SYS (posix_spawnattr_getschedparam, int, + (const posix_spawnattr_t *_Restrict_ __attr, + struct sched_param *_Restrict_ __schedparam) + __THROW _GL_ARG_NONNULL ((1, 2))); +# endif +_GL_CXXALIAS_SYS (posix_spawnattr_getschedparam, int, + (const posix_spawnattr_t *_Restrict_ __attr, + struct sched_param *_Restrict_ __schedparam)); +# endif +_GL_CXXALIASWARN (posix_spawnattr_getschedparam); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define posix_spawnattr_setschedparam rpl_posix_spawnattr_setschedparam +# endif +_GL_FUNCDECL_RPL (posix_spawnattr_setschedparam, int, + (posix_spawnattr_t *_Restrict_ __attr, + const struct sched_param *_Restrict_ __schedparam) + __THROW _GL_ARG_NONNULL ((1, 2))); +_GL_CXXALIAS_RPL (posix_spawnattr_setschedparam, int, + (posix_spawnattr_t *_Restrict_ __attr, + const struct sched_param *_Restrict_ __schedparam)); +# else +# if !@HAVE_POSIX_SPAWN@ || POSIX_SPAWN_SETSCHEDPARAM == 0 +_GL_FUNCDECL_SYS (posix_spawnattr_setschedparam, int, + (posix_spawnattr_t *_Restrict_ __attr, + const struct sched_param *_Restrict_ __schedparam) + __THROW _GL_ARG_NONNULL ((1, 2))); +# endif +_GL_CXXALIAS_SYS (posix_spawnattr_setschedparam, int, + (posix_spawnattr_t *_Restrict_ __attr, + const struct sched_param *_Restrict_ __schedparam)); +# endif +_GL_CXXALIASWARN (posix_spawnattr_setschedparam); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define posix_spawn_file_actions_init rpl_posix_spawn_file_actions_init +# endif +_GL_FUNCDECL_RPL (posix_spawn_file_actions_init, int, + (posix_spawn_file_actions_t *__file_actions) + __THROW _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (posix_spawn_file_actions_init, int, + (posix_spawn_file_actions_t *__file_actions)); +# else +# if !@HAVE_POSIX_SPAWN@ +_GL_FUNCDECL_SYS (posix_spawn_file_actions_init, int, + (posix_spawn_file_actions_t *__file_actions) + __THROW _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (posix_spawn_file_actions_init, int, + (posix_spawn_file_actions_t *__file_actions)); +# endif +_GL_CXXALIASWARN (posix_spawn_file_actions_init); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define posix_spawn_file_actions_destroy rpl_posix_spawn_file_actions_destroy +# endif +_GL_FUNCDECL_RPL (posix_spawn_file_actions_destroy, int, + (posix_spawn_file_actions_t *__file_actions) + __THROW _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (posix_spawn_file_actions_destroy, int, + (posix_spawn_file_actions_t *__file_actions)); +# else +# if !@HAVE_POSIX_SPAWN@ +_GL_FUNCDECL_SYS (posix_spawn_file_actions_destroy, int, + (posix_spawn_file_actions_t *__file_actions) + __THROW _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (posix_spawn_file_actions_destroy, int, + (posix_spawn_file_actions_t *__file_actions)); +# endif +_GL_CXXALIASWARN (posix_spawn_file_actions_destroy); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define posix_spawn_file_actions_addopen rpl_posix_spawn_file_actions_addopen +# endif +_GL_FUNCDECL_RPL (posix_spawn_file_actions_addopen, int, + (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))); +_GL_CXXALIAS_RPL (posix_spawn_file_actions_addopen, int, + (posix_spawn_file_actions_t *_Restrict_ __file_actions, + int __fd, + const char *_Restrict_ __path, int __oflag, mode_t __mode)); +# else +# if !@HAVE_POSIX_SPAWN@ +_GL_FUNCDECL_SYS (posix_spawn_file_actions_addopen, int, + (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 +_GL_CXXALIAS_SYS (posix_spawn_file_actions_addopen, int, + (posix_spawn_file_actions_t *_Restrict_ __file_actions, + int __fd, + const char *_Restrict_ __path, int __oflag, mode_t __mode)); +# endif +_GL_CXXALIASWARN (posix_spawn_file_actions_addopen); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define posix_spawn_file_actions_addclose rpl_posix_spawn_file_actions_addclose +# endif +_GL_FUNCDECL_RPL (posix_spawn_file_actions_addclose, int, + (posix_spawn_file_actions_t *__file_actions, int __fd) + __THROW _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (posix_spawn_file_actions_addclose, int, + (posix_spawn_file_actions_t *__file_actions, int __fd)); +# else +# if !@HAVE_POSIX_SPAWN@ +_GL_FUNCDECL_SYS (posix_spawn_file_actions_addclose, int, + (posix_spawn_file_actions_t *__file_actions, int __fd) + __THROW _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (posix_spawn_file_actions_addclose, int, + (posix_spawn_file_actions_t *__file_actions, int __fd)); +# endif +_GL_CXXALIASWARN (posix_spawn_file_actions_addclose); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define posix_spawn_file_actions_adddup2 rpl_posix_spawn_file_actions_adddup2 +# endif +_GL_FUNCDECL_RPL (posix_spawn_file_actions_adddup2, int, + (posix_spawn_file_actions_t *__file_actions, + int __fd, int __newfd) + __THROW _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (posix_spawn_file_actions_adddup2, int, + (posix_spawn_file_actions_t *__file_actions, + int __fd, int __newfd)); +# else +# if !@HAVE_POSIX_SPAWN@ +_GL_FUNCDECL_SYS (posix_spawn_file_actions_adddup2, int, + (posix_spawn_file_actions_t *__file_actions, + int __fd, int __newfd) + __THROW _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (posix_spawn_file_actions_adddup2, int, + (posix_spawn_file_actions_t *__file_actions, + int __fd, int __newfd)); +# endif +_GL_CXXALIASWARN (posix_spawn_file_actions_adddup2); +#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 + + +#endif /* _@GUARD_PREFIX@_SPAWN_H */ +#endif /* _@GUARD_PREFIX@_SPAWN_H */ diff --git a/gnulib/lib/spawn_faction_addclose.c b/gnulib/lib/spawn_faction_addclose.c new file mode 100644 index 0000000..bd8c4db --- /dev/null +++ b/gnulib/lib/spawn_faction_addclose.c @@ -0,0 +1,59 @@ +/* Copyright (C) 2000, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include + +#include +#include + +#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 0000000..1ebea4a --- /dev/null +++ b/gnulib/lib/spawn_faction_adddup2.c @@ -0,0 +1,60 @@ +/* Copyright (C) 2000, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include + +#include +#include + +#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 0000000..ad72403 --- /dev/null +++ b/gnulib/lib/spawn_faction_addopen.c @@ -0,0 +1,63 @@ +/* Copyright (C) 2000, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include + +#include +#include + +#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 0000000..884209f --- /dev/null +++ b/gnulib/lib/spawn_faction_destroy.c @@ -0,0 +1,31 @@ +/* Copyright (C) 2000, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include + +#include + +/* 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 0000000..f6ef0c9 --- /dev/null +++ b/gnulib/lib/spawn_faction_init.c @@ -0,0 +1,56 @@ +/* Copyright (C) 2000, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include + +#include +#include +#include + +#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 0000000..313af62 --- /dev/null +++ b/gnulib/lib/spawn_int.h @@ -0,0 +1,62 @@ +/* Copyright (C) 2000, 2008-2011 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 . */ + +#include + +/* 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 0000000..5b498a0 --- /dev/null +++ b/gnulib/lib/spawnattr_destroy.c @@ -0,0 +1,28 @@ +/* Copyright (C) 2000, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include + +/* 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 0000000..88ce495 --- /dev/null +++ b/gnulib/lib/spawnattr_getdefault.c @@ -0,0 +1,34 @@ +/* Copyright (C) 2000, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include + +#include + +/* 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 0000000..0e2ec5b --- /dev/null +++ b/gnulib/lib/spawnattr_getflags.c @@ -0,0 +1,32 @@ +/* Copyright (C) 2000, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include + +#include + +/* 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 0000000..e0cefa6 --- /dev/null +++ b/gnulib/lib/spawnattr_getpgroup.c @@ -0,0 +1,32 @@ +/* Copyright (C) 2000, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include + +#include + +/* 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 0000000..69d7014 --- /dev/null +++ b/gnulib/lib/spawnattr_getschedparam.c @@ -0,0 +1,34 @@ +/* Copyright (C) 2000, 2008-2011 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 . */ + +#include + +/* Specification. */ +#include + +/* Get scheduling parameters from the attribute structure. */ +int +posix_spawnattr_getschedparam (const posix_spawnattr_t *attr, + struct sched_param *schedparam) +{ + /* Do nothing if POSIX_SPAWN_SETSCHEDPARAM is unsupported. */ +#if POSIX_SPAWN_SETSCHEDPARAM != 0 + /* Copy the scheduling parameters. */ + *schedparam = attr->_sp; +#endif + + return 0; +} diff --git a/gnulib/lib/spawnattr_getschedpolicy.c b/gnulib/lib/spawnattr_getschedpolicy.c new file mode 100644 index 0000000..3415ca5 --- /dev/null +++ b/gnulib/lib/spawnattr_getschedpolicy.c @@ -0,0 +1,36 @@ +/* Copyright (C) 2000, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include + +#include + +/* Get scheduling policy from the attribute structure. */ +int +posix_spawnattr_getschedpolicy (const posix_spawnattr_t *attr, + int *schedpolicy) +{ + /* Do nothing if POSIX_SPAWN_SETSCHEDULER is unsupported. */ +#if POSIX_SPAWN_SETSCHEDULER != 0 + /* Copy the scheduling policy. */ + *schedpolicy = attr->_policy; +#endif + + return 0; +} diff --git a/gnulib/lib/spawnattr_getsigmask.c b/gnulib/lib/spawnattr_getsigmask.c new file mode 100644 index 0000000..1fca4e2 --- /dev/null +++ b/gnulib/lib/spawnattr_getsigmask.c @@ -0,0 +1,33 @@ +/* Copyright (C) 2000, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include + +#include + +/* 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 0000000..0475080 --- /dev/null +++ b/gnulib/lib/spawnattr_init.c @@ -0,0 +1,33 @@ +/* Copyright (C) 2000, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include + +#include + +/* 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 0000000..213c206 --- /dev/null +++ b/gnulib/lib/spawnattr_setdefault.c @@ -0,0 +1,33 @@ +/* Copyright (C) 2000, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include + +#include + +/* 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 0000000..522d7c2 --- /dev/null +++ b/gnulib/lib/spawnattr_setflags.c @@ -0,0 +1,45 @@ +/* Copyright (C) 2000, 2004, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include + +#include +#include + +#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 0000000..406739b --- /dev/null +++ b/gnulib/lib/spawnattr_setpgroup.c @@ -0,0 +1,32 @@ +/* Copyright (C) 2000, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include + +#include + +/* 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 0000000..4416a3b --- /dev/null +++ b/gnulib/lib/spawnattr_setschedparam.c @@ -0,0 +1,34 @@ +/* Copyright (C) 2000, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include + +/* Store scheduling parameters in the attribute structure. */ +int +posix_spawnattr_setschedparam (posix_spawnattr_t *attr, + const struct sched_param *schedparam) +{ + /* Do nothing if POSIX_SPAWN_SETSCHEDPARAM is unsupported. */ +#if POSIX_SPAWN_SETSCHEDPARAM != 0 + /* Store the scheduling parameters. */ + attr->_sp = *schedparam; +#endif + + return 0; +} diff --git a/gnulib/lib/spawnattr_setschedpolicy.c b/gnulib/lib/spawnattr_setschedpolicy.c new file mode 100644 index 0000000..9eca36a --- /dev/null +++ b/gnulib/lib/spawnattr_setschedpolicy.c @@ -0,0 +1,39 @@ +/* Copyright (C) 2000, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include + +#include + +/* Store scheduling policy in the attribute structure. */ +int +posix_spawnattr_setschedpolicy (posix_spawnattr_t *attr, int schedpolicy) +{ + /* Do nothing if POSIX_SPAWN_SETSCHEDULER is unsupported. */ +#if POSIX_SPAWN_SETSCHEDULER != 0 + if (schedpolicy != SCHED_OTHER && schedpolicy != SCHED_FIFO + && schedpolicy != SCHED_RR) + return EINVAL; + + /* Store the policy. */ + attr->_policy = schedpolicy; +#endif + + return 0; +} diff --git a/gnulib/lib/spawnattr_setsigmask.c b/gnulib/lib/spawnattr_setsigmask.c new file mode 100644 index 0000000..875d2c9 --- /dev/null +++ b/gnulib/lib/spawnattr_setsigmask.c @@ -0,0 +1,33 @@ +/* Copyright (C) 2000, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include + +#include + +/* 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 0000000..9af2781 --- /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-2011 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 . */ + +#include + +/* Specification. */ +#include +#include "spawn_int.h" + +#include +#include + +#include +#ifndef O_LARGEFILE +# define O_LARGEFILE 0 +#endif + +#if _LIBC || HAVE_PATHS_H +# include +#else +# define _PATH_BSHELL "/bin/sh" +#endif + +#include +#include +#include +#include + +#if _LIBC +# include +#else +# define close_not_cancel close +# define open_not_cancel open +#endif + +#if _LIBC +# include +#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 0000000..5ca0fed --- /dev/null +++ b/gnulib/lib/spawnp.c @@ -0,0 +1,33 @@ +/* Copyright (C) 2000, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include + +#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 0000000..5fa78df --- /dev/null +++ b/gnulib/lib/sprintf.c @@ -0,0 +1,80 @@ +/* Formatted output to strings. + Copyright (C) 2004, 2006-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +/* Specification. */ +#include + +#include +#include +#include +#include +#include + +#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/sqrtf.c b/gnulib/lib/sqrtf.c new file mode 100644 index 0000000..02ec7c2 --- /dev/null +++ b/gnulib/lib/sqrtf.c @@ -0,0 +1,26 @@ +/* Square root. + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +float +sqrtf (float x) +{ + return (float) sqrt ((double) x); +} diff --git a/gnulib/lib/sqrtl.c b/gnulib/lib/sqrtl.c new file mode 100644 index 0000000..6795d66 --- /dev/null +++ b/gnulib/lib/sqrtl.c @@ -0,0 +1,71 @@ +/* Emulation for sqrtl. + Contributed by Paolo Bonzini + + Copyright 2002-2003, 2007, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include + +#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE + +long double +sqrtl (long double x) +{ + return sqrt (x); +} + +#else + +# include + +/* 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; +} + +#endif diff --git a/gnulib/lib/stat-macros.h b/gnulib/lib/stat-macros.h new file mode 100644 index 0000000..690216c --- /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-size.h b/gnulib/lib/stat-size.h new file mode 100644 index 0000000..1e47500 --- /dev/null +++ b/gnulib/lib/stat-size.h @@ -0,0 +1,111 @@ +/* macros useful in interpreting size-related values in struct stat. + Copyright (C) 1989, 1991-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ +/* + Macros defined by this file (s is an rvalue of type struct stat): + + DEV_BSIZE: The device blocksize. But use ST_NBLOCKSIZE instead. + ST_BLKSIZE(s): Preferred (in the sense of best performance) I/O blocksize + for the file, in bytes. + ST_NBLOCKS(s): Number of blocks in the file, including indirect blocks. + ST_NBLOCKSIZE: Size of blocks used when calculating ST_NBLOCKS. + */ +#ifndef STAT_SIZE_H +#define STAT_SIZE_H + +/* sys/param.h may define DEV_BSIZE */ +#if HAVE_SYS_PARAM_H +# include +#endif + + +/* Much of the remainder of this file is not indented consistently + with the above, in order to make it easier to see that the text + is almost identical to part of the system.h header in coreutils. +*/ +/* Get or fake the disk device blocksize. + Usually defined by sys/param.h (if at all). */ +#if !defined DEV_BSIZE && defined BSIZE +# define DEV_BSIZE BSIZE +#endif +#if !defined DEV_BSIZE && defined BBSIZE /* SGI sys/param.h */ +# define DEV_BSIZE BBSIZE +#endif +#ifndef DEV_BSIZE +# define DEV_BSIZE 4096 +#endif + + + +/* Extract or fake data from a `struct stat'. + ST_BLKSIZE: Preferred I/O blocksize for the file, in bytes. + ST_NBLOCKS: Number of blocks in the file, including indirect blocks. + ST_NBLOCKSIZE: Size of blocks used when calculating ST_NBLOCKS. */ +#ifndef HAVE_STRUCT_STAT_ST_BLOCKS +# define ST_BLKSIZE(statbuf) DEV_BSIZE + /* coreutils' fileblocks.c also uses BSIZE. */ +# if defined _POSIX_SOURCE || !defined BSIZE +# define ST_NBLOCKS(statbuf) \ + ((statbuf).st_size / ST_NBLOCKSIZE + ((statbuf).st_size % ST_NBLOCKSIZE != 0)) +# else + /* This definition calls st_blocks, which is in the fileblocks module. */ +# define ST_NBLOCKS(statbuf) \ + (S_ISREG ((statbuf).st_mode) || S_ISDIR ((statbuf).st_mode) ? \ + st_blocks ((statbuf).st_size) : 0) +# endif +#else +/* Some systems, like Sequents, return st_blksize of 0 on pipes. + Also, when running `rsh hpux11-system cat any-file', cat would + determine that the output stream had an st_blksize of 2147421096. + Conversely st_blksize can be 2 GiB (or maybe even larger) with XFS + on 64-bit hosts. Somewhat arbitrarily, limit the `optimal' block + size to SIZE_MAX / 8 + 1. (Dividing SIZE_MAX by only 4 wouldn't + suffice, since "cat" sometimes multiplies the result by 4.) If + anyone knows of a system for which this limit is too small, please + report it as a bug in this code. */ +# define ST_BLKSIZE(statbuf) ((0 < (statbuf).st_blksize \ + && (statbuf).st_blksize <= ((size_t)-1) / 8 + 1) \ + ? (statbuf).st_blksize : DEV_BSIZE) +# if defined hpux || defined __hpux__ || defined __hpux + /* HP-UX counts st_blocks in 1024-byte units. + This loses when mixing HP-UX and BSD file systems with NFS. */ +# define ST_NBLOCKSIZE 1024 +# else /* !hpux */ +# if defined _AIX && defined _I386 + /* AIX PS/2 counts st_blocks in 4K units. */ +# define ST_NBLOCKSIZE (4 * 1024) +# else +# if defined _CRAY +# define ST_NBLOCKS(statbuf) \ + (S_ISREG ((statbuf).st_mode) || S_ISDIR ((statbuf).st_mode) \ + ? (statbuf).st_blocks * ST_BLKSIZE (statbuf) / ST_NBLOCKSIZE : 0) +# endif +# endif +# endif +#endif + +#ifndef ST_NBLOCKS +# define ST_NBLOCKS(statbuf) ((statbuf).st_blocks) +#endif + +#ifndef ST_NBLOCKSIZE +# ifdef S_BLKSIZE +# define ST_NBLOCKSIZE S_BLKSIZE +# else +# define ST_NBLOCKSIZE 512 +# endif +#endif + +#endif /* STAT_SIZE_H */ diff --git a/gnulib/lib/stat-time.h b/gnulib/lib/stat-time.h new file mode 100644 index 0000000..86d9d4b --- /dev/null +++ b/gnulib/lib/stat-time.h @@ -0,0 +1,189 @@ +/* stat-related time functions. + + Copyright (C) 2005, 2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +#ifndef STAT_TIME_H +#define STAT_TIME_H 1 + +#include +#include + +/* 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 tv_sec and tv_nsec both equal to -1. */ +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 + . */ + t.tv_sec = st->st_ctime; + t.tv_nsec = 0; +#else + /* Birth time is not supported. */ + 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 is detected. */ + if (! (t.tv_sec && 0 <= t.tv_nsec && t.tv_nsec < 1000000000)) + { + t.tv_sec = -1; + 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 0000000..1397aa9 --- /dev/null +++ b/gnulib/lib/stat.c @@ -0,0 +1,123 @@ +/* Work around platform bugs in stat. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Eric Blake */ + +/* If the user's config.h happens to include , let it include only + the system's here, so that orig_stat doesn't recurse to + rpl_stat. */ +#define __need_system_sys_stat_h +#include + +/* Get the original definition of stat. It might be defined as a macro. */ +#include +#include +#undef __need_system_sys_stat_h + +static inline int +orig_stat (const char *filename, struct stat *buf) +{ + return stat (filename, buf); +} + +/* Specification. */ +/* Write "sys/stat.h" here, not , otherwise OSF/1 5.1 DTK cc + eliminates this include because of the preliminary #include + above. */ +#include "sys/stat.h" + +#include +#include +#include +#include +#include "dosname.h" +#include "verify.h" + +#if REPLACE_FUNC_STAT_DIR +# include "pathmax.h" + /* The only known systems where REPLACE_FUNC_STAT_DIR is needed also + have a constant PATH_MAX. */ +# ifndef PATH_MAX +# error "Please port this replacement to your platform" +# endif +#endif + +/* 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; + verify (PATH_MAX <= 4096); + 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/stdalign.in.h b/gnulib/lib/stdalign.in.h new file mode 100644 index 0000000..37446a7 --- /dev/null +++ b/gnulib/lib/stdalign.in.h @@ -0,0 +1,89 @@ +/* A substitute for ISO C 1x . + + Copyright 2011 Free Software Foundation, Inc. + + This program is free software; you can 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 and Bruno Haible. */ + +#ifndef _GL_STDALIGN_H +#define _GL_STDALIGN_H + +/* ISO C1X for platforms that lack it. + + References: + ISO C1X + sections 6.5.3.4, 6.7.5, 7.15. + C++0X + section 18.10. */ + +/* alignof (TYPE), also known as _Alignof (TYPE), yields the alignment + requirement of a structure member (i.e., slot or field) that is of + type TYPE, as an integer constant expression. + + This differs from GCC's __alignof__ operator, which can yield a + better-performing alignment for an object of that type. For + example, on x86 with GCC, __alignof__ (double) and __alignof__ + (long long) are 8, whereas alignof (double) and alignof (long long) + are 4 unless the option '-malign-double' is used. + + The result cannot be used as a value for an 'enum' constant, if you + want to be portable to HP-UX 10.20 cc and AIX 3.2.5 xlc. */ +#include +#if defined __cplusplus + template struct __alignof_helper { char __a; __t __b; }; +# define _Alignof(type) offsetof (__alignof_helper, __b) +#else +# define _Alignof(type) offsetof (struct { char __a; type __b; }, __b) +#endif +#define alignof _Alignof +#define __alignof_is_defined 1 + +/* alignas (A), also known as _Alignas (A), aligns a variable or type + to the alignment A, where A is an integer constant expression. For + example: + + int alignas (8) foo; + struct s { int a; int alignas (8) bar; }; + + aligns the address of FOO and the offset of BAR to be multiples of 8. + + A should be a power of two that is at least the type's alignment + and at most the implementation's alignment limit. This limit is + 2**28 on typical GNUish hosts, and 2**13 on MSVC. To be portable + to MSVC through at least version 10.0, A should be an integer + constant, as MSVC does not support expressions such as 1 << 3. + To be portable to Sun C 5.11, do not align auto variables to + anything stricter than their default alignment. + + The following draft C1X requirements are not supported here: + + - If A is zero, alignas has no effect. + - alignas can be used multiple times; the strictest one wins. + - alignas (TYPE) is equivalent to alignas (alignof (TYPE)). + + */ + +#if __GNUC__ || __IBMC__ || __IBMCPP__ || 0x5110 <= __SUNPRO_C +# define _Alignas(a) __attribute__ ((__aligned__ (a))) +#elif 1300 <= _MSC_VER +# define _Alignas(a) __declspec (align (a)) +#endif +#ifdef _Alignas +# define alignas _Alignas +# define __alignas_is_defined 1 +#endif + +#endif /* _GL_STDALIGN_H */ diff --git a/gnulib/lib/stdarg.in.h b/gnulib/lib/stdarg.in.h new file mode 100644 index 0000000..345e5f0 --- /dev/null +++ b/gnulib/lib/stdarg.in.h @@ -0,0 +1,36 @@ +/* Substitute for and wrapper around . + Copyright (C) 2008-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 _@GUARD_PREFIX@_STDARG_H + +#if __GNUC__ >= 3 +@PRAGMA_SYSTEM_HEADER@ +#endif +@PRAGMA_COLUMNS@ + +/* The include_next requires a split double-inclusion guard. */ +#@INCLUDE_NEXT@ @NEXT_STDARG_H@ + +#ifndef _@GUARD_PREFIX@_STDARG_H +#define _@GUARD_PREFIX@_STDARG_H + +#ifndef va_copy +# define va_copy(a,b) ((a) = (b)) +#endif + +#endif /* _@GUARD_PREFIX@_STDARG_H */ +#endif /* _@GUARD_PREFIX@_STDARG_H */ diff --git a/gnulib/lib/stdbool.in.h b/gnulib/lib/stdbool.in.h new file mode 100644 index 0000000..5b371fd --- /dev/null +++ b/gnulib/lib/stdbool.in.h @@ -0,0 +1,122 @@ +/* Copyright (C) 2001-2003, 2006-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 for platforms that lack it. */ + +/* Usage suggestions: + + Programs that use should be aware of some limitations + and standards compliance issues. + + Standards compliance: + + - 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: + + - 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'. + + - C99 allows the use of (_Bool)0.0 in constant expressions, but + this substitute cannot always provide this property. + + 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 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 /* 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 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 0000000..6ac06da --- /dev/null +++ b/gnulib/lib/stddef.in.h @@ -0,0 +1,87 @@ +/* A substitute for POSIX 2008 , for platforms that have issues. + + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 for platforms that have issues. + * + */ + +#if __GNUC__ >= 3 +@PRAGMA_SYSTEM_HEADER@ +#endif +@PRAGMA_COLUMNS@ + +#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 that blindly + redefines NULL even when __need_wint_t was defined, even though + wint_t is not normally provided by . 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 _@GUARD_PREFIX@_STDDEF_H && defined _GL_STDDEF_WINT_T) +# ifdef __need_wint_t +# undef _@GUARD_PREFIX@_STDDEF_H +# define _GL_STDDEF_WINT_T +# endif +# @INCLUDE_NEXT@ @NEXT_STDDEF_H@ +# endif + +#else +/* Normal invocation convention. */ + +# ifndef _@GUARD_PREFIX@_STDDEF_H + +/* The include_next requires a split double-inclusion guard. */ + +# @INCLUDE_NEXT@ @NEXT_STDDEF_H@ + +# ifndef _@GUARD_PREFIX@_STDDEF_H +# define _@GUARD_PREFIX@_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 /* _@GUARD_PREFIX@_STDDEF_H */ +# endif /* _@GUARD_PREFIX@_STDDEF_H */ +#endif /* __need_XXX */ diff --git a/gnulib/lib/stdint.in.h b/gnulib/lib/stdint.in.h new file mode 100644 index 0000000..7769582 --- /dev/null +++ b/gnulib/lib/stdint.in.h @@ -0,0 +1,609 @@ +/* Copyright (C) 2001-2002, 2004-2011 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 for platforms that lack it. + * + */ + +#ifndef _@GUARD_PREFIX@_STDINT_H + +#if __GNUC__ >= 3 +@PRAGMA_SYSTEM_HEADER@ +#endif +@PRAGMA_COLUMNS@ + +/* When including a system file that in turn includes , + use the system , not our substitute. This avoids + problems with (for example) VMS, whose includes + . */ +#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 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 + + /* Some pre-C++11 implementations need this. */ +# ifdef __cplusplus +# ifndef __STDC_CONSTANT_MACROS +# define __STDC_CONSTANT_MACROS 1 +# endif +# ifndef __STDC_LIMIT_MACROS +# define __STDC_LIMIT_MACROS 1 +# endif +# endif + + /* Other systems may have an incomplete or buggy . + Include it before , since any "#include " + in would reinclude us, skipping our contents because + _@GUARD_PREFIX@_STDINT_H is defined. + The include_next requires a split double-inclusion guard. */ +# @INCLUDE_NEXT@ @NEXT_STDINT_H@ +#endif + +#if ! defined _@GUARD_PREFIX@_STDINT_H && ! defined _GL_JUST_INCLUDE_SYSTEM_STDINT_H +#define _@GUARD_PREFIX@_STDINT_H + +/* defines some of the stdint.h types as well, on glibc, + IRIX 6.5, and OpenBSD 3.8 (via ). + AIX 5.2 isn't needed and causes troubles. + MacOS X 10.4.6 includes (which is us), but + relies on the system definitions, so include + after @NEXT_STDINT_H@. */ +#if @HAVE_SYS_TYPES_H@ && ! defined _AIX +# include +#endif + +/* Get LONG_MIN, LONG_MAX, ULONG_MAX. */ +#include + +#if @HAVE_INTTYPES_H@ + /* In OpenBSD 3.8, includes , which defines + int{8,16,32,64}_t, uint{8,16,32,64}_t and __BIT_TYPES_DEFINED__. + also defines intptr_t and uintptr_t. */ +# include +#elif @HAVE_SYS_INTTYPES_H@ + /* Solaris 7 has the types except the *_fast*_t types, and + the macros except for *_FAST*_*, INTPTR_MIN, PTRDIFF_MIN, PTRDIFF_MAX. */ +# include +#endif + +#if @HAVE_SYS_BITYPES_H@ && ! defined __BIT_TYPES_DEFINED__ + /* Linux libc4 >= 4.6.7 and libc5 have a that defines + int{8,16,32,64}_t and __BIT_TYPES_DEFINED__. In libc5 >= 5.2.2 it is + included by . */ +# include +#endif + +#undef _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H + +/* Minimum and maximum values for an 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) + +#if !GNULIB_defined_stdint_types + +/* 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 + +/* If the system defines INT64_MAX, assume int64_t works. That way, + if the underlying platform defines int64_t to be a 64-bit long long + int, the code below won't mistakenly define it to be a 64-bit long + int, which would mess up C++ name mangling. We must use #ifdef + rather than #if, to avoid an error with HP-UX 10.20 cc. */ + +#ifdef INT64_MAX +# define GL_INT64_T +#else +/* 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 +#endif + +#ifdef UINT64_MAX +# define GL_UINT64_T +#else +# 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 +#endif + +/* Avoid collision with Solaris 2.5.1 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 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. */ + +/* If the system defines INTMAX_MAX, assume that intmax_t works, and + similarly for UINTMAX_MAX and uintmax_t. This avoids problems with + assuming one type where another is used by the system. */ + +#ifndef INTMAX_MAX +# undef INTMAX_C +# 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 +#endif + +#ifndef UINTMAX_MAX +# undef UINTMAX_C +# 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 +#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[sizeof (intmax_t) == sizeof (uintmax_t) + ? 1 : -1]; + +#define GNULIB_defined_stdint_types 1 +#endif /* !GNULIB_defined_stdint_types */ + +/* 7.18.2. Limits of specified-width integer types */ + +/* 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 + +#if defined GL_INT64_T && ! defined INT64_MAX +/* 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 + +#if defined GL_UINT64_T && ! defined UINT64_MAX +# 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 */ + +#ifndef INTMAX_MAX +# undef INTMAX_MIN +# 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 +#endif + +#ifndef UINTMAX_MAX +# ifdef UINT64_MAX +# define UINTMAX_MAX UINT64_MAX +# else +# define UINTMAX_MAX UINT32_MAX +# endif +#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 + -> -> -> , and the latter includes + and assumes its types are already defined. */ +#if @HAVE_WCHAR_H@ && ! (defined WCHAR_MIN && defined WCHAR_MAX) + /* BSD/OS 4.0.1 has a bug: , and must be + included before . */ +# include +# include +# include +# define _GL_JUST_INCLUDE_SYSTEM_WCHAR_H +# include +# 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@) + +/* 7.18.4. Macros for integer constants */ + +/* 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 */ + +#ifndef 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 +#endif + +#ifndef 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 + +#endif /* _@GUARD_PREFIX@_STDINT_H */ +#endif /* !defined _@GUARD_PREFIX@_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 0000000..adde0f9 --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +#include +#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 0000000..d41c32f --- /dev/null +++ b/gnulib/lib/stdio-impl.h @@ -0,0 +1,110 @@ +/* Implementation details of FILE streams. + Copyright (C) 2007-2008, 2010-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* 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 __NetBSD__ /* NetBSD */ +/* Get __NetBSD_Version__. */ +# include +#endif + +#if defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */ + +# if defined __DragonFly__ /* DragonFly */ + /* See . */ +# 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 . */ +# define _p pub._p +# define _flags pub._flags +# define _r pub._r +# define _w pub._w +# else +# define fp_ fp +# endif + +# if (defined __NetBSD__ && __NetBSD_Version__ >= 105270000) || defined __OpenBSD__ /* NetBSD >= 1.5ZA, OpenBSD */ + /* See + and */ + struct __sfileext + { + struct __sbuf _ub; /* ungetc buffer */ + /* More fields, not relevant here. */ + }; +# define fp_ub ((struct __sfileext *) fp->_ext._base)->_ub +# else /* FreeBSD, NetBSD <= 1.5Z, DragonFly, MacOS X, Cygwin */ +# define fp_ub fp_->_ub +# endif + +# define HASUB(fp) (fp_ub._base != NULL) + +#endif + + +/* SystemV derived implementations. */ + +#ifdef __TANDEM /* NonStop Kernel */ +# ifndef _IOERR +/* These values were determined by the program 'stdioext-flags' at + . */ +# define _IOERR 0x40 +# define _IOREAD 0x80 +# define _IOWRT 0x4 +# define _IORW 0x100 +# endif +#endif + +#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-read.c b/gnulib/lib/stdio-read.c new file mode 100644 index 0000000..86b1d61 --- /dev/null +++ b/gnulib/lib/stdio-read.c @@ -0,0 +1,150 @@ +/* POSIX compatible FILE stream read function. + Copyright (C) 2008-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +/* Replace these functions only if module 'nonblocking' is requested. */ +#if GNULIB_NONBLOCKING + +/* On native Windows platforms, when read() is called on a non-blocking pipe + with an empty buffer, ReadFile() fails with error GetLastError() = + ERROR_NO_DATA, and read() in consequence fails with error EINVAL. This + read() function is at the basis of the function which fills the buffer of + a FILE stream. */ + +# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ + +# include +# include + +# define WIN32_LEAN_AND_MEAN /* avoid including junk */ +# include + +# include "msvc-nothrow.h" + +# define CALL_WITH_ERRNO_FIX(RETTYPE, EXPRESSION, FAILED) \ + if (ferror (stream)) \ + return (EXPRESSION); \ + else \ + { \ + RETTYPE ret; \ + SetLastError (0); \ + ret = (EXPRESSION); \ + if (FAILED) \ + { \ + if (GetLastError () == ERROR_NO_DATA && ferror (stream)) \ + { \ + int fd = fileno (stream); \ + if (fd >= 0) \ + { \ + HANDLE h = (HANDLE) _get_osfhandle (fd); \ + if (GetFileType (h) == FILE_TYPE_PIPE) \ + { \ + /* h is a pipe or socket. */ \ + DWORD state; \ + if (GetNamedPipeHandleState (h, &state, NULL, NULL, \ + NULL, NULL, 0) \ + && (state & PIPE_NOWAIT) != 0) \ + /* h is a pipe in non-blocking mode. \ + Change errno from EINVAL to EAGAIN. */ \ + errno = EAGAIN; \ + } \ + } \ + } \ + } \ + return ret; \ + } + +int +scanf (const char *format, ...) +{ + int retval; + va_list args; + + va_start (args, format); + retval = vfscanf (stdin, format, args); + va_end (args); + + return retval; +} + +int +fscanf (FILE *stream, const char *format, ...) +{ + int retval; + va_list args; + + va_start (args, format); + retval = vfscanf (stream, format, args); + va_end (args); + + return retval; +} + +int +vscanf (const char *format, va_list args) +{ + return vfscanf (stdin, format, args); +} + +int +vfscanf (FILE *stream, const char *format, va_list args) +#undef vfscanf +{ + CALL_WITH_ERRNO_FIX (int, vfscanf (stream, format, args), ret == EOF) +} + +int +getchar (void) +{ + return fgetc (stdin); +} + +int +fgetc (FILE *stream) +#undef fgetc +{ + CALL_WITH_ERRNO_FIX (int, fgetc (stream), ret == EOF) +} + +char * +fgets (char *s, int n, FILE *stream) +#undef fgets +{ + CALL_WITH_ERRNO_FIX (char *, fgets (s, n, stream), ret == NULL) +} + +char * +gets (char *s) +#undef gets +{ + FILE *stream = stdin; + CALL_WITH_ERRNO_FIX (char *, gets (s), ret == NULL) +} + +size_t +fread (void *ptr, size_t s, size_t n, FILE *stream) +#undef fread +{ + CALL_WITH_ERRNO_FIX (size_t, fread (ptr, s, n, stream), ret < n) +} + +# endif +#endif diff --git a/gnulib/lib/stdio-safer.h b/gnulib/lib/stdio-safer.h new file mode 100644 index 0000000..62fdf64 --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +#include + +#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 0000000..02aed45 --- /dev/null +++ b/gnulib/lib/stdio-write.c @@ -0,0 +1,198 @@ +/* POSIX compatible FILE stream write function. + Copyright (C) 2008-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include + +/* Replace these functions only if module 'nonblocking' or module 'sigpipe' is + requested. */ +#if GNULIB_NONBLOCKING || 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 +# include +# include + +# define WIN32_LEAN_AND_MEAN /* avoid including junk */ +# include + +# include "msvc-nothrow.h" + +# if GNULIB_NONBLOCKING +# define CLEAR_ERRNO \ + errno = 0; +# define HANDLE_ENOSPC \ + if (errno == ENOSPC && ferror (stream)) \ + { \ + int fd = fileno (stream); \ + if (fd >= 0) \ + { \ + HANDLE h = (HANDLE) _get_osfhandle (fd); \ + if (GetFileType (h) == FILE_TYPE_PIPE) \ + { \ + /* h is a pipe or socket. */ \ + DWORD state; \ + if (GetNamedPipeHandleState (h, &state, NULL, NULL, \ + NULL, NULL, 0) \ + && (state & PIPE_NOWAIT) != 0) \ + /* h is a pipe in non-blocking mode. \ + Change errno from ENOSPC to EAGAIN. */ \ + errno = EAGAIN; \ + } \ + } \ + } \ + else +# else +# define CLEAR_ERRNO +# define HANDLE_ENOSPC +# endif + +# if GNULIB_SIGPIPE +# define CLEAR_LastError \ + SetLastError (0); +# define HANDLE_ERROR_NO_DATA \ + if (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; \ + } \ + } \ + else +# else +# define CLEAR_LastError +# define HANDLE_ERROR_NO_DATA +# endif + +# define CALL_WITH_SIGPIPE_EMULATION(RETTYPE, EXPRESSION, FAILED) \ + if (ferror (stream)) \ + return (EXPRESSION); \ + else \ + { \ + RETTYPE ret; \ + CLEAR_ERRNO \ + CLEAR_LastError \ + ret = (EXPRESSION); \ + if (FAILED) \ + { \ + HANDLE_ENOSPC \ + HANDLE_ERROR_NO_DATA \ + ; \ + } \ + return ret; \ + } + +# if !REPLACE_PRINTF_POSIX /* avoid collision with 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 + +# 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 0000000..ebbf801 --- /dev/null +++ b/gnulib/lib/stdio.in.h @@ -0,0 +1,1350 @@ +/* A GNU-like . + + Copyright (C) 2004, 2007-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 +@PRAGMA_COLUMNS@ + +#if defined __need_FILE || defined __need___FILE || defined _GL_ALREADY_INCLUDING_STDIO_H +/* Special invocation convention: + - Inside glibc header files. + - On OSF/1 5.1 we have a sequence of nested includes + -> -> -> -> + -> -> -> . + In this situation, the functions are not yet declared, therefore we cannot + provide the C++ aliases. */ + +#@INCLUDE_NEXT@ @NEXT_STDIO_H@ + +#else +/* Normal invocation convention. */ + +#ifndef _@GUARD_PREFIX@_STDIO_H + +#define _GL_ALREADY_INCLUDING_STDIO_H + +/* The include_next requires a split double-inclusion guard. */ +#@INCLUDE_NEXT@ @NEXT_STDIO_H@ + +#undef _GL_ALREADY_INCLUDING_STDIO_H + +#ifndef _@GUARD_PREFIX@_STDIO_H +#define _@GUARD_PREFIX@_STDIO_H + +/* Get va_list. Needed on many systems, including glibc 2.8. */ +#include + +#include + +/* Get off_t and ssize_t. Needed on many systems, including glibc 2.8 + and eglibc 2.11.2. */ +#include + +/* 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 _GL_ATTRIBUTE_FORMAT 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 _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec)) +#else +# define _GL_ATTRIBUTE_FORMAT(spec) /* empty */ +#endif + +/* _GL_ATTRIBUTE_FORMAT_PRINTF + indicates to GCC that the function takes a format string and arguments, + where the format string directives are the ones standardized by ISO C99 + and POSIX. */ +#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4) +# define _GL_ATTRIBUTE_FORMAT_PRINTF(formatstring_parameter, first_argument) \ + _GL_ATTRIBUTE_FORMAT ((__gnu_printf__, formatstring_parameter, first_argument)) +#else +# define _GL_ATTRIBUTE_FORMAT_PRINTF(formatstring_parameter, first_argument) \ + _GL_ATTRIBUTE_FORMAT ((__printf__, formatstring_parameter, first_argument)) +#endif + +/* _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM is like _GL_ATTRIBUTE_FORMAT_PRINTF, + except that it indicates to GCC that the supported format string directives + are the ones of the system printf(), rather than the ones standardized by + ISO C99 and POSIX. */ +#define _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM(formatstring_parameter, first_argument) \ + _GL_ATTRIBUTE_FORMAT ((__printf__, formatstring_parameter, first_argument)) + +/* _GL_ATTRIBUTE_FORMAT_SCANF + indicates to GCC that the function takes a format string and arguments, + where the format string directives are the ones standardized by ISO C99 + and POSIX. */ +#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4) +# define _GL_ATTRIBUTE_FORMAT_SCANF(formatstring_parameter, first_argument) \ + _GL_ATTRIBUTE_FORMAT ((__gnu_scanf__, formatstring_parameter, first_argument)) +#else +# define _GL_ATTRIBUTE_FORMAT_SCANF(formatstring_parameter, first_argument) \ + _GL_ATTRIBUTE_FORMAT ((__scanf__, formatstring_parameter, first_argument)) +#endif + +/* _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM is like _GL_ATTRIBUTE_FORMAT_SCANF, + except that it indicates to GCC that the supported format string directives + are the ones of the system scanf(), rather than the ones standardized by + ISO C99 and POSIX. */ +#define _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM(formatstring_parameter, first_argument) \ + _GL_ATTRIBUTE_FORMAT ((__scanf__, formatstring_parameter, first_argument)) + +/* Solaris 10 declares renameat in , not in . */ +/* But in any case avoid namespace pollution on glibc systems. */ +#if (@GNULIB_RENAMEAT@ || defined GNULIB_POSIXCHECK) && defined __sun \ + && ! defined __GLIBC__ +# include +#endif + + +/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ + +/* The definition of _GL_ARG_NONNULL is copied here. */ + +/* The definition of _GL_WARN_ON_USE is copied here. */ + +/* Macros for stringification. */ +#define _GL_STDIO_STRINGIZE(token) #token +#define _GL_STDIO_MACROEXPAND_AND_STRINGIZE(token) _GL_STDIO_STRINGIZE(token) + + +#if @GNULIB_DPRINTF@ +# if @REPLACE_DPRINTF@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define dprintf rpl_dprintf +# endif +_GL_FUNCDECL_RPL (dprintf, int, (int fd, const char *format, ...) + _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3) + _GL_ARG_NONNULL ((2))); +_GL_CXXALIAS_RPL (dprintf, int, (int fd, const char *format, ...)); +# else +# if !@HAVE_DPRINTF@ +_GL_FUNCDECL_SYS (dprintf, int, (int fd, const char *format, ...) + _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3) + _GL_ARG_NONNULL ((2))); +# endif +_GL_CXXALIAS_SYS (dprintf, int, (int fd, const char *format, ...)); +# endif +_GL_CXXALIASWARN (dprintf); +#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@ +/* Close STREAM and its underlying file descriptor. */ +# if @REPLACE_FCLOSE@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define fclose rpl_fclose +# endif +_GL_FUNCDECL_RPL (fclose, int, (FILE *stream) _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (fclose, int, (FILE *stream)); +# else +_GL_CXXALIAS_SYS (fclose, int, (FILE *stream)); +# endif +_GL_CXXALIASWARN (fclose); +#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_FDOPEN@ +# if @REPLACE_FDOPEN@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef fdopen +# define fdopen rpl_fdopen +# endif +_GL_FUNCDECL_RPL (fdopen, FILE *, (int fd, const char *mode) + _GL_ARG_NONNULL ((2))); +_GL_CXXALIAS_RPL (fdopen, FILE *, (int fd, const char *mode)); +# else +_GL_CXXALIAS_SYS (fdopen, FILE *, (int fd, const char *mode)); +# endif +_GL_CXXALIASWARN (fdopen); +#elif defined GNULIB_POSIXCHECK +# undef fdopen +/* Assume fdopen is always declared. */ +_GL_WARN_ON_USE (fdopen, "fdopen on Win32 platforms is not POSIX compatible - " + "use gnulib module fdopen for portability"); +#endif + +#if @GNULIB_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). */ +# if @REPLACE_FFLUSH@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define fflush rpl_fflush +# endif +_GL_FUNCDECL_RPL (fflush, int, (FILE *gl_stream)); +_GL_CXXALIAS_RPL (fflush, int, (FILE *gl_stream)); +# else +_GL_CXXALIAS_SYS (fflush, int, (FILE *gl_stream)); +# endif +_GL_CXXALIASWARN (fflush); +#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 + +#if @GNULIB_FGETC@ +# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef fgetc +# define fgetc rpl_fgetc +# endif +_GL_FUNCDECL_RPL (fgetc, int, (FILE *stream) _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (fgetc, int, (FILE *stream)); +# else +_GL_CXXALIAS_SYS (fgetc, int, (FILE *stream)); +# endif +_GL_CXXALIASWARN (fgetc); +#endif + +#if @GNULIB_FGETS@ +# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef fgets +# define fgets rpl_fgets +# endif +_GL_FUNCDECL_RPL (fgets, char *, (char *s, int n, FILE *stream) + _GL_ARG_NONNULL ((1, 3))); +_GL_CXXALIAS_RPL (fgets, char *, (char *s, int n, FILE *stream)); +# else +_GL_CXXALIAS_SYS (fgets, char *, (char *s, int n, FILE *stream)); +# endif +_GL_CXXALIASWARN (fgets); +#endif + +#if @GNULIB_FOPEN@ +# if @REPLACE_FOPEN@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef fopen +# define fopen rpl_fopen +# endif +_GL_FUNCDECL_RPL (fopen, FILE *, (const char *filename, const char *mode) + _GL_ARG_NONNULL ((1, 2))); +_GL_CXXALIAS_RPL (fopen, FILE *, (const char *filename, const char *mode)); +# else +_GL_CXXALIAS_SYS (fopen, FILE *, (const char *filename, const char *mode)); +# endif +_GL_CXXALIASWARN (fopen); +#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_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@)) +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define fprintf rpl_fprintf +# endif +# define GNULIB_overrides_fprintf 1 +# if @GNULIB_FPRINTF_POSIX@ || @GNULIB_VFPRINTF_POSIX@ +_GL_FUNCDECL_RPL (fprintf, int, (FILE *fp, const char *format, ...) + _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3) + _GL_ARG_NONNULL ((1, 2))); +# else +_GL_FUNCDECL_RPL (fprintf, int, (FILE *fp, const char *format, ...) + _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (2, 3) + _GL_ARG_NONNULL ((1, 2))); +# endif +_GL_CXXALIAS_RPL (fprintf, int, (FILE *fp, const char *format, ...)); +# else +_GL_CXXALIAS_SYS (fprintf, int, (FILE *fp, const char *format, ...)); +# endif +_GL_CXXALIASWARN (fprintf); +#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@ +/* 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. */ +# if @REPLACE_FPURGE@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define fpurge rpl_fpurge +# endif +_GL_FUNCDECL_RPL (fpurge, int, (FILE *gl_stream) _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (fpurge, int, (FILE *gl_stream)); +# else +# if !@HAVE_DECL_FPURGE@ +_GL_FUNCDECL_SYS (fpurge, int, (FILE *gl_stream) _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (fpurge, int, (FILE *gl_stream)); +# endif +_GL_CXXALIASWARN (fpurge); +#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@ +# if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@) +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef fputc +# define fputc rpl_fputc +# endif +_GL_FUNCDECL_RPL (fputc, int, (int c, FILE *stream) _GL_ARG_NONNULL ((2))); +_GL_CXXALIAS_RPL (fputc, int, (int c, FILE *stream)); +# else +_GL_CXXALIAS_SYS (fputc, int, (int c, FILE *stream)); +# endif +_GL_CXXALIASWARN (fputc); +#endif + +#if @GNULIB_FPUTS@ +# if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@) +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef fputs +# define fputs rpl_fputs +# endif +_GL_FUNCDECL_RPL (fputs, int, (const char *string, FILE *stream) + _GL_ARG_NONNULL ((1, 2))); +_GL_CXXALIAS_RPL (fputs, int, (const char *string, FILE *stream)); +# else +_GL_CXXALIAS_SYS (fputs, int, (const char *string, FILE *stream)); +# endif +_GL_CXXALIASWARN (fputs); +#endif + +#if @GNULIB_FREAD@ +# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef fread +# define fread rpl_fread +# endif +_GL_FUNCDECL_RPL (fread, size_t, (void *ptr, size_t s, size_t n, FILE *stream) + _GL_ARG_NONNULL ((4))); +_GL_CXXALIAS_RPL (fread, size_t, (void *ptr, size_t s, size_t n, FILE *stream)); +# else +_GL_CXXALIAS_SYS (fread, size_t, (void *ptr, size_t s, size_t n, FILE *stream)); +# endif +_GL_CXXALIASWARN (fread); +#endif + +#if @GNULIB_FREOPEN@ +# if @REPLACE_FREOPEN@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef freopen +# define freopen rpl_freopen +# endif +_GL_FUNCDECL_RPL (freopen, FILE *, + (const char *filename, const char *mode, FILE *stream) + _GL_ARG_NONNULL ((2, 3))); +_GL_CXXALIAS_RPL (freopen, FILE *, + (const char *filename, const char *mode, FILE *stream)); +# else +_GL_CXXALIAS_SYS (freopen, FILE *, + (const char *filename, const char *mode, FILE *stream)); +# endif +_GL_CXXALIASWARN (freopen); +#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 + +#if @GNULIB_FSCANF@ +# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef fscanf +# define fscanf rpl_fscanf +# endif +_GL_FUNCDECL_RPL (fscanf, int, (FILE *stream, const char *format, ...) + _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (2, 3) + _GL_ARG_NONNULL ((1, 2))); +_GL_CXXALIAS_RPL (fscanf, int, (FILE *stream, const char *format, ...)); +# else +_GL_CXXALIAS_SYS (fscanf, int, (FILE *stream, const char *format, ...)); +# endif +_GL_CXXALIASWARN (fscanf); +#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. + In C++ compilations with GNULIB_NAMESPACE, in order to avoid that + fseek gets defined as a macro, it is recommended that the developer + uses the fseek module, even if he is not calling the fseek function. + + 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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef fseek +# define fseek rpl_fseek +# endif +_GL_FUNCDECL_RPL (fseek, int, (FILE *fp, long offset, int whence) + _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (fseek, int, (FILE *fp, long offset, int whence)); +# else +_GL_CXXALIAS_SYS (fseek, int, (FILE *fp, long offset, int whence)); +# endif +_GL_CXXALIASWARN (fseek); +#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 an fseeko function that is aware of a preceding fflush(), and which + detects pipes. */ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef fseeko +# define fseeko rpl_fseeko +# endif +_GL_FUNCDECL_RPL (fseeko, int, (FILE *fp, off_t offset, int whence) + _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (fseeko, int, (FILE *fp, off_t offset, int whence)); +# else +# if ! @HAVE_DECL_FSEEKO@ +_GL_FUNCDECL_SYS (fseeko, int, (FILE *fp, off_t offset, int whence) + _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (fseeko, int, (FILE *fp, off_t offset, int whence)); +# endif +_GL_CXXALIASWARN (fseeko); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef ftell +# define ftell rpl_ftell +# endif +_GL_FUNCDECL_RPL (ftell, long, (FILE *fp) _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (ftell, long, (FILE *fp)); +# else +_GL_CXXALIAS_SYS (ftell, long, (FILE *fp)); +# endif +_GL_CXXALIASWARN (ftell); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef ftello +# define ftello rpl_ftello +# endif +_GL_FUNCDECL_RPL (ftello, off_t, (FILE *fp) _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (ftello, off_t, (FILE *fp)); +# else +# if ! @HAVE_DECL_FTELLO@ +_GL_FUNCDECL_SYS (ftello, off_t, (FILE *fp) _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (ftello, off_t, (FILE *fp)); +# endif +_GL_CXXALIASWARN (ftello); +#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@ +# if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@) +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef fwrite +# define fwrite rpl_fwrite +# endif +_GL_FUNCDECL_RPL (fwrite, size_t, + (const void *ptr, size_t s, size_t n, FILE *stream) + _GL_ARG_NONNULL ((1, 4))); +_GL_CXXALIAS_RPL (fwrite, size_t, + (const void *ptr, size_t s, size_t n, FILE *stream)); +# else +_GL_CXXALIAS_SYS (fwrite, size_t, + (const void *ptr, size_t s, size_t n, FILE *stream)); + +/* Work around glibc bug 11959 + , + which sometimes causes an unwanted diagnostic for fwrite calls. + This affects only function declaration attributes, so it's not + needed for C++. */ +# if !defined __cplusplus && 0 < __USE_FORTIFY_LEVEL +static inline size_t _GL_ARG_NONNULL ((1, 4)) +rpl_fwrite (const void *ptr, size_t s, size_t n, FILE *stream) +{ + size_t r = fwrite (ptr, s, n, stream); + (void) r; + return r; +} +# undef fwrite +# define fwrite rpl_fwrite +# endif +# endif +_GL_CXXALIASWARN (fwrite); +#endif + +#if @GNULIB_GETC@ +# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef getc +# define getc rpl_fgetc +# endif +_GL_FUNCDECL_RPL (fgetc, int, (FILE *stream) _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL_1 (getc, rpl_fgetc, int, (FILE *stream)); +# else +_GL_CXXALIAS_SYS (getc, int, (FILE *stream)); +# endif +_GL_CXXALIASWARN (getc); +#endif + +#if @GNULIB_GETCHAR@ +# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef getchar +# define getchar rpl_getchar +# endif +_GL_FUNCDECL_RPL (getchar, int, (void)); +_GL_CXXALIAS_RPL (getchar, int, (void)); +# else +_GL_CXXALIAS_SYS (getchar, int, (void)); +# endif +_GL_CXXALIASWARN (getchar); +#endif + +#if @GNULIB_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. */ +# if @REPLACE_GETDELIM@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef getdelim +# define getdelim rpl_getdelim +# endif +_GL_FUNCDECL_RPL (getdelim, ssize_t, + (char **lineptr, size_t *linesize, int delimiter, + FILE *stream) + _GL_ARG_NONNULL ((1, 2, 4))); +_GL_CXXALIAS_RPL (getdelim, ssize_t, + (char **lineptr, size_t *linesize, int delimiter, + FILE *stream)); +# else +# if !@HAVE_DECL_GETDELIM@ +_GL_FUNCDECL_SYS (getdelim, ssize_t, + (char **lineptr, size_t *linesize, int delimiter, + FILE *stream) + _GL_ARG_NONNULL ((1, 2, 4))); +# endif +_GL_CXXALIAS_SYS (getdelim, ssize_t, + (char **lineptr, size_t *linesize, int delimiter, + FILE *stream)); +# endif +_GL_CXXALIASWARN (getdelim); +#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@ +/* 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. */ +# if @REPLACE_GETLINE@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef getline +# define getline rpl_getline +# endif +_GL_FUNCDECL_RPL (getline, ssize_t, + (char **lineptr, size_t *linesize, FILE *stream) + _GL_ARG_NONNULL ((1, 2, 3))); +_GL_CXXALIAS_RPL (getline, ssize_t, + (char **lineptr, size_t *linesize, FILE *stream)); +# else +# if !@HAVE_DECL_GETLINE@ +_GL_FUNCDECL_SYS (getline, ssize_t, + (char **lineptr, size_t *linesize, FILE *stream) + _GL_ARG_NONNULL ((1, 2, 3))); +# endif +_GL_CXXALIAS_SYS (getline, ssize_t, + (char **lineptr, size_t *linesize, FILE *stream)); +# endif +# if @HAVE_DECL_GETLINE@ +_GL_CXXALIASWARN (getline); +# 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_GETS@ +# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef gets +# define gets rpl_gets +# endif +_GL_FUNCDECL_RPL (gets, char *, (char *s) _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (gets, char *, (char *s)); +# else +_GL_CXXALIAS_SYS (gets, char *, (char *s)); +# undef gets +# endif +_GL_CXXALIASWARN (gets); +/* 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. */ +_GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead"); +#endif + + +#if @GNULIB_OBSTACK_PRINTF@ || @GNULIB_OBSTACK_PRINTF_POSIX@ +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. */ +# if @REPLACE_OBSTACK_PRINTF@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define obstack_printf rpl_obstack_printf +# endif +_GL_FUNCDECL_RPL (obstack_printf, int, + (struct obstack *obs, const char *format, ...) + _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3) + _GL_ARG_NONNULL ((1, 2))); +_GL_CXXALIAS_RPL (obstack_printf, int, + (struct obstack *obs, const char *format, ...)); +# else +# if !@HAVE_DECL_OBSTACK_PRINTF@ +_GL_FUNCDECL_SYS (obstack_printf, int, + (struct obstack *obs, const char *format, ...) + _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3) + _GL_ARG_NONNULL ((1, 2))); +# endif +_GL_CXXALIAS_SYS (obstack_printf, int, + (struct obstack *obs, const char *format, ...)); +# endif +_GL_CXXALIASWARN (obstack_printf); +# if @REPLACE_OBSTACK_PRINTF@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define obstack_vprintf rpl_obstack_vprintf +# endif +_GL_FUNCDECL_RPL (obstack_vprintf, int, + (struct obstack *obs, const char *format, va_list args) + _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0) + _GL_ARG_NONNULL ((1, 2))); +_GL_CXXALIAS_RPL (obstack_vprintf, int, + (struct obstack *obs, const char *format, va_list args)); +# else +# if !@HAVE_DECL_OBSTACK_PRINTF@ +_GL_FUNCDECL_SYS (obstack_vprintf, int, + (struct obstack *obs, const char *format, va_list args) + _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0) + _GL_ARG_NONNULL ((1, 2))); +# endif +_GL_CXXALIAS_SYS (obstack_vprintf, int, + (struct obstack *obs, const char *format, va_list args)); +# endif +_GL_CXXALIASWARN (obstack_vprintf); +#endif + +#if @GNULIB_PCLOSE@ +# if !@HAVE_PCLOSE@ +_GL_FUNCDECL_SYS (pclose, int, (FILE *stream) _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (pclose, int, (FILE *stream)); +_GL_CXXALIASWARN (pclose); +#elif defined GNULIB_POSIXCHECK +# undef pclose +# if HAVE_RAW_DECL_PCLOSE +_GL_WARN_ON_USE (pclose, "popen is unportable - " + "use gnulib module pclose for more portability"); +# endif +#endif + +#if @GNULIB_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. */ +# if @REPLACE_PERROR@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define perror rpl_perror +# endif +_GL_FUNCDECL_RPL (perror, void, (const char *string)); +_GL_CXXALIAS_RPL (perror, void, (const char *string)); +# else +_GL_CXXALIAS_SYS (perror, void, (const char *string)); +# endif +_GL_CXXALIASWARN (perror); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef popen +# define popen rpl_popen +# endif +_GL_FUNCDECL_RPL (popen, FILE *, (const char *cmd, const char *mode) + _GL_ARG_NONNULL ((1, 2))); +_GL_CXXALIAS_RPL (popen, FILE *, (const char *cmd, const char *mode)); +# else +# if !@HAVE_POPEN@ +_GL_FUNCDECL_SYS (popen, FILE *, (const char *cmd, const char *mode) + _GL_ARG_NONNULL ((1, 2))); +# endif +_GL_CXXALIAS_SYS (popen, FILE *, (const char *cmd, const char *mode)); +# endif +_GL_CXXALIASWARN (popen); +#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_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@)) +# if defined __GNUC__ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +/* Don't break __attribute__((format(printf,M,N))). */ +# define printf __printf__ +# endif +# if @GNULIB_PRINTF_POSIX@ || @GNULIB_VFPRINTF_POSIX@ +_GL_FUNCDECL_RPL_1 (__printf__, int, + (const char *format, ...) + __asm__ (@ASM_SYMBOL_PREFIX@ + _GL_STDIO_MACROEXPAND_AND_STRINGIZE(rpl_printf)) + _GL_ATTRIBUTE_FORMAT_PRINTF (1, 2) + _GL_ARG_NONNULL ((1))); +# else +_GL_FUNCDECL_RPL_1 (__printf__, int, + (const char *format, ...) + __asm__ (@ASM_SYMBOL_PREFIX@ + _GL_STDIO_MACROEXPAND_AND_STRINGIZE(rpl_printf)) + _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (1, 2) + _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_RPL_1 (printf, __printf__, int, (const char *format, ...)); +# else +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define printf rpl_printf +# endif +_GL_FUNCDECL_RPL (printf, int, + (const char *format, ...) + _GL_ATTRIBUTE_FORMAT_PRINTF (1, 2) + _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (printf, int, (const char *format, ...)); +# endif +# define GNULIB_overrides_printf 1 +# else +_GL_CXXALIAS_SYS (printf, int, (const char *format, ...)); +# endif +_GL_CXXALIASWARN (printf); +#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@ +# if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@) +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef putc +# define putc rpl_fputc +# endif +_GL_FUNCDECL_RPL (fputc, int, (int c, FILE *stream) _GL_ARG_NONNULL ((2))); +_GL_CXXALIAS_RPL_1 (putc, rpl_fputc, int, (int c, FILE *stream)); +# else +_GL_CXXALIAS_SYS (putc, int, (int c, FILE *stream)); +# endif +_GL_CXXALIASWARN (putc); +#endif + +#if @GNULIB_PUTCHAR@ +# if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@) +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef putchar +# define putchar rpl_putchar +# endif +_GL_FUNCDECL_RPL (putchar, int, (int c)); +_GL_CXXALIAS_RPL (putchar, int, (int c)); +# else +_GL_CXXALIAS_SYS (putchar, int, (int c)); +# endif +_GL_CXXALIASWARN (putchar); +#endif + +#if @GNULIB_PUTS@ +# if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@) +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef puts +# define puts rpl_puts +# endif +_GL_FUNCDECL_RPL (puts, int, (const char *string) _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (puts, int, (const char *string)); +# else +_GL_CXXALIAS_SYS (puts, int, (const char *string)); +# endif +_GL_CXXALIASWARN (puts); +#endif + +#if @GNULIB_REMOVE@ +# if @REPLACE_REMOVE@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef remove +# define remove rpl_remove +# endif +_GL_FUNCDECL_RPL (remove, int, (const char *name) _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (remove, int, (const char *name)); +# else +_GL_CXXALIAS_SYS (remove, int, (const char *name)); +# endif +_GL_CXXALIASWARN (remove); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef rename +# define rename rpl_rename +# endif +_GL_FUNCDECL_RPL (rename, int, + (const char *old_filename, const char *new_filename) + _GL_ARG_NONNULL ((1, 2))); +_GL_CXXALIAS_RPL (rename, int, + (const char *old_filename, const char *new_filename)); +# else +_GL_CXXALIAS_SYS (rename, int, + (const char *old_filename, const char *new_filename)); +# endif +_GL_CXXALIASWARN (rename); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef renameat +# define renameat rpl_renameat +# endif +_GL_FUNCDECL_RPL (renameat, int, + (int fd1, char const *file1, int fd2, char const *file2) + _GL_ARG_NONNULL ((2, 4))); +_GL_CXXALIAS_RPL (renameat, int, + (int fd1, char const *file1, int fd2, char const *file2)); +# else +# if !@HAVE_RENAMEAT@ +_GL_FUNCDECL_SYS (renameat, int, + (int fd1, char const *file1, int fd2, char const *file2) + _GL_ARG_NONNULL ((2, 4))); +# endif +_GL_CXXALIAS_SYS (renameat, int, + (int fd1, char const *file1, int fd2, char const *file2)); +# endif +_GL_CXXALIASWARN (renameat); +#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_SCANF@ +# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@ +# if defined __GNUC__ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef scanf +/* Don't break __attribute__((format(scanf,M,N))). */ +# define scanf __scanf__ +# endif +_GL_FUNCDECL_RPL_1 (__scanf__, int, + (const char *format, ...) + __asm__ (@ASM_SYMBOL_PREFIX@ + _GL_STDIO_MACROEXPAND_AND_STRINGIZE(rpl_scanf)) + _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (1, 2) + _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL_1 (scanf, __scanf__, int, (const char *format, ...)); +# else +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef scanf +# define scanf rpl_scanf +# endif +_GL_FUNCDECL_RPL (scanf, int, (const char *format, ...) + _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (1, 2) + _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (scanf, int, (const char *format, ...)); +# endif +# else +_GL_CXXALIAS_SYS (scanf, int, (const char *format, ...)); +# endif +_GL_CXXALIASWARN (scanf); +#endif + +#if @GNULIB_SNPRINTF@ +# if @REPLACE_SNPRINTF@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define snprintf rpl_snprintf +# endif +_GL_FUNCDECL_RPL (snprintf, int, + (char *str, size_t size, const char *format, ...) + _GL_ATTRIBUTE_FORMAT_PRINTF (3, 4) + _GL_ARG_NONNULL ((3))); +_GL_CXXALIAS_RPL (snprintf, int, + (char *str, size_t size, const char *format, ...)); +# else +# if !@HAVE_DECL_SNPRINTF@ +_GL_FUNCDECL_SYS (snprintf, int, + (char *str, size_t size, const char *format, ...) + _GL_ATTRIBUTE_FORMAT_PRINTF (3, 4) + _GL_ARG_NONNULL ((3))); +# endif +_GL_CXXALIAS_SYS (snprintf, int, + (char *str, size_t size, const char *format, ...)); +# endif +_GL_CXXALIASWARN (snprintf); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define sprintf rpl_sprintf +# endif +_GL_FUNCDECL_RPL (sprintf, int, (char *str, const char *format, ...) + _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3) + _GL_ARG_NONNULL ((1, 2))); +_GL_CXXALIAS_RPL (sprintf, int, (char *str, const char *format, ...)); +# else +_GL_CXXALIAS_SYS (sprintf, int, (char *str, const char *format, ...)); +# endif +_GL_CXXALIASWARN (sprintf); +#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_TMPFILE@ +# if @REPLACE_TMPFILE@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define tmpfile rpl_tmpfile +# endif +_GL_FUNCDECL_RPL (tmpfile, FILE *, (void)); +_GL_CXXALIAS_RPL (tmpfile, FILE *, (void)); +# else +_GL_CXXALIAS_SYS (tmpfile, FILE *, (void)); +# endif +_GL_CXXALIASWARN (tmpfile); +#elif defined GNULIB_POSIXCHECK +# undef tmpfile +# if HAVE_RAW_DECL_TMPFILE +_GL_WARN_ON_USE (tmpfile, "tmpfile is not usable on mingw - " + "use gnulib module tmpfile for portability"); +# endif +#endif + +#if @GNULIB_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. */ +# if @REPLACE_VASPRINTF@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define asprintf rpl_asprintf +# endif +_GL_FUNCDECL_RPL (asprintf, int, + (char **result, const char *format, ...) + _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3) + _GL_ARG_NONNULL ((1, 2))); +_GL_CXXALIAS_RPL (asprintf, int, + (char **result, const char *format, ...)); +# else +# if !@HAVE_VASPRINTF@ +_GL_FUNCDECL_SYS (asprintf, int, + (char **result, const char *format, ...) + _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3) + _GL_ARG_NONNULL ((1, 2))); +# endif +_GL_CXXALIAS_SYS (asprintf, int, + (char **result, const char *format, ...)); +# endif +_GL_CXXALIASWARN (asprintf); +# if @REPLACE_VASPRINTF@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define vasprintf rpl_vasprintf +# endif +_GL_FUNCDECL_RPL (vasprintf, int, + (char **result, const char *format, va_list args) + _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0) + _GL_ARG_NONNULL ((1, 2))); +_GL_CXXALIAS_RPL (vasprintf, int, + (char **result, const char *format, va_list args)); +# else +# if !@HAVE_VASPRINTF@ +_GL_FUNCDECL_SYS (vasprintf, int, + (char **result, const char *format, va_list args) + _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0) + _GL_ARG_NONNULL ((1, 2))); +# endif +_GL_CXXALIAS_SYS (vasprintf, int, + (char **result, const char *format, va_list args)); +# endif +_GL_CXXALIASWARN (vasprintf); +#endif + +#if @GNULIB_VDPRINTF@ +# if @REPLACE_VDPRINTF@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define vdprintf rpl_vdprintf +# endif +_GL_FUNCDECL_RPL (vdprintf, int, (int fd, const char *format, va_list args) + _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0) + _GL_ARG_NONNULL ((2))); +_GL_CXXALIAS_RPL (vdprintf, int, (int fd, const char *format, va_list args)); +# else +# if !@HAVE_VDPRINTF@ +_GL_FUNCDECL_SYS (vdprintf, int, (int fd, const char *format, va_list args) + _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0) + _GL_ARG_NONNULL ((2))); +# endif +/* Need to cast, because on Solaris, the third parameter will likely be + __va_list args. */ +_GL_CXXALIAS_SYS_CAST (vdprintf, int, + (int fd, const char *format, va_list args)); +# endif +_GL_CXXALIASWARN (vdprintf); +#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_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@)) +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define vfprintf rpl_vfprintf +# endif +# define GNULIB_overrides_vfprintf 1 +# if @GNULIB_VFPRINTF_POSIX@ +_GL_FUNCDECL_RPL (vfprintf, int, (FILE *fp, const char *format, va_list args) + _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0) + _GL_ARG_NONNULL ((1, 2))); +# else +_GL_FUNCDECL_RPL (vfprintf, int, (FILE *fp, const char *format, va_list args) + _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (2, 0) + _GL_ARG_NONNULL ((1, 2))); +# endif +_GL_CXXALIAS_RPL (vfprintf, int, (FILE *fp, const char *format, va_list args)); +# else +/* Need to cast, because on Solaris, the third parameter is + __va_list args + and GCC's fixincludes did not change this to __gnuc_va_list. */ +_GL_CXXALIAS_SYS_CAST (vfprintf, int, + (FILE *fp, const char *format, va_list args)); +# endif +_GL_CXXALIASWARN (vfprintf); +#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_VFSCANF@ +# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef vfscanf +# define vfscanf rpl_vfscanf +# endif +_GL_FUNCDECL_RPL (vfscanf, int, + (FILE *stream, const char *format, va_list args) + _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (2, 0) + _GL_ARG_NONNULL ((1, 2))); +_GL_CXXALIAS_RPL (vfscanf, int, + (FILE *stream, const char *format, va_list args)); +# else +_GL_CXXALIAS_SYS (vfscanf, int, + (FILE *stream, const char *format, va_list args)); +# endif +_GL_CXXALIASWARN (vfscanf); +#endif + +#if @GNULIB_VPRINTF_POSIX@ || @GNULIB_VPRINTF@ +# if (@GNULIB_VPRINTF_POSIX@ && @REPLACE_VPRINTF@) \ + || (@GNULIB_VPRINTF@ && @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@)) +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define vprintf rpl_vprintf +# endif +# define GNULIB_overrides_vprintf 1 +# if @GNULIB_VPRINTF_POSIX@ || @GNULIB_VFPRINTF_POSIX@ +_GL_FUNCDECL_RPL (vprintf, int, (const char *format, va_list args) + _GL_ATTRIBUTE_FORMAT_PRINTF (1, 0) + _GL_ARG_NONNULL ((1))); +# else +_GL_FUNCDECL_RPL (vprintf, int, (const char *format, va_list args) + _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (1, 0) + _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_RPL (vprintf, int, (const char *format, va_list args)); +# else +/* Need to cast, because on Solaris, the second parameter is + __va_list args + and GCC's fixincludes did not change this to __gnuc_va_list. */ +_GL_CXXALIAS_SYS_CAST (vprintf, int, (const char *format, va_list args)); +# endif +_GL_CXXALIASWARN (vprintf); +#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_VSCANF@ +# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef vscanf +# define vscanf rpl_vscanf +# endif +_GL_FUNCDECL_RPL (vscanf, int, (const char *format, va_list args) + _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (1, 0) + _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (vscanf, int, (const char *format, va_list args)); +# else +_GL_CXXALIAS_SYS (vscanf, int, (const char *format, va_list args)); +# endif +_GL_CXXALIASWARN (vscanf); +#endif + +#if @GNULIB_VSNPRINTF@ +# if @REPLACE_VSNPRINTF@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define vsnprintf rpl_vsnprintf +# endif +_GL_FUNCDECL_RPL (vsnprintf, int, + (char *str, size_t size, const char *format, va_list args) + _GL_ATTRIBUTE_FORMAT_PRINTF (3, 0) + _GL_ARG_NONNULL ((3))); +_GL_CXXALIAS_RPL (vsnprintf, int, + (char *str, size_t size, const char *format, va_list args)); +# else +# if !@HAVE_DECL_VSNPRINTF@ +_GL_FUNCDECL_SYS (vsnprintf, int, + (char *str, size_t size, const char *format, va_list args) + _GL_ATTRIBUTE_FORMAT_PRINTF (3, 0) + _GL_ARG_NONNULL ((3))); +# endif +_GL_CXXALIAS_SYS (vsnprintf, int, + (char *str, size_t size, const char *format, va_list args)); +# endif +_GL_CXXALIASWARN (vsnprintf); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define vsprintf rpl_vsprintf +# endif +_GL_FUNCDECL_RPL (vsprintf, int, + (char *str, const char *format, va_list args) + _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0) + _GL_ARG_NONNULL ((1, 2))); +_GL_CXXALIAS_RPL (vsprintf, int, + (char *str, const char *format, va_list args)); +# else +/* Need to cast, because on Solaris, the third parameter is + __va_list args + and GCC's fixincludes did not change this to __gnuc_va_list. */ +_GL_CXXALIAS_SYS_CAST (vsprintf, int, + (char *str, const char *format, va_list args)); +# endif +_GL_CXXALIASWARN (vsprintf); +#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 + + +#endif /* _@GUARD_PREFIX@_STDIO_H */ +#endif /* _@GUARD_PREFIX@_STDIO_H */ +#endif diff --git a/gnulib/lib/stdlib--.h b/gnulib/lib/stdlib--.h new file mode 100644 index 0000000..108456c --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +#include +#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 0000000..dd8f1b3 --- /dev/null +++ b/gnulib/lib/stdlib-safer.h @@ -0,0 +1,32 @@ +/* Invoke stdlib.h functions, but avoid some glitches. + + Copyright (C) 2005, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* 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 0000000..a59cb08 --- /dev/null +++ b/gnulib/lib/stdlib.in.h @@ -0,0 +1,804 @@ +/* A GNU-like . + + Copyright (C) 1995, 2001-2004, 2006-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#if __GNUC__ >= 3 +@PRAGMA_SYSTEM_HEADER@ +#endif +@PRAGMA_COLUMNS@ + +#if defined __need_malloc_and_calloc +/* Special invocation convention inside glibc header files. */ + +#@INCLUDE_NEXT@ @NEXT_STDLIB_H@ + +#else +/* Normal invocation convention. */ + +#ifndef _@GUARD_PREFIX@_STDLIB_H + +/* The include_next requires a split double-inclusion guard. */ +#@INCLUDE_NEXT@ @NEXT_STDLIB_H@ + +#ifndef _@GUARD_PREFIX@_STDLIB_H +#define _@GUARD_PREFIX@_STDLIB_H + +/* NetBSD 5.0 mis-defines NULL. */ +#include + +/* MirBSD 10 defines WEXITSTATUS in , not in . */ +#if @GNULIB_SYSTEM_POSIX@ && !defined WEXITSTATUS +# include +#endif + +/* Solaris declares getloadavg() in . */ +#if (@GNULIB_GETLOADAVG@ || defined GNULIB_POSIXCHECK) && @HAVE_SYS_LOADAVG_H@ +# include +#endif + +#if @GNULIB_RANDOM_R@ + +/* OSF/1 5.1 declares 'struct random_data' in , which is included + from if _REENTRANT is defined. Include it whenever we need + 'struct random_data'. */ +# if @HAVE_RANDOM_H@ +# include +# endif + +# if !@HAVE_STRUCT_RANDOM_DATA@ || !@HAVE_RANDOM_R@ +# include +# endif + +# if !@HAVE_STRUCT_RANDOM_DATA@ +/* Define 'struct random_data'. + But allow multiple gnulib generated replacements to coexist. */ +# if !GNULIB_defined_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. */ +}; +# define GNULIB_defined_struct_random_data 1 +# endif +# endif +#endif + +#if (@GNULIB_MKSTEMP@ || @GNULIB_MKSTEMPS@ || @GNULIB_GETSUBOPT@ || defined GNULIB_POSIXCHECK) && ! defined __GLIBC__ && !((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__) +/* On MacOS X 10.3, only declares mkstemp. */ +/* On MacOS X 10.5, only declares mkstemps. */ +/* On Cygwin 1.7.1, only declares getsubopt. */ +/* But avoid namespace pollution on glibc systems and native Windows. */ +# include +#endif + +/* The definition of _Noreturn is copied here. */ + +/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ + +/* 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 + + +#if @GNULIB__EXIT@ +/* Terminate the current process with the given return code, without running + the 'atexit' handlers. */ +# if !@HAVE__EXIT@ +_GL_FUNCDECL_SYS (_Exit, _Noreturn void, (int status)); +# endif +_GL_CXXALIAS_SYS (_Exit, void, (int status)); +_GL_CXXALIASWARN (_Exit); +#elif defined GNULIB_POSIXCHECK +# undef _Exit +# if HAVE_RAW_DECL__EXIT +_GL_WARN_ON_USE (_Exit, "_Exit is unportable - " + "use gnulib module _Exit for portability"); +# endif +#endif + + +#if @GNULIB_ATOLL@ +/* Parse a signed decimal integer. + Returns the value of the integer. Errors are not detected. */ +# if !@HAVE_ATOLL@ +_GL_FUNCDECL_SYS (atoll, long long, (const char *string) _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (atoll, long long, (const char *string)); +_GL_CXXALIASWARN (atoll); +#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 @REPLACE_CALLOC@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef calloc +# define calloc rpl_calloc +# endif +_GL_FUNCDECL_RPL (calloc, void *, (size_t nmemb, size_t size)); +_GL_CXXALIAS_RPL (calloc, void *, (size_t nmemb, size_t size)); +# else +_GL_CXXALIAS_SYS (calloc, void *, (size_t nmemb, size_t size)); +# endif +_GL_CXXALIASWARN (calloc); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define canonicalize_file_name rpl_canonicalize_file_name +# endif +_GL_FUNCDECL_RPL (canonicalize_file_name, char *, (const char *name) + _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (canonicalize_file_name, char *, (const char *name)); +# else +# if !@HAVE_CANONICALIZE_FILE_NAME@ +_GL_FUNCDECL_SYS (canonicalize_file_name, char *, (const char *name) + _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (canonicalize_file_name, char *, (const char *name)); +# endif +_GL_CXXALIASWARN (canonicalize_file_name); +#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@ +/* 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. */ +# if !@HAVE_DECL_GETLOADAVG@ +_GL_FUNCDECL_SYS (getloadavg, int, (double loadavg[], int nelem) + _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (getloadavg, int, (double loadavg[], int nelem)); +_GL_CXXALIASWARN (getloadavg); +#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@ +_GL_FUNCDECL_SYS (getsubopt, int, + (char **optionp, char *const *tokens, char **valuep) + _GL_ARG_NONNULL ((1, 2, 3))); +# endif +_GL_CXXALIAS_SYS (getsubopt, int, + (char **optionp, char *const *tokens, char **valuep)); +_GL_CXXALIASWARN (getsubopt); +#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_GRANTPT@ +/* Change the ownership and access permission of the slave side of the + pseudo-terminal whose master side is specified by FD. */ +# if !@HAVE_GRANTPT@ +_GL_FUNCDECL_SYS (grantpt, int, (int fd)); +# endif +_GL_CXXALIAS_SYS (grantpt, int, (int fd)); +_GL_CXXALIASWARN (grantpt); +#elif defined GNULIB_POSIXCHECK +# undef grantpt +# if HAVE_RAW_DECL_GRANTPT +_GL_WARN_ON_USE (grantpt, "grantpt is not portable - " + "use gnulib module grantpt for portability"); +# endif +#endif + +/* If _GL_USE_STDLIB_ALLOC is nonzero, the including module does not + rely on GNU or POSIX semantics for malloc and realloc (for example, + by never specifying a zero size), so it does not need malloc or + realloc to be redefined. */ +#if @GNULIB_MALLOC_POSIX@ +# if @REPLACE_MALLOC@ +# if !((defined __cplusplus && defined GNULIB_NAMESPACE) \ + || _GL_USE_STDLIB_ALLOC) +# undef malloc +# define malloc rpl_malloc +# endif +_GL_FUNCDECL_RPL (malloc, void *, (size_t size)); +_GL_CXXALIAS_RPL (malloc, void *, (size_t size)); +# else +_GL_CXXALIAS_SYS (malloc, void *, (size_t size)); +# endif +_GL_CXXALIASWARN (malloc); +#elif defined GNULIB_POSIXCHECK && !_GL_USE_STDLIB_ALLOC +# 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 + +/* Convert a multibyte character to a wide character. */ +#if @GNULIB_MBTOWC@ +# if @REPLACE_MBTOWC@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef mbtowc +# define mbtowc rpl_mbtowc +# endif +_GL_FUNCDECL_RPL (mbtowc, int, (wchar_t *pwc, const char *s, size_t n)); +_GL_CXXALIAS_RPL (mbtowc, int, (wchar_t *pwc, const char *s, size_t n)); +# else +_GL_CXXALIAS_SYS (mbtowc, int, (wchar_t *pwc, const char *s, size_t n)); +# endif +_GL_CXXALIASWARN (mbtowc); +#endif + +#if @GNULIB_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. */ +# if !@HAVE_MKDTEMP@ +_GL_FUNCDECL_SYS (mkdtemp, char *, (char * /*template*/) _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (mkdtemp, char *, (char * /*template*/)); +_GL_CXXALIASWARN (mkdtemp); +#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@ +/* 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 ) + 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. */ +# if !@HAVE_MKOSTEMP@ +_GL_FUNCDECL_SYS (mkostemp, int, (char * /*template*/, int /*flags*/) + _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (mkostemp, int, (char * /*template*/, int /*flags*/)); +_GL_CXXALIASWARN (mkostemp); +#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@ +/* 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 ) + 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. */ +# if !@HAVE_MKOSTEMPS@ +_GL_FUNCDECL_SYS (mkostemps, int, + (char * /*template*/, int /*suffixlen*/, int /*flags*/) + _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (mkostemps, int, + (char * /*template*/, int /*suffixlen*/, int /*flags*/)); +_GL_CXXALIASWARN (mkostemps); +#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@ +/* 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. */ +# if @REPLACE_MKSTEMP@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define mkstemp rpl_mkstemp +# endif +_GL_FUNCDECL_RPL (mkstemp, int, (char * /*template*/) _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (mkstemp, int, (char * /*template*/)); +# else +# if ! @HAVE_MKSTEMP@ +_GL_FUNCDECL_SYS (mkstemp, int, (char * /*template*/) _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (mkstemp, int, (char * /*template*/)); +# endif +_GL_CXXALIASWARN (mkstemp); +#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@ +/* 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. */ +# if !@HAVE_MKSTEMPS@ +_GL_FUNCDECL_SYS (mkstemps, int, (char * /*template*/, int /*suffixlen*/) + _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (mkstemps, int, (char * /*template*/, int /*suffixlen*/)); +_GL_CXXALIASWARN (mkstemps); +#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_POSIX_OPENPT@ +/* Return an FD open to the master side of a pseudo-terminal. Flags should + include O_RDWR, and may also include O_NOCTTY. */ +# if !@HAVE_POSIX_OPENPT@ +_GL_FUNCDECL_SYS (posix_openpt, int, (int flags)); +# endif +_GL_CXXALIAS_SYS (posix_openpt, int, (int flags)); +_GL_CXXALIASWARN (posix_openpt); +#elif defined GNULIB_POSIXCHECK +# undef posix_openpt +# if HAVE_RAW_DECL_POSIX_OPENPT +_GL_WARN_ON_USE (posix_openpt, "posix_openpt is not portable - " + "use gnulib module posix_openpt for portability"); +# endif +#endif + +#if @GNULIB_PTSNAME@ +/* Return the pathname of the pseudo-terminal slave associated with + the master FD is open on, or NULL on errors. */ +# if !@HAVE_PTSNAME@ +_GL_FUNCDECL_SYS (ptsname, char *, (int fd)); +# endif +_GL_CXXALIAS_SYS (ptsname, char *, (int fd)); +_GL_CXXALIASWARN (ptsname); +#elif defined GNULIB_POSIXCHECK +# undef ptsname +# if HAVE_RAW_DECL_PTSNAME +_GL_WARN_ON_USE (ptsname, "ptsname is not portable - " + "use gnulib module ptsname for portability"); +# endif +#endif + +#if @GNULIB_PTSNAME_R@ +/* Set the pathname of the pseudo-terminal slave associated with + the master FD is open on and return 0, or set errno and return + non-zero on errors. */ +# if @REPLACE_PTSNAME_R@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef ptsname_r +# define ptsname_r rpl_ptsname_r +# endif +_GL_FUNCDECL_RPL (ptsname_r, int, (int fd, char *buf, size_t len)); +_GL_CXXALIAS_RPL (ptsname_r, int, (int fd, char *buf, size_t len)); +# else +# if !@HAVE_PTSNAME_R@ +_GL_FUNCDECL_SYS (ptsname_r, int, (int fd, char *buf, size_t len)); +# endif +_GL_CXXALIAS_SYS (ptsname_r, int, (int fd, char *buf, size_t len)); +# endif +_GL_CXXALIASWARN (ptsname_r); +#elif defined GNULIB_POSIXCHECK +# undef ptsname_r +# if HAVE_RAW_DECL_PTSNAME_R +_GL_WARN_ON_USE (ptsname_r, "ptsname_r is not portable - " + "use gnulib module ptsname_r for portability"); +# endif +#endif + +#if @GNULIB_PUTENV@ +# if @REPLACE_PUTENV@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef putenv +# define putenv rpl_putenv +# endif +_GL_FUNCDECL_RPL (putenv, int, (char *string) _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (putenv, int, (char *string)); +# else +_GL_CXXALIAS_SYS (putenv, int, (char *string)); +# endif +_GL_CXXALIASWARN (putenv); +#endif + + +#if @GNULIB_RANDOM_R@ +# if !@HAVE_RANDOM_R@ +# ifndef RAND_MAX +# define RAND_MAX 2147483647 +# endif +# endif +#endif + +#if @GNULIB_RANDOM_R@ +# if !@HAVE_RANDOM_R@ +_GL_FUNCDECL_SYS (random_r, int, (struct random_data *buf, int32_t *result) + _GL_ARG_NONNULL ((1, 2))); +# endif +_GL_CXXALIAS_SYS (random_r, int, (struct random_data *buf, int32_t *result)); +_GL_CXXALIASWARN (random_r); +#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 +#endif + +#if @GNULIB_RANDOM_R@ +# if !@HAVE_RANDOM_R@ +_GL_FUNCDECL_SYS (srandom_r, int, + (unsigned int seed, struct random_data *rand_state) + _GL_ARG_NONNULL ((2))); +# endif +_GL_CXXALIAS_SYS (srandom_r, int, + (unsigned int seed, struct random_data *rand_state)); +_GL_CXXALIASWARN (srandom_r); +#elif defined GNULIB_POSIXCHECK +# 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 +#endif + +#if @GNULIB_RANDOM_R@ +# if !@HAVE_RANDOM_R@ +_GL_FUNCDECL_SYS (initstate_r, int, + (unsigned int seed, char *buf, size_t buf_size, + struct random_data *rand_state) + _GL_ARG_NONNULL ((2, 4))); +# endif +_GL_CXXALIAS_SYS (initstate_r, int, + (unsigned int seed, char *buf, size_t buf_size, + struct random_data *rand_state)); +_GL_CXXALIASWARN (initstate_r); +#elif defined GNULIB_POSIXCHECK +# 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 +#endif + +#if @GNULIB_RANDOM_R@ +# if !@HAVE_RANDOM_R@ +_GL_FUNCDECL_SYS (setstate_r, int, + (char *arg_state, struct random_data *rand_state) + _GL_ARG_NONNULL ((1, 2))); +# endif +_GL_CXXALIAS_SYS (setstate_r, int, + (char *arg_state, struct random_data *rand_state)); +_GL_CXXALIASWARN (setstate_r); +#elif defined GNULIB_POSIXCHECK +# 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 @REPLACE_REALLOC@ +# if !((defined __cplusplus && defined GNULIB_NAMESPACE) \ + || _GL_USE_STDLIB_ALLOC) +# undef realloc +# define realloc rpl_realloc +# endif +_GL_FUNCDECL_RPL (realloc, void *, (void *ptr, size_t size)); +_GL_CXXALIAS_RPL (realloc, void *, (void *ptr, size_t size)); +# else +_GL_CXXALIAS_SYS (realloc, void *, (void *ptr, size_t size)); +# endif +_GL_CXXALIASWARN (realloc); +#elif defined GNULIB_POSIXCHECK && !_GL_USE_STDLIB_ALLOC +# 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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define realpath rpl_realpath +# endif +_GL_FUNCDECL_RPL (realpath, char *, (const char *name, char *resolved) + _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (realpath, char *, (const char *name, char *resolved)); +# else +# if !@HAVE_REALPATH@ +_GL_FUNCDECL_SYS (realpath, char *, (const char *name, char *resolved) + _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (realpath, char *, (const char *name, char *resolved)); +# endif +_GL_CXXALIASWARN (realpath); +#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@ +/* Test a user response to a question. + Return 1 if it is affirmative, 0 if it is negative, or -1 if not clear. */ +# if !@HAVE_RPMATCH@ +_GL_FUNCDECL_SYS (rpmatch, int, (const char *response) _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (rpmatch, int, (const char *response)); +_GL_CXXALIASWARN (rpmatch); +#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@ +/* Set NAME to VALUE in the environment. + If REPLACE is nonzero, overwrite an existing value. */ +# if @REPLACE_SETENV@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef setenv +# define setenv rpl_setenv +# endif +_GL_FUNCDECL_RPL (setenv, int, + (const char *name, const char *value, int replace) + _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (setenv, int, + (const char *name, const char *value, int replace)); +# else +# if !@HAVE_DECL_SETENV@ +_GL_FUNCDECL_SYS (setenv, int, + (const char *name, const char *value, int replace) + _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (setenv, int, + (const char *name, const char *value, int replace)); +# endif +# if !(@REPLACE_SETENV@ && !@HAVE_DECL_SETENV@) +_GL_CXXALIASWARN (setenv); +# 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@ + /* Parse a double from STRING, updating ENDP if appropriate. */ +# if @REPLACE_STRTOD@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define strtod rpl_strtod +# endif +_GL_FUNCDECL_RPL (strtod, double, (const char *str, char **endp) + _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (strtod, double, (const char *str, char **endp)); +# else +# if !@HAVE_STRTOD@ +_GL_FUNCDECL_SYS (strtod, double, (const char *str, char **endp) + _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (strtod, double, (const char *str, char **endp)); +# endif +_GL_CXXALIASWARN (strtod); +#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@ +/* 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. */ +# if !@HAVE_STRTOLL@ +_GL_FUNCDECL_SYS (strtoll, long long, + (const char *string, char **endptr, int base) + _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (strtoll, long long, + (const char *string, char **endptr, int base)); +_GL_CXXALIASWARN (strtoll); +#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@ +/* 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. */ +# if !@HAVE_STRTOULL@ +_GL_FUNCDECL_SYS (strtoull, unsigned long long, + (const char *string, char **endptr, int base) + _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (strtoull, unsigned long long, + (const char *string, char **endptr, int base)); +_GL_CXXALIASWARN (strtoull); +#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_UNLOCKPT@ +/* Unlock the slave side of the pseudo-terminal whose master side is specified + by FD, so that it can be opened. */ +# if !@HAVE_UNLOCKPT@ +_GL_FUNCDECL_SYS (unlockpt, int, (int fd)); +# endif +_GL_CXXALIAS_SYS (unlockpt, int, (int fd)); +_GL_CXXALIASWARN (unlockpt); +#elif defined GNULIB_POSIXCHECK +# undef unlockpt +# if HAVE_RAW_DECL_UNLOCKPT +_GL_WARN_ON_USE (unlockpt, "unlockpt is not portable - " + "use gnulib module unlockpt for portability"); +# endif +#endif + +#if @GNULIB_UNSETENV@ +/* Remove the variable NAME from the environment. */ +# if @REPLACE_UNSETENV@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef unsetenv +# define unsetenv rpl_unsetenv +# endif +_GL_FUNCDECL_RPL (unsetenv, int, (const char *name) _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (unsetenv, int, (const char *name)); +# else +# if !@HAVE_DECL_UNSETENV@ +_GL_FUNCDECL_SYS (unsetenv, int, (const char *name) _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (unsetenv, int, (const char *name)); +# endif +# if !(@REPLACE_UNSETENV@ && !@HAVE_DECL_UNSETENV@) +_GL_CXXALIASWARN (unsetenv); +# 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 + +/* Convert a wide character to a multibyte character. */ +#if @GNULIB_WCTOMB@ +# if @REPLACE_WCTOMB@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef wctomb +# define wctomb rpl_wctomb +# endif +_GL_FUNCDECL_RPL (wctomb, int, (char *s, wchar_t wc)); +_GL_CXXALIAS_RPL (wctomb, int, (char *s, wchar_t wc)); +# else +_GL_CXXALIAS_SYS (wctomb, int, (char *s, wchar_t wc)); +# endif +_GL_CXXALIASWARN (wctomb); +#endif + + +#endif /* _@GUARD_PREFIX@_STDLIB_H */ +#endif /* _@GUARD_PREFIX@_STDLIB_H */ +#endif diff --git a/gnulib/lib/stpcpy.c b/gnulib/lib/stpcpy.c new file mode 100644 index 0000000..fa42af4 --- /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-2011 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 . */ + +#include + +#include + +#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 0000000..8cd49cc --- /dev/null +++ b/gnulib/lib/stpncpy.c @@ -0,0 +1,92 @@ +/* Copyright (C) 1993, 1995-1997, 2002-2003, 2005-2007, 2009-2011 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 . */ + +/* This is almost copied from strncpy.c, written by Torbjorn Granlund. */ + +#include + +/* Specification. */ +#include + +#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 0000000..d7e0a74 --- /dev/null +++ b/gnulib/lib/str-kmp.h @@ -0,0 +1,154 @@ +/* Substring search in a NUL terminated string of UNIT elements, + using the Knuth-Morris-Pratt algorithm. + Copyright (C) 2005-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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: + UNIT The element type of the needle and haystack. + CANON_ELEMENT(c) A macro that canonicalizes an element right after + it has been fetched from needle or haystack. + The argument is of type UNIT; the result must be + of type UNIT as well. */ + +/* Knuth-Morris-Pratt algorithm. + See http://en.wikipedia.org/wiki/Knuth-Morris-Pratt_algorithm + HAYSTACK is the NUL terminated string in which to search for. + NEEDLE is the string to search for in HAYSTACK, consisting of NEEDLE_LEN + units. + 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 (const UNIT *haystack, + const UNIT *needle, size_t needle_len, + const UNIT **resultp) +{ + size_t m = needle_len; + + /* 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]. */ + UNIT b = CANON_ELEMENT (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 (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 UNIT *rhaystack; + const UNIT *phaystack; + + *resultp = NULL; + j = 0; + rhaystack = haystack; + phaystack = haystack; + /* Invariant: phaystack = rhaystack + j. */ + while (*phaystack != 0) + if (CANON_ELEMENT (needle[j]) == CANON_ELEMENT (*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 0000000..7dcb387 --- /dev/null +++ b/gnulib/lib/str-two-way.h @@ -0,0 +1,453 @@ +/* Byte-wise substring search, using the Two-Way algorithm. + Copyright (C) 2008-2011 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Written by Eric Blake , 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 and + , 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 +#include + +/* We use the Two-Way string matching algorithm (also known as + Chrochemore-Perrin), 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, + http://en.wikipedia.org/wiki/Boyer-Moore_string_search_algorithm, + http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.34.6641&rep=rep1&type=pdf +*/ + +/* 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. + And while some strings have more than one critical factorization, + it is provable that with an ordered alphabet, at least one of the + critical factorizations corresponds to a maximal suffix. + + Given an ordered alphabet, a critical factorization can be computed + in linear time, with 2 * NEEDLE_LEN comparisons, by computing the + shorter of two ordered maximal suffixes. The ordered maximal + suffixes are determined by lexicographic comparison while tracking + 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. */ + + /* Special case NEEDLE_LEN of 1 or 2 (all callers already filtered + out 0-length needles. */ + if (needle_len < 3) + { + *period = 1; + return needle_len - 1; + } + + /* 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 shorter suffix. Return the index of the first byte of + the right half, rather than the last byte of the left half. + + For some examples, 'banana' has two critical factorizations, both + exposed by the two lexicographic extreme suffixes of 'anana' and + 'nana', where both suffixes have a period of 2. On the other + hand, with 'aab' and 'bba', both strings have a single critical + factorization of the last byte, with the suffix having a period + of 1. While the maximal lexicographic suffix of 'aab' is 'b', + the maximal lexicographic suffix of 'bba' is 'ba', which is not a + critical factorization. Conversely, the maximal reverse + lexicographic suffix of 'a' works for 'bba', but not 'ab' for + 'aab'. The shorter suffix of the two will always be a critical + factorization. */ + 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 in the left half can + only advance by the period, so use memory to avoid rescanning + known occurrences of the period in the right half. */ + 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 in the left half can + only advance by the period, so use memory to avoid rescanning + known occurrences of the period in the right half. */ + 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 0000000..fb57d20 --- /dev/null +++ b/gnulib/lib/strcasecmp.c @@ -0,0 +1,63 @@ +/* Case-insensitive string comparison function. + Copyright (C) 1998-1999, 2005-2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 + +/* Specification. */ +#include + +#include +#include + +#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 0000000..a2a1043 --- /dev/null +++ b/gnulib/lib/strcasestr.c @@ -0,0 +1,83 @@ +/* Case-insensitive searching in a string. + Copyright (C) 2005-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 + +/* Specification. */ +#include + +#include +#include +#include + +#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 0000000..61db4e8 --- /dev/null +++ b/gnulib/lib/strchrnul.c @@ -0,0 +1,142 @@ +/* Searching in a string. + Copyright (C) 2003, 2007-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +/* 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 0000000..b14fa13 --- /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 0000000..e4d780e --- /dev/null +++ b/gnulib/lib/strcspn.c @@ -0,0 +1,41 @@ +/* Copyright (C) 1991, 1994, 1996-1997, 2002-2003, 2005-2006, 2009-2011 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 . */ + +#include + +#include +#include + +#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 0000000..98a2655 --- /dev/null +++ b/gnulib/lib/strdup.c @@ -0,0 +1,55 @@ +/* Copyright (C) 1991, 1996-1998, 2002-2004, 2006-2007, 2009-2011 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 +#endif + +/* Get specification. */ +#include + +#include + +#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 0000000..3b52893 --- /dev/null +++ b/gnulib/lib/streq.h @@ -0,0 +1,176 @@ +/* Optimized string comparison. + Copyright (C) 2001-2002, 2007, 2009-2011 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 . */ + +/* Written by Bruno Haible . */ + +#ifndef _GL_STREQ_H +#define _GL_STREQ_H + +#include + +/* 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-override.c b/gnulib/lib/strerror-override.c new file mode 100644 index 0000000..4e2c32b --- /dev/null +++ b/gnulib/lib/strerror-override.c @@ -0,0 +1,289 @@ +/* strerror-override.c --- POSIX compatible system error routine + + Copyright (C) 2010-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible , 2010. */ + +#include + +#include "strerror-override.h" + +#include + +#if GNULIB_defined_EWINSOCK /* native Windows platforms */ +# if HAVE_WINSOCK2_H +# include +# endif +#endif + +/* If ERRNUM maps to an errno value defined by gnulib, return a string + describing the error. Otherwise return NULL. */ +const char * +strerror_override (int errnum) +{ + /* These error messages are taken from glibc/sysdeps/gnu/errlist.c. */ + switch (errnum) + { +#if REPLACE_STRERROR_0 + case 0: + return "Success"; +#endif + +#if GNULIB_defined_ESOCK /* native Windows platforms with older */ + case EINPROGRESS: + return "Operation now in progress"; + case EALREADY: + return "Operation already in progress"; + case ENOTSOCK: + return "Socket operation on non-socket"; + case EDESTADDRREQ: + return "Destination address required"; + case EMSGSIZE: + return "Message too long"; + case EPROTOTYPE: + return "Protocol wrong type for socket"; + case ENOPROTOOPT: + return "Protocol not available"; + case EPROTONOSUPPORT: + return "Protocol not supported"; + case EOPNOTSUPP: + return "Operation not supported"; + case EAFNOSUPPORT: + return "Address family not supported by protocol"; + case EADDRINUSE: + return "Address already in use"; + case EADDRNOTAVAIL: + return "Cannot assign requested address"; + case ENETDOWN: + return "Network is down"; + case ENETUNREACH: + return "Network is unreachable"; + case ECONNRESET: + return "Connection reset by peer"; + case ENOBUFS: + return "No buffer space available"; + case EISCONN: + return "Transport endpoint is already connected"; + case ENOTCONN: + return "Transport endpoint is not connected"; + case ETIMEDOUT: + return "Connection timed out"; + case ECONNREFUSED: + return "Connection refused"; + case ELOOP: + return "Too many levels of symbolic links"; + case EHOSTUNREACH: + return "No route to host"; + case EWOULDBLOCK: + return "Operation would block"; + case ETXTBSY: + return "Text file busy"; + case ENODATA: + return "No data available"; + case ENOSR: + return "Out of streams resources"; + case ENOSTR: + return "Device not a stream"; + case ENOTRECOVERABLE: + return "State not recoverable"; + case EOWNERDEAD: + return "Owner died"; + case ETIME: + return "Timer expired"; + case EOTHER: + return "Other error"; +#endif +#if GNULIB_defined_EWINSOCK /* native Windows platforms */ + case ESOCKTNOSUPPORT: + return "Socket type not supported"; + case EPFNOSUPPORT: + return "Protocol family not supported"; + case ESHUTDOWN: + return "Cannot send after transport endpoint shutdown"; + case ETOOMANYREFS: + return "Too many references: cannot splice"; + case EHOSTDOWN: + return "Host is down"; + case EPROCLIM: + return "Too many processes"; + case EUSERS: + return "Too many users"; + case EDQUOT: + return "Disk quota exceeded"; + case ESTALE: + return "Stale NFS file handle"; + case EREMOTE: + return "Object is remote"; +# 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: + return "Overlapped operation aborted"; + case WSA_IO_INCOMPLETE: + return "Overlapped I/O event object not in signaled state"; + case WSA_IO_PENDING: + return "Overlapped operations will complete later"; + /* 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 maps to EINPROGRESS */ + /* WSAEALREADY maps to EALREADY */ + /* WSAENOTSOCK maps to ENOTSOCK */ + /* WSAEDESTADDRREQ maps to EDESTADDRREQ */ + /* WSAEMSGSIZE maps to EMSGSIZE */ + /* WSAEPROTOTYPE maps to EPROTOTYPE */ + /* WSAENOPROTOOPT maps to ENOPROTOOPT */ + /* WSAEPROTONOSUPPORT maps to EPROTONOSUPPORT */ + /* WSAESOCKTNOSUPPORT is ESOCKTNOSUPPORT */ + /* WSAEOPNOTSUPP maps to EOPNOTSUPP */ + /* WSAEPFNOSUPPORT is EPFNOSUPPORT */ + /* WSAEAFNOSUPPORT maps to EAFNOSUPPORT */ + /* WSAEADDRINUSE maps to EADDRINUSE */ + /* WSAEADDRNOTAVAIL maps to EADDRNOTAVAIL */ + /* WSAENETDOWN maps to ENETDOWN */ + /* WSAENETUNREACH maps to ENETUNREACH */ + /* WSAENETRESET maps to ENETRESET */ + /* WSAECONNABORTED maps to ECONNABORTED */ + /* WSAECONNRESET maps to ECONNRESET */ + /* WSAENOBUFS maps to ENOBUFS */ + /* WSAEISCONN maps to EISCONN */ + /* WSAENOTCONN maps to ENOTCONN */ + /* WSAESHUTDOWN is ESHUTDOWN */ + /* WSAETOOMANYREFS is ETOOMANYREFS */ + /* WSAETIMEDOUT maps to ETIMEDOUT */ + /* WSAECONNREFUSED maps to ECONNREFUSED */ + /* WSAELOOP maps to ELOOP */ + /* WSAENAMETOOLONG maps to ENAMETOOLONG */ + /* WSAEHOSTDOWN is EHOSTDOWN */ + /* WSAEHOSTUNREACH maps to EHOSTUNREACH */ + /* WSAENOTEMPTY maps to ENOTEMPTY */ + /* WSAEPROCLIM is EPROCLIM */ + /* WSAEUSERS is EUSERS */ + /* WSAEDQUOT is EDQUOT */ + /* WSAESTALE is ESTALE */ + /* WSAEREMOTE is EREMOTE */ + case WSASYSNOTREADY: + return "Network subsystem is unavailable"; + case WSAVERNOTSUPPORTED: + return "Winsock.dll version out of range"; + case WSANOTINITIALISED: + return "Successful WSAStartup not yet performed"; + case WSAEDISCON: + return "Graceful shutdown in progress"; + case WSAENOMORE: case WSA_E_NO_MORE: + return "No more results"; + case WSAECANCELLED: case WSA_E_CANCELLED: + return "Call was canceled"; + case WSAEINVALIDPROCTABLE: + return "Procedure call table is invalid"; + case WSAEINVALIDPROVIDER: + return "Service provider is invalid"; + case WSAEPROVIDERFAILEDINIT: + return "Service provider failed to initialize"; + case WSASYSCALLFAILURE: + return "System call failure"; + case WSASERVICE_NOT_FOUND: + return "Service not found"; + case WSATYPE_NOT_FOUND: + return "Class type not found"; + case WSAEREFUSED: + return "Database query was refused"; + case WSAHOST_NOT_FOUND: + return "Host not found"; + case WSATRY_AGAIN: + return "Nonauthoritative host not found"; + case WSANO_RECOVERY: + return "Nonrecoverable error"; + case WSANO_DATA: + return "Valid name, no data record of requested type"; + /* WSA_QOS_* omitted */ +# endif +#endif + +#if GNULIB_defined_ENOMSG + case ENOMSG: + return "No message of desired type"; +#endif + +#if GNULIB_defined_EIDRM + case EIDRM: + return "Identifier removed"; +#endif + +#if GNULIB_defined_ENOLINK + case ENOLINK: + return "Link has been severed"; +#endif + +#if GNULIB_defined_EPROTO + case EPROTO: + return "Protocol error"; +#endif + +#if GNULIB_defined_EMULTIHOP + case EMULTIHOP: + return "Multihop attempted"; +#endif + +#if GNULIB_defined_EBADMSG + case EBADMSG: + return "Bad message"; +#endif + +#if GNULIB_defined_EOVERFLOW + case EOVERFLOW: + return "Value too large for defined data type"; +#endif + +#if GNULIB_defined_ENOTSUP + case ENOTSUP: + return "Not supported"; +#endif + +#if GNULIB_defined_ENETRESET + case ENETRESET: + return "Network dropped connection on reset"; +#endif + +#if GNULIB_defined_ECONNABORTED + case ECONNABORTED: + return "Software caused connection abort"; +#endif + +#if GNULIB_defined_ESTALE + case ESTALE: + return "Stale NFS file handle"; +#endif + +#if GNULIB_defined_EDQUOT + case EDQUOT: + return "Disk quota exceeded"; +#endif + +#if GNULIB_defined_ECANCELED + case ECANCELED: + return "Operation canceled"; +#endif + + default: + return NULL; + } +} diff --git a/gnulib/lib/strerror-override.h b/gnulib/lib/strerror-override.h new file mode 100644 index 0000000..09540b9 --- /dev/null +++ b/gnulib/lib/strerror-override.h @@ -0,0 +1,52 @@ +/* strerror-override.h --- POSIX compatible system error routine + + Copyright (C) 2010-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef _GL_STRERROR_OVERRIDE_H +# define _GL_STRERROR_OVERRIDE_H + +# include +# include + +/* Reasonable buffer size that should never trigger ERANGE; if this + proves too small, we intentionally abort(), to remind us to fix + this value. */ +# define STACKBUF_LEN 256 + +/* If ERRNUM maps to an errno value defined by gnulib, return a string + describing the error. Otherwise return NULL. */ +# if REPLACE_STRERROR_0 \ + || GNULIB_defined_ESOCK \ + || GNULIB_defined_EWINSOCK \ + || GNULIB_defined_ENOMSG \ + || GNULIB_defined_EIDRM \ + || GNULIB_defined_ENOLINK \ + || GNULIB_defined_EPROTO \ + || GNULIB_defined_EMULTIHOP \ + || GNULIB_defined_EBADMSG \ + || GNULIB_defined_EOVERFLOW \ + || GNULIB_defined_ENOTSUP \ + || GNULIB_defined_ENETRESET \ + || GNULIB_defined_ECONNABORTED \ + || GNULIB_defined_ESTALE \ + || GNULIB_defined_EDQUOT \ + || GNULIB_defined_ECANCELED +extern const char *strerror_override (int errnum); +# else +# define strerror_override(ignored) NULL +# endif + +#endif /* _GL_STRERROR_OVERRIDE_H */ diff --git a/gnulib/lib/strerror.c b/gnulib/lib/strerror.c new file mode 100644 index 0000000..63899ca --- /dev/null +++ b/gnulib/lib/strerror.c @@ -0,0 +1,70 @@ +/* strerror.c --- POSIX compatible system error routine + + Copyright (C) 2007-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include +#include +#include +#include + +#include "intprops.h" +#include "strerror-override.h" +#include "verify.h" + +/* Use the system functions, not the gnulib overrides in this file. */ +#undef sprintf + +char * +strerror (int n) +#undef strerror +{ + static char buf[STACKBUF_LEN]; + size_t len; + + /* Cast away const, due to the historical signature of strerror; + callers should not be modifying the string. */ + const char *msg = strerror_override (n); + if (msg) + return (char *) msg; + + msg = strerror (n); + + /* Our strerror_r implementation might use the system's strerror + buffer, so all other clients of strerror have to see the error + copied into a buffer that we manage. This is not thread-safe, + even if the system strerror is, but portable programs shouldn't + be using strerror if they care about thread-safety. */ + if (!msg || !*msg) + { + static char const fmt[] = "Unknown error %d"; + verify (sizeof buf >= sizeof (fmt) + INT_STRLEN_BOUND (n)); + sprintf (buf, fmt, n); + errno = EINVAL; + return buf; + } + + /* Fix STACKBUF_LEN if this ever aborts. */ + len = strlen (msg); + if (sizeof buf <= len) + abort (); + + return memcpy (buf, msg, len + 1); +} diff --git a/gnulib/lib/strerror_r.c b/gnulib/lib/strerror_r.c new file mode 100644 index 0000000..e6cf99b --- /dev/null +++ b/gnulib/lib/strerror_r.c @@ -0,0 +1,327 @@ +/* strerror_r.c --- POSIX compatible system error routine + + Copyright (C) 2010-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible , 2010. */ + +#include + +/* Enable declaration of sys_nerr and sys_errlist in on NetBSD. */ +#define _NETBSD_SOURCE 1 + +/* Specification. */ +#include + +#include +#include +#include + +#include "strerror-override.h" + +#if (__GLIBC__ >= 2 || defined __UCLIBC__ || defined __CYGWIN__) && HAVE___XPG_STRERROR_R /* glibc >= 2.3.4, cygwin >= 1.7.9 */ + +# define USE_XPG_STRERROR_R 1 + +#elif HAVE_DECL_STRERROR_R && !(__GLIBC__ >= 2 || defined __UCLIBC__ || defined __CYGWIN__) + +/* The system's strerror_r function is OK, except that its third argument + is 'int', not 'size_t', or its return type is wrong. */ + +# include + +# define USE_SYSTEM_STRERROR_R 1 + +#else /* (__GLIBC__ >= 2 || defined __UCLIBC__ || defined __CYGWIN__ ? !HAVE___XPG_STRERROR_R : !HAVE_DECL_STRERROR_R) */ + +/* Use the system's strerror(). Exclude glibc and cygwin because the + system strerror_r has the wrong return type, and cygwin 1.7.9 + strerror_r clobbers strerror. */ +# undef strerror + +# define USE_SYSTEM_STRERROR 1 + +# if defined __NetBSD__ || defined __hpux || ((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__) || defined __sgi || (defined __sun && !defined _LP64) || defined __CYGWIN__ + +/* No locking needed. */ + +/* Get catgets internationalization functions. */ +# if HAVE_CATGETS +# include +# endif + +/* Get sys_nerr, sys_errlist on HP-UX (otherwise only declared in C++ mode). + Get sys_nerr, sys_errlist on IRIX (otherwise only declared with _SGIAPI). */ +# if defined __hpux || defined __sgi +extern int sys_nerr; +extern char *sys_errlist[]; +# endif + +/* Get sys_nerr on Solaris. */ +# if defined __sun && !defined _LP64 +extern int sys_nerr; +# endif + +# else + +# include "glthread/lock.h" + +/* This lock protects the buffer returned by strerror(). We assume that + no other uses of strerror() exist in the program. */ +gl_lock_define_initialized(static, strerror_lock) + +# endif + +#endif + +/* On MSVC, there is no snprintf() function, just a _snprintf(). + It is of lower quality, but sufficient for the simple use here. + We only have to make sure to NUL terminate the result (_snprintf + does not NUL terminate, like strncpy). */ +#if !HAVE_SNPRINTF +static int +local_snprintf (char *buf, size_t buflen, const char *format, ...) +{ + va_list args; + int result; + + va_start (args, format); + result = _vsnprintf (buf, buflen, format, args); + va_end (args); + if (buflen > 0 && (result < 0 || result >= buflen)) + buf[buflen - 1] = '\0'; + return result; +} +# define snprintf local_snprintf +#endif + +/* Copy as much of MSG into BUF as possible, without corrupting errno. + Return 0 if MSG fit in BUFLEN, otherwise return ERANGE. */ +static int +safe_copy (char *buf, size_t buflen, const char *msg) +{ + size_t len = strlen (msg); + int ret; + + if (len < buflen) + { + /* Although POSIX allows memcpy() to corrupt errno, we don't + know of any implementation where this is a real problem. */ + memcpy (buf, msg, len + 1); + ret = 0; + } + else + { + memcpy (buf, msg, buflen - 1); + buf[buflen - 1] = '\0'; + ret = ERANGE; + } + return ret; +} + + +int +strerror_r (int errnum, char *buf, size_t buflen) +#undef strerror_r +{ + /* Filter this out now, so that rest of this replacement knows that + there is room for a non-empty message and trailing NUL. */ + if (buflen <= 1) + { + if (buflen) + *buf = '\0'; + return ERANGE; + } + *buf = '\0'; + + /* Check for gnulib overrides. */ + { + char const *msg = strerror_override (errnum); + + if (msg) + return safe_copy (buf, buflen, msg); + } + + { + int ret; + int saved_errno = errno; + +#if USE_XPG_STRERROR_R + + { + extern int __xpg_strerror_r (int errnum, char *buf, size_t buflen); + + ret = __xpg_strerror_r (errnum, buf, buflen); + if (ret < 0) + ret = errno; + if (!*buf) + { + /* glibc 2.13 would not touch buf on err, so we have to fall + back to GNU strerror_r which always returns a thread-safe + untruncated string to (partially) copy into our buf. */ + safe_copy (buf, buflen, strerror_r (errnum, buf, buflen)); + } + } + +#elif USE_SYSTEM_STRERROR_R + + if (buflen > INT_MAX) + buflen = INT_MAX; + +# ifdef __hpux + /* On HP-UX 11.31, strerror_r always fails when buflen < 80; it + also fails to change buf on EINVAL. */ + { + char stackbuf[80]; + + if (buflen < sizeof stackbuf) + { + ret = strerror_r (errnum, stackbuf, sizeof stackbuf); + if (ret == 0) + ret = safe_copy (buf, buflen, stackbuf); + } + else + ret = strerror_r (errnum, buf, buflen); + } +# else + ret = strerror_r (errnum, buf, buflen); + + /* Some old implementations may return (-1, EINVAL) instead of EINVAL. */ + if (ret < 0) + ret = errno; +# endif + +# ifdef _AIX + /* AIX returns 0 rather than ERANGE when truncating strings; try + again until we are sure we got the entire string. */ + if (!ret && strlen (buf) == buflen - 1) + { + char stackbuf[STACKBUF_LEN]; + size_t len; + strerror_r (errnum, stackbuf, sizeof stackbuf); + len = strlen (stackbuf); + /* STACKBUF_LEN should have been large enough. */ + if (len + 1 == sizeof stackbuf) + abort (); + if (buflen <= len) + ret = ERANGE; + } +# else + /* Solaris 10 does not populate buf on ERANGE. OpenBSD 4.7 + truncates early on ERANGE rather than return a partial integer. + We prefer the maximal string. We set buf[0] earlier, and we + know of no implementation that modifies buf to be an + unterminated string, so this strlen should be portable in + practice (rather than pulling in a safer strnlen). */ + if (ret == ERANGE && strlen (buf) < buflen - 1) + { + char stackbuf[STACKBUF_LEN]; + + /* STACKBUF_LEN should have been large enough. */ + if (strerror_r (errnum, stackbuf, sizeof stackbuf) == ERANGE) + abort (); + safe_copy (buf, buflen, stackbuf); + } +# endif + +#else /* USE_SYSTEM_STRERROR */ + + /* Try to do what strerror (errnum) does, but without clobbering the + buffer used by strerror(). */ + +# if defined __NetBSD__ || defined __hpux || ((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__) || defined __CYGWIN__ /* NetBSD, HP-UX, native Win32, Cygwin */ + + /* NetBSD: sys_nerr, sys_errlist are declared through _NETBSD_SOURCE + and above. + HP-UX: sys_nerr, sys_errlist are declared explicitly above. + native Win32: sys_nerr, sys_errlist are declared in . + Cygwin: sys_nerr, sys_errlist are declared in . */ + if (errnum >= 0 && errnum < sys_nerr) + { +# if HAVE_CATGETS && (defined __NetBSD__ || defined __hpux) +# if defined __NetBSD__ + nl_catd catd = catopen ("libc", NL_CAT_LOCALE); + const char *errmsg = + (catd != (nl_catd)-1 + ? catgets (catd, 1, errnum, sys_errlist[errnum]) + : sys_errlist[errnum]); +# endif +# if defined __hpux + nl_catd catd = catopen ("perror", NL_CAT_LOCALE); + const char *errmsg = + (catd != (nl_catd)-1 + ? catgets (catd, 1, 1 + errnum, sys_errlist[errnum]) + : sys_errlist[errnum]); +# endif +# else + const char *errmsg = sys_errlist[errnum]; +# endif + if (errmsg == NULL || *errmsg == '\0') + ret = EINVAL; + else + ret = safe_copy (buf, buflen, errmsg); +# if HAVE_CATGETS && (defined __NetBSD__ || defined __hpux) + if (catd != (nl_catd)-1) + catclose (catd); +# endif + } + else + ret = EINVAL; + +# elif defined __sgi || (defined __sun && !defined _LP64) /* IRIX, Solaris <= 9 32-bit */ + + /* For a valid error number, the system's strerror() function returns + a pointer to a not copied string, not to a buffer. */ + if (errnum >= 0 && errnum < sys_nerr) + { + char *errmsg = strerror (errnum); + + if (errmsg == NULL || *errmsg == '\0') + ret = EINVAL; + else + ret = safe_copy (buf, buflen, errmsg); + } + else + ret = EINVAL; + +# else + + gl_lock_lock (strerror_lock); + + { + char *errmsg = strerror (errnum); + + /* For invalid error numbers, strerror() on + - IRIX 6.5 returns NULL, + - HP-UX 11 returns an empty string. */ + if (errmsg == NULL || *errmsg == '\0') + ret = EINVAL; + else + ret = safe_copy (buf, buflen, errmsg); + } + + gl_lock_unlock (strerror_lock); + +# endif + +#endif + + if (ret == EINVAL && !*buf) + snprintf (buf, buflen, "Unknown error %d", errnum); + + errno = saved_errno; + return ret; + } +} diff --git a/gnulib/lib/strftime.c b/gnulib/lib/strftime.c new file mode 100644 index 0000000..acebc9a --- /dev/null +++ b/gnulib/lib/strftime.c @@ -0,0 +1,1469 @@ +/* Copyright (C) 1991-2001, 2003-2007, 2009-2011 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 . */ + +#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 +# if FPRINTFTIME +# include "ignore-value.h" +# include "fprintftime.h" +# else +# include "strftime.h" +# endif +#endif + +#include +#include + +#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. + + The DEC-HANYU encoding used on OSF/1 is not safe for formats, but + this encoding has never been seen in real-life use, so we ignore + it. */ +#if !(defined __osf__ && 0) +# define MULTIBYTE_IS_FORMAT_SAFE 1 +#endif +#define DO_MULTIBYTE (! MULTIBYTE_IS_FORMAT_SAFE) + +#if DO_MULTIBYTE +# include + static const mbstate_t mbstate_zero; +#endif + +#include +#include +#include +#include +#include + +#ifdef COMPILE_WIDE +# include +# 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 \ + { \ + size_t _n = (n); \ + size_t _w = (width < 0 ? 0 : width); \ + size_t _incr = _n < _w ? _w : _n; \ + if (_incr >= maxsize - i) \ + return 0; \ + if (p) \ + { \ + if (digits == 0 && _n < _w) \ + { \ + size_t _delta = width - _n; \ + 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 = © +#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 (<m); + + /* 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 (<m); + + 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 (<, &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 (<, >m)) + break; + + diff = tm_diff (<m, >m); + } +#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 0000000..3410568 --- /dev/null +++ b/gnulib/lib/strftime.h @@ -0,0 +1,34 @@ +/* declarations for strftime.c + + Copyright (C) 2002, 2004, 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#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 0000000..9bbed46 --- /dev/null +++ b/gnulib/lib/striconv.c @@ -0,0 +1,464 @@ +/* Charset conversion. + Copyright (C) 2001-2007, 2010-2011 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 + +/* Specification. */ +#include "striconv.h" + +#include +#include +#include + +#if HAVE_ICONV +# include +/* Get MB_LEN_MAX, CHAR_BIT. */ +# include +#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__ == 2 && __GLIBC_MINOR__ <= 1) && !defined __UCLIBC__) \ + || 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__ && !defined __UCLIBC__) + /* 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__ == 2 && __GLIBC_MINOR__ <= 1) && !defined __UCLIBC__) \ + || 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__ == 2 && __GLIBC_MINOR__ <= 1) && !defined __UCLIBC__) \ + || 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__ && !defined __UCLIBC__) + /* 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__ == 2 && __GLIBC_MINOR__ <= 1) && !defined __UCLIBC__) \ + || 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__ && !defined __UCLIBC__) + /* 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__ == 2 && __GLIBC_MINOR__ <= 1) && !defined __UCLIBC__) \ + || 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__ == 2 && __GLIBC_MINOR__ <= 1) && !defined __UCLIBC__) \ + || 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__ == 2 && __GLIBC_MINOR__ <= 1) && !defined __UCLIBC__) \ + && !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 0000000..4229b63 --- /dev/null +++ b/gnulib/lib/striconv.h @@ -0,0 +1,76 @@ +/* Charset conversion. + Copyright (C) 2001-2004, 2006-2007, 2009-2011 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 +#if HAVE_ICONV +#include +#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 0000000..311dc77 --- /dev/null +++ b/gnulib/lib/striconveh.c @@ -0,0 +1,1199 @@ +/* Character set conversion with error handling. + Copyright (C) 2001-2011 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 . */ + +#include + +/* Specification. */ +#include "striconveh.h" + +#include +#include +#include +#include + +#if HAVE_ICONV +# include +# 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__ == 2 && __GLIBC_MINOR__ <= 1) && !defined __UCLIBC__) \ + && !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) \ + && !defined __UCLIBC__) \ + || _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__ && !defined __UCLIBC__) +/* 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__ && !defined __UCLIBC__) + /* 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__ == 2 && __GLIBC_MINOR__ <= 1) && !defined __UCLIBC__) \ + || 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 __UCLIBC__) \ + || 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__ == 2 && __GLIBC_MINOR__ <= 1) && !defined __UCLIBC__) \ + || 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 __UCLIBC__) \ + || 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 __UCLIBC__) \ + || 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__ && !defined __UCLIBC__) + /* 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; + + if (*resultp != NULL && *lengthp >= memsize) + result = *resultp; + else + { + char *memory; + + memory = (char *) malloc (memsize > 0 ? memsize : 1); + if (memory != NULL) + result = memory; + else + { + errno = ENOMEM; + return -1; + } + } + memcpy (result, tmpbuf, length); + } + 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 0000000..dd6b604 --- /dev/null +++ b/gnulib/lib/striconveh.h @@ -0,0 +1,140 @@ +/* Character set conversion with error handling. + Copyright (C) 2001-2007, 2009-2011 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 . */ + +#ifndef _STRICONVEH_H +#define _STRICONVEH_H + +#include +#if HAVE_ICONV +#include +#endif + +#include "iconveh.h" + + +#ifdef __cplusplus +extern "C" { +#endif + + +#if HAVE_ICONV + +/* A 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 0000000..fb4c496 --- /dev/null +++ b/gnulib/lib/striconveha.c @@ -0,0 +1,352 @@ +/* Character set conversion with error handling and autodetection. + Copyright (C) 2002, 2005, 2007, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include "striconveha.h" + +#include +#include +#include + +#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) \ + && !defined __UCLIBC__) \ + || _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) \ + && !defined __UCLIBC__) \ + || _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 0000000..792e6a8 --- /dev/null +++ b/gnulib/lib/striconveha.h @@ -0,0 +1,95 @@ +/* Character set conversion with error handling and autodetection. + Copyright (C) 2002, 2005, 2007-2011 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 . */ + +#ifndef _STRICONVEHA_H +#define _STRICONVEHA_H + +#include +#include + +#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 0000000..d8b753d --- /dev/null +++ b/gnulib/lib/string.in.h @@ -0,0 +1,1011 @@ +/* A GNU-like . + + Copyright (C) 1995-1996, 2001-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 _@GUARD_PREFIX@_STRING_H + +#if __GNUC__ >= 3 +@PRAGMA_SYSTEM_HEADER@ +#endif +@PRAGMA_COLUMNS@ + +/* The include_next requires a split double-inclusion guard. */ +#@INCLUDE_NEXT@ @NEXT_STRING_H@ + +#ifndef _@GUARD_PREFIX@_STRING_H +#define _@GUARD_PREFIX@_STRING_H + +/* NetBSD 5.0 mis-defines NULL. */ +#include + +/* MirBSD defines mbslen as a macro. */ +#if @GNULIB_MBSLEN@ && defined __MirBSD__ +# include +#endif + +/* The __attribute__ feature is available in gcc versions 2.5 and later. + The attribute __pure__ was added in gcc 2.96. */ +#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) +# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__)) +#else +# define _GL_ATTRIBUTE_PURE /* empty */ +#endif + +/* NetBSD 5.0 declares strsignal in , not in . */ +/* But in any case avoid namespace pollution on glibc systems. */ +#if (@GNULIB_STRSIGNAL@ || defined GNULIB_POSIXCHECK) && defined __NetBSD__ \ + && ! defined __GLIBC__ +# include +#endif + +/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ + +/* The definition of _GL_ARG_NONNULL is copied here. */ + +/* The definition of _GL_WARN_ON_USE is copied here. */ + + +/* Find the index of the least-significant set bit. */ +#if @GNULIB_FFSL@ +# if !@HAVE_FFSL@ +_GL_FUNCDECL_SYS (ffsl, int, (long int i)); +# endif +_GL_CXXALIAS_SYS (ffsl, int, (long int i)); +_GL_CXXALIASWARN (ffsl); +#elif defined GNULIB_POSIXCHECK +# undef ffsl +# if HAVE_RAW_DECL_FFSL +_GL_WARN_ON_USE (ffsl, "ffsl is not portable - use the ffsl module"); +# endif +#endif + + +/* Find the index of the least-significant set bit. */ +#if @GNULIB_FFSLL@ +# if !@HAVE_FFSLL@ +_GL_FUNCDECL_SYS (ffsll, int, (long long int i)); +# endif +_GL_CXXALIAS_SYS (ffsll, int, (long long int i)); +_GL_CXXALIASWARN (ffsll); +#elif defined GNULIB_POSIXCHECK +# undef ffsll +# if HAVE_RAW_DECL_FFSLL +_GL_WARN_ON_USE (ffsll, "ffsll is not portable - use the ffsll module"); +# endif +#endif + + +/* Return the first instance of C within N bytes of S, or NULL. */ +#if @GNULIB_MEMCHR@ +# if @REPLACE_MEMCHR@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define memchr rpl_memchr +# endif +_GL_FUNCDECL_RPL (memchr, void *, (void const *__s, int __c, size_t __n) + _GL_ATTRIBUTE_PURE + _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (memchr, void *, (void const *__s, int __c, size_t __n)); +# else +# if ! @HAVE_MEMCHR@ +_GL_FUNCDECL_SYS (memchr, void *, (void const *__s, int __c, size_t __n) + _GL_ATTRIBUTE_PURE + _GL_ARG_NONNULL ((1))); +# endif + /* On some systems, this function is defined as an overloaded function: + extern "C" { const void * std::memchr (const void *, int, size_t); } + extern "C++" { void * std::memchr (void *, int, size_t); } */ +_GL_CXXALIAS_SYS_CAST2 (memchr, + void *, (void const *__s, int __c, size_t __n), + void const *, (void const *__s, int __c, size_t __n)); +# endif +# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \ + && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) +_GL_CXXALIASWARN1 (memchr, void *, (void *__s, int __c, size_t __n)); +_GL_CXXALIASWARN1 (memchr, void const *, + (void const *__s, int __c, size_t __n)); +# else +_GL_CXXALIASWARN (memchr); +# 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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define memmem rpl_memmem +# endif +_GL_FUNCDECL_RPL (memmem, void *, + (void const *__haystack, size_t __haystack_len, + void const *__needle, size_t __needle_len) + _GL_ATTRIBUTE_PURE + _GL_ARG_NONNULL ((1, 3))); +_GL_CXXALIAS_RPL (memmem, void *, + (void const *__haystack, size_t __haystack_len, + void const *__needle, size_t __needle_len)); +# else +# if ! @HAVE_DECL_MEMMEM@ +_GL_FUNCDECL_SYS (memmem, void *, + (void const *__haystack, size_t __haystack_len, + void const *__needle, size_t __needle_len) + _GL_ATTRIBUTE_PURE + _GL_ARG_NONNULL ((1, 3))); +# endif +_GL_CXXALIAS_SYS (memmem, void *, + (void const *__haystack, size_t __haystack_len, + void const *__needle, size_t __needle_len)); +# endif +_GL_CXXALIASWARN (memmem); +#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@ +_GL_FUNCDECL_SYS (mempcpy, void *, + (void *restrict __dest, void const *restrict __src, + size_t __n) + _GL_ARG_NONNULL ((1, 2))); +# endif +_GL_CXXALIAS_SYS (mempcpy, void *, + (void *restrict __dest, void const *restrict __src, + size_t __n)); +_GL_CXXALIASWARN (mempcpy); +#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@ +_GL_FUNCDECL_SYS (memrchr, void *, (void const *, int, size_t) + _GL_ATTRIBUTE_PURE + _GL_ARG_NONNULL ((1))); +# endif + /* On some systems, this function is defined as an overloaded function: + extern "C++" { const void * std::memrchr (const void *, int, size_t); } + extern "C++" { void * std::memrchr (void *, int, size_t); } */ +_GL_CXXALIAS_SYS_CAST2 (memrchr, + void *, (void const *, int, size_t), + void const *, (void const *, int, size_t)); +# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \ + && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) +_GL_CXXALIASWARN1 (memrchr, void *, (void *, int, size_t)); +_GL_CXXALIASWARN1 (memrchr, void const *, (void const *, int, size_t)); +# else +_GL_CXXALIASWARN (memrchr); +# 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@ +_GL_FUNCDECL_SYS (rawmemchr, void *, (void const *__s, int __c_in) + _GL_ATTRIBUTE_PURE + _GL_ARG_NONNULL ((1))); +# endif + /* On some systems, this function is defined as an overloaded function: + extern "C++" { const void * std::rawmemchr (const void *, int); } + extern "C++" { void * std::rawmemchr (void *, int); } */ +_GL_CXXALIAS_SYS_CAST2 (rawmemchr, + void *, (void const *__s, int __c_in), + void const *, (void const *__s, int __c_in)); +# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \ + && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) +_GL_CXXALIASWARN1 (rawmemchr, void *, (void *__s, int __c_in)); +_GL_CXXALIASWARN1 (rawmemchr, void const *, (void const *__s, int __c_in)); +# else +_GL_CXXALIASWARN (rawmemchr); +# 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@ +_GL_FUNCDECL_SYS (stpcpy, char *, + (char *restrict __dst, char const *restrict __src) + _GL_ARG_NONNULL ((1, 2))); +# endif +_GL_CXXALIAS_SYS (stpcpy, char *, + (char *restrict __dst, char const *restrict __src)); +_GL_CXXALIASWARN (stpcpy); +#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 @REPLACE_STPNCPY@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef stpncpy +# define stpncpy rpl_stpncpy +# endif +_GL_FUNCDECL_RPL (stpncpy, char *, + (char *restrict __dst, char const *restrict __src, + size_t __n) + _GL_ARG_NONNULL ((1, 2))); +_GL_CXXALIAS_RPL (stpncpy, char *, + (char *restrict __dst, char const *restrict __src, + size_t __n)); +# else +# if ! @HAVE_STPNCPY@ +_GL_FUNCDECL_SYS (stpncpy, char *, + (char *restrict __dst, char const *restrict __src, + size_t __n) + _GL_ARG_NONNULL ((1, 2))); +# endif +_GL_CXXALIAS_SYS (stpncpy, char *, + (char *restrict __dst, char const *restrict __src, + size_t __n)); +# endif +_GL_CXXALIASWARN (stpncpy); +#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 @REPLACE_STRCHRNUL@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define strchrnul rpl_strchrnul +# endif +_GL_FUNCDECL_RPL (strchrnul, char *, (const char *__s, int __c_in) + _GL_ATTRIBUTE_PURE + _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (strchrnul, char *, + (const char *str, int ch)); +# else +# if ! @HAVE_STRCHRNUL@ +_GL_FUNCDECL_SYS (strchrnul, char *, (char const *__s, int __c_in) + _GL_ATTRIBUTE_PURE + _GL_ARG_NONNULL ((1))); +# endif + /* On some systems, this function is defined as an overloaded function: + extern "C++" { const char * std::strchrnul (const char *, int); } + extern "C++" { char * std::strchrnul (char *, int); } */ +_GL_CXXALIAS_SYS_CAST2 (strchrnul, + char *, (char const *__s, int __c_in), + char const *, (char const *__s, int __c_in)); +# endif +# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \ + && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) +_GL_CXXALIASWARN1 (strchrnul, char *, (char *__s, int __c_in)); +_GL_CXXALIASWARN1 (strchrnul, char const *, (char const *__s, int __c_in)); +# else +_GL_CXXALIASWARN (strchrnul); +# 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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef strdup +# define strdup rpl_strdup +# endif +_GL_FUNCDECL_RPL (strdup, char *, (char const *__s) _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (strdup, char *, (char const *__s)); +# else +# if defined __cplusplus && defined GNULIB_NAMESPACE && defined strdup + /* strdup exists as a function and as a macro. Get rid of the macro. */ +# undef strdup +# endif +# if !(@HAVE_DECL_STRDUP@ || defined strdup) +_GL_FUNCDECL_SYS (strdup, char *, (char const *__s) _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (strdup, char *, (char const *__s)); +# endif +_GL_CXXALIASWARN (strdup); +#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 + +/* Append no more than N characters from SRC onto DEST. */ +#if @GNULIB_STRNCAT@ +# if @REPLACE_STRNCAT@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef strncat +# define strncat rpl_strncat +# endif +_GL_FUNCDECL_RPL (strncat, char *, (char *dest, const char *src, size_t n) + _GL_ARG_NONNULL ((1, 2))); +_GL_CXXALIAS_RPL (strncat, char *, (char *dest, const char *src, size_t n)); +# else +_GL_CXXALIAS_SYS (strncat, char *, (char *dest, const char *src, size_t n)); +# endif +_GL_CXXALIASWARN (strncat); +#elif defined GNULIB_POSIXCHECK +# undef strncat +# if HAVE_RAW_DECL_STRNCAT +_GL_WARN_ON_USE (strncat, "strncat is unportable - " + "use gnulib module strncat for portability"); +# endif +#endif + +/* Return a newly allocated copy of at most N bytes of STRING. */ +#if @GNULIB_STRNDUP@ +# if @REPLACE_STRNDUP@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef strndup +# define strndup rpl_strndup +# endif +_GL_FUNCDECL_RPL (strndup, char *, (char const *__string, size_t __n) + _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (strndup, char *, (char const *__string, size_t __n)); +# else +# if ! @HAVE_DECL_STRNDUP@ +_GL_FUNCDECL_SYS (strndup, char *, (char const *__string, size_t __n) + _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (strndup, char *, (char const *__string, size_t __n)); +# endif +_GL_CXXALIASWARN (strndup); +#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 @REPLACE_STRNLEN@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef strnlen +# define strnlen rpl_strnlen +# endif +_GL_FUNCDECL_RPL (strnlen, size_t, (char const *__string, size_t __maxlen) + _GL_ATTRIBUTE_PURE + _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (strnlen, size_t, (char const *__string, size_t __maxlen)); +# else +# if ! @HAVE_DECL_STRNLEN@ +_GL_FUNCDECL_SYS (strnlen, size_t, (char const *__string, size_t __maxlen) + _GL_ATTRIBUTE_PURE + _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (strnlen, size_t, (char const *__string, size_t __maxlen)); +# endif +_GL_CXXALIASWARN (strnlen); +#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@ +_GL_FUNCDECL_SYS (strpbrk, char *, (char const *__s, char const *__accept) + _GL_ATTRIBUTE_PURE + _GL_ARG_NONNULL ((1, 2))); +# endif + /* On some systems, this function is defined as an overloaded function: + extern "C" { const char * strpbrk (const char *, const char *); } + extern "C++" { char * strpbrk (char *, const char *); } */ +_GL_CXXALIAS_SYS_CAST2 (strpbrk, + char *, (char const *__s, char const *__accept), + const char *, (char const *__s, char const *__accept)); +# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \ + && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) +_GL_CXXALIASWARN1 (strpbrk, char *, (char *__s, char const *__accept)); +_GL_CXXALIASWARN1 (strpbrk, char const *, + (char const *__s, char const *__accept)); +# else +_GL_CXXALIASWARN (strpbrk); +# 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@ +_GL_FUNCDECL_SYS (strsep, char *, + (char **restrict __stringp, char const *restrict __delim) + _GL_ARG_NONNULL ((1, 2))); +# endif +_GL_CXXALIAS_SYS (strsep, char *, + (char **restrict __stringp, char const *restrict __delim)); +_GL_CXXALIASWARN (strsep); +# 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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define strstr rpl_strstr +# endif +_GL_FUNCDECL_RPL (strstr, char *, (const char *haystack, const char *needle) + _GL_ATTRIBUTE_PURE + _GL_ARG_NONNULL ((1, 2))); +_GL_CXXALIAS_RPL (strstr, char *, (const char *haystack, const char *needle)); +# else + /* On some systems, this function is defined as an overloaded function: + extern "C++" { const char * strstr (const char *, const char *); } + extern "C++" { char * strstr (char *, const char *); } */ +_GL_CXXALIAS_SYS_CAST2 (strstr, + char *, (const char *haystack, const char *needle), + const char *, (const char *haystack, const char *needle)); +# endif +# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \ + && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) +_GL_CXXALIASWARN1 (strstr, char *, (char *haystack, const char *needle)); +_GL_CXXALIASWARN1 (strstr, const char *, + (const char *haystack, const char *needle)); +# else +_GL_CXXALIASWARN (strstr); +# 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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define strcasestr rpl_strcasestr +# endif +_GL_FUNCDECL_RPL (strcasestr, char *, + (const char *haystack, const char *needle) + _GL_ATTRIBUTE_PURE + _GL_ARG_NONNULL ((1, 2))); +_GL_CXXALIAS_RPL (strcasestr, char *, + (const char *haystack, const char *needle)); +# else +# if ! @HAVE_STRCASESTR@ +_GL_FUNCDECL_SYS (strcasestr, char *, + (const char *haystack, const char *needle) + _GL_ATTRIBUTE_PURE + _GL_ARG_NONNULL ((1, 2))); +# endif + /* On some systems, this function is defined as an overloaded function: + extern "C++" { const char * strcasestr (const char *, const char *); } + extern "C++" { char * strcasestr (char *, const char *); } */ +_GL_CXXALIAS_SYS_CAST2 (strcasestr, + char *, (const char *haystack, const char *needle), + const char *, (const char *haystack, const char *needle)); +# endif +# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \ + && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) +_GL_CXXALIASWARN1 (strcasestr, char *, (char *haystack, const char *needle)); +_GL_CXXALIASWARN1 (strcasestr, const char *, + (const char *haystack, const char *needle)); +# else +_GL_CXXALIASWARN (strcasestr); +# 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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef strtok_r +# define strtok_r rpl_strtok_r +# endif +_GL_FUNCDECL_RPL (strtok_r, char *, + (char *restrict s, char const *restrict delim, + char **restrict save_ptr) + _GL_ARG_NONNULL ((2, 3))); +_GL_CXXALIAS_RPL (strtok_r, char *, + (char *restrict s, char const *restrict delim, + char **restrict save_ptr)); +# else +# if @UNDEFINE_STRTOK_R@ || defined GNULIB_POSIXCHECK +# undef strtok_r +# endif +# if ! @HAVE_DECL_STRTOK_R@ +_GL_FUNCDECL_SYS (strtok_r, char *, + (char *restrict s, char const *restrict delim, + char **restrict save_ptr) + _GL_ARG_NONNULL ((2, 3))); +# endif +_GL_CXXALIAS_SYS (strtok_r, char *, + (char *restrict s, char const *restrict delim, + char **restrict save_ptr)); +# endif +_GL_CXXALIASWARN (strtok_r); +# 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. */ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define mbslen rpl_mbslen +# endif +_GL_FUNCDECL_RPL (mbslen, size_t, (const char *string) _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (mbslen, size_t, (const char *string)); +# else +_GL_FUNCDECL_SYS (mbslen, size_t, (const char *string) _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_SYS (mbslen, size_t, (const char *string)); +# endif +_GL_CXXALIASWARN (mbslen); +#endif + +#if @GNULIB_MBSNLEN@ +/* Return the number of multibyte characters in the character string starting + at STRING and ending at STRING + LEN. */ +_GL_EXTERN_C 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. */ +# if defined __hpux +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define mbschr rpl_mbschr /* avoid collision with HP-UX function */ +# endif +_GL_FUNCDECL_RPL (mbschr, char *, (const char *string, int c) + _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (mbschr, char *, (const char *string, int c)); +# else +_GL_FUNCDECL_SYS (mbschr, char *, (const char *string, int c) + _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_SYS (mbschr, char *, (const char *string, int c)); +# endif +_GL_CXXALIASWARN (mbschr); +#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. */ +# if defined __hpux || defined __INTERIX +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define mbsrchr rpl_mbsrchr /* avoid collision with system function */ +# endif +_GL_FUNCDECL_RPL (mbsrchr, char *, (const char *string, int c) + _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (mbsrchr, char *, (const char *string, int c)); +# else +_GL_FUNCDECL_SYS (mbsrchr, char *, (const char *string, int c) + _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_SYS (mbsrchr, char *, (const char *string, int c)); +# endif +_GL_CXXALIASWARN (mbsrchr); +#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. */ +_GL_EXTERN_C 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. */ +_GL_EXTERN_C 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! */ +_GL_EXTERN_C 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. If the two match, return a pointer to the first byte + after this prefix in STRING. Otherwise, return NULL. + Note: This function may, in multibyte locales, return non-NULL if STRING + is of smaller length than PREFIX! + Unlike strncasecmp(), this function works correctly in multibyte + locales. */ +_GL_EXTERN_C 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. */ +_GL_EXTERN_C 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. */ +_GL_EXTERN_C 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. */ +# if defined __hpux +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define mbspbrk rpl_mbspbrk /* avoid collision with HP-UX function */ +# endif +_GL_FUNCDECL_RPL (mbspbrk, char *, (const char *string, const char *accept) + _GL_ARG_NONNULL ((1, 2))); +_GL_CXXALIAS_RPL (mbspbrk, char *, (const char *string, const char *accept)); +# else +_GL_FUNCDECL_SYS (mbspbrk, char *, (const char *string, const char *accept) + _GL_ARG_NONNULL ((1, 2))); +_GL_CXXALIAS_SYS (mbspbrk, char *, (const char *string, const char *accept)); +# endif +_GL_CXXALIASWARN (mbspbrk); +#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. */ +_GL_EXTERN_C 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(). */ +_GL_EXTERN_C 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(). */ +_GL_EXTERN_C 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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef strerror +# define strerror rpl_strerror +# endif +_GL_FUNCDECL_RPL (strerror, char *, (int)); +_GL_CXXALIAS_RPL (strerror, char *, (int)); +# else +_GL_CXXALIAS_SYS (strerror, char *, (int)); +# endif +_GL_CXXALIASWARN (strerror); +#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 + +/* Map any int, typically from errno, into an error message. Multithread-safe. + Uses the POSIX declaration, not the glibc declaration. */ +#if @GNULIB_STRERROR_R@ +# if @REPLACE_STRERROR_R@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef strerror_r +# define strerror_r rpl_strerror_r +# endif +_GL_FUNCDECL_RPL (strerror_r, int, (int errnum, char *buf, size_t buflen) + _GL_ARG_NONNULL ((2))); +_GL_CXXALIAS_RPL (strerror_r, int, (int errnum, char *buf, size_t buflen)); +# else +# if !@HAVE_DECL_STRERROR_R@ +_GL_FUNCDECL_SYS (strerror_r, int, (int errnum, char *buf, size_t buflen) + _GL_ARG_NONNULL ((2))); +# endif +_GL_CXXALIAS_SYS (strerror_r, int, (int errnum, char *buf, size_t buflen)); +# endif +# if @HAVE_DECL_STRERROR_R@ +_GL_CXXALIASWARN (strerror_r); +# endif +#elif defined GNULIB_POSIXCHECK +# undef strerror_r +# if HAVE_RAW_DECL_STRERROR_R +_GL_WARN_ON_USE (strerror_r, "strerror_r is unportable - " + "use gnulib module strerror_r-posix for portability"); +# endif +#endif + +#if @GNULIB_STRSIGNAL@ +# if @REPLACE_STRSIGNAL@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define strsignal rpl_strsignal +# endif +_GL_FUNCDECL_RPL (strsignal, char *, (int __sig)); +_GL_CXXALIAS_RPL (strsignal, char *, (int __sig)); +# else +# if ! @HAVE_DECL_STRSIGNAL@ +_GL_FUNCDECL_SYS (strsignal, char *, (int __sig)); +# endif +/* Need to cast, because on Cygwin 1.5.x systems, the return type is + 'const char *'. */ +_GL_CXXALIAS_SYS_CAST (strsignal, char *, (int __sig)); +# endif +_GL_CXXALIASWARN (strsignal); +#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@ +_GL_FUNCDECL_SYS (strverscmp, int, (const char *, const char *) + _GL_ARG_NONNULL ((1, 2))); +# endif +_GL_CXXALIAS_SYS (strverscmp, int, (const char *, const char *)); +_GL_CXXALIASWARN (strverscmp); +#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 + + +#endif /* _@GUARD_PREFIX@_STRING_H */ +#endif /* _@GUARD_PREFIX@_STRING_H */ diff --git a/gnulib/lib/strings.in.h b/gnulib/lib/strings.in.h new file mode 100644 index 0000000..7eaf28d --- /dev/null +++ b/gnulib/lib/strings.in.h @@ -0,0 +1,123 @@ +/* A substitute . + + Copyright (C) 2007-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 _@GUARD_PREFIX@_STRINGS_H + +#if __GNUC__ >= 3 +@PRAGMA_SYSTEM_HEADER@ +#endif +@PRAGMA_COLUMNS@ + +/* Minix 3.1.8 has a bug: must be included before . + But avoid namespace pollution on glibc systems. */ +#if defined __minix && !defined __GLIBC__ +# include +#endif + +/* The include_next requires a split double-inclusion guard. */ +#if @HAVE_STRINGS_H@ +# @INCLUDE_NEXT@ @NEXT_STRINGS_H@ +#endif + +#ifndef _@GUARD_PREFIX@_STRINGS_H +#define _@GUARD_PREFIX@_STRINGS_H + +#if ! @HAVE_DECL_STRNCASECMP@ +/* Get size_t. */ +# include +#endif + + +/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ + +/* The definition of _GL_ARG_NONNULL is copied here. */ + +/* The definition of _GL_WARN_ON_USE is copied here. */ + +#ifdef __cplusplus +extern "C" { +#endif + + + /* Find the index of the least-significant set bit. */ +#if @GNULIB_FFS@ +# if !@HAVE_FFS@ +_GL_FUNCDECL_SYS (ffs, int, (int i)); +# endif +_GL_CXXALIAS_SYS (ffs, int, (int i)); +_GL_CXXALIASWARN (ffs); +#elif defined GNULIB_POSIXCHECK +# undef ffs +# if HAVE_RAW_DECL_FFS +_GL_WARN_ON_USE (ffs, "ffs is not portable - use the ffs module"); +# endif +#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 /* _@GUARD_PREFIX@_STRING_H */ +#endif /* _@GUARD_PREFIX@_STRING_H */ diff --git a/gnulib/lib/stripslash.c b/gnulib/lib/stripslash.c new file mode 100644 index 0000000..1212440 --- /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-2011 Free Software Foundation, + Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#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 0000000..c44da83 --- /dev/null +++ b/gnulib/lib/strncasecmp.c @@ -0,0 +1,63 @@ +/* strncasecmp.c -- case insensitive string comparator + Copyright (C) 1998-1999, 2005-2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 + +/* Specification. */ +#include + +#include +#include + +#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/strncat.c b/gnulib/lib/strncat.c new file mode 100644 index 0000000..8fe2a64 --- /dev/null +++ b/gnulib/lib/strncat.c @@ -0,0 +1,33 @@ +/* Concatenate strings. + Copyright (C) 1999, 2002, 2006, 2010-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +char * +strncat (char *dest, const char *src, size_t n) +{ + char *destptr = dest + strlen (dest); + + for (; n > 0 && (*destptr = *src) != '\0'; src++, destptr++, n--) + ; + if (n == 0) + *destptr = '\0'; + return dest; +} diff --git a/gnulib/lib/strndup.c b/gnulib/lib/strndup.c new file mode 100644 index 0000000..dd446a8 --- /dev/null +++ b/gnulib/lib/strndup.c @@ -0,0 +1,37 @@ +/* A replacement function, for systems that lack strndup. + + Copyright (C) 1996-1998, 2001-2003, 2005-2007, 2009-2011 Free Software + Foundation, Inc. + + This program is free software; you can 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 + +#include + +#include + +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 0000000..26295cc --- /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-2007, 2009-2011 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 + +#include + +/* 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 0000000..f64ce10 --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "strnlen1.h" + +#include + +/* 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 0000000..a0634fe --- /dev/null +++ b/gnulib/lib/strnlen1.h @@ -0,0 +1,40 @@ +/* Find the length of STRING + 1, but scan at most MAXLEN bytes. + Copyright (C) 2005, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef _STRNLEN1_H +#define _STRNLEN1_H + +#include + + +#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) + _GL_ATTRIBUTE_PURE; + + +#ifdef __cplusplus +} +#endif + + +#endif /* _STRNLEN1_H */ diff --git a/gnulib/lib/strpbrk.c b/gnulib/lib/strpbrk.c new file mode 100644 index 0000000..05e6c51 --- /dev/null +++ b/gnulib/lib/strpbrk.c @@ -0,0 +1,42 @@ +/* Copyright (C) 1991, 1994, 2000, 2002-2003, 2006, 2009-2011 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 + +#include +#include + +#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 0000000..6cf44bc --- /dev/null +++ b/gnulib/lib/strptime.c @@ -0,0 +1,1145 @@ +/* Copyright (C) 2002, 2004-2005, 2007, 2009-2011 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 +#endif + +#include + +#include +#include +#ifdef _LIBC +# include +#endif +#include +#include +#include + +#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 + 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; +#ifdef _NL_CURRENT + size_t num_eras; +#endif + 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. */ +#ifdef _NL_CURRENT + match_century: +#endif + 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': +#ifdef _NL_CURRENT + match_year_in_century: +#endif + /* 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 0000000..77dcb99 --- /dev/null +++ b/gnulib/lib/strsep.c @@ -0,0 +1,58 @@ +/* Copyright (C) 2004, 2007, 2009-2011 Free Software Foundation, Inc. + + Written by Yoann Vandoorselaere . + + This program is free software; you can 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 +#endif + +/* Specification. */ +#include + +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 0000000..7caab1d --- /dev/null +++ b/gnulib/lib/strsignal.c @@ -0,0 +1,200 @@ +/* Copyright (C) 1991, 1994-2002, 2005, 2008-2011 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 . */ + +#ifndef _LIBC +# include +#endif + +/* Specification. */ +#include + +#include +#include +#include + +#ifdef _LIBC +# include +#else /* !_LIBC */ +# include "gettext.h" +# define _(msgid) gettext (msgid) +# define N_(msgid) gettext_noop (msgid) +#endif /* _LIBC */ + +#ifdef _LIBC +# include +#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. */ +# if HAVE_UNISTD_H +# include +# endif + +# 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 - (int) 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 0000000..5399ff6 --- /dev/null +++ b/gnulib/lib/strstr.c @@ -0,0 +1,83 @@ +/* Copyright (C) 1991-1994, 1996-1998, 2000, 2004, 2007-2011 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 +#endif + +/* Specification of strstr. */ +#include + +#include + +#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 0000000..bf6955a --- /dev/null +++ b/gnulib/lib/strtod.c @@ -0,0 +1,367 @@ +/* Copyright (C) 1991-1992, 1997, 1999, 2003, 2006, 2008-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "c-ctype.h" + +#ifndef HAVE_LDEXP_IN_LIBC +#define HAVE_LDEXP_IN_LIBC 0 +#endif +#ifndef HAVE_RAW_DECL_STRTOD +#define HAVE_RAW_DECL_STRTOD 0 +#endif + +/* Return true if C is a space in the current locale, avoiding + problems with signed char and isspace. */ +static bool +locale_isspace (char c) +{ + unsigned char uc = c; + return isspace (uc) != 0; +} + +#if !HAVE_LDEXP_IN_LIBC + #define ldexp dummy_ldexp + /* A dummy definition that will never be invoked. */ + static double ldexp (double x _GL_UNUSED, int exponent _GL_UNUSED) + { + abort (); + return 0.0; + } +#endif + +/* Return X * BASE**EXPONENT. Return an extreme value and set errno + to ERANGE if underflow or overflow occurs. */ +static double +scale_radix_exp (double x, int radix, long int exponent) +{ + /* If RADIX == 10, this code is neither precise nor fast; it is + merely a straightforward and relatively portable approximation. + If N == 2, this code is precise on a radix-2 implementation, + albeit perhaps not fast if ldexp is not in libc. */ + + long int e = exponent; + + if (HAVE_LDEXP_IN_LIBC && radix == 2) + return ldexp (x, e < INT_MIN ? INT_MIN : INT_MAX < e ? INT_MAX : e); + else + { + double r = x; + + if (r != 0) + { + if (e < 0) + { + while (e++ != 0) + { + r /= radix; + if (r == 0 && x != 0) + { + errno = ERANGE; + break; + } + } + } + else + { + while (e-- != 0) + { + if (r < -DBL_MAX / radix) + { + errno = ERANGE; + return -HUGE_VAL; + } + else if (DBL_MAX / radix < r) + { + errno = ERANGE; + return HUGE_VAL; + } + else + r *= radix; + } + } + } + + return r; + } +} + +/* Parse a number at NPTR; this is a bit like strtol (NPTR, ENDPTR) + except there are no leading spaces or signs or "0x", and ENDPTR is + nonnull. The number uses a base BASE (either 10 or 16) fraction, a + radix RADIX (either 10 or 2) exponent, and exponent character + EXPCHAR. To convert from a number of digits to a radix exponent, + multiply by RADIX_MULTIPLIER (either 1 or 4). */ +static double +parse_number (const char *nptr, + int base, int radix, int radix_multiplier, char expchar, + char **endptr) +{ + const char *s = nptr; + bool got_dot = false; + long int exponent = 0; + double num = 0; + + for (;; ++s) + { + int digit; + if (c_isdigit (*s)) + digit = *s - '0'; + else if (base == 16 && c_isxdigit (*s)) + digit = c_tolower (*s) - ('a' - 10); + else if (! got_dot && *s == '.') + { + /* Record that we have found the decimal point. */ + got_dot = true; + continue; + } + else + /* Any other character terminates the number. */ + break; + + /* Make sure that multiplication by base will not overflow. */ + if (num <= DBL_MAX / base) + num = num * base + digit; + else + { + /* 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 += radix_multiplier; + } + + /* Keep track of the number of digits after the decimal point. + If we just divided by base here, we might lose precision. */ + if (got_dot) + exponent -= radix_multiplier; + } + + if (c_tolower (*s) == expchar && ! locale_isspace (s[1])) + { + /* Add any given exponent to the implicit one. */ + int save = errno; + char *end; + long int value = strtol (s + 1, &end, 10); + errno = save; + + if (s + 1 != end) + { + /* Skip past the exponent, and add in the implicit exponent, + resulting in an extreme value on overflow. */ + s = end; + exponent = + (exponent < 0 + ? (value < LONG_MIN - exponent ? LONG_MIN : exponent + value) + : (LONG_MAX - exponent < value ? LONG_MAX : exponent + value)); + } + } + + *endptr = (char *) s; + return scale_radix_exp (num, radix, exponent); +} + +static double underlying_strtod (const char *, char **); + +/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0. + ICC 10.0 has a bug when optimizing the expression -zero. + The expression -DBL_MIN * DBL_MIN does not work when cross-compiling + to PowerPC on MacOS X 10.5. */ +#if defined __hpux || defined __sgi || defined __ICC +static double +compute_minus_zero (void) +{ + return -DBL_MIN * DBL_MIN; +} +# define minus_zero compute_minus_zero () +#else +double minus_zero = -0.0; +#endif + +/* 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) +{ + bool negative = false; + + /* The number so far. */ + double num; + + const char *s = nptr; + const char *end; + char *endbuf; + int saved_errno; + + /* Eat whitespace. */ + while (locale_isspace (*s)) + ++s; + + /* Get the sign. */ + negative = *s == '-'; + if (*s == '-' || *s == '+') + ++s; + + saved_errno = errno; + num = underlying_strtod (s, &endbuf); + end = endbuf; + + if (c_isdigit (s[*s == '.'])) + { + /* If a hex float was converted incorrectly, do it ourselves. + If the string starts with "0x" but does not contain digits, + consume the "0" ourselves. If a hex float is followed by a + 'p' but no exponent, then adjust the end pointer. */ + if (*s == '0' && c_tolower (s[1]) == 'x') + { + if (! c_isxdigit (s[2 + (s[2] == '.')])) + end = s + 1; + else if (end <= s + 2) + { + num = parse_number (s + 2, 16, 2, 4, 'p', &endbuf); + end = endbuf; + } + else + { + const char *p = s + 2; + while (p < end && c_tolower (*p) != 'p') + p++; + if (p < end && ! c_isdigit (p[1 + (p[1] == '-' || p[1] == '+')])) + end = p; + } + } + else + { + /* If "1e 1" was misparsed as 10.0 instead of 1.0, re-do the + underlying strtod on a copy of the original string + truncated to avoid the bug. */ + const char *e = s + 1; + while (e < end && c_tolower (*e) != 'e') + e++; + if (e < end && ! c_isdigit (e[1 + (e[1] == '-' || e[1] == '+')])) + { + char *dup = strdup (s); + errno = saved_errno; + if (!dup) + { + /* Not really our day, is it. Rounding errors are + better than outright failure. */ + num = parse_number (s, 10, 10, 1, 'e', &endbuf); + } + else + { + dup[e - s] = '\0'; + num = underlying_strtod (dup, &endbuf); + saved_errno = errno; + free (dup); + errno = saved_errno; + } + end = e; + } + } + + s = end; + } + + /* Check for infinities and NaNs. */ + else if (c_tolower (*s) == 'i' + && c_tolower (s[1]) == 'n' + && c_tolower (s[2]) == 'f') + { + s += 3; + 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; + num = HUGE_VAL; + errno = saved_errno; + } + else if (c_tolower (*s) == 'n' + && c_tolower (s[1]) == 'a' + && c_tolower (s[2]) == 'n') + { + s += 3; + if (*s == '(') + { + const char *p = s + 1; + while (c_isalnum (*p)) + p++; + if (*p == ')') + s = p + 1; + } + + /* If the underlying implementation misparsed the NaN, assume + its result is incorrect, and return a NaN. Normally it's + better to use the underlying implementation's result, since a + nice implementation populates the bits of the NaN according + to interpreting n-char-sequence as a hexadecimal number. */ + if (s != end) + num = NAN; + errno = saved_errno; + } + else + { + /* No conversion could be performed. */ + errno = EINVAL; + s = nptr; + } + + if (endptr != NULL) + *endptr = (char *) s; + /* Special case -0.0, since at least ICC miscompiles negation. We + can't use copysign(), as that drags in -lm on some platforms. */ + if (!num && negative) + return minus_zero; + return negative ? -num : num; +} + +/* The "underlying" strtod implementation. This must be defined + after strtod because it #undefs strtod. */ +static double +underlying_strtod (const char *nptr, char **endptr) +{ + if (HAVE_RAW_DECL_STRTOD) + { + /* Prefer the native strtod if available. Usually it should + work and it should give more-accurate results than our + approximation. */ + #undef strtod + return strtod (nptr, endptr); + } + else + { + /* Approximate strtod well enough for this module. There's no + need to handle anything but finite unsigned decimal + numbers with nonnull ENDPTR. */ + return parse_number (nptr, 10, 10, 1, 'e', endptr); + } +} diff --git a/gnulib/lib/strtoimax.c b/gnulib/lib/strtoimax.c new file mode 100644 index 0000000..497d155 --- /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-2004, 2006, 2009-2011 Free Software Foundation, + Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +#include + +/* Verify interface. */ +#include + +#include + +#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 0000000..b60efcd --- /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-2011 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 . */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#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 0000000..6c15d11 --- /dev/null +++ b/gnulib/lib/strtol.c @@ -0,0 +1,433 @@ +/* Convert string representation of a number into an integer value. + + Copyright (C) 1991-1992, 1994-1999, 2003, 2005-2007, 2009-2011 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 . */ + +#ifdef _LIBC +# define USE_NUMBER_GROUPING +#else +# include +#endif + +#include +#include +#ifndef __set_errno +# define __set_errno(Val) errno = (Val) +#endif + +#include +#include +#include +#include + +#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 LLONG_MIN +# define STRTOL_LONG_MAX LLONG_MAX +# define STRTOL_ULONG_MAX ULLONG_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 \ + : ~ TYPE_MAXIMUM (t))) +# define TYPE_MAXIMUM(t) \ + ((t) (! TYPE_SIGNED (t) \ + ? (t) -1 \ + : ((((t) 1 << (sizeof (t) * CHAR_BIT - 2)) - 1) * 2 + 1))) + +# ifndef ULLONG_MAX +# define ULLONG_MAX TYPE_MAXIMUM (unsigned long long) +# endif +# ifndef LLONG_MAX +# define LLONG_MAX TYPE_MAXIMUM (long long int) +# endif +# ifndef LLONG_MIN +# define LLONG_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 = ULLONG_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 + +#ifdef USE_WIDE_CHAR +# include +# include +# 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 . */ + 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 0000000..75afa4d --- /dev/null +++ b/gnulib/lib/strtoll.c @@ -0,0 +1,33 @@ +/* Function to parse a `long long int' from text. + Copyright (C) 1995-1997, 1999, 2001, 2009-2011 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 . */ + +#define QUAD 1 + +#include + +#ifdef _LIBC +# ifdef SHARED +# include + +# 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 0000000..6fa6d0c --- /dev/null +++ b/gnulib/lib/strtoul.c @@ -0,0 +1,19 @@ +/* Copyright (C) 1991, 1997, 2009-2011 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 . */ + +#define UNSIGNED 1 + +#include "strtol.c" diff --git a/gnulib/lib/strtoull.c b/gnulib/lib/strtoull.c new file mode 100644 index 0000000..bf25995 --- /dev/null +++ b/gnulib/lib/strtoull.c @@ -0,0 +1,26 @@ +/* Function to parse an `unsigned long long int' from text. + Copyright (C) 1995-1997, 1999, 2009-2011 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 . */ + +#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 0000000..dc395d6 --- /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 0000000..be527a7 --- /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-2011 Free Software + Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Jean-François Bignolles , 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 +#endif + +#include +#include + +/* 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 0000000..2896cc9 --- /dev/null +++ b/gnulib/lib/symlink.c @@ -0,0 +1,57 @@ +/* Stub for symlink(). + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include +#include +#include + + +#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 0000000..fc5bb52 --- /dev/null +++ b/gnulib/lib/symlinkat.c @@ -0,0 +1,76 @@ +/* Create a symlink relative to an open directory. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Eric Blake */ + +#include + +#include + +#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 + +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 */ diff --git a/gnulib/lib/sys_file.in.h b/gnulib/lib/sys_file.in.h new file mode 100644 index 0000000..1e10dae --- /dev/null +++ b/gnulib/lib/sys_file.in.h @@ -0,0 +1,64 @@ +/* Provide a more complete sys/file.h. + + Copyright (C) 2007-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 _@GUARD_PREFIX@_SYS_FILE_H + +#if __GNUC__ >= 3 +@PRAGMA_SYSTEM_HEADER@ +#endif +@PRAGMA_COLUMNS@ + +/* The include_next requires a split double-inclusion guard. */ +#if @HAVE_SYS_FILE_H@ +# @INCLUDE_NEXT@ @NEXT_SYS_FILE_H@ +#endif + +#ifndef _@GUARD_PREFIX@_SYS_FILE_H +#define _@GUARD_PREFIX@_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 /* _@GUARD_PREFIX@_SYS_FILE_H */ +#endif /* _@GUARD_PREFIX@_SYS_FILE_H */ diff --git a/gnulib/lib/sys_ioctl.in.h b/gnulib/lib/sys_ioctl.in.h new file mode 100644 index 0000000..5ed764e --- /dev/null +++ b/gnulib/lib/sys_ioctl.in.h @@ -0,0 +1,79 @@ +/* Substitute for and wrapper around . + Copyright (C) 2008-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 _@GUARD_PREFIX@_SYS_IOCTL_H + +#if __GNUC__ >= 3 +@PRAGMA_SYSTEM_HEADER@ +#endif +@PRAGMA_COLUMNS@ + +/* The include_next requires a split double-inclusion guard. */ +#if @HAVE_SYS_IOCTL_H@ +# @INCLUDE_NEXT@ @NEXT_SYS_IOCTL_H@ +#endif + +#ifndef _@GUARD_PREFIX@_SYS_IOCTL_H +#define _@GUARD_PREFIX@_SYS_IOCTL_H + +/* AIX 5.1 and Solaris 10 declare ioctl() in and in , + but not in . + But avoid namespace pollution on glibc systems. */ +#ifndef __GLIBC__ +# include +#endif + +/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ + +/* The definition of _GL_WARN_ON_USE is copied here. */ + + +/* Declare overridden functions. */ + +#if @GNULIB_IOCTL@ +# if @REPLACE_IOCTL@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef ioctl +# define ioctl rpl_ioctl +# endif +_GL_FUNCDECL_RPL (ioctl, int, + (int fd, int request, ... /* {void *,char *} arg */)); +_GL_CXXALIAS_RPL (ioctl, int, + (int fd, int request, ... /* {void *,char *} arg */)); +# else +# if @SYS_IOCTL_H_HAVE_WINSOCK2_H@ || 1 +_GL_FUNCDECL_SYS (ioctl, int, + (int fd, int request, ... /* {void *,char *} arg */)); +# endif +_GL_CXXALIAS_SYS (ioctl, int, + (int fd, int request, ... /* {void *,char *} arg */)); +# endif +_GL_CXXALIASWARN (ioctl); +#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 + + +#endif /* _@GUARD_PREFIX@_SYS_IOCTL_H */ +#endif /* _@GUARD_PREFIX@_SYS_IOCTL_H */ diff --git a/gnulib/lib/sys_select.in.h b/gnulib/lib/sys_select.in.h new file mode 100644 index 0000000..397508a --- /dev/null +++ b/gnulib/lib/sys_select.in.h @@ -0,0 +1,288 @@ +/* Substitute for . + Copyright (C) 2007-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 +@PRAGMA_COLUMNS@ + +/* On OSF/1, and include . + 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@ + +/* On IRIX 6.5, includes , which includes + , which includes . At this point we cannot + include , because that includes , which + gives a syntax error because has not been completely + processed. Simply delegate to the system's header in this case. */ +#elif @HAVE_SYS_SELECT_H@ && defined __sgi && (defined _SYS_BSD_TYPES_H && !defined _GL_SYS_SELECT_H_REDIRECT_FROM_SYS_BSD_TYPES_H) + +# define _GL_SYS_SELECT_H_REDIRECT_FROM_SYS_BSD_TYPES_H +# @INCLUDE_NEXT@ @NEXT_SYS_SELECT_H@ + +#else + +#ifndef _@GUARD_PREFIX@_SYS_SELECT_H + +/* On many platforms, assumes prior inclusion of + . Also, mingw defines sigset_t there, instead of + in where it belongs. */ +#include + +/* Get definition of 'sigset_t'. + But avoid namespace pollution on glibc systems. */ +#if !(defined __GLIBC__ && !defined __UCLIBC__) +# include +#endif + +#if @HAVE_SYS_SELECT_H@ + +/* On OSF/1 4.0, provides only a forward declaration + of 'struct timeval', and no definition of this type. + Also, MacOS X, AIX, HP-UX, IRIX, Solaris, Interix declare select() + in . + But avoid namespace pollution on glibc systems. */ +# ifndef __GLIBC__ +# include +# endif + +/* On AIX 7 and Solaris 10, provides an FD_ZERO implementation + that relies on memset(), but without including . + But in any case avoid namespace pollution on glibc systems. */ +# if (defined __OpenBSD__ || defined _AIX || defined __sun || defined __osf__ || defined __BEOS__) \ + && ! defined __GLIBC__ +# include +# endif + +/* The include_next requires a split double-inclusion guard. */ +# @INCLUDE_NEXT@ @NEXT_SYS_SELECT_H@ + +#endif + +#ifndef _@GUARD_PREFIX@_SYS_SELECT_H +#define _@GUARD_PREFIX@_SYS_SELECT_H + +#if !@HAVE_SYS_SELECT_H@ +/* A platform that lacks . */ +/* Get the 'struct timeval' and 'fd_set' types and the FD_* macros + on most platforms. */ +# include +/* On HP-UX 11, provides an FD_ZERO implementation + that relies on memset(), but without including . */ +# if defined __hpux +# include +# endif +/* On native Windows platforms: + Get the 'fd_set' type. + Get the close() declaration before we override it. */ +# if @HAVE_WINSOCK2_H@ +# if !defined _GL_INCLUDING_WINSOCK2_H +# define _GL_INCLUDING_WINSOCK2_H +# include +# undef _GL_INCLUDING_WINSOCK2_H +# endif +# include +# endif +#endif + +/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ + +/* The definition of _GL_WARN_ON_USE is copied here. */ + + +/* Fix some definitions from . */ + +#if @HAVE_WINSOCK2_H@ + +# if !GNULIB_defined_rpl_fd_isset + +/* 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; +} + +# define GNULIB_defined_rpl_fd_isset 1 +# endif + +# undef FD_ISSET +# define FD_ISSET(fd, set) rpl_fd_isset(fd, set) + +#endif + +/* Hide some function declarations from . */ + +#if @HAVE_WINSOCK2_H@ +# if !defined _@GUARD_PREFIX@_UNISTD_H +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef close +# define close close_used_without_including_unistd_h +# else + _GL_WARN_ON_USE (close, + "close() used without including "); +# endif +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef gethostname +# define gethostname gethostname_used_without_including_unistd_h +# else + _GL_WARN_ON_USE (gethostname, + "gethostname() used without including "); +# endif +# endif +# if !defined _@GUARD_PREFIX@_SYS_SOCKET_H +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# 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 +# else + _GL_WARN_ON_USE (socket, + "socket() used without including "); + _GL_WARN_ON_USE (connect, + "connect() used without including "); + _GL_WARN_ON_USE (accept, + "accept() used without including "); + _GL_WARN_ON_USE (bind, + "bind() used without including "); + _GL_WARN_ON_USE (getpeername, + "getpeername() used without including "); + _GL_WARN_ON_USE (getsockname, + "getsockname() used without including "); + _GL_WARN_ON_USE (getsockopt, + "getsockopt() used without including "); + _GL_WARN_ON_USE (listen, + "listen() used without including "); + _GL_WARN_ON_USE (recv, + "recv() used without including "); + _GL_WARN_ON_USE (send, + "send() used without including "); + _GL_WARN_ON_USE (recvfrom, + "recvfrom() used without including "); + _GL_WARN_ON_USE (sendto, + "sendto() used without including "); + _GL_WARN_ON_USE (setsockopt, + "setsockopt() used without including "); + _GL_WARN_ON_USE (shutdown, + "shutdown() used without including "); +# endif +# endif +#endif + + +#if @GNULIB_PSELECT@ +# if @REPLACE_PSELECT@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef pselect +# define pselect rpl_pselect +# endif +_GL_FUNCDECL_RPL (pselect, int, + (int, fd_set *restrict, fd_set *restrict, fd_set *restrict, + struct timespec const *restrict, const sigset_t *restrict)); +_GL_CXXALIAS_RPL (pselect, int, + (int, fd_set *restrict, fd_set *restrict, fd_set *restrict, + struct timespec const *restrict, const sigset_t *restrict)); +# else +# if !@HAVE_PSELECT@ +_GL_FUNCDECL_SYS (pselect, int, + (int, fd_set *restrict, fd_set *restrict, fd_set *restrict, + struct timespec const *restrict, const sigset_t *restrict)); +# endif +_GL_CXXALIAS_SYS (pselect, int, + (int, fd_set *restrict, fd_set *restrict, fd_set *restrict, + struct timespec const *restrict, const sigset_t *restrict)); +# endif +_GL_CXXALIASWARN (pselect); +#elif defined GNULIB_POSIXCHECK +# undef pselect +# if HAVE_RAW_DECL_PSELECT +_GL_WARN_ON_USE (pselect, "pselect is not portable - " + "use gnulib module pselect for portability"); +# endif +#endif + +#if @GNULIB_SELECT@ +# if @REPLACE_SELECT@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef select +# define select rpl_select +# endif +_GL_FUNCDECL_RPL (select, int, + (int, fd_set *, fd_set *, fd_set *, struct timeval *)); +_GL_CXXALIAS_RPL (select, int, + (int, fd_set *, fd_set *, fd_set *, struct timeval *)); +# else +_GL_CXXALIAS_SYS (select, int, + (int, fd_set *, fd_set *, fd_set *, struct timeval *)); +# endif +_GL_CXXALIASWARN (select); +#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 + + +#endif /* _@GUARD_PREFIX@_SYS_SELECT_H */ +#endif /* _@GUARD_PREFIX@_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 0000000..107c180 --- /dev/null +++ b/gnulib/lib/sys_socket.in.h @@ -0,0 +1,683 @@ +/* Provide a sys/socket header file for systems lacking it (read: MinGW) + and for systems where it is incomplete. + Copyright (C) 2005-2011 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 , + on platforms where cannot be included standalone, and on + platforms where does not provide all necessary definitions. + It is intended to provide definitions and prototypes needed by an + application. */ + +#if __GNUC__ >= 3 +@PRAGMA_SYSTEM_HEADER@ +#endif +@PRAGMA_COLUMNS@ + +#if defined _GL_ALREADY_INCLUDING_SYS_SOCKET_H +/* Special invocation convention: + - On Cygwin 1.5.x we have a sequence of nested includes + -> -> -> , + and the latter includes . In this situation, the functions + are not yet declared, therefore we cannot provide the C++ aliases. */ + +#@INCLUDE_NEXT@ @NEXT_SYS_SOCKET_H@ + +#else +/* Normal invocation convention. */ + +#ifndef _@GUARD_PREFIX@_SYS_SOCKET_H + +#if @HAVE_SYS_SOCKET_H@ + +# define _GL_ALREADY_INCLUDING_SYS_SOCKET_H + +/* On many platforms, assumes prior inclusion of + . */ +# include + +/* On FreeBSD 6.4, defines some macros that assume that NULL + is defined. */ +# include + +/* The include_next requires a split double-inclusion guard. */ +# @INCLUDE_NEXT@ @NEXT_SYS_SOCKET_H@ + +# undef _GL_ALREADY_INCLUDING_SYS_SOCKET_H + +#endif + +#ifndef _@GUARD_PREFIX@_SYS_SOCKET_H +#define _@GUARD_PREFIX@_SYS_SOCKET_H + +/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ + +/* The definition of _GL_ARG_NONNULL is copied here. */ + +/* The definition of _GL_WARN_ON_USE is copied here. */ + +#if !@HAVE_SA_FAMILY_T@ +# if !GNULIB_defined_sa_family_t +typedef unsigned short sa_family_t; +# define GNULIB_defined_sa_family_t 1 +# endif +#endif + +#if @HAVE_STRUCT_SOCKADDR_STORAGE@ +/* Make the 'struct sockaddr_storage' field 'ss_family' visible on AIX 7.1. */ +# if !@HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY@ +# ifndef ss_family +# define ss_family __ss_family +# endif +# endif +#else +# include +/* 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))) + +# if !GNULIB_defined_struct_sockaddr_storage +struct sockaddr_storage +{ + sa_family_t ss_family; /* Address family, etc. */ + __ss_aligntype __ss_align; /* Force desired alignment. */ + char __ss_padding[_SS_PADSIZE]; +}; +# define GNULIB_defined_struct_sockaddr_storage 1 +# endif + +#endif + +/* Get struct iovec. */ +/* But avoid namespace pollution on glibc systems. */ +#if ! defined __GLIBC__ +# include +#endif + +#if @HAVE_SYS_SOCKET_H@ + +/* A platform that has . */ + +/* 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 . + + 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 + + suggests that getaddrinfo should be available on all Windows + releases. */ + +# if @HAVE_WINSOCK2_H@ +# include +# endif +# if @HAVE_WS2TCPIP_H@ +# include +# 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 + +# if @HAVE_WINSOCK2_H@ +/* Include headers needed by the emulation code. */ +# include +# include + +# if !GNULIB_defined_socklen_t +typedef int socklen_t; +# define GNULIB_defined_socklen_t 1 +# endif + +# endif + +/* Rudimentary 'struct msghdr'; this works as long as you don't try to + access msg_control or msg_controllen. */ +struct msghdr { + void *msg_name; + socklen_t msg_namelen; + struct iovec *msg_iov; + int msg_iovlen; + int msg_flags; +}; + +#endif + +/* Fix some definitions from . */ + +#if @HAVE_WINSOCK2_H@ + +# if !GNULIB_defined_rpl_fd_isset + +/* 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; +} + +# define GNULIB_defined_rpl_fd_isset 1 +# endif + +# undef FD_ISSET +# define FD_ISSET(fd, set) rpl_fd_isset(fd, set) + +#endif + +/* Hide some function declarations from . */ + +#if @HAVE_WINSOCK2_H@ +# if !defined _@GUARD_PREFIX@_UNISTD_H +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef close +# define close close_used_without_including_unistd_h +# else + _GL_WARN_ON_USE (close, + "close() used without including "); +# endif +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef gethostname +# define gethostname gethostname_used_without_including_unistd_h +# else + _GL_WARN_ON_USE (gethostname, + "gethostname() used without including "); +# endif +# endif +# if !defined _@GUARD_PREFIX@_SYS_SELECT_H +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef select +# define select select_used_without_including_sys_select_h +# else + _GL_WARN_ON_USE (select, + "select() used without including "); +# endif +# endif +#endif + +/* Wrap everything else to use libc file descriptors for sockets. */ + +#if @GNULIB_SOCKET@ +# if @HAVE_WINSOCK2_H@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef socket +# define socket rpl_socket +# endif +_GL_FUNCDECL_RPL (socket, int, (int domain, int type, int protocol)); +_GL_CXXALIAS_RPL (socket, int, (int domain, int type, int protocol)); +# else +_GL_CXXALIAS_SYS (socket, int, (int domain, int type, int protocol)); +# endif +_GL_CXXALIASWARN (socket); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef connect +# define connect rpl_connect +# endif +_GL_FUNCDECL_RPL (connect, int, + (int fd, const struct sockaddr *addr, socklen_t addrlen) + _GL_ARG_NONNULL ((2))); +_GL_CXXALIAS_RPL (connect, int, + (int fd, const struct sockaddr *addr, socklen_t addrlen)); +# else +/* Need to cast, because on NonStop Kernel, the third parameter is + size_t addrlen. */ +_GL_CXXALIAS_SYS_CAST (connect, int, + (int fd, + const struct sockaddr *addr, socklen_t addrlen)); +# endif +_GL_CXXALIASWARN (connect); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef accept +# define accept rpl_accept +# endif +_GL_FUNCDECL_RPL (accept, int, + (int fd, struct sockaddr *addr, socklen_t *addrlen)); +_GL_CXXALIAS_RPL (accept, int, + (int fd, struct sockaddr *addr, socklen_t *addrlen)); +# else +/* Need to cast, because on Solaris 10 systems, the third parameter is + void *addrlen. */ +_GL_CXXALIAS_SYS_CAST (accept, int, + (int fd, struct sockaddr *addr, socklen_t *addrlen)); +# endif +_GL_CXXALIASWARN (accept); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef bind +# define bind rpl_bind +# endif +_GL_FUNCDECL_RPL (bind, int, + (int fd, const struct sockaddr *addr, socklen_t addrlen) + _GL_ARG_NONNULL ((2))); +_GL_CXXALIAS_RPL (bind, int, + (int fd, const struct sockaddr *addr, socklen_t addrlen)); +# else +/* Need to cast, because on NonStop Kernel, the third parameter is + size_t addrlen. */ +_GL_CXXALIAS_SYS_CAST (bind, int, + (int fd, + const struct sockaddr *addr, socklen_t addrlen)); +# endif +_GL_CXXALIASWARN (bind); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef getpeername +# define getpeername rpl_getpeername +# endif +_GL_FUNCDECL_RPL (getpeername, int, + (int fd, struct sockaddr *addr, socklen_t *addrlen) + _GL_ARG_NONNULL ((2, 3))); +_GL_CXXALIAS_RPL (getpeername, int, + (int fd, struct sockaddr *addr, socklen_t *addrlen)); +# else +/* Need to cast, because on Solaris 10 systems, the third parameter is + void *addrlen. */ +_GL_CXXALIAS_SYS_CAST (getpeername, int, + (int fd, struct sockaddr *addr, socklen_t *addrlen)); +# endif +_GL_CXXALIASWARN (getpeername); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef getsockname +# define getsockname rpl_getsockname +# endif +_GL_FUNCDECL_RPL (getsockname, int, + (int fd, struct sockaddr *addr, socklen_t *addrlen) + _GL_ARG_NONNULL ((2, 3))); +_GL_CXXALIAS_RPL (getsockname, int, + (int fd, struct sockaddr *addr, socklen_t *addrlen)); +# else +/* Need to cast, because on Solaris 10 systems, the third parameter is + void *addrlen. */ +_GL_CXXALIAS_SYS_CAST (getsockname, int, + (int fd, struct sockaddr *addr, socklen_t *addrlen)); +# endif +_GL_CXXALIASWARN (getsockname); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef getsockopt +# define getsockopt rpl_getsockopt +# endif +_GL_FUNCDECL_RPL (getsockopt, int, (int fd, int level, int optname, + void *optval, socklen_t *optlen) + _GL_ARG_NONNULL ((4, 5))); +_GL_CXXALIAS_RPL (getsockopt, int, (int fd, int level, int optname, + void *optval, socklen_t *optlen)); +# else +/* Need to cast, because on Solaris 10 systems, the fifth parameter is + void *optlen. */ +_GL_CXXALIAS_SYS_CAST (getsockopt, int, (int fd, int level, int optname, + void *optval, socklen_t *optlen)); +# endif +_GL_CXXALIASWARN (getsockopt); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef listen +# define listen rpl_listen +# endif +_GL_FUNCDECL_RPL (listen, int, (int fd, int backlog)); +_GL_CXXALIAS_RPL (listen, int, (int fd, int backlog)); +# else +_GL_CXXALIAS_SYS (listen, int, (int fd, int backlog)); +# endif +_GL_CXXALIASWARN (listen); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef recv +# define recv rpl_recv +# endif +_GL_FUNCDECL_RPL (recv, ssize_t, (int fd, void *buf, size_t len, int flags) + _GL_ARG_NONNULL ((2))); +_GL_CXXALIAS_RPL (recv, ssize_t, (int fd, void *buf, size_t len, int flags)); +# else +_GL_CXXALIAS_SYS (recv, ssize_t, (int fd, void *buf, size_t len, int flags)); +# endif +_GL_CXXALIASWARN (recv); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef send +# define send rpl_send +# endif +_GL_FUNCDECL_RPL (send, ssize_t, + (int fd, const void *buf, size_t len, int flags) + _GL_ARG_NONNULL ((2))); +_GL_CXXALIAS_RPL (send, ssize_t, + (int fd, const void *buf, size_t len, int flags)); +# else +_GL_CXXALIAS_SYS (send, ssize_t, + (int fd, const void *buf, size_t len, int flags)); +# endif +_GL_CXXALIASWARN (send); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef recvfrom +# define recvfrom rpl_recvfrom +# endif +_GL_FUNCDECL_RPL (recvfrom, ssize_t, + (int fd, void *buf, size_t len, int flags, + struct sockaddr *from, socklen_t *fromlen) + _GL_ARG_NONNULL ((2))); +_GL_CXXALIAS_RPL (recvfrom, ssize_t, + (int fd, void *buf, size_t len, int flags, + struct sockaddr *from, socklen_t *fromlen)); +# else +/* Need to cast, because on Solaris 10 systems, the sixth parameter is + void *fromlen. */ +_GL_CXXALIAS_SYS_CAST (recvfrom, ssize_t, + (int fd, void *buf, size_t len, int flags, + struct sockaddr *from, socklen_t *fromlen)); +# endif +_GL_CXXALIASWARN (recvfrom); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef sendto +# define sendto rpl_sendto +# endif +_GL_FUNCDECL_RPL (sendto, ssize_t, + (int fd, const void *buf, size_t len, int flags, + const struct sockaddr *to, socklen_t tolen) + _GL_ARG_NONNULL ((2))); +_GL_CXXALIAS_RPL (sendto, ssize_t, + (int fd, const void *buf, size_t len, int flags, + const struct sockaddr *to, socklen_t tolen)); +# else +/* Need to cast, because on NonStop Kernel, the sixth parameter is + size_t tolen. */ +_GL_CXXALIAS_SYS_CAST (sendto, ssize_t, + (int fd, const void *buf, size_t len, int flags, + const struct sockaddr *to, socklen_t tolen)); +# endif +_GL_CXXALIASWARN (sendto); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef setsockopt +# define setsockopt rpl_setsockopt +# endif +_GL_FUNCDECL_RPL (setsockopt, int, (int fd, int level, int optname, + const void * optval, socklen_t optlen) + _GL_ARG_NONNULL ((4))); +_GL_CXXALIAS_RPL (setsockopt, int, (int fd, int level, int optname, + const void * optval, socklen_t optlen)); +# else +/* Need to cast, because on NonStop Kernel, the fifth parameter is + size_t optlen. */ +_GL_CXXALIAS_SYS_CAST (setsockopt, int, + (int fd, int level, int optname, + const void * optval, socklen_t optlen)); +# endif +_GL_CXXALIASWARN (setsockopt); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef shutdown +# define shutdown rpl_shutdown +# endif +_GL_FUNCDECL_RPL (shutdown, int, (int fd, int how)); +_GL_CXXALIAS_RPL (shutdown, int, (int fd, int how)); +# else +_GL_CXXALIAS_SYS (shutdown, int, (int fd, int how)); +# endif +_GL_CXXALIASWARN (shutdown); +#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 @GNULIB_ACCEPT4@ +/* Accept a connection on a socket, with specific opening flags. + The flags are a bitmask, possibly including O_CLOEXEC (defined in ) + and O_TEXT, O_BINARY (defined in "binary-io.h"). + See also the Linux man page at + . */ +# if @HAVE_ACCEPT4@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define accept4 rpl_accept4 +# endif +_GL_FUNCDECL_RPL (accept4, int, + (int sockfd, struct sockaddr *addr, socklen_t *addrlen, + int flags)); +_GL_CXXALIAS_RPL (accept4, int, + (int sockfd, struct sockaddr *addr, socklen_t *addrlen, + int flags)); +# else +_GL_FUNCDECL_SYS (accept4, int, + (int sockfd, struct sockaddr *addr, socklen_t *addrlen, + int flags)); +_GL_CXXALIAS_SYS (accept4, int, + (int sockfd, struct sockaddr *addr, socklen_t *addrlen, + int flags)); +# endif +_GL_CXXALIASWARN (accept4); +#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 + +#endif /* _@GUARD_PREFIX@_SYS_SOCKET_H */ +#endif /* _@GUARD_PREFIX@_SYS_SOCKET_H */ +#endif diff --git a/gnulib/lib/sys_stat.in.h b/gnulib/lib/sys_stat.in.h new file mode 100644 index 0000000..9f7bf76 --- /dev/null +++ b/gnulib/lib/sys_stat.in.h @@ -0,0 +1,674 @@ +/* Provide a more complete sys/stat header file. + Copyright (C) 2005-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 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 +@PRAGMA_COLUMNS@ + +#if defined __need_system_sys_stat_h +/* Special invocation convention. */ + +#@INCLUDE_NEXT@ @NEXT_SYS_STAT_H@ + +#else +/* Normal invocation convention. */ + +#ifndef _@GUARD_PREFIX@_SYS_STAT_H + +/* Get nlink_t. */ +#include + +/* Get struct timespec. */ +#include + +/* The include_next requires a split double-inclusion guard. */ +#@INCLUDE_NEXT@ @NEXT_SYS_STAT_H@ + +#ifndef _@GUARD_PREFIX@_SYS_STAT_H +#define _@GUARD_PREFIX@_SYS_STAT_H + +/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ + +/* 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(). Native Windows platforms declare mkdir + in and/or , not in . */ +#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ +# include /* mingw32, mingw64 */ +# include /* mingw64, MSVC 9 */ +#endif + +#ifndef S_IFIFO +# ifdef _S_IFIFO +# define S_IFIFO _S_IFIFO +# endif +#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 + + +#if @GNULIB_FCHMODAT@ +# if !@HAVE_FCHMODAT@ +_GL_FUNCDECL_SYS (fchmodat, int, + (int fd, char const *file, mode_t mode, int flag) + _GL_ARG_NONNULL ((2))); +# endif +_GL_CXXALIAS_SYS (fchmodat, int, + (int fd, char const *file, mode_t mode, int flag)); +_GL_CXXALIASWARN (fchmodat); +#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 @GNULIB_FSTAT@ +# if @REPLACE_FSTAT@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef fstat +# define fstat rpl_fstat +# endif +_GL_FUNCDECL_RPL (fstat, int, (int fd, struct stat *buf) _GL_ARG_NONNULL ((2))); +_GL_CXXALIAS_RPL (fstat, int, (int fd, struct stat *buf)); +# else +_GL_CXXALIAS_SYS (fstat, int, (int fd, struct stat *buf)); +# endif +_GL_CXXALIASWARN (fstat); +#elif defined GNULIB_POSIXCHECK +# undef fstat +# if HAVE_RAW_DECL_FSTAT +_GL_WARN_ON_USE (fstat, "fstat has portability problems - " + "use gnulib module fstat for portability"); +# endif +#endif + + +#if @GNULIB_FSTATAT@ +# if @REPLACE_FSTATAT@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef fstatat +# define fstatat rpl_fstatat +# endif +_GL_FUNCDECL_RPL (fstatat, int, + (int fd, char const *name, struct stat *st, int flags) + _GL_ARG_NONNULL ((2, 3))); +_GL_CXXALIAS_RPL (fstatat, int, + (int fd, char const *name, struct stat *st, int flags)); +# else +# if !@HAVE_FSTATAT@ +_GL_FUNCDECL_SYS (fstatat, int, + (int fd, char const *name, struct stat *st, int flags) + _GL_ARG_NONNULL ((2, 3))); +# endif +_GL_CXXALIAS_SYS (fstatat, int, + (int fd, char const *name, struct stat *st, int flags)); +# endif +_GL_CXXALIASWARN (fstatat); +#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@ +/* Use the rpl_ prefix also on Solaris <= 9, because on Solaris 9 our futimens + implementation relies on futimesat, which on Solaris 10 makes an invocation + to futimens that is meant to invoke the libc's futimens(), not gnulib's + futimens(). */ +# if @REPLACE_FUTIMENS@ || (!@HAVE_FUTIMENS@ && defined __sun) +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef futimens +# define futimens rpl_futimens +# endif +_GL_FUNCDECL_RPL (futimens, int, (int fd, struct timespec const times[2])); +_GL_CXXALIAS_RPL (futimens, int, (int fd, struct timespec const times[2])); +# else +# if !@HAVE_FUTIMENS@ +_GL_FUNCDECL_SYS (futimens, int, (int fd, struct timespec const times[2])); +# endif +_GL_CXXALIAS_SYS (futimens, int, (int fd, struct timespec const times[2])); +# endif +# if @HAVE_FUTIMENS@ +_GL_CXXALIASWARN (futimens); +# 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. */ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define lchmod chmod +# endif +/* Need to cast, because on mingw, the second parameter of chmod is + int mode. */ +_GL_CXXALIAS_RPL_CAST_1 (lchmod, chmod, int, + (const char *filename, mode_t mode)); +# else +# if 0 /* assume already declared */ +_GL_FUNCDECL_SYS (lchmod, int, (const char *filename, mode_t mode) + _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (lchmod, int, (const char *filename, mode_t mode)); +# endif +# if @HAVE_LCHMOD@ +_GL_CXXALIASWARN (lchmod); +# 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. */ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define lstat stat +# endif +_GL_CXXALIAS_RPL_1 (lstat, stat, int, (const char *name, struct stat *buf)); +# elif @REPLACE_LSTAT@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef lstat +# define lstat rpl_lstat +# endif +_GL_FUNCDECL_RPL (lstat, int, (const char *name, struct stat *buf) + _GL_ARG_NONNULL ((1, 2))); +_GL_CXXALIAS_RPL (lstat, int, (const char *name, struct stat *buf)); +# else +_GL_CXXALIAS_SYS (lstat, int, (const char *name, struct stat *buf)); +# endif +# if @HAVE_LSTAT@ +_GL_CXXALIASWARN (lstat); +# 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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef mkdir +# define mkdir rpl_mkdir +# endif +_GL_FUNCDECL_RPL (mkdir, int, (char const *name, mode_t mode) + _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (mkdir, int, (char const *name, mode_t mode)); +#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 includes and , + which are included above. */ +# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ + +# if !GNULIB_defined_rpl_mkdir +static inline int +rpl_mkdir (char const *name, mode_t mode) +{ + return _mkdir (name); +} +# define GNULIB_defined_rpl_mkdir 1 +# endif + +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define mkdir rpl_mkdir +# endif +_GL_CXXALIAS_RPL (mkdir, int, (char const *name, mode_t mode)); +# else +_GL_CXXALIAS_SYS (mkdir, int, (char const *name, mode_t mode)); +# endif +#endif +_GL_CXXALIASWARN (mkdir); + + +#if @GNULIB_MKDIRAT@ +# if !@HAVE_MKDIRAT@ +_GL_FUNCDECL_SYS (mkdirat, int, (int fd, char const *file, mode_t mode) + _GL_ARG_NONNULL ((2))); +# endif +_GL_CXXALIAS_SYS (mkdirat, int, (int fd, char const *file, mode_t mode)); +_GL_CXXALIASWARN (mkdirat); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef mkfifo +# define mkfifo rpl_mkfifo +# endif +_GL_FUNCDECL_RPL (mkfifo, int, (char const *file, mode_t mode) + _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (mkfifo, int, (char const *file, mode_t mode)); +# else +# if !@HAVE_MKFIFO@ +_GL_FUNCDECL_SYS (mkfifo, int, (char const *file, mode_t mode) + _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (mkfifo, int, (char const *file, mode_t mode)); +# endif +_GL_CXXALIASWARN (mkfifo); +#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@ +_GL_FUNCDECL_SYS (mkfifoat, int, (int fd, char const *file, mode_t mode) + _GL_ARG_NONNULL ((2))); +# endif +_GL_CXXALIAS_SYS (mkfifoat, int, (int fd, char const *file, mode_t mode)); +_GL_CXXALIASWARN (mkfifoat); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef mknod +# define mknod rpl_mknod +# endif +_GL_FUNCDECL_RPL (mknod, int, (char const *file, mode_t mode, dev_t dev) + _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (mknod, int, (char const *file, mode_t mode, dev_t dev)); +# else +# if !@HAVE_MKNOD@ +_GL_FUNCDECL_SYS (mknod, int, (char const *file, mode_t mode, dev_t dev) + _GL_ARG_NONNULL ((1))); +# endif +/* Need to cast, because on OSF/1 5.1, the third parameter is '...'. */ +_GL_CXXALIAS_SYS_CAST (mknod, int, (char const *file, mode_t mode, dev_t dev)); +# endif +_GL_CXXALIASWARN (mknod); +#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@ +_GL_FUNCDECL_SYS (mknodat, int, + (int fd, char const *file, mode_t mode, dev_t dev) + _GL_ARG_NONNULL ((2))); +# endif +_GL_CXXALIAS_SYS (mknodat, int, + (int fd, char const *file, mode_t mode, dev_t dev)); +_GL_CXXALIASWARN (mknodat); +#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 */ +_GL_EXTERN_C 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@ +/* Use the rpl_ prefix also on Solaris <= 9, because on Solaris 9 our utimensat + implementation relies on futimesat, which on Solaris 10 makes an invocation + to utimensat that is meant to invoke the libc's utimensat(), not gnulib's + utimensat(). */ +# if @REPLACE_UTIMENSAT@ || (!@HAVE_UTIMENSAT@ && defined __sun) +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef utimensat +# define utimensat rpl_utimensat +# endif +_GL_FUNCDECL_RPL (utimensat, int, (int fd, char const *name, + struct timespec const times[2], int flag) + _GL_ARG_NONNULL ((2))); +_GL_CXXALIAS_RPL (utimensat, int, (int fd, char const *name, + struct timespec const times[2], int flag)); +# else +# if !@HAVE_UTIMENSAT@ +_GL_FUNCDECL_SYS (utimensat, int, (int fd, char const *name, + struct timespec const times[2], int flag) + _GL_ARG_NONNULL ((2))); +# endif +_GL_CXXALIAS_SYS (utimensat, int, (int fd, char const *name, + struct timespec const times[2], int flag)); +# endif +# if @HAVE_UTIMENSAT@ +_GL_CXXALIASWARN (utimensat); +# 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 + + +#endif /* _@GUARD_PREFIX@_SYS_STAT_H */ +#endif /* _@GUARD_PREFIX@_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 0000000..1fed8c4 --- /dev/null +++ b/gnulib/lib/sys_time.in.h @@ -0,0 +1,200 @@ +/* Provide a more complete sys/time.h. + + Copyright (C) 2007-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 +@PRAGMA_COLUMNS@ + +#if defined _@GUARD_PREFIX@_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 _@GUARD_PREFIX@_SYS_TIME_H + +# if @HAVE_SYS_TIME_H@ +# @INCLUDE_NEXT@ @NEXT_SYS_TIME_H@ +# else +# include +# endif + +/* On native Windows with MSVC: + Get the 'struct timeval' type. */ +# if defined _MSC_VER && @HAVE_WINSOCK2_H@ && !defined _GL_INCLUDING_WINSOCK2_H +# define _GL_INCLUDING_WINSOCK2_H +# include +# undef _GL_INCLUDING_WINSOCK2_H +# endif + +/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ + +/* 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@ + +# if !GNULIB_defined_struct_timeval +struct timeval +{ + time_t tv_sec; + long int tv_usec; +}; +# define GNULIB_defined_struct_timeval 1 +# endif + +# endif + +# ifdef __cplusplus +} +# endif + +# if @GNULIB_GETTIMEOFDAY@ +# if @REPLACE_GETTIMEOFDAY@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef gettimeofday +# define gettimeofday rpl_gettimeofday +# endif +_GL_FUNCDECL_RPL (gettimeofday, int, + (struct timeval *restrict, void *restrict) + _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (gettimeofday, int, + (struct timeval *restrict, void *restrict)); +# else +# if !@HAVE_GETTIMEOFDAY@ +_GL_FUNCDECL_SYS (gettimeofday, int, + (struct timeval *restrict, void *restrict) + _GL_ARG_NONNULL ((1))); +# endif +/* Need to cast, because on glibc systems, by default, the second argument is + struct timezone *. */ +_GL_CXXALIAS_SYS_CAST (gettimeofday, int, + (struct timeval *restrict, void *restrict)); +# endif +_GL_CXXALIASWARN (gettimeofday); +# 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 + +/* Hide some function declarations from . */ + +# if defined _MSC_VER && @HAVE_WINSOCK2_H@ +# if !defined _@GUARD_PREFIX@_UNISTD_H +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef close +# define close close_used_without_including_unistd_h +# else + _GL_WARN_ON_USE (close, + "close() used without including "); +# endif +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef gethostname +# define gethostname gethostname_used_without_including_unistd_h +# else + _GL_WARN_ON_USE (gethostname, + "gethostname() used without including "); +# endif +# endif +# if !defined _@GUARD_PREFIX@_SYS_SOCKET_H +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# 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 +# else + _GL_WARN_ON_USE (socket, + "socket() used without including "); + _GL_WARN_ON_USE (connect, + "connect() used without including "); + _GL_WARN_ON_USE (accept, + "accept() used without including "); + _GL_WARN_ON_USE (bind, + "bind() used without including "); + _GL_WARN_ON_USE (getpeername, + "getpeername() used without including "); + _GL_WARN_ON_USE (getsockname, + "getsockname() used without including "); + _GL_WARN_ON_USE (getsockopt, + "getsockopt() used without including "); + _GL_WARN_ON_USE (listen, + "listen() used without including "); + _GL_WARN_ON_USE (recv, + "recv() used without including "); + _GL_WARN_ON_USE (send, + "send() used without including "); + _GL_WARN_ON_USE (recvfrom, + "recvfrom() used without including "); + _GL_WARN_ON_USE (sendto, + "sendto() used without including "); + _GL_WARN_ON_USE (setsockopt, + "setsockopt() used without including "); + _GL_WARN_ON_USE (shutdown, + "shutdown() used without including "); +# endif +# endif +# if !defined _@GUARD_PREFIX@_SYS_SELECT_H +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef select +# define select select_used_without_including_sys_select_h +# else + _GL_WARN_ON_USE (select, + "select() used without including "); +# endif +# endif +# endif + +#endif /* _@GUARD_PREFIX@_SYS_TIME_H */ diff --git a/gnulib/lib/sys_times.in.h b/gnulib/lib/sys_times.in.h new file mode 100644 index 0000000..413a373 --- /dev/null +++ b/gnulib/lib/sys_times.in.h @@ -0,0 +1,81 @@ +/* Provide a sys/times.h header file. + Copyright (C) 2008-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 , 2008. */ + +/* This file is supposed to be used on platforms where + is missing. */ + +#ifndef _@GUARD_PREFIX@_SYS_TIMES_H + +# if __GNUC__ >= 3 +@PRAGMA_SYSTEM_HEADER@ +# endif +@PRAGMA_COLUMNS@ + +# if @HAVE_SYS_TIMES_H@ +# @INCLUDE_NEXT@ @NEXT_SYS_TIMES_H@ +# endif + +# define _@GUARD_PREFIX@_SYS_TIMES_H + +/* Get clock_t. + But avoid namespace pollution on glibc systems. */ +# ifndef __GLIBC__ +# include +# 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@ +# if !GNULIB_defined_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. */ + }; +# define GNULIB_defined_struct_tms 1 +# endif +# 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 /* _@GUARD_PREFIX@_SYS_TIMES_H */ diff --git a/gnulib/lib/sys_types.in.h b/gnulib/lib/sys_types.in.h new file mode 100644 index 0000000..a1d5fda --- /dev/null +++ b/gnulib/lib/sys_types.in.h @@ -0,0 +1,40 @@ +/* Provide a more complete sys/types.h. + + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software; you can 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 +@PRAGMA_COLUMNS@ + +#ifndef _@GUARD_PREFIX@_SYS_TYPES_H + +/* The include_next requires a split double-inclusion guard. */ +#@INCLUDE_NEXT@ @NEXT_SYS_TYPES_H@ + +#ifndef _@GUARD_PREFIX@_SYS_TYPES_H +#define _@GUARD_PREFIX@_SYS_TYPES_H + +/* MSVC 9 defines size_t in , not in . */ +/* But avoid namespace pollution on glibc systems. */ +#if ((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__) \ + && ! defined __GLIBC__ +# include +#endif + +#endif /* _@GUARD_PREFIX@_SYS_TYPES_H */ +#endif /* _@GUARD_PREFIX@_SYS_TYPES_H */ diff --git a/gnulib/lib/sys_uio.in.h b/gnulib/lib/sys_uio.in.h new file mode 100644 index 0000000..04cf13d --- /dev/null +++ b/gnulib/lib/sys_uio.in.h @@ -0,0 +1,64 @@ +/* Substitute for . + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software; you can 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 +@PRAGMA_COLUMNS@ + +#ifndef _@GUARD_PREFIX@_SYS_UIO_H + +#if @HAVE_SYS_UIO_H@ + +/* On OpenBSD 4.4, assumes prior inclusion of . */ +# include + +/* The include_next requires a split double-inclusion guard. */ +# @INCLUDE_NEXT@ @NEXT_SYS_UIO_H@ + +#endif + +#ifndef _@GUARD_PREFIX@_SYS_UIO_H +#define _@GUARD_PREFIX@_SYS_UIO_H + +#if !@HAVE_SYS_UIO_H@ +/* A platform that lacks . */ +/* Get 'size_t' and 'ssize_t'. */ +# include + +# ifdef __cplusplus +extern "C" { +# endif + +# if !GNULIB_defined_struct_iovec +/* All known platforms that lack also lack any declaration + of struct iovec in any other header. */ +struct iovec { + void *iov_base; + size_t iov_len; +}; +# define GNULIB_defined_struct_iovec 1 +# endif + +# ifdef __cplusplus +} +# endif + +#endif + +#endif /* _@GUARD_PREFIX@_SYS_UIO_H */ +#endif /* _@GUARD_PREFIX@_SYS_UIO_H */ diff --git a/gnulib/lib/sys_utsname.in.h b/gnulib/lib/sys_utsname.in.h new file mode 100644 index 0000000..0249e57 --- /dev/null +++ b/gnulib/lib/sys_utsname.in.h @@ -0,0 +1,109 @@ +/* Substitute for . + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 _@GUARD_PREFIX@_SYS_UTSNAME_H + +#if __GNUC__ >= 3 +@PRAGMA_SYSTEM_HEADER@ +#endif +@PRAGMA_COLUMNS@ + +#if @HAVE_SYS_UTSNAME_H@ + +/* Minix 3.1.8 has a bug: must be included before . + But avoid namespace pollution on glibc systems. */ +# if defined __minix && !defined __GLIBC__ +# include +# endif + +# @INCLUDE_NEXT@ @NEXT_SYS_UTSNAME_H@ + +#endif + +#define _@GUARD_PREFIX@_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 + +# if !GNULIB_defined_struct_utsname +/* 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]; + }; +# define GNULIB_defined_struct_utsname 1 +# endif + +#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 /* _@GUARD_PREFIX@_SYS_UTSNAME_H */ diff --git a/gnulib/lib/sys_wait.in.h b/gnulib/lib/sys_wait.in.h new file mode 100644 index 0000000..e31be9c --- /dev/null +++ b/gnulib/lib/sys_wait.in.h @@ -0,0 +1,130 @@ +/* A POSIX-like . + Copyright (C) 2001-2003, 2005-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 _@GUARD_PREFIX@_SYS_WAIT_H + +#if __GNUC__ >= 3 +@PRAGMA_SYSTEM_HEADER@ +#endif +@PRAGMA_COLUMNS@ + +/* The include_next requires a split double-inclusion guard. */ +#if !((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__) +# @INCLUDE_NEXT@ @NEXT_SYS_WAIT_H@ +#endif + +#ifndef _@GUARD_PREFIX@_SYS_WAIT_H +#define _@GUARD_PREFIX@_SYS_WAIT_H + +/* Get pid_t. */ +#include + + +/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ + +/* The definition of _GL_WARN_ON_USE is copied here. */ + + +#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 + +/* The stopping signal. Only to be accessed if WIFSTOPPED(x) is true. */ +# ifndef WSTOPSIG +# define WSTOPSIG(x) (((x) >> 8) & 0x7f) +# endif + +/* True if the process dumped core. Not standardized by POSIX. */ +# ifndef WCOREDUMP +# define WCOREDUMP(x) ((x) & 0x80) +# endif + +#else +/* Native Windows API. */ + +# include /* for SIGTERM */ + +/* 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 stopping signals. */ +# define WSTOPSIG(x) 0 + +/* There are no core dumps. */ +# define WCOREDUMP(x) 0 + +#endif + + +/* Declarations of functions. */ + +#if @GNULIB_WAITPID@ +# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ +_GL_FUNCDECL_SYS (waitpid, pid_t, (pid_t pid, int *statusp, int options)); +# endif +_GL_CXXALIAS_SYS (waitpid, pid_t, (pid_t pid, int *statusp, int options)); +_GL_CXXALIASWARN (waitpid); +#elif defined GNULIB_POSIXCHECK +# undef waitpid +# if HAVE_RAW_DECL_WAITPID +_GL_WARN_ON_USE (waitpid, "waitpid is unportable - " + "use gnulib module sys_wait for portability"); +# endif +#endif + + +#endif /* _@GUARD_PREFIX@_SYS_WAIT_H */ +#endif /* _@GUARD_PREFIX@_SYS_WAIT_H */ diff --git a/gnulib/lib/sysexits.in.h b/gnulib/lib/sysexits.in.h new file mode 100644 index 0000000..f925b69 --- /dev/null +++ b/gnulib/lib/sysexits.in.h @@ -0,0 +1,72 @@ +/* exit() exit codes for some BSD system programs. + Copyright (C) 2003, 2006-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Simon Josefsson based on sysexits(3) man page */ + +#ifndef _@GUARD_PREFIX@_SYSEXITS_H + +#if __GNUC__ >= 3 +@PRAGMA_SYSTEM_HEADER@ +#endif +@PRAGMA_COLUMNS@ + +#if @HAVE_SYSEXITS_H@ + +/* IRIX 6.5 has an that defines a macro EX_OK with a nonzero + value. Override it. See + */ +# ifdef __sgi +# include +# undef EX_OK +# endif + +/* The include_next requires a split double-inclusion guard. */ +# @INCLUDE_NEXT@ @NEXT_SYSEXITS_H@ + +/* HP-UX 11 ends at EX_NOPERM. */ +# ifndef EX_CONFIG +# define EX_CONFIG 78 +# endif + +#endif + +#ifndef _@GUARD_PREFIX@_SYSEXITS_H +#define _@GUARD_PREFIX@_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 /* _@GUARD_PREFIX@_SYSEXITS_H */ +#endif /* _@GUARD_PREFIX@_SYSEXITS_H */ diff --git a/gnulib/lib/t-idcache b/gnulib/lib/t-idcache new file mode 100755 index 0000000..e4d71af --- /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/tanf.c b/gnulib/lib/tanf.c new file mode 100644 index 0000000..39e1e10 --- /dev/null +++ b/gnulib/lib/tanf.c @@ -0,0 +1,26 @@ +/* Tangent function. + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +float +tanf (float x) +{ + return (float) tan ((double) x); +} diff --git a/gnulib/lib/tanhf.c b/gnulib/lib/tanhf.c new file mode 100644 index 0000000..b7591a0 --- /dev/null +++ b/gnulib/lib/tanhf.c @@ -0,0 +1,26 @@ +/* Hyperbolic tangent function. + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +float +tanhf (float x) +{ + return (float) tanh ((double) x); +} diff --git a/gnulib/lib/tanl.c b/gnulib/lib/tanl.c new file mode 100644 index 0000000..e5efb06 --- /dev/null +++ b/gnulib/lib/tanl.c @@ -0,0 +1,235 @@ +/* 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 + +/* Specification. */ +#include + +#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE + +long double +tanl (long double x) +{ + return tan (x); +} + +#else + +/* 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 +*/ + +/* __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)); + } +} + +#endif + +#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/tcgetsid.c b/gnulib/lib/tcgetsid.c new file mode 100644 index 0000000..838fb75 --- /dev/null +++ b/gnulib/lib/tcgetsid.c @@ -0,0 +1,42 @@ +/* Determine the session ID of the controlling terminal of the current process. + Copyright (C) 2010-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 + +#define USE_OLD_TTY /* needed on OpenBSD 4.5, so that TIOCGSID gets defined */ + +/* Specification. */ +#include + +#include +#include + +pid_t +tcgetsid (int fd) +{ +#ifdef TIOCGSID /* MacOS X, OpenBSD */ + int sid; + + if (ioctl (fd, TIOCGSID, &sid) < 0) + return -1; /* errno is set here */ + + return sid; +#else /* FreeBSD, Cygwin, mingw */ + errno = ENOSYS; + return -1; +#endif +} diff --git a/gnulib/lib/tempname.c b/gnulib/lib/tempname.c new file mode 100644 index 0000000..130ae97 --- /dev/null +++ b/gnulib/lib/tempname.c @@ -0,0 +1,309 @@ +/* tempname.c - generate the name of a temporary file. + + Copyright (C) 1991-2003, 2005-2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Extracted from glibc sysdeps/posix/tempname.c. See also tmpdir.c. */ + +#if !_LIBC +# include +# include "tempname.h" +#endif + +#include +#include + +#include +#ifndef __set_errno +# define __set_errno(Val) errno = (Val) +#endif + +#include +#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 +#include +#include + +#include +#include +#include +#include + +#include + +#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 __lxstat64(version, file, buf) lstat (file, buf) +#endif + +#if ! (HAVE___SECURE_GETENV || _LIBC) +# define __secure_getenv getenv +#endif + +#ifdef _LIBC +# include +# 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 0000000..f27b9ba --- /dev/null +++ b/gnulib/lib/tempname.h @@ -0,0 +1,50 @@ +/* Create a temporary file or directory. + + Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* header written by Eric Blake */ + +#ifndef GL_TEMPNAME_H +# define GL_TEMPNAME_H + +# include + +# 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/termios.in.h b/gnulib/lib/termios.in.h new file mode 100644 index 0000000..f69786b --- /dev/null +++ b/gnulib/lib/termios.in.h @@ -0,0 +1,76 @@ +/* Substitute for and wrapper around . + Copyright (C) 2010-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 _@GUARD_PREFIX@_TERMIOS_H + +#if __GNUC__ >= 3 +@PRAGMA_SYSTEM_HEADER@ +#endif +@PRAGMA_COLUMNS@ + +/* On HP-UX 11.00, some of the function declarations in , + included by , are not protected by extern "C". Enforce + "C" linkage for these functions nevertheless. */ +#if defined __hpux && defined __cplusplus +# include +# include +extern "C" { +# include +} +#endif + +/* The include_next requires a split double-inclusion guard. */ +#if @HAVE_TERMIOS_H@ +# @INCLUDE_NEXT@ @NEXT_TERMIOS_H@ +#endif + +#ifndef _@GUARD_PREFIX@_TERMIOS_H +#define _@GUARD_PREFIX@_TERMIOS_H + +#if @GNULIB_TCGETSID@ +/* Get pid_t. */ +# include +#endif + +/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ + +/* The definition of _GL_WARN_ON_USE is copied here. */ + + +/* Declare overridden functions. */ + +#if @GNULIB_TCGETSID@ +/* Return the session ID of the controlling terminal of the current process. + The argument is a descriptor if this controlling terminal. + Return -1, with errno set, upon failure. errno = ENOSYS means that the + function is unsupported. */ +# if !@HAVE_DECL_TCGETSID@ +_GL_FUNCDECL_SYS (tcgetsid, pid_t, (int fd)); +# endif +_GL_CXXALIAS_SYS (tcgetsid, pid_t, (int fd)); +_GL_CXXALIASWARN (tcgetsid); +#elif defined GNULIB_POSIXCHECK +# undef tcgetsid +# if HAVE_RAW_DECL_TCGETSID +_GL_WARN_ON_USE (tcgetsid, "tcgetsid is not portable - " + "use gnulib module tcgetsid for portability"); +# endif +#endif + + +#endif /* _@GUARD_PREFIX@_TERMIOS_H */ +#endif /* _@GUARD_PREFIX@_TERMIOS_H */ diff --git a/gnulib/lib/time.in.h b/gnulib/lib/time.in.h new file mode 100644 index 0000000..ca852e8 --- /dev/null +++ b/gnulib/lib/time.in.h @@ -0,0 +1,249 @@ +/* A more-standard . + + Copyright (C) 2007-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 +@PRAGMA_COLUMNS@ + +/* 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 eventually includes itself + recursively; if that is happening, just include the system + without adding our own declarations. */ +#if (defined __need_time_t || defined __need_clock_t \ + || defined __need_timespec \ + || defined _@GUARD_PREFIX@_TIME_H) + +# @INCLUDE_NEXT@ @NEXT_TIME_H@ + +#else + +# define _@GUARD_PREFIX@_TIME_H + +# @INCLUDE_NEXT@ @NEXT_TIME_H@ + +/* NetBSD 5.0 mis-defines NULL. */ +# include + +/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ + +/* The definition of _GL_ARG_NONNULL is copied here. */ + +/* The definition of _GL_WARN_ON_USE is copied here. */ + +/* 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 + (e.g., FreeBSD circa 1997). Stock Mingw does not define it, but the + pthreads-win32 library defines it in . */ +# if ! @TIME_H_DEFINES_STRUCT_TIMESPEC@ +# if @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@ +# include +# elif @PTHREAD_H_DEFINES_STRUCT_TIMESPEC@ +# include +/* The pthreads-win32 also defines a couple of broken macros. */ +# undef asctime_r +# undef ctime_r +# undef gmtime_r +# undef localtime_r +# undef rand_r +# undef strtok_r +# else + +# ifdef __cplusplus +extern "C" { +# endif + +# if !GNULIB_defined_struct_timespec +# undef timespec +# define timespec rpl_timespec +struct timespec +{ + time_t tv_sec; + long int tv_nsec; +}; +# define GNULIB_defined_struct_timespec 1 +# endif + +# ifdef __cplusplus +} +# endif + +# endif +# endif + +# if !GNULIB_defined_struct_time_t_must_be_integral +/* Per http://austingroupbugs.net/view.php?id=327, POSIX requires + time_t to be an integer type, even though C99 permits floating + point. We don't know of any implementation that uses floating + point, and it is much easier to write code that doesn't have to + worry about that corner case, so we force the issue. */ +struct __time_t_must_be_integral { + unsigned int __floating_time_t_unsupported : (time_t) 1; +}; +# define GNULIB_defined_struct_time_t_must_be_integral 1 +# endif + +/* Sleep for at least RQTP seconds unless interrupted, If interrupted, + return -1 and store the remaining time into RMTP. See + . */ +# if @GNULIB_NANOSLEEP@ +# if @REPLACE_NANOSLEEP@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define nanosleep rpl_nanosleep +# endif +_GL_FUNCDECL_RPL (nanosleep, int, + (struct timespec const *__rqtp, struct timespec *__rmtp) + _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (nanosleep, int, + (struct timespec const *__rqtp, struct timespec *__rmtp)); +# else +# if ! @HAVE_NANOSLEEP@ +_GL_FUNCDECL_SYS (nanosleep, int, + (struct timespec const *__rqtp, struct timespec *__rmtp) + _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (nanosleep, int, + (struct timespec const *__rqtp, struct timespec *__rmtp)); +# endif +_GL_CXXALIASWARN (nanosleep); +# endif + +/* Return the 'time_t' representation of TP and normalize TP. */ +# if @GNULIB_MKTIME@ +# if @REPLACE_MKTIME@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define mktime rpl_mktime +# endif +_GL_FUNCDECL_RPL (mktime, time_t, (struct tm *__tp) _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (mktime, time_t, (struct tm *__tp)); +# else +_GL_CXXALIAS_SYS (mktime, time_t, (struct tm *__tp)); +# endif +_GL_CXXALIASWARN (mktime); +# endif + +/* Convert TIMER to RESULT, assuming local time and UTC respectively. See + and + . */ +# if @GNULIB_TIME_R@ +# if @REPLACE_LOCALTIME_R@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef localtime_r +# define localtime_r rpl_localtime_r +# endif +_GL_FUNCDECL_RPL (localtime_r, struct tm *, (time_t const *restrict __timer, + struct tm *restrict __result) + _GL_ARG_NONNULL ((1, 2))); +_GL_CXXALIAS_RPL (localtime_r, struct tm *, (time_t const *restrict __timer, + struct tm *restrict __result)); +# else +# if ! @HAVE_DECL_LOCALTIME_R@ +_GL_FUNCDECL_SYS (localtime_r, struct tm *, (time_t const *restrict __timer, + struct tm *restrict __result) + _GL_ARG_NONNULL ((1, 2))); +# endif +_GL_CXXALIAS_SYS (localtime_r, struct tm *, (time_t const *restrict __timer, + struct tm *restrict __result)); +# endif +# if @HAVE_DECL_LOCALTIME_R@ +_GL_CXXALIASWARN (localtime_r); +# endif +# if @REPLACE_LOCALTIME_R@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef gmtime_r +# define gmtime_r rpl_gmtime_r +# endif +_GL_FUNCDECL_RPL (gmtime_r, struct tm *, (time_t const *restrict __timer, + struct tm *restrict __result) + _GL_ARG_NONNULL ((1, 2))); +_GL_CXXALIAS_RPL (gmtime_r, struct tm *, (time_t const *restrict __timer, + struct tm *restrict __result)); +# else +# if ! @HAVE_DECL_LOCALTIME_R@ +_GL_FUNCDECL_SYS (gmtime_r, struct tm *, (time_t const *restrict __timer, + struct tm *restrict __result) + _GL_ARG_NONNULL ((1, 2))); +# endif +_GL_CXXALIAS_SYS (gmtime_r, struct tm *, (time_t const *restrict __timer, + struct tm *restrict __result)); +# endif +# if @HAVE_DECL_LOCALTIME_R@ +_GL_CXXALIASWARN (gmtime_r); +# endif +# endif + +/* Parse BUF as a time stamp, assuming FORMAT specifies its layout, and store + the resulting broken-down time into TM. See + . */ +# if @GNULIB_STRPTIME@ +# if ! @HAVE_STRPTIME@ +_GL_FUNCDECL_SYS (strptime, char *, (char const *restrict __buf, + char const *restrict __format, + struct tm *restrict __tm) + _GL_ARG_NONNULL ((1, 2, 3))); +# endif +_GL_CXXALIAS_SYS (strptime, char *, (char const *restrict __buf, + char const *restrict __format, + struct tm *restrict __tm)); +_GL_CXXALIASWARN (strptime); +# endif + +/* Convert TM to a time_t value, assuming UTC. */ +# if @GNULIB_TIMEGM@ +# if @REPLACE_TIMEGM@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef timegm +# define timegm rpl_timegm +# endif +_GL_FUNCDECL_RPL (timegm, time_t, (struct tm *__tm) _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (timegm, time_t, (struct tm *__tm)); +# else +# if ! @HAVE_TIMEGM@ +_GL_FUNCDECL_SYS (timegm, time_t, (struct tm *__tm) _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (timegm, time_t, (struct tm *__tm)); +# endif +_GL_CXXALIASWARN (timegm); +# 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 defined GNULIB_POSIXCHECK +# undef asctime +_GL_WARN_ON_USE (asctime, "asctime can overrun buffers in some cases - " + "better use strftime (or even sprintf) instead"); +# endif +# if defined GNULIB_POSIXCHECK +# undef asctime_r +_GL_WARN_ON_USE (asctime, "asctime_r can overrun buffers in some cases - " + "better use strftime (or even sprintf) instead"); +# endif +# if defined GNULIB_POSIXCHECK +# undef ctime +_GL_WARN_ON_USE (asctime, "ctime can overrun buffers in some cases - " + "better use strftime (or even sprintf) instead"); +# endif +# if defined GNULIB_POSIXCHECK +# undef ctime_r +_GL_WARN_ON_USE (asctime, "ctime_r can overrun buffers in some cases - " + "better use strftime (or even sprintf) instead"); +# endif + +#endif diff --git a/gnulib/lib/time_r.c b/gnulib/lib/time_r.c new file mode 100644 index 0000000..97be6c2 --- /dev/null +++ b/gnulib/lib/time_r.c @@ -0,0 +1,45 @@ +/* Reentrant time functions like localtime_r. + + Copyright (C) 2003, 2006-2007, 2010-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 + +#include + +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 0000000..d1dddfb --- /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-2011 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 +#endif + +#include + +#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 0000000..c290ba3 --- /dev/null +++ b/gnulib/lib/times.c @@ -0,0 +1,67 @@ +/* Get process times + + Copyright (C) 2008-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 , 2008. */ + +#include + +/* Get times prototype. */ +#include + +/* Get round. */ +#include + +/* Get GetProcessTimes etc. */ +#include + +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-add.c b/gnulib/lib/timespec-add.c new file mode 100644 index 0000000..813dadb --- /dev/null +++ b/gnulib/lib/timespec-add.c @@ -0,0 +1,71 @@ +/* Add two struct timespec values. + + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +/* Return the sum of two timespec values A and B. On overflow, return + an extremal value. This assumes 0 <= tv_nsec <= 999999999. */ + +#include +#include "timespec.h" + +#include "intprops.h" + +struct timespec +timespec_add (struct timespec a, struct timespec b) +{ + struct timespec r; + time_t rs = a.tv_sec; + time_t bs = b.tv_sec; + int ns = a.tv_nsec + b.tv_nsec; + int nsd = ns - 1000000000; + int rns = ns; + + if (0 <= nsd) + { + rns = nsd; + if (rs == TYPE_MAXIMUM (time_t)) + { + if (0 <= bs) + goto high_overflow; + bs++; + } + else + rs++; + } + + if (INT_ADD_OVERFLOW (rs, bs)) + { + if (rs < 0) + { + rs = TYPE_MINIMUM (time_t); + rns = 0; + } + else + { + high_overflow: + rs = TYPE_MAXIMUM (time_t); + rns = 999999999; + } + } + else + rs += bs; + + r.tv_sec = rs; + r.tv_nsec = rns; + return r; +} diff --git a/gnulib/lib/timespec-sub.c b/gnulib/lib/timespec-sub.c new file mode 100644 index 0000000..679d0db --- /dev/null +++ b/gnulib/lib/timespec-sub.c @@ -0,0 +1,72 @@ +/* Subtract two struct timespec values. + + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +/* Return the difference between two timespec values A and B. On + overflow, return an extremal value. This assumes 0 <= tv_nsec <= + 999999999. */ + +#include +#include +#include "timespec.h" + +#include "intprops.h" + +struct timespec +timespec_sub (struct timespec a, struct timespec b) +{ + struct timespec r; + time_t rs = a.tv_sec; + time_t bs = b.tv_sec; + int ns = a.tv_nsec - b.tv_nsec; + int rns = ns; + + if (ns < 0) + { + rns = ns + 1000000000; + if (rs == TYPE_MINIMUM (time_t)) + { + if (bs <= 0) + goto low_overflow; + bs--; + } + else + rs--; + } + + if (INT_SUBTRACT_OVERFLOW (rs, bs)) + { + if (rs < 0) + { + low_overflow: + rs = TYPE_MINIMUM (time_t); + rns = 0; + } + else + { + rs = TYPE_MAXIMUM (time_t); + rns = 999999999; + } + } + else + rs -= bs; + + r.tv_sec = rs; + r.tv_nsec = rns; + return r; +} diff --git a/gnulib/lib/timespec.h b/gnulib/lib/timespec.h new file mode 100644 index 0000000..acf815c --- /dev/null +++ b/gnulib/lib/timespec.h @@ -0,0 +1,82 @@ +/* timespec -- System time interface + + Copyright (C) 2000, 2002, 2004-2005, 2007, 2009-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#if ! defined TIMESPEC_H +# define TIMESPEC_H + +# include + +/* Return negative, zero, positive if A < B, A == B, A > B, respectively. + + For each time stamp T, this code assumes that either: + + * T.tv_nsec is in the range 0..999999999; or + * T.tv_sec corresponds to a valid leap second on a host that supports + leap seconds, and T.tv_nsec is in the range 1000000000..1999999999; or + * T.tv_sec is the minimum time_t value and T.tv_nsec is -1; or + T.tv_sec is the maximum time_t value and T.tv_nsec is 2000000000. + This allows for special struct timespec values that are less or + greater than all possible valid time stamps. + + In all these cases, it is safe to subtract two tv_nsec values and + convert the result to integer without worrying about overflow on + any platform of interest to the GNU project, since all such + platforms have 32-bit int or wider. + + Replacing "(int) (a.tv_nsec - b.tv_nsec)" with something like + "a.tv_nsec < b.tv_nsec ? -1 : a.tv_nsec > b.tv_nsec" would cause + this function to work in some cases where the above assumption is + violated, but not in all cases (e.g., a.tv_sec==1, a.tv_nsec==-2, + b.tv_sec==0, b.tv_nsec==999999999) and is arguably not worth the + extra instructions. Using a subtraction has the advantage of + detecting some invalid cases on platforms that detect integer + overflow. + + The (int) cast avoids a gcc -Wconversion warning. */ + +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 + : (int) (a.tv_nsec - b.tv_nsec)); +} + +/* Return -1, 0, 1, depending on the sign of A. A.tv_nsec must be + nonnegative. */ +static inline int +timespec_sign (struct timespec a) +{ + return a.tv_sec < 0 ? -1 : a.tv_sec || a.tv_nsec; +} + +struct timespec timespec_add (struct timespec, struct timespec); +struct timespec timespec_sub (struct timespec, struct timespec); +struct timespec dtotimespec (double); + +/* Return an approximation to A, of type 'double'. */ +static inline double +timespectod (struct timespec a) +{ + return a.tv_sec + a.tv_nsec / 1e9; +} + +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 0000000..f159f16 --- /dev/null +++ b/gnulib/lib/tmpdir.c @@ -0,0 +1,157 @@ +/* Copyright (C) 1999, 2001-2002, 2006, 2009-2011 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 . */ + +/* Extracted from sysdeps/posix/tempname.c. */ + +#include + +/* Specification. */ +#include "tmpdir.h" + +#include +#include +#include + +#include +#ifndef __set_errno +# define __set_errno(Val) errno = (Val) +#endif + +#include +#ifndef P_tmpdir +# ifdef _P_tmpdir /* native Windows */ +# define P_tmpdir _P_tmpdir +# else +# define P_tmpdir "/tmp" +# endif +#endif + +#include + +#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ +# define WIN32_LEAN_AND_MEAN /* avoid including junk */ +# include +#endif + +#include "pathmax.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 (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ + char dirbuf[PATH_MAX]; + DWORD retval; + + /* Find Windows temporary file directory. + We try this before P_tmpdir 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, dirbuf); + if (retval > 0 && retval < PATH_MAX && direxists (dirbuf)) + dir = dirbuf; + else +#endif + 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 0000000..553304f --- /dev/null +++ b/gnulib/lib/tmpdir.h @@ -0,0 +1,26 @@ +/* Determine a temporary directory. + Copyright (C) 2001-2002, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include +#include + +/* 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 0000000..628db77 --- /dev/null +++ b/gnulib/lib/tmpfile-safer.c @@ -0,0 +1,69 @@ +/* Invoke tmpfile, but avoid some glitches. + Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Eric Blake, based on ideas from Paul Eggert. */ + +#include + +#include "stdio-safer.h" + +#include +#include +#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 0000000..c57e0e7 --- /dev/null +++ b/gnulib/lib/tmpfile.c @@ -0,0 +1,127 @@ +/* Create a temporary file. + Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Ben Pfaff. */ + +#include + +/* Specification. */ +#include + +/* This replacement is used only on native Windows platforms. */ + +#include +#include +#include +#include + +#include + +#define WIN32_LEAN_AND_MEAN /* avoid including junk */ +#include + +#include "pathmax.h" +#include "tempname.h" +#include "tmpdir.h" + +/* PATH_MAX is guaranteed to be defined, because this replacement is only + used on native Windows. */ + +/* 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/towctrans-impl.h b/gnulib/lib/towctrans-impl.h new file mode 100644 index 0000000..9e640fe --- /dev/null +++ b/gnulib/lib/towctrans-impl.h @@ -0,0 +1,22 @@ +/* Convert a wide character using a case mapping. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +wint_t +towctrans (wint_t wc, wctrans_t desc) +{ + return ((wint_t (*) (wint_t)) desc) (wc); +} diff --git a/gnulib/lib/towctrans.c b/gnulib/lib/towctrans.c new file mode 100644 index 0000000..3bf42ad --- /dev/null +++ b/gnulib/lib/towctrans.c @@ -0,0 +1,23 @@ +/* Convert a wide character using a case mapping. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include "towctrans-impl.h" diff --git a/gnulib/lib/trigl.c b/gnulib/lib/trigl.c new file mode 100644 index 0000000..0ed0da6 --- /dev/null +++ b/gnulib/lib/trigl.c @@ -0,0 +1,636 @@ +/* Quad-precision floating point argument reduction. + Copyright (C) 1999, 2007, 2009-2011 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Jakub Jelinek + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "trigl.h" + +#include +#include + +/* 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 0000000..d71ace9 --- /dev/null +++ b/gnulib/lib/trigl.h @@ -0,0 +1,35 @@ +/* Declarations for sinl, cosl, tanl internal functions + Contributed by Paolo Bonzini + + Copyright 2002-2003, 2009-2011 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 . */ + +/* Decompose x into x = k * π/2 + r + where k is an integer and abs(r) <= π/4. + Store r in y[0] and y[1] (main part in y[0], small additional part in + y[1], r = y[0] + y[1]). + Return k. */ +extern int ieee754_rem_pio2l (long double x, long double *y); + +/* Compute and return sinl (x + y), where x is the main part and y is the + small additional part of a floating-point number. + iy is 0 when y is known to be 0.0, otherwise iy is 1. */ +extern long double kernel_sinl (long double x, long double y, int iy); + +/* Compute and return cosl (x + y), where x is the main part and y is the + small additional part of a floating-point number. */ +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 0000000..155063e --- /dev/null +++ b/gnulib/lib/trim.c @@ -0,0 +1,129 @@ +/* Removes leading and/or trailing whitespaces + Copyright (C) 2006-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Davide Angelocola */ + +#include + +/* Specification. */ +#include "trim.h" + +#include +#include +#include +#include + +#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) + { + unsigned 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))) + continue; + + if (state == 0 && !mb_isspace (mbi_cur (i))) + { + state = 1; + continue; + } + + if (state == 1 && !mb_isspace (mbi_cur (i))) + 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))) + { + /* empty */ + } + 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 0000000..0bbb2ff --- /dev/null +++ b/gnulib/lib/trim.h @@ -0,0 +1,33 @@ +/* Removes leading and/or trailing whitespaces + Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Davide Angelocola */ + +/* 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 0000000..73a3345 --- /dev/null +++ b/gnulib/lib/trunc.c @@ -0,0 +1,115 @@ +/* Round towards zero. + Copyright (C) 2007, 2010-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible , 2007. */ + +#if ! defined USE_LONG_DOUBLE +# include +#endif + +/* Specification. */ +#include + +#include + +#undef MIN + +#ifdef USE_LONG_DOUBLE +# define FUNC truncl +# define DOUBLE long double +# define MANT_DIG LDBL_MANT_DIG +# define MIN LDBL_MIN +# define L_(literal) literal##L +#elif ! defined USE_FLOAT +# define FUNC trunc +# define DOUBLE double +# define MANT_DIG DBL_MANT_DIG +# define MIN DBL_MIN +# define L_(literal) literal +#else /* defined USE_FLOAT */ +# define FUNC truncf +# define DOUBLE float +# define MANT_DIG FLT_MANT_DIG +# define MIN FLT_MIN +# define L_(literal) literal##f +#endif + +/* -0.0. See minus-zero.h. */ +#if defined __hpux || defined __sgi || defined __ICC +# define MINUS_ZERO (-MIN * MIN) +#else +# define MINUS_ZERO L_(-0.0) +#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)) + { + /* For 0 < x < 1, return +0.0 even if the current rounding mode is + FE_DOWNWARD. */ + if (z < L_(1.0)) + z = L_(0.0); + /* Avoid rounding errors for values near 2^k, where k >= MANT_DIG-1. */ + else 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)) + { + /* For -1 < x < 0, return -0.0 regardless of the current rounding + mode. */ + if (z > L_(-1.0)) + z = MINUS_ZERO; + /* Avoid rounding errors for values near -2^k, where k >= MANT_DIG-1. */ + else 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 0000000..609eb5e --- /dev/null +++ b/gnulib/lib/truncf.c @@ -0,0 +1,20 @@ +/* Round towards zero. + Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible , 2007. */ + +#define USE_FLOAT +#include "trunc.c" diff --git a/gnulib/lib/truncl.c b/gnulib/lib/truncl.c new file mode 100644 index 0000000..8af2c5c --- /dev/null +++ b/gnulib/lib/truncl.c @@ -0,0 +1,37 @@ +/* Round towards zero. + Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible , 2007. */ + +#include + +#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE + +/* Specification. */ +# include + +long double +truncl (long double x) +{ + return trunc (x); +} + +#else + +# define USE_LONG_DOUBLE +# include "trunc.c" + +#endif diff --git a/gnulib/lib/tsearch.c b/gnulib/lib/tsearch.c new file mode 100644 index 0000000..086ef53 --- /dev/null +++ b/gnulib/lib/tsearch.c @@ -0,0 +1,687 @@ +/* Copyright (C) 1995-1997, 2000, 2006-2007, 2009-2011 Free Software + Foundation, Inc. + Contributed by Bernd Schmidt , 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 . */ + +/* 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 + +/* 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 +#endif + +#include + +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 + +#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/ttyname_r.c b/gnulib/lib/ttyname_r.c new file mode 100644 index 0000000..3379f1c --- /dev/null +++ b/gnulib/lib/ttyname_r.c @@ -0,0 +1,86 @@ +/* Determine name of a terminal. + + Copyright (C) 2010-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible , 2010. */ + +#include + +#include + +#include +#include +#include + +int +ttyname_r (int fd, char *buf, size_t buflen) +#undef ttyname_r +{ + /* When ttyname_r exists, use it. */ +#if HAVE_TTYNAME_R + /* This code is multithread-safe. */ + /* On Solaris, ttyname_r always fails if buflen < 128. On OSF/1 5.1, + ttyname_r ignores the buffer size and assumes the buffer is large enough. + So provide a buffer that is large enough. */ + char largerbuf[512]; +# if HAVE_POSIXDECL_TTYNAME_R + int err = + (buflen < sizeof (largerbuf) + ? ttyname_r (fd, largerbuf, sizeof (largerbuf)) + : ttyname_r (fd, buf, buflen <= INT_MAX ? buflen : INT_MAX)); + if (err != 0) + return err; + if (buflen < sizeof (largerbuf)) + { + size_t namelen = strlen (largerbuf); + if (namelen > buflen) + return ERANGE; + memcpy (buf, largerbuf, namelen); + } +# else + char *name = + (buflen < sizeof (largerbuf) + ? ttyname_r (fd, largerbuf, sizeof (largerbuf)) + : ttyname_r (fd, buf, buflen <= INT_MAX ? buflen : INT_MAX)); + if (name == NULL) + return errno; + if (name != buf) + { + size_t namelen = strlen (name) + 1; + if (namelen > buflen) + return ERANGE; + memmove (buf, name, namelen); + } +# endif + return 0; +#elif HAVE_TTYNAME + /* Note: This is not multithread-safe. */ + char *name; + size_t namelen; + + name = ttyname (fd); + if (name == NULL) + return errno; + namelen = strlen (name) + 1; + if (namelen > buflen) + return ERANGE; + memcpy (buf, name, namelen); + return 0; +#else + /* Platforms like mingw: no ttys exist at all. */ + return ENOTTY; +#endif +} diff --git a/gnulib/lib/u64.h b/gnulib/lib/u64.h new file mode 100644 index 0000000..182d649 --- /dev/null +++ b/gnulib/lib/u64.h @@ -0,0 +1,158 @@ +/* uint64_t-like operations that work even on hosts lacking uint64_t + + Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +#include + +/* 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 0000000..48fd98f --- /dev/null +++ b/gnulib/lib/uinttostr.c @@ -0,0 +1,3 @@ +#define anytostr uinttostr +#define inttype unsigned int +#include "anytostr.c" diff --git a/gnulib/lib/umaxtostr.c b/gnulib/lib/umaxtostr.c new file mode 100644 index 0000000..f95bfc3 --- /dev/null +++ b/gnulib/lib/umaxtostr.c @@ -0,0 +1,3 @@ +#define anytostr umaxtostr +#define inttype uintmax_t +#include "anytostr.c" diff --git a/gnulib/lib/uname.c b/gnulib/lib/uname.c new file mode 100644 index 0000000..226a2b4 --- /dev/null +++ b/gnulib/lib/uname.c @@ -0,0 +1,268 @@ +/* uname replacement. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +/* This file provides an implementation only for the native Windows API. */ +#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ + +#include +#include +#include +#include +#include + +/* 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.in.h b/gnulib/lib/unicase.in.h new file mode 100644 index 0000000..fb88906 --- /dev/null +++ b/gnulib/lib/unicase.in.h @@ -0,0 +1,457 @@ +/* Unicode character case mappings. + Copyright (C) 2002, 2009-2011 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 . */ + +#ifndef _UNICASE_H +#define _UNICASE_H + +#include "unitypes.h" + +/* Get bool. */ +#include + +/* Get size_t. */ +#include + +/* 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 0000000..1966a2a --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..06bf66c --- /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-uni-tables.c for Unicode 6.0.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, 0xFFFE00FF, 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, 0x00000000, + 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, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000781F, + 0xFFFFFFFF, 0x0000003F, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xFFFFFFFF, 0x00003FFF, + 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0xFFFFFFFC, 0xFFFFFFFF, 0xFFFFFFFF, + 0x000378FF, 0x000003FF, 0x00000000, 0x04000000, + 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 0000000..31e94b1 --- /dev/null +++ b/gnulib/lib/unicase/casefold.h @@ -0,0 +1,22 @@ +/* Casefolding of Unicode characters. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#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 0000000..ecc9f09 --- /dev/null +++ b/gnulib/lib/unicase/caseprop.h @@ -0,0 +1,32 @@ +/* Case related properties of Unicode characters. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include +#include "unitypes.h" + +/* Determine whether a character is "cased" according to the Unicode Standard, + , 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, + , 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 0000000..8212f2e --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + + +/* The context of a prefix string combines the information of the "Before C" + conditions of the Unicode Standard, + , 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, + , 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 0000000..5e0a640 --- /dev/null +++ b/gnulib/lib/unicase/empty-prefix-context.c @@ -0,0 +1,27 @@ +/* Case-mapping context of empty prefix string. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..de772a3 --- /dev/null +++ b/gnulib/lib/unicase/empty-suffix-context.c @@ -0,0 +1,27 @@ +/* Case-mapping context of empty suffix string. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..4dcc553 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 + 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 0000000..810f52a --- /dev/null +++ b/gnulib/lib/unicase/ignorable.h @@ -0,0 +1,552 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Casing Properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[32 << 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, + 16 + 384 * sizeof (short) / sizeof (int) + 320, + 16 + 384 * sizeof (short) / sizeof (int) + 336, + 16 + 384 * sizeof (short) / sizeof (int) + 352, + 16 + 384 * 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, + 16 + 384 * sizeof (short) / sizeof (int) + 384, + -1, + 16 + 384 * sizeof (short) / sizeof (int) + 400, + 16 + 384 * sizeof (short) / sizeof (int) + 416, + -1, + -1, + -1, + -1, + 16 + 384 * sizeof (short) / sizeof (int) + 432, + -1, + -1, + 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, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -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) + 464, + 16 + 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, + 16 + 384 * 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, + -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, 0xFFFFF801, 0x00010000, + 0x00000000, 0x00000000, 0xBFC00000, 0x00003DFF, + 0x00028000, 0xFFFF0000, 0x000007FF, 0x00000000, + 0x00000000, 0x0001FFC0, 0x00000000, 0x043FF800, + 0xFFC00000, 0x00003FFF, 0x0E000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000007, 0x14000000, 0x00FE21FE, 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, + 0xFEFFE0DF, 0x1FFFFFFF, 0x00000040, 0x00000000, + 0x00000000, 0x66FDE000, 0xC3000000, 0x001E0001, + 0x20002064, 0x00000000, 0x00000000, 0x10000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xE0000000, 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, 0x7F400000, 0x9FF81FE5, + 0x00000000, 0x00000080, 0x00000000, 0x00000000, + 0x0000000F, 0x17D00000, 0x00000004, 0x000FF800, + 0x00000003, 0x0000033C, 0x00000000, 0x0003A340, + 0x00000000, 0x00CFF000, 0x00000000, 0x3F000000, + 0x00000000, 0x00000000, 0xFFF70000, 0x000021FD, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xFFFFFFFF, 0xF000007F, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0xA0000000, 0xE000E003, 0x6000E000, + 0x0300F800, 0x00007C90, 0x00000000, 0x8002FC1F, + 0x1FE00000, 0x00000000, 0xFFFF0000, 0x0001FFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00038000, + 0x00000000, 0x00000000, 0x00000000, 0x80008000, + 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, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x3F000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00001000, 0x00000000, 0x00000000, 0xB0078000, + 0x00000000, 0x00000000, 0x00000000, 0x00030000, + 0xFFFFFFFF, 0x00000003, 0x00000000, 0x00000000, + 0x00000700, 0x00000000, 0x00000000, 0x00000000, + 0x00000844, 0x00000060, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000010, 0x0003FFFF, + 0x00000000, 0x00003FC0, 0x0003FF80, 0x00000000, + 0x00000007, 0x13C80000, 0x00008000, 0x00000000, + 0x00000000, 0x00667E00, 0x00001008, 0x00010000, + 0x00000000, 0xC19D0000, 0x20000002, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00002120, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x40000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0xFFFC0000, 0x00000003, 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, + 0x00000002, 0xFF000000, 0x0000007F, 0x00000000, + 0x00000003, 0x26780000, 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 0000000..abf7085 --- /dev/null +++ b/gnulib/lib/unicase/invariant.h @@ -0,0 +1,45 @@ +/* Internal functions for Unicode character case mappings. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include +#include + +#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 0000000..c1491e2 --- /dev/null +++ b/gnulib/lib/unicase/locale-language.c @@ -0,0 +1,55 @@ +/* Language code of current locale. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unicase.h" + +#include +#include + +#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 0000000..da0d94e --- /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 0000000..4a5ab0e --- /dev/null +++ b/gnulib/lib/unicase/simple-mapping.h @@ -0,0 +1,39 @@ +/* Simple case mapping for Unicode characters. + Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +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 0000000..f77662e --- /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 6.0.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 0000000..6598ddb --- /dev/null +++ b/gnulib/lib/unicase/special-casing.c @@ -0,0 +1,25 @@ +/* Special casing table. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "special-casing.h" + +#include + +#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 0000000..38e74ce --- /dev/null +++ b/gnulib/lib/unicase/special-casing.h @@ -0,0 +1,60 @@ +/* Special casing table. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + + +/* 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 0000000..6013de5 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..0b68f83 --- /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 6.0.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, 1, 0, 1, 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, + -10782, 0, 1, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, -10815, -10815, + 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 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, 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, + 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 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, + 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, -42280, 0, 0, + 1, 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, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 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 0000000..8b42a6e --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..b759903 --- /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 6.0.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, 1, 0, 1, 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, + -10782, 0, 1, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, -10815, -10815, + 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 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, 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, + 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 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, + 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, -42280, 0, 0, + 1, 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, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 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 0000000..a9176c2 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..3ccb935 --- /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 6.0.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, 10815, + 10815, 0, -1, 0, 0, 0, 0, -1, + 0, -1, 0, -1, 0, -1, 0, -1, + 10783, 10780, 10782, -210, -206, 0, -205, -205, + 0, -202, 0, -203, 0, 0, 0, 0, + -205, 0, 0, -207, 0, 42280, 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, -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, -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, -1, 0, -1, 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, -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, -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, -1, 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, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 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 0000000..81b9ab1 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..d8e4069 --- /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 6.0.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, 10815, + 10815, 0, -1, 0, 0, 0, 0, -1, + 0, -1, 0, -1, 0, -1, 0, -1, + 10783, 10780, 10782, -210, -206, 0, -205, -205, + 0, -202, 0, -203, 0, 0, 0, 0, + -205, 0, 0, -207, 0, 42280, 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, -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, -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, -1, 0, -1, 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, -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, -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, -1, 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, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 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 0000000..1849d7d --- /dev/null +++ b/gnulib/lib/unicase/u-casecmp.h @@ -0,0 +1,69 @@ +/* Case and normalization insensitive comparison of Unicode strings. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +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 0000000..463b6e1 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +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 0000000..d63ffd2 --- /dev/null +++ b/gnulib/lib/unicase/u-casefold.h @@ -0,0 +1,28 @@ +/* Casefolding mapping for Unicode strings (locale dependent). + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +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 0000000..eb5ce27 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +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 0000000..44d845f --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +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 = amemxfrm (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 0000000..05036ba --- /dev/null +++ b/gnulib/lib/unicase/u-ct-casefold.h @@ -0,0 +1,107 @@ +/* Casefolding mapping for Unicode substrings (locale dependent). + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +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 0000000..b39483c --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +/* 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 0000000..73dece2 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +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 0000000..05b749c --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +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 0000000..460a8bc --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +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 0000000..ec12d7d --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +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 0000000..8362abd --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +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 0000000..7dcf702 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unicase.h" + +#include +#include + +#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 0000000..578c810 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unicase.h" + +#include +#include + +#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 0000000..348e6c6 --- /dev/null +++ b/gnulib/lib/unicase/u16-casefold.c @@ -0,0 +1,26 @@ +/* Casefolding mapping for UTF-16 strings (locale dependent). + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..0ffdb08 --- /dev/null +++ b/gnulib/lib/unicase/u16-casemap.c @@ -0,0 +1,40 @@ +/* Case mapping for UTF-16 strings (locale dependent). + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unicasemap.h" + +#include +#include +#include + +#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 0000000..f26898b --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unicase.h" + +#include +#include + +#include "localcharset.h" +#include "uniconv.h" +#include "amemxfrm.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 0000000..0fdeef2 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unicase.h" + +#include +#include +#include + +#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 0000000..45ccb9f --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unicase.h" + +#include + +#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 0000000..215c4ac --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unicase.h" + +#include +#include +#include +#include + +#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 0000000..594ddf4 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unicase.h" + +#include + +#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 0000000..0e8f392 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unicase.h" + +#include +#include + +#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 0000000..67492b2 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..415db2f --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unicase/invariant.h" + +#include +#include +#include + +#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 0000000..06bf2b0 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..0c10916 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..fa8aafd --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..fca0419 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..b714e9d --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..dde5fe9 --- /dev/null +++ b/gnulib/lib/unicase/u16-tolower.c @@ -0,0 +1,39 @@ +/* Lowercase mapping for UTF-16 strings (locale dependent). + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unicase.h" + +#include + +#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 0000000..541e705 --- /dev/null +++ b/gnulib/lib/unicase/u16-totitle.c @@ -0,0 +1,27 @@ +/* Titlecase mapping for UTF-16 strings (locale dependent). + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..3b964f7 --- /dev/null +++ b/gnulib/lib/unicase/u16-toupper.c @@ -0,0 +1,39 @@ +/* Uppercase mapping for UTF-16 strings (locale dependent). + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unicase.h" + +#include + +#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 0000000..66ef142 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unicase.h" + +#include +#include + +#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 0000000..c48afa6 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unicase.h" + +#include +#include + +#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 0000000..b8e93f2 --- /dev/null +++ b/gnulib/lib/unicase/u32-casefold.c @@ -0,0 +1,26 @@ +/* Casefolding mapping for UTF-32 strings (locale dependent). + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..2201d76 --- /dev/null +++ b/gnulib/lib/unicase/u32-casemap.c @@ -0,0 +1,40 @@ +/* Case mapping for UTF-32 strings (locale dependent). + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unicasemap.h" + +#include +#include +#include + +#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 0000000..c537738 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unicase.h" + +#include +#include + +#include "localcharset.h" +#include "uniconv.h" +#include "amemxfrm.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 0000000..4267f27 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unicase.h" + +#include +#include +#include + +#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 0000000..2f529db --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unicase.h" + +#include + +#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 0000000..68689b3 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unicase.h" + +#include +#include +#include +#include + +#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 0000000..195addd --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unicase.h" + +#include + +#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 0000000..da4e473 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unicase.h" + +#include +#include + +#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 0000000..54f5259 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..128fefd --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unicase/invariant.h" + +#include +#include +#include + +#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 0000000..03f49e2 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..a49cecf --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..ff3fed9 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..28719cf --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..a4ede0c --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..16c9762 --- /dev/null +++ b/gnulib/lib/unicase/u32-tolower.c @@ -0,0 +1,39 @@ +/* Lowercase mapping for UTF-32 strings (locale dependent). + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unicase.h" + +#include + +#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 0000000..0f637f6 --- /dev/null +++ b/gnulib/lib/unicase/u32-totitle.c @@ -0,0 +1,26 @@ +/* Titlecase mapping for UTF-32 strings (locale dependent). + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..dbf93b9 --- /dev/null +++ b/gnulib/lib/unicase/u32-toupper.c @@ -0,0 +1,39 @@ +/* Uppercase mapping for UTF-32 strings (locale dependent). + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unicase.h" + +#include + +#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 0000000..820cd3e --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unicase.h" + +#include +#include + +#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 0000000..6a5ba75 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unicase.h" + +#include +#include + +#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 0000000..88aabd8 --- /dev/null +++ b/gnulib/lib/unicase/u8-casefold.c @@ -0,0 +1,107 @@ +/* Casefolding mapping for UTF-8 strings (locale dependent). + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 +#include +#include +#include + +/* 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 0000000..38107b1 --- /dev/null +++ b/gnulib/lib/unicase/u8-casemap.c @@ -0,0 +1,40 @@ +/* Case mapping for UTF-8 strings (locale dependent). + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unicasemap.h" + +#include +#include +#include + +#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 0000000..d8aea34 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unicase.h" + +#include +#include + +#include "localcharset.h" +#include "uniconv.h" +#include "amemxfrm.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 0000000..6e08a5e --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unicase.h" + +#include +#include +#include + +#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 0000000..503d0f7 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unicase.h" + +#include + +#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 0000000..20f38f0 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unicase.h" + +#include +#include +#include +#include + +#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 0000000..cfc3c81 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unicase.h" + +#include + +#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 0000000..3dd583b --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unicase.h" + +#include +#include + +#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 0000000..186643f --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..076b57a --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unicase/invariant.h" + +#include +#include +#include + +#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 0000000..f012b76 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..94568b7 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..a40d946 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..f9bd286 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..8619c70 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..b68f849 --- /dev/null +++ b/gnulib/lib/unicase/u8-tolower.c @@ -0,0 +1,120 @@ +/* Lowercase mapping for UTF-8 strings (locale dependent). + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unicase.h" + +#include + +#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 +#include +#include +#include + +/* 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 0000000..0799cc9 --- /dev/null +++ b/gnulib/lib/unicase/u8-totitle.c @@ -0,0 +1,107 @@ +/* Titlecase mapping for UTF-8 strings (locale dependent). + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 +#include +#include +#include + +/* 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 0000000..3fee6a3 --- /dev/null +++ b/gnulib/lib/unicase/u8-toupper.c @@ -0,0 +1,120 @@ +/* Uppercase mapping for UTF-8 strings (locale dependent). + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unicase.h" + +#include + +#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 +#include +#include +#include + +/* 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 0000000..94a6637 --- /dev/null +++ b/gnulib/lib/unicase/ulc-casecmp.c @@ -0,0 +1,74 @@ +/* Case and normalization insensitive comparison of strings. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unicase.h" + +#include +#include + +#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 0000000..34ded70 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unicase.h" + +#include +#include + +#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 0000000..00108b6 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unicase.h" + +#include +#include + +#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 0000000..aff0610 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +#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 0000000..7665144 --- /dev/null +++ b/gnulib/lib/unicodeio.c @@ -0,0 +1,216 @@ +/* Unicode character output to streams with locale dependent encoding. + + Copyright (C) 2000-2003, 2006, 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible . */ + +#include + +/* Specification. */ +#include "unicodeio.h" + +#include +#include +#include + +#if HAVE_ICONV +# include +#endif + +#include + +#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 __UCLIBC__) \ + || 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 0000000..f065cf0 --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef UNICODEIO_H +# define UNICODEIO_H + +# include +# include + +/* 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.in.h b/gnulib/lib/uniconv.in.h new file mode 100644 index 0000000..4bcdb19 --- /dev/null +++ b/gnulib/lib/uniconv.in.h @@ -0,0 +1,172 @@ +/* Conversions between Unicode and legacy encodings. + Copyright (C) 2002, 2005, 2007, 2009-2011 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 . */ + +#ifndef _UNICONV_H +#define _UNICONV_H + +/* Get size_t. */ +#include + +#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 0000000..928eed1 --- /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-2011 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 . */ + +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 0000000..281d153 --- /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-2011 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 . */ + +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 0000000..37f111f --- /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-2011 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 . */ + +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 0000000..ff5ffae --- /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-2011 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 . */ + +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 0000000..a7d5ed2 --- /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-2011 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 . */ + +/* Written by Bruno Haible . */ + +#include + +/* Specification. */ +#include "uniconv.h" + +#include +#include + +#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)) && !defined __UCLIBC__) +# 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 0000000..8259faa --- /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-2011 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 . */ + +/* Written by Bruno Haible . */ + +#include + +/* Specification. */ +#include "uniconv.h" + +#include +#include +#include + +#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)) && !defined __UCLIBC__) +# 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 0000000..4477911 --- /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-2011 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 . */ + +/* Written by Bruno Haible . */ + +#include + +/* Specification. */ +#include "uniconv.h" + +#include +#include +#include + +#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 0000000..79b5fad --- /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-2011 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 . */ + +/* Written by Bruno Haible . */ + +#include + +/* 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 0000000..d883bbf --- /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-2011 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 . */ + +/* Written by Bruno Haible . */ + +#include + +/* Specification. */ +#include "uniconv.h" + +#include +#include +#include + +#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)) && !defined __UCLIBC__) +# 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 0000000..5090270 --- /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-2011 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 . */ + +/* Written by Bruno Haible . */ + +#include + +/* 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 0000000..7d002ad --- /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-2011 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 . */ + +/* Written by Bruno Haible . */ + +#include + +/* Specification. */ +#include "uniconv.h" + +#include +#include + +#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)) && !defined __UCLIBC__ +# 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 0000000..11f094e --- /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-2011 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 . */ + +/* Written by Bruno Haible . */ + +#include + +/* Specification. */ +#include "uniconv.h" + +#include +#include +#include + +#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)) && !defined __UCLIBC__ +# 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 0000000..03a02fd --- /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-2011 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 . */ + +/* Written by Bruno Haible . */ + +#include + +/* Specification. */ +#include "uniconv.h" + +#include +#include +#include + +#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 0000000..61edff8 --- /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-2011 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 . */ + +/* Written by Bruno Haible . */ + +#include + +/* 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 0000000..a25b47b --- /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-2011 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 . */ + +/* Written by Bruno Haible . */ + +#include + +/* Specification. */ +#include "uniconv.h" + +#include +#include +#include + +#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)) && !defined __UCLIBC__ +# 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 0000000..7cdb15d --- /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-2011 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 . */ + +/* Written by Bruno Haible . */ + +#include + +/* 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 0000000..a461b60 --- /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-2011 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 . */ + +/* Written by Bruno Haible . */ + +#include + +/* Specification. */ +#include "uniconv.h" + +#include +#include +#include + +#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 0000000..b9a7614 --- /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-2011 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 . */ + +/* Written by Bruno Haible . */ + +#include + +/* Specification. */ +#include "uniconv.h" + +#include +#include +#include + +#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 0000000..162284b --- /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-2011 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 . */ + +/* Written by Bruno Haible . */ + +#include + +/* Specification. */ +#include "uniconv.h" + +#include +#include +#include + +#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 0000000..2175d52 --- /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-2011 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 . */ + +/* Written by Bruno Haible . */ + +#include + +/* 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 0000000..4cbf55a --- /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-2011 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 . */ + +/* Written by Bruno Haible . */ + +#include + +/* Specification. */ +#include "uniconv.h" + +#include +#include +#include + +#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 0000000..97a97bb --- /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-2011 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 . */ + +/* Written by Bruno Haible . */ + +#include + +/* 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.in.h b/gnulib/lib/unictype.in.h new file mode 100644 index 0000000..19faea1 --- /dev/null +++ b/gnulib/lib/unictype.in.h @@ -0,0 +1,881 @@ +/* Unicode character classification and properties. + Copyright (C) 2002, 2005-2011 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 . */ + +#ifndef _UNICTYPE_H +#define _UNICTYPE_H + +#include "unitypes.h" + +/* Get bool. */ +#include + +/* Get size_t. */ +#include + +#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_LC = 0x00000007, + 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_LC; +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_CASED_LETTER UC_CATEGORY_LC +#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 long name of a general category. */ +extern const char * + uc_general_category_long_name (uc_general_category_t category); + +/* Return the general category given by name, e.g. "Lu", or by long name, + e.g. "Uppercase Letter". */ +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_ATA = 214, /* Attached Above */ + 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); + +/* Return the name of a canonical combining class. */ +extern const char * + uc_combining_class_name (int ccc); + +/* Return the long name of a canonical combining class. */ +extern const char * + uc_combining_class_long_name (int ccc); + +/* Return the canonical combining class given by name, e.g. "BL", or by long + name, e.g. "Below Left". */ +extern int + uc_combining_class_byname (const char *ccc_name); + +/* ========================================================================= */ + +/* Field 4 of Unicode Character Database: Bidi class. + Before Unicode 4.0, this field was called "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 bidi class. */ +extern const char * + uc_bidi_class_name (int bidi_class); +/* Same; obsolete function name. */ +extern const char * + uc_bidi_category_name (int category); + +/* Return the long name of a bidi class. */ +extern const char * + uc_bidi_class_long_name (int bidi_class); + +/* Return the bidi class given by name, e.g. "LRE", or by long name, e.g. + "Left-to-Right Embedding". */ +extern int + uc_bidi_class_byname (const char *bidi_class_name); +/* Same; obsolete function name. */ +extern int + uc_bidi_category_byname (const char *category_name); + +/* Return the bidi class of a Unicode character. */ +extern int + uc_bidi_class (ucs4_t uc); +/* Same; obsolete function name. */ +extern int + uc_bidi_category (ucs4_t uc); + +/* Test whether a Unicode character belongs to a given bidi class. */ +extern bool + uc_is_bidi_class (ucs4_t uc, int bidi_class); +/* Same; obsolete function name. */ +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". */ + +/* ========================================================================= */ + +/* Field 2 of the file ArabicShaping.txt in the Unicode Character Database. */ + +/* Possible joining types. */ +enum +{ + UC_JOINING_TYPE_U, /* Non_Joining */ + UC_JOINING_TYPE_T, /* Transparent */ + UC_JOINING_TYPE_C, /* Join_Causing */ + UC_JOINING_TYPE_L, /* Left_Joining */ + UC_JOINING_TYPE_R, /* Right_Joining */ + UC_JOINING_TYPE_D /* Dual_Joining */ +}; + +/* Return the name of a joining type. */ +extern const char * + uc_joining_type_name (int joining_type); + +/* Return the long name of a joining type. */ +extern const char * + uc_joining_type_long_name (int joining_type); + +/* Return the joining type given by name, e.g. "D", or by long name, e.g. + "Dual Joining". */ +extern int + uc_joining_type_byname (const char *joining_type_name); + +/* Return the joining type of a Unicode character. */ +extern int + uc_joining_type (ucs4_t uc); + +/* ========================================================================= */ + +/* Field 3 of the file ArabicShaping.txt in the Unicode Character Database. */ + +/* Possible joining groups. + This enumeration may be extended in the future. */ +enum +{ + UC_JOINING_GROUP_NONE, /* No_Joining_Group */ + UC_JOINING_GROUP_AIN, /* Ain */ + UC_JOINING_GROUP_ALAPH, /* Alaph */ + UC_JOINING_GROUP_ALEF, /* Alef */ + UC_JOINING_GROUP_BEH, /* Beh */ + UC_JOINING_GROUP_BETH, /* Beth */ + UC_JOINING_GROUP_BURUSHASKI_YEH_BARREE, /* Burushaski_Yeh_Barree */ + UC_JOINING_GROUP_DAL, /* Dal */ + UC_JOINING_GROUP_DALATH_RISH, /* Dalath_Rish */ + UC_JOINING_GROUP_E, /* E */ + UC_JOINING_GROUP_FARSI_YEH, /* Farsi_Yeh */ + UC_JOINING_GROUP_FE, /* Fe */ + UC_JOINING_GROUP_FEH, /* Feh */ + UC_JOINING_GROUP_FINAL_SEMKATH, /* Final_Semkath */ + UC_JOINING_GROUP_GAF, /* Gaf */ + UC_JOINING_GROUP_GAMAL, /* Gamal */ + UC_JOINING_GROUP_HAH, /* Hah */ + UC_JOINING_GROUP_HE, /* He */ + UC_JOINING_GROUP_HEH, /* Heh */ + UC_JOINING_GROUP_HEH_GOAL, /* Heh_Goal */ + UC_JOINING_GROUP_HETH, /* Heth */ + UC_JOINING_GROUP_KAF, /* Kaf */ + UC_JOINING_GROUP_KAPH, /* Kaph */ + UC_JOINING_GROUP_KHAPH, /* Khaph */ + UC_JOINING_GROUP_KNOTTED_HEH, /* Knotted_Heh */ + UC_JOINING_GROUP_LAM, /* Lam */ + UC_JOINING_GROUP_LAMADH, /* Lamadh */ + UC_JOINING_GROUP_MEEM, /* Meem */ + UC_JOINING_GROUP_MIM, /* Mim */ + UC_JOINING_GROUP_NOON, /* Noon */ + UC_JOINING_GROUP_NUN, /* Nun */ + UC_JOINING_GROUP_NYA, /* Nya */ + UC_JOINING_GROUP_PE, /* Pe */ + UC_JOINING_GROUP_QAF, /* Qaf */ + UC_JOINING_GROUP_QAPH, /* Qaph */ + UC_JOINING_GROUP_REH, /* Reh */ + UC_JOINING_GROUP_REVERSED_PE, /* Reversed_Pe */ + UC_JOINING_GROUP_SAD, /* Sad */ + UC_JOINING_GROUP_SADHE, /* Sadhe */ + UC_JOINING_GROUP_SEEN, /* Seen */ + UC_JOINING_GROUP_SEMKATH, /* Semkath */ + UC_JOINING_GROUP_SHIN, /* Shin */ + UC_JOINING_GROUP_SWASH_KAF, /* Swash_Kaf */ + UC_JOINING_GROUP_SYRIAC_WAW, /* Syriac_Waw */ + UC_JOINING_GROUP_TAH, /* Tah */ + UC_JOINING_GROUP_TAW, /* Taw */ + UC_JOINING_GROUP_TEH_MARBUTA, /* Teh_Marbuta */ + UC_JOINING_GROUP_TEH_MARBUTA_GOAL, /* Teh_Marbuta_Goal */ + UC_JOINING_GROUP_TETH, /* Teth */ + UC_JOINING_GROUP_WAW, /* Waw */ + UC_JOINING_GROUP_YEH, /* Yeh */ + UC_JOINING_GROUP_YEH_BARREE, /* Yeh_Barree */ + UC_JOINING_GROUP_YEH_WITH_TAIL, /* Yeh_With_Tail */ + UC_JOINING_GROUP_YUDH, /* Yudh */ + UC_JOINING_GROUP_YUDH_HE, /* Yudh_He */ + UC_JOINING_GROUP_ZAIN, /* Zain */ + UC_JOINING_GROUP_ZHAIN /* Zhain */ +}; + +/* Return the name of a joining group. */ +extern const char * + uc_joining_group_name (int joining_group); + +/* Return the joining group given by name, e.g. "Teh_Marbuta". */ +extern int + uc_joining_group_byname (const char *joining_group_name); + +/* Return the joining group of a Unicode character. */ +extern int + uc_joining_group (ucs4_t uc); + +/* ========================================================================= */ + +/* 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_CASED; +extern const uc_property_t UC_PROPERTY_CASE_IGNORABLE; +extern const uc_property_t UC_PROPERTY_CHANGES_WHEN_LOWERCASED; +extern const uc_property_t UC_PROPERTY_CHANGES_WHEN_UPPERCASED; +extern const uc_property_t UC_PROPERTY_CHANGES_WHEN_TITLECASED; +extern const uc_property_t UC_PROPERTY_CHANGES_WHEN_CASEFOLDED; +extern const uc_property_t UC_PROPERTY_CHANGES_WHEN_CASEMAPPED; +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_cased (ucs4_t uc); +extern bool uc_is_property_case_ignorable (ucs4_t uc); +extern bool uc_is_property_changes_when_lowercased (ucs4_t uc); +extern bool uc_is_property_changes_when_uppercased (ucs4_t uc); +extern bool uc_is_property_changes_when_titlecased (ucs4_t uc); +extern bool uc_is_property_changes_when_casefolded (ucs4_t uc); +extern bool uc_is_property_changes_when_casemapped (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 and . 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 0000000..7ae7d00 --- /dev/null +++ b/gnulib/lib/unictype/3level.h @@ -0,0 +1,327 @@ +/* Copyright (C) 2000-2001, 2009-2011 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Bruno Haible , 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 0000000..66e9188 --- /dev/null +++ b/gnulib/lib/unictype/3levelbit.h @@ -0,0 +1,317 @@ +/* Copyright (C) 2000-2002, 2009-2011 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Bruno Haible , 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/Makefile b/gnulib/lib/unictype/Makefile new file mode 100644 index 0000000..d56ec31 --- /dev/null +++ b/gnulib/lib/unictype/Makefile @@ -0,0 +1,20 @@ +# Makefile for generating the table files from unicode.org data. + +ARCHIVE_DIR = /gfs/ibook/Volumes/ExtData/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions +VERSION = 5.0.0 +UCD_DIR = $(ARCHIVE_DIR)/$(VERSION)/ucd + +EXTRA_DIST = gen-ctype.c 3levelbit.h 3level.h + +all: force + gcc -g -Wall gen-ctype.c -o gen-ctype + ./gen-ctype $(UCD_DIR)/UnicodeData.txt \ + $(UCD_DIR)/PropList.txt \ + $(UCD_DIR)/DerivedCoreProperties.txt \ + $(UCD_DIR)/Scripts.txt \ + $(UCD_DIR)/Blocks.txt \ + $(ARCHIVE_DIR)/3.0.1/PropList-3.0.1.txt \ + $(VERSION) + mv test-* ../../tests/unictype/ + +force: diff --git a/gnulib/lib/unictype/bidi_byname.c b/gnulib/lib/unictype/bidi_byname.c new file mode 100644 index 0000000..4b3a92a --- /dev/null +++ b/gnulib/lib/unictype/bidi_byname.c @@ -0,0 +1,69 @@ +/* Bidi classes of Unicode characters. + Copyright (C) 2002, 2006, 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unictype.h" + +#include + +#include "unictype/bidi_byname.h" + +int +uc_bidi_class_byname (const char *bidi_class_name) +{ + size_t len; + + len = strlen (bidi_class_name); + if (len <= MAX_WORD_LENGTH) + { + char buf[MAX_WORD_LENGTH + 1]; + const struct named_bidi_class *found; + + /* Copy bidi_class_name into buf, converting '_' and '-' to ' '. */ + { + const char *p = bidi_class_name; + char *q = buf; + + for (;; p++, q++) + { + char c = *p; + + if (c == '_' || c == '-') + c = ' '; + *q = c; + if (c == '\0') + break; + } + } + /* Here q == buf + len. */ + + /* Do a hash table lookup, with case-insensitive comparison. */ + found = uc_bidi_class_lookup (buf, len); + if (found != NULL) + return found->bidi_class; + } + /* Invalid bidi class name. */ + return -1; +} + +int +uc_bidi_category_byname (const char *category_name) +{ + return uc_bidi_class_byname (category_name); +} diff --git a/gnulib/lib/unictype/bidi_byname.gperf b/gnulib/lib/unictype/bidi_byname.gperf new file mode 100644 index 0000000..9cacacf --- /dev/null +++ b/gnulib/lib/unictype/bidi_byname.gperf @@ -0,0 +1,70 @@ +/* Bidi classes of Unicode characters. */ +struct named_bidi_class { int name; int bidi_class; }; +%struct-type +%ignore-case +%language=ANSI-C +%define hash-function-name bidi_class_hash +%define lookup-function-name uc_bidi_class_lookup +%readonly-tables +%global-table +%define word-array-name bidi_class_names +%pic +%define string-pool-name bidi_class_stringpool +%% +AL, UC_BIDI_AL +AN, UC_BIDI_AN +B, UC_BIDI_B +BN, UC_BIDI_BN +CS, UC_BIDI_CS +EN, UC_BIDI_EN +ES, UC_BIDI_ES +ET, UC_BIDI_ET +L, UC_BIDI_L +LRE, UC_BIDI_LRE +LRO, UC_BIDI_LRO +NSM, UC_BIDI_NSM +ON, UC_BIDI_ON +PDF, UC_BIDI_PDF +R, UC_BIDI_R +RLE, UC_BIDI_RLE +RLO, UC_BIDI_RLO +S, UC_BIDI_S +WS, UC_BIDI_WS +Arabic Letter, UC_BIDI_AL +ArabicLetter, UC_BIDI_AL +Arabic Number, UC_BIDI_AN +ArabicNumber, UC_BIDI_AN +Paragraph Separator, UC_BIDI_B +ParagraphSeparator, UC_BIDI_B +Boundary Neutral, UC_BIDI_BN +BoundaryNeutral, UC_BIDI_BN +Common Separator, UC_BIDI_CS +CommonSeparator, UC_BIDI_CS +European Number, UC_BIDI_EN +EuropeanNumber, UC_BIDI_EN +European Separator, UC_BIDI_ES +EuropeanSeparator, UC_BIDI_ES +European Terminator, UC_BIDI_ET +EuropeanTerminator, UC_BIDI_ET +Left To Right, UC_BIDI_L +LeftToRight, UC_BIDI_L +Left To Right Embedding, UC_BIDI_LRE +LeftToRightEmbedding, UC_BIDI_LRE +Left To Right Override, UC_BIDI_LRO +LeftToRightOverride, UC_BIDI_LRO +Nonspacing Mark, UC_BIDI_NSM +NonspacingMark, UC_BIDI_NSM +Other Neutral, UC_BIDI_ON +OtherNeutral, UC_BIDI_ON +Pop Directional Format, UC_BIDI_PDF +PopDirectionalFormat, UC_BIDI_PDF +Right To Left, UC_BIDI_R +RightToLeft, UC_BIDI_R +Right To Left Embedding, UC_BIDI_RLE +RightToLeftEmbedding, UC_BIDI_RLE +Right To Left Override, UC_BIDI_RLO +RightToLeftOverride, UC_BIDI_RLO +Segment Separator, UC_BIDI_S +SegmentSeparator, UC_BIDI_S +White Space, UC_BIDI_WS +WhiteSpace, UC_BIDI_WS diff --git a/gnulib/lib/unictype/bidi_longname.c b/gnulib/lib/unictype/bidi_longname.c new file mode 100644 index 0000000..a40080d --- /dev/null +++ b/gnulib/lib/unictype/bidi_longname.c @@ -0,0 +1,53 @@ +/* Bidi classes of Unicode characters. + Copyright (C) 2002, 2006, 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unictype.h" + +static const char u_bidi_class_long_name[19][24] = +{ + "Left To Right", + "Left To Right Embedding", + "Left To Right Override", + "Right To Left", + "Arabic Letter", + "Right To Left Embedding", + "Right To Left Override", + "Pop Directional Format", + "European Number", + "European Separator", + "European Terminator", + "Arabic Number", + "Common Separator", + "Nonspacing Mark", + "Boundary Neutral", + "Paragraph Separator", + "Segment Separator", + "White Space", + "Other Neutral" +}; + +const char * +uc_bidi_class_long_name (int bidi_class) +{ + if (bidi_class >= 0 + && bidi_class < sizeof (u_bidi_class_long_name) / sizeof (u_bidi_class_long_name[0])) + return u_bidi_class_long_name[bidi_class]; + return NULL; +} diff --git a/gnulib/lib/unictype/bidi_name.c b/gnulib/lib/unictype/bidi_name.c new file mode 100644 index 0000000..eca74f6 --- /dev/null +++ b/gnulib/lib/unictype/bidi_name.c @@ -0,0 +1,41 @@ +/* Bidi classes of Unicode characters. + Copyright (C) 2002, 2006, 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unictype.h" + +static const char u_bidi_class_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_class_name (int bidi_class) +{ + if (bidi_class >= 0 && bidi_class < sizeof (u_bidi_class_name) / sizeof (u_bidi_class_name[0])) + return u_bidi_class_name[bidi_class]; + return NULL; +} + +const char * +uc_bidi_category_name (int category) +{ + return uc_bidi_class_name (category); +} diff --git a/gnulib/lib/unictype/bidi_of.c b/gnulib/lib/unictype/bidi_of.c new file mode 100644 index 0000000..5c735fd --- /dev/null +++ b/gnulib/lib/unictype/bidi_of.c @@ -0,0 +1,58 @@ +/* Bidi classes of Unicode characters. + Copyright (C) 2002, 2006, 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unictype.h" + +/* Define u_bidi_category table. */ +#include "bidi_of.h" + +int +uc_bidi_class (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; +} + +int +uc_bidi_category (ucs4_t uc) +{ + return uc_bidi_class (uc); +} diff --git a/gnulib/lib/unictype/bidi_of.h b/gnulib/lib/unictype/bidi_of.h new file mode 100644 index 0000000..c30ddc9 --- /dev/null +++ b/gnulib/lib/unictype/bidi_of.h @@ -0,0 +1,909 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Bidi categories of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[125 * 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, 1536, 1664, 1792, 1920, 2048, 2176, 2304, + 2432, 2560, 2688, 2816, 2944, 3072, 3200, 3328, + 3456, 3584, -1, -1, -1, -1, 3712, 3840, + 3968, -1, -1, -1, -1, 4096, 4224, 4352, + 4480, 4608, 4736, 4864, 4992, -1, 5120, 5248, + 5376, 5504, -1, 5632, -1, -1, -1, 5760, + 5888, 6016, 6144, 6272, 6400, 6528, 6656, 6784, + 6912, 7040, 6528, 6528, 6528, 7168, 7296, 7424, + -1, -1, 6528, 6528, 6528, 6528, 7552, -1, + -1, 7680, 7808, 7936, 8064, 8192, 6528, 8320, + 8448, 8576, -1, 8704, 8832, 8960, 9088, 9216, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 9344, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 9472, -1, -1, 9600, 9728, 9856, 9984, + 10112, 10240, 10368, 10496, 10624, 10752, -1, 10880, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 11008, 11136, + 11136, 11136, 11264, 11392, 11520, 11648, 11776, 11904, + -1, -1, 12032, 12160, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 1536, 1536, 12288, 1536, 12416, 1536, 12544, 1536, + 1536, 1536, 1536, 1536, 12672, 1536, 1536, 1536, + 12800, 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, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -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, 13184, 13312, -1, 13440, -1, + -1, -1, -1, -1, -1, 13568, 13696, 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, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 13952, 14080, 14208, -1, -1, -1, 14336, 14464, + 14592, 14720, 14848, 14976, 15104, 15232, 15360, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 15488, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 15488, + 15616, 15616, 15744, 15872, 15616, 15616, 15616, 15616, + 15616, 15616, 15616, 15616, 15616, 15616, 15616, 15616, + 15616, 15616, 15616, 15616, 15616, 15616, 15616, 15616, + 15616, 15616, 15616, 15616, 15616, 15616, 15616, 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, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 15488 + }, + { + 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, 0x6b5a, 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, 0x6c96, 0xb5ad, 0x08d6, + 0x4d69, 0xd6b6, 0x211a, 0x2108, 0x1084, 0x0842, 0x4211, 0x2108, + 0x1084, 0x0842, 0x8421, 0x4210, 0x5908, 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, 0x4631, 0xad6b, + 0xd68d, 0x6b5a, 0xb5ad, 0x5a36, 0xa36b, 0xd6b5, 0x18da, 0x8c63, + 0xc631, 0x6318, 0x318c, 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c, + 0x18c6, 0x8c63, 0xc631, 0xa318, 0x36b5, 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, 0x8c63, 0xc631, + 0x6318, 0x318c, 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6, + 0x35ad, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0xd034, 0x0000, 0xb5a0, 0x5ad6, 0x0d6b, 0x0000, + 0x001a, 0xb5a0, 0x5ad6, 0x006b, 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, 0x0500, 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, 0x0000, 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, 0x6b5a, 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, 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, 0x6b5a, 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, + 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, 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, 0x4000, 0xad03, 0xd6b5, 0x035a, 0x340d, 0x5a00, + 0xad6b, 0xd6b5, 0x0000, 0x8000, 0x5ad6, 0xad6b, 0xd6b5, 0x6800, + 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, 0x4000, + 0xad03, 0x0001, 0x681a, 0x01ad, 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, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x35ad, 0x5ad0, 0xad6b, 0xd6b5, 0x6b5a, 0xb40d, 0x5ad6, + 0x0d6b, 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, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, + 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, + 0x0003, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd000, 0x6b5a, + 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, + 0x94a5, 0x4a52, 0x0001, 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, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x4000, 0x0002, 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, + 0x5294, 0x294a, 0x94a5, 0x4a52, 0x0009, 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, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x094a, 0x94a4, 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, + 0x4a40, 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, 0x204a, + 0x9481, 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, 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, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa400, + 0x5294, 0x004a, 0x6800, 0x01ad, 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, 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, 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, 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, + 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, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x01ad, 0x0000, 0x0000, 0x0000, 0x0000, + 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, 0x4a00, 0x0001, 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, 0xb5ad, 0x5ad6, + 0xad6b, 0xd6b5, 0x6b5a, 0x01ad, 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, + 0x35ad, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, + 0x4006, 0xad6b, 0xd001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 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, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb40d, + 0x00d6, 0x0d68, 0x0000, 0x6b40, 0x01a0, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1a00, + 0x0d00, 0x0000, 0x001a, 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, + 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6, 0x8c63, 0xc631, 0x6318, + 0x318c, 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6, 0x8c63, + 0xc631, 0x4318, 0x294a, 0x94a5, 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, 0x8c63, 0xc631, 0x6318, 0x318c, + 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6, 0xad6b, 0xd6b5, + 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x1ad6, + 0x01a0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xad00, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0x0003, 0x0000, + 0x0000, 0x4800, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0x2529, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x01ad, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, + 0x5ad6, 0xa003, 0x0035, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 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, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0900, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2400, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, 0x4000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0009, 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, 0x4a52, 0xa529, 0x5294, 0x294a, 0x04a5, 0x4a40, + 0xa529, 0x5294, 0x294a, 0x04a5, 0x4a40, 0xa529, 0x5294, 0x294a, + 0x94a5, 0x4a40, 0xa529, 0x5294, 0x294a, 0x94a5, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x2108, 0x1084, 0x0842, 0x0021, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 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, 0x0012, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a52, + 0x2529, 0x5290, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, + 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, + 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x0001, + 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0x0009, 0x0000, + 0x0000, 0x0000, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, + 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0x8129, 0x5294, 0x004a, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a52, 0xa529, + 0x5294, 0x294a, 0x94a5, 0x0012, 0x0000, 0x0000, 0x0000, 0x0000, + 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, + 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, + 0xa529, 0x5294, 0x294a, 0x04a5, 0x4812, 0xa529, 0x5294, 0x294a, + 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, + 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, + 0x4a52, 0xa529, 0x5294, 0x094a, 0x94a4, 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, 0x4094, 0x294a, 0x0001, + 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, + 0x294a, 0x94a5, 0x4a52, 0xa409, 0x5294, 0x294a, 0x94a5, 0x4a52, + 0xa529, 0x5294, 0x294a, 0x0025, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, + 0x0094, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2900, 0x94a5, + 0x4a40, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4812, 0x8129, 0x1204, + 0x2048, 0x04a5, 0x4a52, 0x2529, 0x5200, 0x094a, 0x0024, 0x4a52, + 0xa409, 0x5294, 0x294a, 0x94a5, 0x0012, 0xa400, 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, 0x2529, 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, 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, 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 0000000..ffe93a6 --- /dev/null +++ b/gnulib/lib/unictype/bidi_test.c @@ -0,0 +1,33 @@ +/* Bidi classes of Unicode characters. + Copyright (C) 2002, 2006, 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unictype.h" + +bool +uc_is_bidi_class (ucs4_t uc, int bidi_class) +{ + return (uc_bidi_class (uc) == bidi_class); +} + +bool +uc_is_bidi_category (ucs4_t uc, int category) +{ + return uc_is_bidi_class (uc, category); +} diff --git a/gnulib/lib/unictype/bitmap.h b/gnulib/lib/unictype/bitmap.h new file mode 100644 index 0000000..a945b8d --- /dev/null +++ b/gnulib/lib/unictype/bitmap.h @@ -0,0 +1,47 @@ +/* Three-level bitmap lookup. + Copyright (C) 2000-2002, 2005-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +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 0000000..9e20c04 --- /dev/null +++ b/gnulib/lib/unictype/block_test.c @@ -0,0 +1,31 @@ +/* Blocks of Unicode characters. + Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..19b0427 --- /dev/null +++ b/gnulib/lib/unictype/blocks.c @@ -0,0 +1,62 @@ +/* Blocks of Unicode characters. + Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..cd4b14e --- /dev/null +++ b/gnulib/lib/unictype/blocks.h @@ -0,0 +1,990 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Unicode blocks. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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" }, + { 0x0800, 0x083F, "Samaritan" }, + { 0x0840, 0x085F, "Mandaic" }, + { 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" }, + { 0x18B0, 0x18FF, "Unified Canadian Aboriginal Syllabics Extended" }, + { 0x1900, 0x194F, "Limbu" }, + { 0x1950, 0x197F, "Tai Le" }, + { 0x1980, 0x19DF, "New Tai Lue" }, + { 0x19E0, 0x19FF, "Khmer Symbols" }, + { 0x1A00, 0x1A1F, "Buginese" }, + { 0x1A20, 0x1AAF, "Tai Tham" }, + { 0x1B00, 0x1B7F, "Balinese" }, + { 0x1B80, 0x1BBF, "Sundanese" }, + { 0x1BC0, 0x1BFF, "Batak" }, + { 0x1C00, 0x1C4F, "Lepcha" }, + { 0x1C50, 0x1C7F, "Ol Chiki" }, + { 0x1CD0, 0x1CFF, "Vedic Extensions" }, + { 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" }, + { 0xA4D0, 0xA4FF, "Lisu" }, + { 0xA500, 0xA63F, "Vai" }, + { 0xA640, 0xA69F, "Cyrillic Extended-B" }, + { 0xA6A0, 0xA6FF, "Bamum" }, + { 0xA700, 0xA71F, "Modifier Tone Letters" }, + { 0xA720, 0xA7FF, "Latin Extended-D" }, + { 0xA800, 0xA82F, "Syloti Nagri" }, + { 0xA830, 0xA83F, "Common Indic Number Forms" }, + { 0xA840, 0xA87F, "Phags-pa" }, + { 0xA880, 0xA8DF, "Saurashtra" }, + { 0xA8E0, 0xA8FF, "Devanagari Extended" }, + { 0xA900, 0xA92F, "Kayah Li" }, + { 0xA930, 0xA95F, "Rejang" }, + { 0xA960, 0xA97F, "Hangul Jamo Extended-A" }, + { 0xA980, 0xA9DF, "Javanese" }, + { 0xAA00, 0xAA5F, "Cham" }, + { 0xAA60, 0xAA7F, "Myanmar Extended-A" }, + { 0xAA80, 0xAADF, "Tai Viet" }, + { 0xAB00, 0xAB2F, "Ethiopic Extended-A" }, + { 0xABC0, 0xABFF, "Meetei Mayek" }, + { 0xAC00, 0xD7AF, "Hangul Syllables" }, + { 0xD7B0, 0xD7FF, "Hangul Jamo Extended-B" }, + { 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" }, + { 0x10840, 0x1085F, "Imperial Aramaic" }, + { 0x10900, 0x1091F, "Phoenician" }, + { 0x10920, 0x1093F, "Lydian" }, + { 0x10A00, 0x10A5F, "Kharoshthi" }, + { 0x10A60, 0x10A7F, "Old South Arabian" }, + { 0x10B00, 0x10B3F, "Avestan" }, + { 0x10B40, 0x10B5F, "Inscriptional Parthian" }, + { 0x10B60, 0x10B7F, "Inscriptional Pahlavi" }, + { 0x10C00, 0x10C4F, "Old Turkic" }, + { 0x10E60, 0x10E7F, "Rumi Numeral Symbols" }, + { 0x11000, 0x1107F, "Brahmi" }, + { 0x11080, 0x110CF, "Kaithi" }, + { 0x12000, 0x123FF, "Cuneiform" }, + { 0x12400, 0x1247F, "Cuneiform Numbers and Punctuation" }, + { 0x13000, 0x1342F, "Egyptian Hieroglyphs" }, + { 0x16800, 0x16A3F, "Bamum Supplement" }, + { 0x1B000, 0x1B0FF, "Kana Supplement" }, + { 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" }, + { 0x1F0A0, 0x1F0FF, "Playing Cards" }, + { 0x1F100, 0x1F1FF, "Enclosed Alphanumeric Supplement" }, + { 0x1F200, 0x1F2FF, "Enclosed Ideographic Supplement" }, + { 0x1F300, 0x1F5FF, "Miscellaneous Symbols And Pictographs" }, + { 0x1F600, 0x1F64F, "Emoticons" }, + { 0x1F680, 0x1F6FF, "Transport And Map Symbols" }, + { 0x1F700, 0x1F77F, "Alchemical Symbols" }, + { 0x20000, 0x2A6DF, "CJK Unified Ideographs Extension B" }, + { 0x2A700, 0x2B73F, "CJK Unified Ideographs Extension C" }, + { 0x2B740, 0x2B81F, "CJK Unified Ideographs Extension D" }, + { 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, 19, + 19, 21, + 21, 23, + 23, 25, + 25, 27, + 27, 29, + 29, 31, + 31, 32, + 32, 34, + 34, 35, + 35, 36, + 35, 38, + 38, 39, + 38, 39, + 38, 41, + 41, 46, + 46, 48, + 48, 52, + 52, 54, + 54, 57, + 57, 60, + 60, 63, + 63, 64, + 64, 65, + 65, 69, + 69, 72, + 72, 73, + 73, 74, + 74, 77, + 77, 80, + 80, 81, + 81, 84, + 84, 85, + 85, 87, + 87, 88, + 88, 89, + 89, 92, + 92, 96, + 96, 98, + 98, 100, + 100, 103, + 103, 109, + 109, 110, + 110, 111, + 111, 112, + 111, 112, + 111, 112, + 111, 112, + 111, 112, + 111, 112, + 111, 112, + 111, 112, + 111, 112, + 111, 112, + 111, 112, + 111, 112, + 111, 112, + 111, 112, + 111, 112, + 111, 112, + 111, 112, + 111, 112, + 111, 112, + 111, 112, + 111, 112, + 111, 112, + 111, 112, + 111, 112, + 111, 112, + 111, 113, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 113, 114, + 114, 115, + 114, 115, + 114, 115, + 114, 115, + 114, 117, + 117, 118, + 117, 120, + 120, 122, + 122, 127, + 127, 131, + 131, 134, + 134, 136, + 136, 137, + 136, 137, + 136, 137, + 136, 137, + 136, 137, + 136, 137, + 136, 137, + 136, 137, + 136, 137, + 136, 137, + 136, 137, + 136, 137, + 136, 137, + 136, 137, + 136, 137, + 136, 137, + 136, 137, + 136, 137, + 136, 137, + 136, 137, + 136, 137, + 136, 137, + 136, 137, + 136, 137, + 136, 137, + 136, 137, + 136, 137, + 136, 137, + 136, 137, + 136, 137, + 136, 137, + 136, 137, + 136, 137, + 136, 137, + 136, 137, + 136, 137, + 136, 137, + 136, 137, + 136, 137, + 136, 137, + 136, 137, + 136, 137, + 136, 137, + 136, 138, + 138, 139, + 138, 139, + 138, 139, + 138, 140, + 140, 141, + 140, 141, + 140, 141, + 140, 141, + 141, 142, + 141, 142, + 141, 142, + 141, 142, + 141, 142, + 141, 142, + 141, 142, + 141, 142, + 141, 142, + 141, 142, + 141, 142, + 141, 142, + 141, 142, + 141, 142, + 141, 142, + 141, 142, + 141, 142, + 141, 142, + 141, 142, + 141, 142, + 141, 142, + 141, 142, + 141, 142, + 141, 142, + 141, 142, + 142, 143, + 142, 143, + 143, 145, + 144, 145, + 144, 145, + 145, 151, + 151, 153, + 153, 155, + 155, 159, + 159, 161, + 161, 165, + 165, 168, + 168, 168, + 168, 168, + 168, 168, + 168, 170, + 170, 172, + 172, 174, + 174, 177, + 177, 178, + 178, 178, + 178, 179, + 179, 179, + 179, 181, + 181, 181, + 181, 181, + 181, 181, + 181, 181, + 181, 181, + 181, 181, + 181, 181, + 181, 181, + 181, 181, + 181, 181, + 181, 181, + 181, 181, + 181, 181, + 181, 181, + 181, 181, + 181, 182, + 181, 182, + 181, 182, + 181, 182, + 182, 183, + 183, 183, + 183, 183, + 183, 183, + 183, 183, + 183, 183, + 183, 183, + 183, 183, + 183, 183, + 183, 183, + 183, 183, + 183, 183, + 183, 184, + 183, 184, + 183, 184, + 183, 184, + 183, 184, + 184, 184, + 184, 184, + 184, 184, + 184, 184, + 184, 184, + 184, 184, + 184, 184, + 184, 184, + 184, 184, + 184, 184, + 184, 184, + 184, 184, + 184, 184, + 184, 184, + 184, 184, + 184, 184, + 184, 184, + 184, 184, + 184, 184, + 184, 184, + 184, 184, + 184, 184, + 184, 184, + 184, 184, + 184, 184, + 184, 184, + 184, 184, + 184, 184, + 184, 184, + 184, 184, + 184, 184, + 184, 184, + 184, 184, + 184, 184, + 184, 184, + 184, 184, + 184, 184, + 184, 184, + 184, 184, + 184, 184, + 184, 184, + 184, 184, + 184, 184, + 184, 184, + 184, 184, + 184, 184, + 184, 184, + 184, 184, + 184, 184, + 184, 184, + 184, 184, + 184, 185, + 184, 185, + 184, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 185, + 185, 186, + 186, 186, + 186, 186, + 186, 186, + 186, 186, + 186, 186, + 186, 186, + 186, 186, + 186, 186, + 186, 186, + 186, 186, + 186, 186, + 186, 186, + 186, 186, + 186, 186, + 186, 186, + 186, 186, + 186, 186, + 186, 186, + 186, 186, + 186, 186, + 186, 186, + 186, 186, + 186, 186, + 186, 186, + 186, 186, + 186, 186, + 186, 186, + 186, 186, + 186, 186, + 186, 186, + 186, 186, + 186, 187, + 187, 188, + 188, 189, + 189, 191, + 191, 192, + 191, 192, + 191, 192, + 191, 192, + 192, 192, + 192, 192, + 192, 192, + 192, 192, + 192, 192, + 192, 192, + 192, 192, + 192, 192, + 192, 192, + 192, 192, + 192, 192, + 192, 192, + 192, 192, + 192, 192, + 192, 192, + 192, 192, + 192, 192, + 192, 192, + 192, 192, + 192, 192, + 192, 192, + 192, 192, + 192, 192, + 192, 192, + 192, 195, + 195, 196, + 196, 197, + 197, 198, + 197, 198, + 197, 198, + 198, 200, + 200, 201, + 201, 201, + 201, 201, + 201, 201, + 201, 201, + 201, 201, + 201, 201, + 201, 201, + 201, 201, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 201, 202, + 202, 203, + 202, 203, + 202, 203, + 202, 203, + 202, 203, + 202, 203, + 202, 203, + 202, 203, + 202, 203, + 202, 203, + 202, 203, + 202, 203, + 202, 203, + 202, 203, + 202, 203, + 202, 203, + 202, 204, + 203, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 204, + 204, 205, + 204, 205, + 204, 205, + 205, 205, + 205, 205, + 205, 205, + 205, 205, + 205, 205 +}; +#define blocks_upper_first_index 205 +#define blocks_upper_last_index 209 diff --git a/gnulib/lib/unictype/categ_C.c b/gnulib/lib/unictype/categ_C.c new file mode 100644 index 0000000..3b2d2e9 --- /dev/null +++ b/gnulib/lib/unictype/categ_C.c @@ -0,0 +1,27 @@ +/* Categories of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..d70d6e8 --- /dev/null +++ b/gnulib/lib/unictype/categ_C.h @@ -0,0 +1,926 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Categories of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[61 << 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, + -1, + 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, + -1, + 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, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 18 + 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, + 18 + 640 * sizeof (short) / sizeof (int) + 400, + -1, + -1, + 18 + 640 * sizeof (short) / sizeof (int) + 416, + 18 + 640 * sizeof (short) / sizeof (int) + 432, + 18 + 640 * sizeof (short) / sizeof (int) + 448, + 18 + 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, + 18 + 640 * sizeof (short) / sizeof (int) + 480, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 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) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 624, + 18 + 640 * sizeof (short) / sizeof (int) + 640, + 18 + 640 * sizeof (short) / sizeof (int) + 656, + 18 + 640 * sizeof (short) / sizeof (int) + 672, + 18 + 640 * sizeof (short) / sizeof (int) + 688, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + -1, + 18 + 640 * sizeof (short) / sizeof (int) + 704, + 18 + 640 * sizeof (short) / sizeof (int) + 720, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + -1, + -1, + 18 + 640 * sizeof (short) / sizeof (int) + 736, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + -1, + 18 + 640 * sizeof (short) / sizeof (int) + 752, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 768, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 784, + 18 + 640 * sizeof (short) / sizeof (int) + 800, + 18 + 640 * sizeof (short) / sizeof (int) + 816, + 18 + 640 * sizeof (short) / sizeof (int) + 832, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 848, + 18 + 640 * sizeof (short) / sizeof (int) + 864, + 18 + 640 * sizeof (short) / sizeof (int) + 880, + 18 + 640 * sizeof (short) / sizeof (int) + 896, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * 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, + 18 + 640 * sizeof (short) / sizeof (int) + 912, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 18 + 640 * sizeof (short) / sizeof (int) + 928, + 18 + 640 * sizeof (short) / sizeof (int) + 944, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + -1, + 18 + 640 * sizeof (short) / sizeof (int) + 944, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 960, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + 18 + 640 * sizeof (short) / sizeof (int) + 496 + }, + { + 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, 0x0001FF00, 0x01800000, 0x00000001, + 0x0001F900, 0x00000000, 0x0000FF00, 0xFFE0F800, + 0x3000003F, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x20000000, 0x00000000, + 0x0000C000, 0x00000000, 0x00001800, 0x00000000, + 0x00000000, 0xFFFC0000, 0x00000000, 0xF8000000, + 0x00000000, 0x8000C000, 0xB0000000, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x01000000, + 0x00066011, 0x0C3A0200, 0x4F7F8660, 0xF0000030, + 0x00067811, 0x2C920200, 0xA1FDC678, 0xFFC0003F, + 0x00044011, 0x0C120200, 0xFFFEC440, 0xFFFD0030, + 0x00066011, 0x0C120200, 0x4F3FC660, 0xFF000030, + 0x29C23813, 0x3C0038E7, 0xFF7EC238, 0xF800003F, + 0x00022011, 0x1C100200, 0xFC9FC220, 0x00FF0030, + 0x00022013, 0x0C100200, 0xBF9FC220, 0xFFF90030, + 0x00022013, 0x18000000, 0xFF7F8220, 0x01C00030, + 0x03800013, 0xD0040000, 0x00A07B80, 0xFFE3FFFF, + 0x00000001, 0x78000000, 0xF0000000, 0xFFFFFFFF, + 0x010FDA69, 0xC4001351, 0xCC00C0A0, 0xFFFFFFFF, + 0x00000000, 0x00000000, 0x00000100, 0x0001E000, + 0x01000000, 0x20000000, 0xF8002000, 0xFFFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x0000FFC0, 0xE0000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xC280C200, 0x00000000, + 0x0000C200, 0x80C20000, 0x008000C2, 0x00000000, + 0x00C20000, 0x00000000, 0x18000000, 0xE0000000, + 0xFC000000, 0x00000000, 0x00000000, 0xFFE00000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xE0000000, 0x00000000, 0x00000000, 0xFFFE0000, + 0xFFE02000, 0xFF800000, 0xFFF00000, 0xFFF22000, + 0x00000000, 0x00300000, 0xC0000000, 0xFC00FC00, + 0xFC008000, 0x00000000, 0x00000000, 0xFF000000, + 0x00000000, 0x0000F800, 0x00000000, 0xFFC00000, + 0xE0000000, 0xF000F000, 0x0000000E, 0xFFE0C000, + 0x00000000, 0x0000F000, 0x3800FC00, 0x00000000, + 0x30000000, 0x00000000, 0x80000000, 0x60000000, + 0xFC00FC00, 0xFFFFC000, 0xFFFFFFFF, 0xFFFFFFFF, + 0x00000000, 0x00000000, 0x0000F000, 0xE0000000, + 0x00000000, 0xFC003800, 0x00000000, 0x0FF00000, + 0x00000000, 0x07000000, 0x00001C00, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF, 0xFFF80000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x0FFFFF80, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xC0C00000, 0x00000000, 0x5500C0C0, 0xC0000000, + 0x00000000, 0x00200000, 0x10300020, 0x80230000, + 0x0000F800, 0x00007C00, 0x00000000, 0x000CFFFF, + 0xE0008000, 0xFC000000, 0x0000FFFF, 0xFFFE0000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x0000FC00, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0xFFF00000, + 0x00000000, 0xFFFFFF80, 0xFFFFF800, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000001, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00002800, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xFC00E000, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x00000000, 0x00008000, 0x80000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x01FC0000, + 0x00000000, 0x0000FFC0, 0x00000000, 0x7FFE7FC0, + 0xFF800000, 0x80808080, 0x80808080, 0x00000000, + 0x00000000, 0xFFFC0000, 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, 0xF8000000, 0x00000000, 0x0000FFF0, + 0x80000000, 0x00000000, 0x00000000, 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, 0xFFFFF000, 0xFFFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x0000E000, 0x00000000, 0x0000FF80, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0xFFFFF000, 0x00000000, 0x0FF00000, + 0xFF000000, 0x00000000, 0x00000000, 0xFF000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFC8000, 0xFFFFFC00, 0xFFFFFFFF, 0x03FFFFFF, + 0x00000000, 0xFC00F000, 0x00000000, 0xFF000000, + 0x00000000, 0x00000000, 0xFC003FE0, 0xF0000000, + 0x00000000, 0x00000000, 0x7FF00000, 0xE0000000, + 0x00000000, 0x00000000, 0x3C004000, 0xFFFFFFFF, + 0x00000000, 0xFF800000, 0x0C00C000, 0xF0000000, + 0x00000000, 0x00000000, 0x07FFFFF8, 0xFFFFFFFF, + 0xFF818181, 0xFFFF8080, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0xFC00C000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x0000FFF0, 0x00000780, 0xF0000000, + 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, 0x0000C000, + 0x00000000, 0x00000000, 0xFC000000, 0xFFFFFFFF, + 0x1F07FF80, 0xA0800000, 0x00000024, 0x00000000, + 0x00000000, 0x00000000, 0x0007FFFC, 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, 0x00400000, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x70000000, 0x7C000000, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x01100F90, 0x78F00000, 0xFE00FF00, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x00000000, 0x01C00000, 0x00C00000, 0x00F80000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x00000000, 0x00000000, 0xFFFFFE00, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x80000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x00000000, 0x00000000, 0x0003C000, 0xFFFF0000, + 0x00000000, 0x20000000, 0xFFFFFFFC, 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, 0xFFFF8000, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x00000000, 0xFE000000, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFC, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 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, 0x80018000, 0x00010001, 0xFFFFFFFF, + 0x0000F800, 0x00008000, 0x00000000, 0x0000FC00, + 0xF8000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F, + 0x0000FFF8, 0xF8000000, 0xFFFCFE00, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x00000000, 0x0040FFFE, 0x00000000, 0xE0000000, + 0xFFF00000, 0x00000000, 0xFFFFF820, 0xFFFE0000, + 0x00000000, 0x80000000, 0x00000002, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0xE1000000, + 0x00000000, 0xC0000000, 0x0000FFFF, 0xFFFFFF00, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x07FFFFFF, + 0x8AA20001, 0x0010D0C0, 0xFFFF001E, 0xFFFFFFFF, + 0x00000000, 0x00000000, 0xFFFFFFC0, 0xFFFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0xFFF00000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xFF800000, 0xFFFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0xFFE00000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 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 0000000..0cdaa03 --- /dev/null +++ b/gnulib/lib/unictype/categ_Cc.c @@ -0,0 +1,27 @@ +/* Categories of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..3bbf97c --- /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-uni-tables.c for Unicode 6.0.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 0000000..afa4111 --- /dev/null +++ b/gnulib/lib/unictype/categ_Cf.c @@ -0,0 +1,27 @@ +/* Categories of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..6b775de --- /dev/null +++ b/gnulib/lib/unictype/categ_Cf.h @@ -0,0 +1,456 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Categories of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[8 << 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, + 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, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -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) + 96, + -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, + -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, 0x20000000, 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/categ_Cn.c b/gnulib/lib/unictype/categ_Cn.c new file mode 100644 index 0000000..1a75ba0 --- /dev/null +++ b/gnulib/lib/unictype/categ_Cn.c @@ -0,0 +1,27 @@ +/* Categories of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..7eb02ce --- /dev/null +++ b/gnulib/lib/unictype/categ_Cn.h @@ -0,0 +1,1050 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Categories of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[60 << 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, + -1, + 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, + -1, + 18 + 768 * sizeof (short) / sizeof (int) + 288, + 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, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 18 + 768 * 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, + 18 + 768 * sizeof (short) / sizeof (int) + 384, + -1, + -1, + 18 + 768 * sizeof (short) / sizeof (int) + 400, + 18 + 768 * sizeof (short) / sizeof (int) + 416, + 18 + 768 * sizeof (short) / sizeof (int) + 432, + 18 + 768 * 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, + 18 + 768 * sizeof (short) / sizeof (int) + 464, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 18 + 768 * sizeof (short) / sizeof (int) + 480, + 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) + 640, + 18 + 768 * sizeof (short) / sizeof (int) + 656, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + -1, + 18 + 768 * sizeof (short) / sizeof (int) + 672, + 18 + 768 * sizeof (short) / sizeof (int) + 688, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + -1, + -1, + 18 + 768 * sizeof (short) / sizeof (int) + 704, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + -1, + 18 + 768 * sizeof (short) / sizeof (int) + 720, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 736, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 752, + 18 + 768 * sizeof (short) / sizeof (int) + 768, + 18 + 768 * sizeof (short) / sizeof (int) + 784, + 18 + 768 * sizeof (short) / sizeof (int) + 800, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 816, + 18 + 768 * sizeof (short) / sizeof (int) + 832, + 18 + 768 * sizeof (short) / sizeof (int) + 848, + 18 + 768 * sizeof (short) / sizeof (int) + 864, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * 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, + 18 + 768 * sizeof (short) / sizeof (int) + 880, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 18 + 768 * sizeof (short) / sizeof (int) + 896, + 18 + 768 * sizeof (short) / sizeof (int) + 912, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + -1, + 18 + 768 * sizeof (short) / sizeof (int) + 912, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 928, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * sizeof (short) / sizeof (int) + 576, + 18 + 768 * 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, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 18 + 768 * sizeof (short) / sizeof (int) + 944 + }, + { + 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, 0x0001FF00, 0x01800000, 0x00000001, + 0x0001F900, 0x00000000, 0x0000FF00, 0xFFE0F800, + 0x30000030, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00004000, 0x00000000, 0x00001800, 0x00000000, + 0x00000000, 0xFFFC0000, 0x00000000, 0xF8000000, + 0x00000000, 0x8000C000, 0xB0000000, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x01000000, + 0x00066011, 0x0C3A0200, 0x4F7F8660, 0xF0000030, + 0x00067811, 0x2C920200, 0xA1FDC678, 0xFFC0003F, + 0x00044011, 0x0C120200, 0xFFFEC440, 0xFFFD0030, + 0x00066011, 0x0C120200, 0x4F3FC660, 0xFF000030, + 0x29C23813, 0x3C0038E7, 0xFF7EC238, 0xF800003F, + 0x00022011, 0x1C100200, 0xFC9FC220, 0x00FF0030, + 0x00022013, 0x0C100200, 0xBF9FC220, 0xFFF90030, + 0x00022013, 0x18000000, 0xFF7F8220, 0x01C00030, + 0x03800013, 0xD0040000, 0x00A07B80, 0xFFE3FFFF, + 0x00000001, 0x78000000, 0xF0000000, 0xFFFFFFFF, + 0x010FDA69, 0xC4001351, 0xCC00C0A0, 0xFFFFFFFF, + 0x00000000, 0x00000000, 0x00000100, 0x0001E000, + 0x01000000, 0x20000000, 0xF8002000, 0xFFFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x0000FFC0, 0xE0000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xC280C200, 0x00000000, + 0x0000C200, 0x80C20000, 0x008000C2, 0x00000000, + 0x00C20000, 0x00000000, 0x18000000, 0xE0000000, + 0xFC000000, 0x00000000, 0x00000000, 0xFFE00000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xE0000000, 0x00000000, 0x00000000, 0xFFFE0000, + 0xFFE02000, 0xFF800000, 0xFFF00000, 0xFFF22000, + 0x00000000, 0x00000000, 0xC0000000, 0xFC00FC00, + 0xFC008000, 0x00000000, 0x00000000, 0xFF000000, + 0x00000000, 0x0000F800, 0x00000000, 0xFFC00000, + 0xE0000000, 0xF000F000, 0x0000000E, 0xFFE0C000, + 0x00000000, 0x0000F000, 0x3800FC00, 0x00000000, + 0x30000000, 0x00000000, 0x80000000, 0x60000000, + 0xFC00FC00, 0xFFFFC000, 0xFFFFFFFF, 0xFFFFFFFF, + 0x00000000, 0x00000000, 0x0000F000, 0xE0000000, + 0x00000000, 0xFC003800, 0x00000000, 0x0FF00000, + 0x00000000, 0x07000000, 0x00001C00, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF, 0xFFF80000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x0FFFFF80, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xC0C00000, 0x00000000, 0x5500C0C0, 0xC0000000, + 0x00000000, 0x00200000, 0x10300020, 0x80230000, + 0x00000000, 0x00000000, 0x00000000, 0x000C03E0, + 0xE0008000, 0xFC000000, 0x0000FFFF, 0xFFFE0000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x0000FC00, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0xFFF00000, + 0x00000000, 0xFFFFFF80, 0xFFFFF800, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000001, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00002800, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xFC00E000, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x00000000, 0x00008000, 0x80000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x01FC0000, + 0x00000000, 0x0000FFC0, 0x00000000, 0x7FFE7FC0, + 0xFF800000, 0x80808080, 0x80808080, 0x00000000, + 0x00000000, 0xFFFC0000, 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, 0xF8000000, 0x00000000, 0x0000FFF0, + 0x80000000, 0x00000000, 0x00000000, 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, 0xFFFFF000, 0xFFFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x0000E000, 0x00000000, 0x0000FF80, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0xFFFFF000, 0x00000000, 0x0FF00000, + 0xFF000000, 0x00000000, 0x00000000, 0xFF000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFC8000, 0xFFFFFC00, 0xFFFFFFFF, 0x03FFFFFF, + 0x00000000, 0xFC00F000, 0x00000000, 0xFF000000, + 0x00000000, 0x00000000, 0xFC003FE0, 0xF0000000, + 0x00000000, 0x00000000, 0x7FF00000, 0xE0000000, + 0x00000000, 0x00000000, 0x3C004000, 0xFFFFFFFF, + 0x00000000, 0xFF800000, 0x0C00C000, 0xF0000000, + 0x00000000, 0x00000000, 0x07FFFFF8, 0xFFFFFFFF, + 0xFF818181, 0xFFFF8080, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0xFC00C000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x0000FFF0, 0x00000780, 0xF0000000, + 0x00000000, 0x0000C000, 0x00000000, 0x0000C000, + 0x00000000, 0x00000000, 0xFC000000, 0xFFFFFFFF, + 0x1F07FF80, 0xA0800000, 0x00000024, 0x00000000, + 0x00000000, 0x00000000, 0x0007FFFC, 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, 0x00400000, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x70000000, 0x7C000000, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x01100F90, 0x78F00000, 0xFE00FF00, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x00000000, 0x01C00000, 0x00C00000, 0x00F80000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x00000000, 0x00000000, 0xFFFFFE00, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x80000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x00000000, 0x00000000, 0x0003C000, 0xFFFF0000, + 0x00000000, 0x00000000, 0xFFFFFFFC, 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, 0xFFFF8000, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x00000000, 0xFE000000, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFC, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 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, 0x80018000, 0x00010001, 0xFFFFFFFF, + 0x0000F800, 0x00008000, 0x00000000, 0x0000FC00, + 0xF8000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F, + 0x0000FFF8, 0xF8000000, 0xFFFCFE00, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x00000000, 0x0040FFFE, 0x00000000, 0xE0000000, + 0xFFF00000, 0x00000000, 0xFFFFF820, 0xFFFE0000, + 0x00000000, 0x80000000, 0x00000002, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0xE1000000, + 0x00000000, 0xC0000000, 0x0000FFFF, 0xFFFFFF00, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x07FFFFFF, + 0x8AA20001, 0x0010D0C0, 0xFFFF001E, 0xFFFFFFFF, + 0x00000000, 0x00000000, 0xFFFFFFC0, 0xFFFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0xFFF00000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xFF800000, 0xFFFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0xFFE00000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 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 0000000..2cd5abf --- /dev/null +++ b/gnulib/lib/unictype/categ_Co.c @@ -0,0 +1,27 @@ +/* Categories of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..e7db3ea --- /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-uni-tables.c for Unicode 6.0.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 0000000..4d0ee55 --- /dev/null +++ b/gnulib/lib/unictype/categ_Cs.c @@ -0,0 +1,30 @@ +/* Categories of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..6ee5355 --- /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-uni-tables.c for Unicode 6.0.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 0000000..64f2adb --- /dev/null +++ b/gnulib/lib/unictype/categ_L.c @@ -0,0 +1,27 @@ +/* Categories of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..8818601 --- /dev/null +++ b/gnulib/lib/unictype/categ_L.h @@ -0,0 +1,604 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Categories of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[48 << 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, + 4 + 384 * sizeof (short) / sizeof (int) + 592, + -1, + 4 + 384 * sizeof (short) / sizeof (int) + 608, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 624, + -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) + 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, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 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, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 4 + 384 * sizeof (short) / sizeof (int) + 672, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 4 + 384 * sizeof (short) / sizeof (int) + 688, + 4 + 384 * 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, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 720, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 4 + 384 * sizeof (short) / sizeof (int) + 320, + 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, + -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) + 752, + -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, 0xFFFE00FF, 0x027FFFFF, 0xFFFFFFFE, + 0x000000FF, 0x00000000, 0xFFFF0000, 0x000707FF, + 0x00000000, 0xFFFFFFFF, 0x000007FF, 0xFFFEC000, + 0xFFFFFFFF, 0xFFFFFFFF, 0x002FFFFF, 0x9C00C060, + 0xFFFD0000, 0x0000FFFF, 0xFFFFE000, 0xFFFFFFFF, + 0xFFFFFFFF, 0x0002003F, 0xFFFFFC00, 0x043007FF, + 0x043FFFFF, 0x00000110, 0x01FFFFFF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFF0, 0x23FFFFFF, 0xFF010000, 0xFEFE0003, + 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, 0x00060003, + 0xFFFDDFE0, 0x27FFFFFF, 0x00004000, 0xFC000003, + 0xFC7FFFE0, 0x2FFBFFFF, 0x0000007F, 0x00000000, + 0xFFFFFFFE, 0x000DFFFF, 0x0000007F, 0x00000000, + 0xFEF02596, 0x200DECAE, 0x3000005F, 0x00000000, + 0x00000001, 0x00000000, 0xFFFFFEFF, 0x00001FFF, + 0x00001F00, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0x800007FF, 0x3C3F0000, 0xFFE1C062, + 0x00004003, 0xFFFFFFFF, 0xFFFF003F, 0x17FFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 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, 0xFFFF9FFF, + 0x07FFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0x000007FF, + 0x0003DFFF, 0x0003FFFF, 0x0003FFFF, 0x0001DFFF, + 0xFFFFFFFF, 0x000FFFFF, 0x10800000, 0x00000000, + 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x00FFFFFF, + 0xFFFFFFFF, 0xFFFF05FF, 0xFFFFFFFF, 0x003FFFFF, + 0x1FFFFFFF, 0x00000000, 0xFFFF0000, 0x001F3FFF, + 0xFFFFFFFF, 0x00000FFF, 0x000000FE, 0x00000000, + 0x007FFFFF, 0xFFFFFFFF, 0x001FFFFF, 0x00000000, + 0x00000000, 0x00000080, 0x00000000, 0x00000000, + 0xFFFFFFE0, 0x000FFFFF, 0x00000FE0, 0x00000000, + 0xFFFFFFF8, 0x0000C001, 0xFFFFFFFF, 0x0000003F, + 0xFFFFFFFF, 0x0000000F, 0xFC00E000, 0x3FFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x0003DE00, + 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, + 0x1FFF0000, 0x00000000, 0x00000000, 0x00000000, + 0x3E2FFC84, 0xF3FFBD50, 0x000043E0, 0x00000000, + 0x00000018, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFF7FFF, 0x7FFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000781F, + 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, 0x07FFFFFF, 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, 0x00000FFF, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x00001FFF, 0x00000000, 0xFFFF0000, 0x3FFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFF1FFF, 0x00000C00, 0xFFFFFFFF, 0x80007FFF, + 0x00FFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F, + 0xFF800000, 0xFFFFFFFC, 0xFFFFFFFF, 0xFFFFFFFF, + 0x000379FF, 0x000003FF, 0x00000000, 0xFC000000, + 0xFFFFF7BB, 0x00000007, 0xFFFFFFFF, 0x000FFFFF, + 0xFFFFFFFC, 0x000FFFFF, 0x00000000, 0x08FC0000, + 0xFFFFFC00, 0xFFFF003F, 0x0000007F, 0x1FFFFFFF, + 0xFFFFFFF0, 0x0007FFFF, 0x00008000, 0x00000000, + 0xFFFFFFFF, 0x000001FF, 0x00000FF7, 0x047FFFFF, + 0xFFFFFFFF, 0x3E62FFFF, 0x38000005, 0x00000000, + 0x007E7E7E, 0x00007F7F, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xFFFFFFFF, 0x00000007, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFF000F, 0xFFFFF87F, 0x0FFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFF3FFF, 0xFFFFFFFF, 0xFFFF3FFF, + 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, 0x003FFFFF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x003FFFFF, 0x03FFFFFF, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFEEF0001, 0x000FFFFF, 0x00000000, 0x1FFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0x003FFFFF, 0x003FFFFF, 0x0007FFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0x000001FF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFF8, 0x00FFFFFF, 0x00000000, 0x00000000, + 0xFFFFFFF8, 0x0000FFFF, 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, 0x00007FFF, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0x01FFFFFF, 0x00000000, 0x00000000, + 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, + 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, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0x001FFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x3FFFFFFF, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000 + } +}; diff --git a/gnulib/lib/unictype/categ_LC.c b/gnulib/lib/unictype/categ_LC.c new file mode 100644 index 0000000..13801d9 --- /dev/null +++ b/gnulib/lib/unictype/categ_LC.c @@ -0,0 +1,27 @@ +/* Categories of Unicode characters. + Copyright (C) 2002, 2006-2007, 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unictype.h" + +/* Define u_categ_LC table. */ +#include "categ_LC.h" + +const uc_general_category_t UC_CATEGORY_LC = + { UC_CATEGORY_MASK_LC, 0, { &u_categ_LC } }; diff --git a/gnulib/lib/unictype/categ_LC.h b/gnulib/lib/unictype/categ_LC.h new file mode 100644 index 0000000..454bf75 --- /dev/null +++ b/gnulib/lib/unictype/categ_LC.h @@ -0,0 +1,339 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Categories of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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_categ_LC = +{ + { 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, + -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, + 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, 0x07FFFFFE, 0x07FFFFFE, + 0x00000000, 0x04200400, 0xFF7FFFFF, 0xFF7FFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xF7FFFFFF, 0xFFFFFFF0, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFEFFFFF, 0x0000FFFF, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x38CF0000, + 0xFFFFD740, 0xFFFFFFFB, 0xFFFFFFFF, 0xFFBFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFC03, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFE00FF, 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, 0x00000FFF, 0x00000000, 0xFEFFFFFC, + 0x07FFFFFF, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF, + 0xFFFFFFFF, 0x5FDFFFFF, 0x0FCF1FDC, 0x1FDC1FFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x3E2FFC84, 0xF21FBD50, 0x000043E0, 0x00000000, + 0x00000018, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFF7FFF, 0x7FFFFFFF, 0xDFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000781F, + 0xFFFFFFFF, 0x0000003F, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xFFFFFFFF, 0x00003FFF, + 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0xFFFFFFFC, 0xFFFFFFFF, 0xFFFEFFFF, + 0x000378FF, 0x000003FF, 0x00000000, 0x04000000, + 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/unictype/categ_Ll.c b/gnulib/lib/unictype/categ_Ll.c new file mode 100644 index 0000000..c915918 --- /dev/null +++ b/gnulib/lib/unictype/categ_Ll.c @@ -0,0 +1,27 @@ +/* Categories of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..3cac1f6 --- /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-uni-tables.c for Unicode 6.0.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, 0x000000AA, 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, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x0008C400, 0x32108000, 0x000043C0, 0x00000000, + 0x00000010, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0xFFFF0000, 0x7FFFFFFF, 0x1FDA1562, + 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0x0000501A, + 0xFFFFFFFF, 0x0000003F, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xAAAAAAAA, 0x00002AAA, + 0x00AAAAAA, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0xAAABAAA8, 0xAAAAAAAA, 0x95FEAAAA, + 0x000250AA, 0x000002AA, 0x00000000, 0x04000000, + 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 0000000..9dfaf71 --- /dev/null +++ b/gnulib/lib/unictype/categ_Lm.c @@ -0,0 +1,27 @@ +/* Categories of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..47f73ec --- /dev/null +++ b/gnulib/lib/unictype/categ_Lm.h @@ -0,0 +1,232 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Categories of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[20 << 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, + 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, + 2 + 128 * sizeof (short) / sizeof (int) + 176, + 2 + 128 * sizeof (short) / sizeof (int) + 192, + 2 + 128 * 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, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 2 + 128 * sizeof (short) / sizeof (int) + 224, + -1, + 2 + 128 * sizeof (short) / sizeof (int) + 240, + 2 + 128 * sizeof (short) / sizeof (int) + 256, + 2 + 128 * sizeof (short) / sizeof (int) + 272, + 2 + 128 * 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, + 2 + 128 * sizeof (short) / sizeof (int) + 304 + }, + { + 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, + 0x04000000, 0x00000110, 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, 0x00000000, + 0x00000000, 0x00000080, 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, 0x80020000, + 0x1FFF0000, 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, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x3F000000, + 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, 0x00000000, + 0x00000000, 0x00000000, 0x00008000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00010000, + 0x00000000, 0x00000000, 0x20000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 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 0000000..51cb6c3 --- /dev/null +++ b/gnulib/lib/unictype/categ_Lo.c @@ -0,0 +1,27 @@ +/* Categories of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..966c33f --- /dev/null +++ b/gnulib/lib/unictype/categ_Lo.h @@ -0,0 +1,592 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Categories of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[45 << 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, + 4 + 384 * sizeof (short) / sizeof (int) + 576, + -1, + 4 + 384 * sizeof (short) / sizeof (int) + 592, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 4 + 384 * sizeof (short) / sizeof (int) + 288, + 4 + 384 * sizeof (short) / sizeof (int) + 608, + -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) + 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, + 4 + 384 * sizeof (short) / sizeof (int) + 288, + 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, + 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, + -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) + 672, + 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) + 688, + 4 + 384 * 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, + 4 + 384 * sizeof (short) / sizeof (int) + 288, + 4 + 384 * sizeof (short) / sizeof (int) + 704, + -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, 0xFFFFFFFF, 0x000007FE, 0xFFFEC000, + 0xFFFFFFFF, 0xFFFFFFFF, 0x002FFFFF, 0x9C00C000, + 0xFFFD0000, 0x0000FFFF, 0xFFFFE000, 0xFFFFFFFF, + 0xFFFFFFFF, 0x0002003F, 0xFFFFFC00, 0x000007FF, + 0x003FFFFF, 0x00000000, 0x01FFFFFF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFF0, 0x23FFFFFF, 0xFF010000, 0xFEFC0003, + 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, 0x00060003, + 0xFFFDDFE0, 0x27FFFFFF, 0x00004000, 0xFC000003, + 0xFC7FFFE0, 0x2FFBFFFF, 0x0000007F, 0x00000000, + 0xFFFFFFFE, 0x000DFFFF, 0x0000003F, 0x00000000, + 0xFEF02596, 0x200DECAE, 0x3000001F, 0x00000000, + 0x00000001, 0x00000000, 0xFFFFFEFF, 0x00001FFF, + 0x00001F00, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0x800007FF, 0x3C3F0000, 0xFFE1C062, + 0x00004003, 0x00000000, 0xFFFF0000, 0x07FFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 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, 0xFFFF9FFF, + 0x07FFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0x000007FF, + 0x0003DFFF, 0x0003FFFF, 0x0003FFFF, 0x0001DFFF, + 0xFFFFFFFF, 0x000FFFFF, 0x10000000, 0x00000000, + 0x00000000, 0xFFFFFFFF, 0xFFFFFFF7, 0x00FFFFFF, + 0xFFFFFFFF, 0xFFFF05FF, 0xFFFFFFFF, 0x003FFFFF, + 0x1FFFFFFF, 0x00000000, 0xFFFF0000, 0x001F3FFF, + 0xFFFFFFFF, 0x00000FFF, 0x000000FE, 0x00000000, + 0x007FFFFF, 0xFFFFFFFF, 0x001FFFFF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFE0, 0x000FFFFF, 0x00000FE0, 0x00000000, + 0xFFFFFFF8, 0x0000C001, 0xFFFFFFFF, 0x0000003F, + 0xFFFFFFFF, 0x0000000F, 0xFC00E000, 0x00FFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x0003DE00, + 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, 0x07FFFFFF, 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, 0x00000FFF, 0x00000000, + 0xFFDFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x00001FFF, 0x00000000, 0xFFFF0000, 0x00FFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFF0FFF, 0x00000C00, 0x00000000, 0x00004000, + 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0xF8000000, + 0xFFFFF7BB, 0x00000007, 0xFFFFFFFF, 0x000FFFFF, + 0xFFFFFFFC, 0x000FFFFF, 0x00000000, 0x08FC0000, + 0xFFFFFC00, 0xFFFF003F, 0x0000007F, 0x1FFFFFFF, + 0xFFFFFFF0, 0x0007FFFF, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0x000001FF, 0x00000FF7, 0x047EFFFF, + 0xFFFFFFFF, 0x3E62FFFF, 0x18000005, 0x00000000, + 0x007E7E7E, 0x00007F7F, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xFFFFFFFF, 0x00000007, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFF000F, 0xFFFFF87F, 0x0FFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFF3FFF, 0xFFFFFFFF, 0xFFFF3FFF, + 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, 0x003FFFFF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x003FFFFF, 0x03FFFFFF, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFEEF0001, 0x000FFFFF, 0x00000000, 0x1FFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0x003FFFFF, 0x003FFFFF, 0x0007FFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0x000001FF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFF8, 0x00FFFFFF, 0x00000000, 0x00000000, + 0xFFFFFFF8, 0x0000FFFF, 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, 0x00007FFF, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0x01FFFFFF, 0x00000000, 0x00000000, + 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, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0x001FFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 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 0000000..53c093d --- /dev/null +++ b/gnulib/lib/unictype/categ_Lt.c @@ -0,0 +1,27 @@ +/* Categories of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..728cfd8 --- /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-uni-tables.c for Unicode 6.0.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 0000000..d3e2b11 --- /dev/null +++ b/gnulib/lib/unictype/categ_Lu.c @@ -0,0 +1,27 @@ +/* Categories of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..cfee1c0 --- /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-uni-tables.c for Unicode 6.0.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, 0xFFFE0055, 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, 0xC025EA9D, + 0x55555555, 0x55555555, 0x55555555, 0x00002805, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x55555555, 0x00001555, + 0x00555555, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x55545554, 0x55555555, 0x6A005555, + 0x00012855, 0x00000155, 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 0000000..cce2e02 --- /dev/null +++ b/gnulib/lib/unictype/categ_M.c @@ -0,0 +1,27 @@ +/* Categories of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..c8059ac --- /dev/null +++ b/gnulib/lib/unictype/categ_M.h @@ -0,0 +1,532 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Categories of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[27 << 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, + 16 + 384 * 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, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -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) + 384, + 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, + 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, + -1, + -1, + -1, + -1, + -1, + -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, 0xFFFFF800, 0x00010000, + 0x00000000, 0x00000000, 0x9FC00000, 0x00003D9F, + 0x00020000, 0xFFFF0000, 0x000007FF, 0x00000000, + 0x00000000, 0x0001FFC0, 0x00000000, 0x000FF800, + 0xFBC00000, 0x00003EEF, 0x0E000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x0000000F, 0xDC000000, 0x00FEFFFF, 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, + 0xFEFFE0DF, 0x1FFFFFFF, 0x00000040, 0x00000000, + 0x00000000, 0x7FFFF800, 0xC3C00000, 0x001E3F9D, + 0x3C00BFFC, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xE0000000, 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, 0x7FE00000, 0x9FFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x0000001F, 0xFFF00000, 0x0000001F, 0x000FF800, + 0x00000007, 0x000007FE, 0x00000000, 0x000FFFC0, + 0x00000000, 0x00FFFFF0, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xFFF70000, 0x000421FF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xFFFFFFFF, 0xF000007F, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xFFFF0000, 0x0001FFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00038000, + 0x00000000, 0x00000000, 0x00000000, 0x80000000, + 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, 0x00030000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000844, 0x000000F8, 0x00000000, 0x00000000, + 0x00000003, 0xFFF00000, 0x0000001F, 0x0003FFFF, + 0x00000000, 0x00003FC0, 0x000FFF80, 0x00000000, + 0x0000000F, 0xFFF80000, 0x00000001, 0x00000000, + 0x00000000, 0x007FFE00, 0x00003008, 0x08000000, + 0x00000000, 0xC19D0000, 0x00000002, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x000037F8, + 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, + 0x00000007, 0xFF000000, 0x0000007F, 0x00000000, + 0x00000007, 0x07FF0000, 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 0000000..625dfb1 --- /dev/null +++ b/gnulib/lib/unictype/categ_Mc.c @@ -0,0 +1,27 @@ +/* Categories of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..bc1d563 --- /dev/null +++ b/gnulib/lib/unictype/categ_Mc.h @@ -0,0 +1,335 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Categories of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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_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, + 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, + 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 + }, + { + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000008, 0xC8000000, 0x0000DE01, 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, + 0x1C009F98, 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, 0x00A00000, 0x0007E01A, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000010, 0xE8200000, 0x0000001B, 0x00000000, + 0x00000004, 0x000004C2, 0x00000000, 0x000C5C80, + 0x00000000, 0x00300FF0, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00040002, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000098, 0x00000000, 0x00000000, + 0x00000003, 0xFFF00000, 0x0000000F, 0x00000000, + 0x00000000, 0x00000000, 0x000C0000, 0x00000000, + 0x00000008, 0xEC300000, 0x00000001, 0x00000000, + 0x00000000, 0x00198000, 0x00002000, 0x08000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x000016D8, + 0x00000005, 0x00000000, 0x00000000, 0x00000000, + 0x00000004, 0x01870000, 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 0000000..64b1709 --- /dev/null +++ b/gnulib/lib/unictype/categ_Me.c @@ -0,0 +1,27 @@ +/* Categories of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..3951c8b --- /dev/null +++ b/gnulib/lib/unictype/categ_Me.h @@ -0,0 +1,164 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Categories of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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_Me = +{ + { 1 }, + { 2 * sizeof (int) / sizeof (short) + 0 }, + { + -1, + -1, + 2 + 128 * sizeof (short) / sizeof (int) + 0, + -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, + 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 + }, + { + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000300, 0x00000000, 0x00000000, 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 0000000..c330e7e --- /dev/null +++ b/gnulib/lib/unictype/categ_Mn.c @@ -0,0 +1,27 @@ +/* Categories of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..c1bb94c --- /dev/null +++ b/gnulib/lib/unictype/categ_Mn.h @@ -0,0 +1,532 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Categories of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[27 << 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, + 16 + 384 * 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, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -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) + 384, + 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, + 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, + -1, + -1, + -1, + -1, + -1, + -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, 0xFFFFF800, 0x00010000, + 0x00000000, 0x00000000, 0x9FC00000, 0x00003D9F, + 0x00020000, 0xFFFF0000, 0x000007FF, 0x00000000, + 0x00000000, 0x0001FFC0, 0x00000000, 0x000FF800, + 0xFBC00000, 0x00003EEF, 0x0E000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000007, 0x14000000, 0x00FE21FE, 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, + 0xFEFFE0DF, 0x1FFFFFFF, 0x00000040, 0x00000000, + 0x00000000, 0x66FDE000, 0xC3000000, 0x001E0001, + 0x20002064, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xE0000000, 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, 0x7F400000, 0x9FF81FE5, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x0000000F, 0x17D00000, 0x00000004, 0x000FF800, + 0x00000003, 0x0000033C, 0x00000000, 0x0003A340, + 0x00000000, 0x00CFF000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xFFF70000, 0x000021FD, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xFFFFFFFF, 0xF000007F, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x1FFF0000, 0x0001FFE2, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00038000, + 0x00000000, 0x00000000, 0x00000000, 0x80000000, + 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, 0x00030000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000844, 0x00000060, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000010, 0x0003FFFF, + 0x00000000, 0x00003FC0, 0x0003FF80, 0x00000000, + 0x00000007, 0x13C80000, 0x00000000, 0x00000000, + 0x00000000, 0x00667E00, 0x00001008, 0x00000000, + 0x00000000, 0xC19D0000, 0x00000002, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00002120, + 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, + 0x00000002, 0xFF000000, 0x0000007F, 0x00000000, + 0x00000003, 0x06780000, 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 0000000..d7853fa --- /dev/null +++ b/gnulib/lib/unictype/categ_N.c @@ -0,0 +1,27 @@ +/* Categories of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..29b9e25 --- /dev/null +++ b/gnulib/lib/unictype/categ_N.h @@ -0,0 +1,415 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Categories of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[33 << 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, + 3 + 256 * sizeof (short) / sizeof (int) + 432, + 3 + 256 * sizeof (short) / sizeof (int) + 448, + -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, + 3 + 256 * sizeof (short) / sizeof (int) + 480, + -1, + 3 + 256 * sizeof (short) / sizeof (int) + 496, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 3 + 256 * sizeof (short) / sizeof (int) + 512, + -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, 0x00FCFFC0, + 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, 0x07FF0000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x03FF03FF, 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, 0xFFFF0000, 0xFFFFFFFF, + 0x000003E7, 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, 0x0000FFC0, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x003F0000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x03FF0000, 0x00000000, + 0x000003FF, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x03FF0000, 0x00000000, + 0x00000000, 0x00000000, 0x03FF0000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x03FF0000, + 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, 0xFF000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x0FC00000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x000000FF, 0x60000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xFF000000, 0xFF000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x7FFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xFFFC0000, 0x0000FFFF, + 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, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x000007FF, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000 + } +}; diff --git a/gnulib/lib/unictype/categ_Nd.c b/gnulib/lib/unictype/categ_Nd.c new file mode 100644 index 0000000..f530ab8 --- /dev/null +++ b/gnulib/lib/unictype/categ_Nd.c @@ -0,0 +1,27 @@ +/* Categories of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..765bfc9 --- /dev/null +++ b/gnulib/lib/unictype/categ_Nd.h @@ -0,0 +1,355 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Categories of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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_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, + 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, + 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 + }, + { + 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, + 0x03FF03FF, 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, 0x03FF0000, 0x00000000, + 0x00000000, 0x00000000, 0x03FF0000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x03FF0000, + 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, 0x0000FFC0, + 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, 0xFFFFC000, 0xFFFFFFFF + } +}; diff --git a/gnulib/lib/unictype/categ_Nl.c b/gnulib/lib/unictype/categ_Nl.c new file mode 100644 index 0000000..7ff1156 --- /dev/null +++ b/gnulib/lib/unictype/categ_Nl.c @@ -0,0 +1,27 @@ +/* Categories of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..5fe8aae --- /dev/null +++ b/gnulib/lib/unictype/categ_Nl.h @@ -0,0 +1,311 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Categories of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[7 << 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, + 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, + 3 + 256 * sizeof (short) / sizeof (int) + 64, + 3 + 256 * sizeof (short) / sizeof (int) + 80, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -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 + }, + { + 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, 0x0000FFC0, + 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 0000000..201b9f0 --- /dev/null +++ b/gnulib/lib/unictype/categ_No.c @@ -0,0 +1,27 @@ +/* Categories of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..d25614b --- /dev/null +++ b/gnulib/lib/unictype/categ_No.h @@ -0,0 +1,375 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Categories of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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_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, + 3 + 256 * sizeof (short) / sizeof (int) + 112, + -1, + -1, + -1, + 3 + 256 * sizeof (short) / sizeof (int) + 128, + -1, + 3 + 256 * sizeof (short) / sizeof (int) + 144, + 3 + 256 * sizeof (short) / sizeof (int) + 160, + -1, + -1, + 3 + 256 * sizeof (short) / sizeof (int) + 176, + -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, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -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, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -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, + 3 + 256 * sizeof (short) / sizeof (int) + 272, + 3 + 256 * sizeof (short) / sizeof (int) + 288, + -1, + 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, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -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, + -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 + }, + { + 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, 0x00FC0000, + 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, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x04000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x03F10000, + 0x000003FF, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xFFFF0000, 0x00000000, + 0x00000200, 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, 0x003F0000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 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, 0xFF000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x0FC00000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x000000FF, 0x60000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xFF000000, 0xFF000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x7FFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xFFFC0000, 0x0000003F, + 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, + 0x000007FF, 0x00000000, 0x00000000, 0x00000000, + 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 0000000..cda2174 --- /dev/null +++ b/gnulib/lib/unictype/categ_P.c @@ -0,0 +1,27 @@ +/* Categories of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..1b9ad86 --- /dev/null +++ b/gnulib/lib/unictype/categ_P.h @@ -0,0 +1,415 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Categories of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[33 << 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, + 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, + 3 + 256 * sizeof (short) / sizeof (int) + 224, + 3 + 256 * sizeof (short) / sizeof (int) + 240, + -1, + 3 + 256 * sizeof (short) / sizeof (int) + 256, + 3 + 256 * sizeof (short) / sizeof (int) + 272, + -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, + -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, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -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, + 3 + 256 * sizeof (short) / sizeof (int) + 448, + -1, + -1, + 3 + 256 * sizeof (short) / sizeof (int) + 464, + 3 + 256 * sizeof (short) / sizeof (int) + 480, + -1, + -1, + 3 + 256 * sizeof (short) / sizeof (int) + 496, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 3 + 256 * 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, + -1, + -1, + -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, 0x7FFF0000, 0x40000000, 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, 0x061F0000, 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, + 0x00000001, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 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, 0x00000000, 0x00000000, + 0xC0000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00003F7F, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xFC000000, 0x00000001, + 0x00000000, 0x00000000, 0x00000000, 0xF0000000, + 0x00000000, 0xF8000000, 0x00000000, 0xC0000000, + 0x00000000, 0x00000000, 0x00080000, 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, 0x00010000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0x00037FFF, 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, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0xC0000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x0000E000, 0x00000000, 0x00000000, 0x40080000, + 0x00000000, 0x00000000, 0x00000000, 0x00FC0000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00F00000, + 0x00000000, 0x00000000, 0x0000C000, 0x07000000, + 0x00000000, 0x0000C000, 0x80000000, 0x00000000, + 0x00000000, 0x00000000, 0xC0003FFE, 0x00000000, + 0x00000000, 0x00000000, 0xF0000000, 0x00000000, + 0x00000000, 0x00000000, 0xC0000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000800, + 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, 0x00800000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x80000000, 0x80000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x01FF0000, 0x80000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0xFE000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00003F80, 0x00000000, + 0x00000000, 0xD8000000, 0x00000003, 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 0000000..3f6ce69 --- /dev/null +++ b/gnulib/lib/unictype/categ_Pc.c @@ -0,0 +1,27 @@ +/* Categories of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..71cefb1 --- /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-uni-tables.c for Unicode 6.0.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 0000000..4f47496 --- /dev/null +++ b/gnulib/lib/unictype/categ_Pd.c @@ -0,0 +1,27 @@ +/* Categories of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..1117137 --- /dev/null +++ b/gnulib/lib/unictype/categ_Pd.h @@ -0,0 +1,184 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Categories of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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_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, + 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, + 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, + 0x00000001, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 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 0000000..22e5077 --- /dev/null +++ b/gnulib/lib/unictype/categ_Pe.c @@ -0,0 +1,27 @@ +/* Categories of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..5ac2941 --- /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-uni-tables.c for Unicode 6.0.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 0000000..a0fc9b0 --- /dev/null +++ b/gnulib/lib/unictype/categ_Pf.c @@ -0,0 +1,27 @@ +/* Categories of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..6cdb192 --- /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-uni-tables.c for Unicode 6.0.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 0000000..ae18039 --- /dev/null +++ b/gnulib/lib/unictype/categ_Pi.c @@ -0,0 +1,27 @@ +/* Categories of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..9edd086 --- /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-uni-tables.c for Unicode 6.0.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 0000000..a7d78a1 --- /dev/null +++ b/gnulib/lib/unictype/categ_Po.c @@ -0,0 +1,27 @@ +/* Categories of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..a27eeee --- /dev/null +++ b/gnulib/lib/unictype/categ_Po.h @@ -0,0 +1,395 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Categories of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[28 << 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, + 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, + -1, + -1, + -1, + -1, + -1, + -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, + -1, + -1, + 3 + 256 * sizeof (short) / sizeof (int) + 384, + 3 + 256 * sizeof (short) / sizeof (int) + 400, + -1, + -1, + 3 + 256 * sizeof (short) / sizeof (int) + 416, + -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, + -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, 0x7FFF0000, 0x40000000, 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, 0x061F0000, 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, 0x00000000, 0x00000000, + 0xC0000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00003F7F, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xFC000000, 0x00000001, + 0x00000000, 0x00000000, 0x00000000, 0xF0000000, + 0x00000000, 0xF8000000, 0x00000000, 0xC0000000, + 0x00000000, 0x00000000, 0x00080000, 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, 0x00010000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xCB7FC9C3, 0x00037C00, 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, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0xC0000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x0000E000, 0x00000000, 0x00000000, 0x40080000, + 0x00000000, 0x00000000, 0x00000000, 0x00FC0000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00F00000, + 0x00000000, 0x00000000, 0x0000C000, 0x07000000, + 0x00000000, 0x0000C000, 0x80000000, 0x00000000, + 0x00000000, 0x00000000, 0xC0003FFE, 0x00000000, + 0x00000000, 0x00000000, 0xF0000000, 0x00000000, + 0x00000000, 0x00000000, 0xC0000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000800, + 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, 0x00800000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x80000000, 0x80000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x01FF0000, 0x80000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0xFE000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00003F80, 0x00000000, + 0x00000000, 0xD8000000, 0x00000003, 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 0000000..215d00c --- /dev/null +++ b/gnulib/lib/unictype/categ_Ps.c @@ -0,0 +1,27 @@ +/* Categories of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..124cf13 --- /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-uni-tables.c for Unicode 6.0.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 0000000..d5914b2 --- /dev/null +++ b/gnulib/lib/unictype/categ_S.c @@ -0,0 +1,27 @@ +/* Categories of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..6b87f2a --- /dev/null +++ b/gnulib/lib/unictype/categ_S.h @@ -0,0 +1,443 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Categories of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[40 << 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, + 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, + 3 + 256 * sizeof (short) / sizeof (int) + 464, + 3 + 256 * sizeof (short) / sizeof (int) + 480, + 3 + 256 * sizeof (short) / sizeof (int) + 496, + 3 + 256 * 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, + -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) + 528, + 3 + 256 * sizeof (short) / sizeof (int) + 544, + -1, + 3 + 256 * sizeof (short) / sizeof (int) + 560, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 3 + 256 * sizeof (short) / sizeof (int) + 576, + 3 + 256 * sizeof (short) / sizeof (int) + 592, + 3 + 256 * sizeof (short) / sizeof (int) + 608, + 3 + 256 * sizeof (short) / sizeof (int) + 624, + -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, 0x40000000, 0x60000200, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00400000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x0C0C0000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00020000, + 0x00000000, 0x00000000, 0x00000000, 0x00010000, + 0x00000000, 0x00000000, 0x00000000, 0x07F80000, + 0x00000000, 0x00000000, 0x00000000, 0x80000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x02000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x80000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFCF8000E, 0x01500000, 0x00000000, 0x00000000, + 0x00000000, 0xC0000000, 0x01E0DFBF, 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, 0xC0000000, 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, 0x03FFFFFF, 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, 0x000FFFFF, + 0xFFFFFFFF, 0x0000007F, 0x000007FF, 0x00000000, + 0xF0000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x000003FF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0x000000FF, + 0xFFF00000, 0xFFFFFFFF, 0xFFFFD79F, 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, 0x03FF1FFF, 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, 0x0001FFFF, 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, 0x03C00F00, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x03800000, + 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, 0xFFFC0000, 0x00000003, 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, 0x7FFE7FFF, 0xFFFEFFFE, 0x00000000, + 0xFFFF0000, 0xFFFF7FFF, 0xFFFFFFFF, 0xFFFF03FF, + 0x07FFFFFF, 0x00000000, 0x00000000, 0xFFFFFFC0, + 0xFFFF0007, 0x07FFFFFF, 0x000301FF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFBF0001, 0xFFFFFFFF, 0x1FFFFFFF, + 0x000FFFFF, 0xFFFFFFFF, 0x000007DF, 0x0001FFFF, + 0xFFFFFFFF, 0x7FFFFFFF, 0xFFFFFFFD, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x1EFFFFFF, + 0xFFFFFFFF, 0x3FFFFFFF, 0xFFFF0000, 0x000000FF, + 0x00000000, 0x00000000, 0x00000000, 0xF8000000, + 0x755DFFFE, 0xFFEF2F3F, 0x0000FFE1, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000FFFFF, + 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 0000000..9baa85b --- /dev/null +++ b/gnulib/lib/unictype/categ_Sc.c @@ -0,0 +1,27 @@ +/* Categories of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..121d322 --- /dev/null +++ b/gnulib/lib/unictype/categ_Sc.h @@ -0,0 +1,192 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Categories of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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_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, + 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, + 2 + 128 * sizeof (short) / sizeof (int) + 128, + 2 + 128 * sizeof (short) / sizeof (int) + 144 + }, + { + 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, 0x080C0000, + 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, 0x03FFFFFF, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x01000000, 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, 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 0000000..e3d6ca9 --- /dev/null +++ b/gnulib/lib/unictype/categ_Sk.c @@ -0,0 +1,27 @@ +/* Categories of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..4006353 --- /dev/null +++ b/gnulib/lib/unictype/categ_Sk.h @@ -0,0 +1,180 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Categories of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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_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, + 2 + 128 * sizeof (short) / sizeof (int) + 80, + -1, + 2 + 128 * sizeof (short) / sizeof (int) + 96 + }, + { + 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, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0xFFFC0000, 0x00000003, 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 0000000..d7f7150 --- /dev/null +++ b/gnulib/lib/unictype/categ_Sm.c @@ -0,0 +1,27 @@ +/* Categories of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..0a7b154 --- /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-uni-tables.c for Unicode 6.0.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, + 0x01000000, 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, 0xFFFFD79F, 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 0000000..17ec608 --- /dev/null +++ b/gnulib/lib/unictype/categ_So.c @@ -0,0 +1,27 @@ +/* Categories of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..b2f9447 --- /dev/null +++ b/gnulib/lib/unictype/categ_So.h @@ -0,0 +1,419 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Categories of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[34 << 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, + 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, + 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, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -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, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 3 + 256 * sizeof (short) / sizeof (int) + 480, + 3 + 256 * sizeof (short) / sizeof (int) + 496, + 3 + 256 * sizeof (short) / sizeof (int) + 512, + 3 + 256 * sizeof (short) / sizeof (int) + 528, + -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, 0x40000000, 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, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x02000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFCF8000E, 0x01500000, 0x00000000, 0x00000000, + 0x00000000, 0xC0000000, 0x01E0DFBF, 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, 0xC0000000, 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, + 0xC0D0037B, 0x0C0042AF, 0x0000B400, 0x00000000, + 0xF3E00000, 0xFFFFBFB6, 0xFFEB3FFF, 0x000FFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFF0FF, 0xFFFFF9FC, 0xFFFFFFFF, 0xEFFFFFFF, + 0x07FFFFFF, 0xFFF00000, 0x0FFFFFFF, 0x000FFFFC, + 0xFFFFFFFF, 0x0000007F, 0x000007FF, 0x00000000, + 0xF0000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x000003FF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFF7FFFFF, 0xFFFFFFFD, 0x00FFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF7FFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0x000000FF, + 0xFFF00000, 0xFFFFFFFF, 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, 0x03FF0060, 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, 0x0001FFFF, 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, 0x02C00F00, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x03800000, + 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, 0x7FFE7FFF, 0xFFFEFFFE, 0x00000000, + 0xFFFF0000, 0xFFFF7FFF, 0xFFFFFFFF, 0xFFFF03FF, + 0x07FFFFFF, 0x00000000, 0x00000000, 0xFFFFFFC0, + 0xFFFF0007, 0x07FFFFFF, 0x000301FF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFBF0001, 0xFFFFFFFF, 0x1FFFFFFF, + 0x000FFFFF, 0xFFFFFFFF, 0x000007DF, 0x0001FFFF, + 0xFFFFFFFF, 0x7FFFFFFF, 0xFFFFFFFD, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x1EFFFFFF, + 0xFFFFFFFF, 0x3FFFFFFF, 0xFFFF0000, 0x000000FF, + 0x00000000, 0x00000000, 0x00000000, 0xF8000000, + 0x755DFFFE, 0xFFEF2F3F, 0x0000FFE1, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000FFFFF, + 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 0000000..1d1f8f1 --- /dev/null +++ b/gnulib/lib/unictype/categ_Z.c @@ -0,0 +1,27 @@ +/* Categories of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..ac0e05c --- /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-uni-tables.c for Unicode 6.0.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 0000000..6f8f5bf --- /dev/null +++ b/gnulib/lib/unictype/categ_Zl.c @@ -0,0 +1,30 @@ +/* Categories of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..abc7f93 --- /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-uni-tables.c for Unicode 6.0.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 0000000..ae0d17b --- /dev/null +++ b/gnulib/lib/unictype/categ_Zp.c @@ -0,0 +1,30 @@ +/* Categories of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..ba4216f --- /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-uni-tables.c for Unicode 6.0.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 0000000..5fe27c7 --- /dev/null +++ b/gnulib/lib/unictype/categ_Zs.c @@ -0,0 +1,27 @@ +/* Categories of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..a2656af --- /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-uni-tables.c for Unicode 6.0.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 0000000..89f2dd7 --- /dev/null +++ b/gnulib/lib/unictype/categ_and.c @@ -0,0 +1,45 @@ +/* Categories of Unicode characters. + Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..662920e --- /dev/null +++ b/gnulib/lib/unictype/categ_and_not.c @@ -0,0 +1,42 @@ +/* Categories of Unicode characters. + Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..80e97ab --- /dev/null +++ b/gnulib/lib/unictype/categ_byname.c @@ -0,0 +1,191 @@ +/* Categories of Unicode characters. + Copyright (C) 2002, 2006-2007, 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unictype.h" + +#include +#include + +/* Indices stored in the 'struct named_category' elements of the perfect hash + table. We don't use uc_general_category_t values or their addresses + directly, because this would introduce load-time relocations. */ +enum +{ + UC_CATEGORY_INDEX_L, + UC_CATEGORY_INDEX_LC, + UC_CATEGORY_INDEX_Lu, + UC_CATEGORY_INDEX_Ll, + UC_CATEGORY_INDEX_Lt, + UC_CATEGORY_INDEX_Lm, + UC_CATEGORY_INDEX_Lo, + UC_CATEGORY_INDEX_M, + UC_CATEGORY_INDEX_Mn, + UC_CATEGORY_INDEX_Mc, + UC_CATEGORY_INDEX_Me, + UC_CATEGORY_INDEX_N, + UC_CATEGORY_INDEX_Nd, + UC_CATEGORY_INDEX_Nl, + UC_CATEGORY_INDEX_No, + UC_CATEGORY_INDEX_P, + UC_CATEGORY_INDEX_Pc, + UC_CATEGORY_INDEX_Pd, + UC_CATEGORY_INDEX_Ps, + UC_CATEGORY_INDEX_Pe, + UC_CATEGORY_INDEX_Pi, + UC_CATEGORY_INDEX_Pf, + UC_CATEGORY_INDEX_Po, + UC_CATEGORY_INDEX_S, + UC_CATEGORY_INDEX_Sm, + UC_CATEGORY_INDEX_Sc, + UC_CATEGORY_INDEX_Sk, + UC_CATEGORY_INDEX_So, + UC_CATEGORY_INDEX_Z, + UC_CATEGORY_INDEX_Zs, + UC_CATEGORY_INDEX_Zl, + UC_CATEGORY_INDEX_Zp, + UC_CATEGORY_INDEX_C, + UC_CATEGORY_INDEX_Cc, + UC_CATEGORY_INDEX_Cf, + UC_CATEGORY_INDEX_Cs, + UC_CATEGORY_INDEX_Co, + UC_CATEGORY_INDEX_Cn +}; + +#include "unictype/categ_byname.h" + +uc_general_category_t +uc_general_category_byname (const char *category_name) +{ + size_t len; + + len = strlen (category_name); + if (len <= MAX_WORD_LENGTH) + { + char buf[MAX_WORD_LENGTH + 1]; + const struct named_category *found; + + /* Copy category_name into buf, converting '_' and '-' to ' '. */ + { + const char *p = category_name; + char *q = buf; + + for (;; p++, q++) + { + char c = *p; + + if (c == '_' || c == '-') + c = ' '; + *q = c; + if (c == '\0') + break; + } + } + /* Here q == buf + len. */ + + /* Do a hash table lookup, with case-insensitive comparison. */ + found = uc_general_category_lookup (buf, len); + if (found != NULL) + /* Use a 'switch' statement here, because a table would introduce + load-time relocations. */ + switch (found->category_index) + { + case UC_CATEGORY_INDEX_L: + return UC_CATEGORY_L; + case UC_CATEGORY_INDEX_LC: + return UC_CATEGORY_LC; + case UC_CATEGORY_INDEX_Lu: + return UC_CATEGORY_Lu; + case UC_CATEGORY_INDEX_Ll: + return UC_CATEGORY_Ll; + case UC_CATEGORY_INDEX_Lt: + return UC_CATEGORY_Lt; + case UC_CATEGORY_INDEX_Lm: + return UC_CATEGORY_Lm; + case UC_CATEGORY_INDEX_Lo: + return UC_CATEGORY_Lo; + case UC_CATEGORY_INDEX_M: + return UC_CATEGORY_M; + case UC_CATEGORY_INDEX_Mn: + return UC_CATEGORY_Mn; + case UC_CATEGORY_INDEX_Mc: + return UC_CATEGORY_Mc; + case UC_CATEGORY_INDEX_Me: + return UC_CATEGORY_Me; + case UC_CATEGORY_INDEX_N: + return UC_CATEGORY_N; + case UC_CATEGORY_INDEX_Nd: + return UC_CATEGORY_Nd; + case UC_CATEGORY_INDEX_Nl: + return UC_CATEGORY_Nl; + case UC_CATEGORY_INDEX_No: + return UC_CATEGORY_No; + case UC_CATEGORY_INDEX_P: + return UC_CATEGORY_P; + case UC_CATEGORY_INDEX_Pc: + return UC_CATEGORY_Pc; + case UC_CATEGORY_INDEX_Pd: + return UC_CATEGORY_Pd; + case UC_CATEGORY_INDEX_Ps: + return UC_CATEGORY_Ps; + case UC_CATEGORY_INDEX_Pe: + return UC_CATEGORY_Pe; + case UC_CATEGORY_INDEX_Pi: + return UC_CATEGORY_Pi; + case UC_CATEGORY_INDEX_Pf: + return UC_CATEGORY_Pf; + case UC_CATEGORY_INDEX_Po: + return UC_CATEGORY_Po; + case UC_CATEGORY_INDEX_S: + return UC_CATEGORY_S; + case UC_CATEGORY_INDEX_Sm: + return UC_CATEGORY_Sm; + case UC_CATEGORY_INDEX_Sc: + return UC_CATEGORY_Sc; + case UC_CATEGORY_INDEX_Sk: + return UC_CATEGORY_Sk; + case UC_CATEGORY_INDEX_So: + return UC_CATEGORY_So; + case UC_CATEGORY_INDEX_Z: + return UC_CATEGORY_Z; + case UC_CATEGORY_INDEX_Zs: + return UC_CATEGORY_Zs; + case UC_CATEGORY_INDEX_Zl: + return UC_CATEGORY_Zl; + case UC_CATEGORY_INDEX_Zp: + return UC_CATEGORY_Zp; + case UC_CATEGORY_INDEX_C: + return UC_CATEGORY_C; + case UC_CATEGORY_INDEX_Cc: + return UC_CATEGORY_Cc; + case UC_CATEGORY_INDEX_Cf: + return UC_CATEGORY_Cf; + case UC_CATEGORY_INDEX_Cs: + return UC_CATEGORY_Cs; + case UC_CATEGORY_INDEX_Co: + return UC_CATEGORY_Co; + case UC_CATEGORY_INDEX_Cn: + return UC_CATEGORY_Cn; + default: + abort (); + } + } + /* Invalid category name. */ + return _UC_CATEGORY_NONE; +} diff --git a/gnulib/lib/unictype/categ_byname.gperf b/gnulib/lib/unictype/categ_byname.gperf new file mode 100644 index 0000000..54d1996 --- /dev/null +++ b/gnulib/lib/unictype/categ_byname.gperf @@ -0,0 +1,116 @@ +/* Categories of Unicode characters. */ +struct named_category { int name; unsigned int category_index; }; +%struct-type +%ignore-case +%language=ANSI-C +%define hash-function-name general_category_hash +%define lookup-function-name uc_general_category_lookup +%readonly-tables +%global-table +%define word-array-name general_category_names +%pic +%define string-pool-name general_category_stringpool +%% +L, UC_CATEGORY_INDEX_L +LC, UC_CATEGORY_INDEX_LC +Lu, UC_CATEGORY_INDEX_Lu +Ll, UC_CATEGORY_INDEX_Ll +Lt, UC_CATEGORY_INDEX_Lt +Lm, UC_CATEGORY_INDEX_Lm +Lo, UC_CATEGORY_INDEX_Lo +M, UC_CATEGORY_INDEX_M +Mn, UC_CATEGORY_INDEX_Mn +Mc, UC_CATEGORY_INDEX_Mc +Me, UC_CATEGORY_INDEX_Me +N, UC_CATEGORY_INDEX_N +Nd, UC_CATEGORY_INDEX_Nd +Nl, UC_CATEGORY_INDEX_Nl +No, UC_CATEGORY_INDEX_No +P, UC_CATEGORY_INDEX_P +Pc, UC_CATEGORY_INDEX_Pc +Pd, UC_CATEGORY_INDEX_Pd +Ps, UC_CATEGORY_INDEX_Ps +Pe, UC_CATEGORY_INDEX_Pe +Pi, UC_CATEGORY_INDEX_Pi +Pf, UC_CATEGORY_INDEX_Pf +Po, UC_CATEGORY_INDEX_Po +S, UC_CATEGORY_INDEX_S +Sm, UC_CATEGORY_INDEX_Sm +Sc, UC_CATEGORY_INDEX_Sc +Sk, UC_CATEGORY_INDEX_Sk +So, UC_CATEGORY_INDEX_So +Z, UC_CATEGORY_INDEX_Z +Zs, UC_CATEGORY_INDEX_Zs +Zl, UC_CATEGORY_INDEX_Zl +Zp, UC_CATEGORY_INDEX_Zp +C, UC_CATEGORY_INDEX_C +Cc, UC_CATEGORY_INDEX_Cc +Cf, UC_CATEGORY_INDEX_Cf +Cs, UC_CATEGORY_INDEX_Cs +Co, UC_CATEGORY_INDEX_Co +Cn, UC_CATEGORY_INDEX_Cn +Letter, UC_CATEGORY_INDEX_L +Cased Letter, UC_CATEGORY_INDEX_LC +CasedLetter, UC_CATEGORY_INDEX_LC +Uppercase Letter, UC_CATEGORY_INDEX_Lu +UppercaseLetter, UC_CATEGORY_INDEX_Lu +Lowercase Letter, UC_CATEGORY_INDEX_Ll +LowercaseLetter, UC_CATEGORY_INDEX_Ll +Titlecase Letter, UC_CATEGORY_INDEX_Lt +TitlecaseLetter, UC_CATEGORY_INDEX_Lt +Modifier Letter, UC_CATEGORY_INDEX_Lm +ModifierLetter, UC_CATEGORY_INDEX_Lm +Other Letter, UC_CATEGORY_INDEX_Lo +OtherLetter, UC_CATEGORY_INDEX_Lo +Mark, UC_CATEGORY_INDEX_M +Nonspacing Mark, UC_CATEGORY_INDEX_Mn +NonspacingMark, UC_CATEGORY_INDEX_Mn +Spacing Mark, UC_CATEGORY_INDEX_Mc +SpacingMark, UC_CATEGORY_INDEX_Mc +Enclosing Mark, UC_CATEGORY_INDEX_Me +EnclosingMark, UC_CATEGORY_INDEX_Me +Number, UC_CATEGORY_INDEX_N +Decimal Number, UC_CATEGORY_INDEX_Nd +DecimalNumber, UC_CATEGORY_INDEX_Nd +Letter Number, UC_CATEGORY_INDEX_Nl +LetterNumber, UC_CATEGORY_INDEX_Nl +Other Number, UC_CATEGORY_INDEX_No +OtherNumber, UC_CATEGORY_INDEX_No +Punctuation, UC_CATEGORY_INDEX_P +Connector Punctuation, UC_CATEGORY_INDEX_Pc +ConnectorPunctuation, UC_CATEGORY_INDEX_Pc +Dash Punctuation, UC_CATEGORY_INDEX_Pd +DashPunctuation, UC_CATEGORY_INDEX_Pd +Open Punctuation, UC_CATEGORY_INDEX_Ps +OpenPunctuation, UC_CATEGORY_INDEX_Ps +Close Punctuation, UC_CATEGORY_INDEX_Pe +ClosePunctuation, UC_CATEGORY_INDEX_Pe +Initial Punctuation, UC_CATEGORY_INDEX_Pi +InitialPunctuation, UC_CATEGORY_INDEX_Pi +Final Punctuation, UC_CATEGORY_INDEX_Pf +FinalPunctuation, UC_CATEGORY_INDEX_Pf +Other Punctuation, UC_CATEGORY_INDEX_Po +OtherPunctuation, UC_CATEGORY_INDEX_Po +Symbol, UC_CATEGORY_INDEX_S +Math Symbol, UC_CATEGORY_INDEX_Sm +MathSymbol, UC_CATEGORY_INDEX_Sm +Currency Symbol, UC_CATEGORY_INDEX_Sc +CurrencySymbol, UC_CATEGORY_INDEX_Sc +Modifier Symbol, UC_CATEGORY_INDEX_Sk +ModifierSymbol, UC_CATEGORY_INDEX_Sk +Other Symbol, UC_CATEGORY_INDEX_So +OtherSymbol, UC_CATEGORY_INDEX_So +Separator, UC_CATEGORY_INDEX_Z +Space Separator, UC_CATEGORY_INDEX_Zs +SpaceSeparator, UC_CATEGORY_INDEX_Zs +Line Separator, UC_CATEGORY_INDEX_Zl +LineSeparator, UC_CATEGORY_INDEX_Zl +Paragraph Separator, UC_CATEGORY_INDEX_Zp +ParagraphSeparator, UC_CATEGORY_INDEX_Zp +Other, UC_CATEGORY_INDEX_C +Control, UC_CATEGORY_INDEX_Cc +Format, UC_CATEGORY_INDEX_Cf +Surrogate, UC_CATEGORY_INDEX_Cs +Private Use, UC_CATEGORY_INDEX_Co +PrivateUse, UC_CATEGORY_INDEX_Co +Unassigned, UC_CATEGORY_INDEX_Cn diff --git a/gnulib/lib/unictype/categ_longname.c b/gnulib/lib/unictype/categ_longname.c new file mode 100644 index 0000000..58a653b --- /dev/null +++ b/gnulib/lib/unictype/categ_longname.c @@ -0,0 +1,106 @@ +/* Categories of Unicode characters. + Copyright (C) 2002, 2006-2007, 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unictype.h" + +static const char u_category_long_name[30][22] = +{ + "Uppercase Letter", + "Lowercase Letter", + "Titlecase Letter", + "Modifier Letter", + "Other Letter", + "Nonspacing Mark", + "Spacing Mark", + "Enclosing Mark", + "Decimal Number", + "Letter Number", + "Other Number", + "Connector Punctuation", + "Dash Punctuation", + "Open Punctuation", + "Close Punctuation", + "Initial Punctuation", + "Final Punctuation", + "Other Punctuation", + "Math Symbol", + "Currency Symbol", + "Modifier Symbol", + "Other Symbol", + "Space Separator", + "Line Separator", + "Paragraph Separator", + "Control", + "Format", + "Surrogate", + "Private Use", + "Unassigned" +}; + +const char * +uc_general_category_long_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_long_name) / sizeof (u_category_long_name[0])) + return u_category_long_name[bit]; + } + else + { + if (bitmask == UC_CATEGORY_MASK_L) + return "Letter"; + if (bitmask == UC_CATEGORY_MASK_LC) + return "Cased Letter"; + if (bitmask == UC_CATEGORY_MASK_M) + return "Mark"; + if (bitmask == UC_CATEGORY_MASK_N) + return "Number"; + if (bitmask == UC_CATEGORY_MASK_P) + return "Punctuation"; + if (bitmask == UC_CATEGORY_MASK_S) + return "Symbol"; + if (bitmask == UC_CATEGORY_MASK_Z) + return "Separator"; + if (bitmask == UC_CATEGORY_MASK_C) + return "Other"; + } + } + return NULL; +} diff --git a/gnulib/lib/unictype/categ_name.c b/gnulib/lib/unictype/categ_name.c new file mode 100644 index 0000000..40ecb92 --- /dev/null +++ b/gnulib/lib/unictype/categ_name.c @@ -0,0 +1,79 @@ +/* Categories of Unicode characters. + Copyright (C) 2002, 2006-2007, 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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_LC) + return "LC"; + 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 0000000..63ce05e --- /dev/null +++ b/gnulib/lib/unictype/categ_none.c @@ -0,0 +1,30 @@ +/* Categories of Unicode characters. + Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..98ba78a --- /dev/null +++ b/gnulib/lib/unictype/categ_of.c @@ -0,0 +1,81 @@ +/* Categories of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..ba7bf71 --- /dev/null +++ b/gnulib/lib/unictype/categ_of.h @@ -0,0 +1,1213 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Categories of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[173 * 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, + 2048, -1, 2176, 2304, 2432, 2560, 2688, 2816, + 2944, 3072, 3200, 3328, 3456, 3584, 3712, 3840, + 3968, 4096, 4224, 4224, 4352, 4480, 4608, 4736, + 4864, 4224, 4224, 4224, 4992, 5120, 5248, 5376, + 5504, 5632, 5760, 5888, 6016, 6144, 6272, 6400, + 6528, 6656, 6784, 6912, 7040, 7168, 7296, 7424, + 7552, 7680, 7808, 7936, 8064, 8064, 8192, 8320, + 8448, 8576, 8704, 8832, 8960, 8704, 9088, 9216, + 8704, 8704, 8064, 9344, 8064, 8064, 9472, -1, + 9600, 9728, 9856, 9984, 10112, 10240, 8704, 10368, + 10496, 10624, 10752, 10880, 11008, 11136, 8704, 8704, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 11264, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 11392, + 11520, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 11648, 4224, 4224, 11776, 11904, 12032, 12160, + 12288, 12416, 12544, 12672, 12800, 12928, 13056, 13184, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 13312, + 13440, 13440, 13440, 13440, 13440, 13440, 13440, 13440, + 13440, 13440, 13440, 13440, 13440, 13440, 13440, 13440, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 4224, 4224, 13696, 13824, 13952, 14080, + 4224, 4224, 14208, 14336, 14464, 14592, 14720, 14848, + 14976, 15104, 15232, 15360, -1, 15488, 15616, 15744, + 15872, 16000, -1, -1, -1, -1, -1, -1, + 16128, -1, 16256, -1, 16384, -1, 16512, -1, + 16640, -1, -1, -1, 16768, -1, -1, -1, + 16896, 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, + 4224, 4224, 4224, 4224, 4224, 4224, 17152, -1, + 17280, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 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, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 4224, 4224, 4224, 4224, 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, + 17664, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 8704, 17792, 17920, 18048, 18176, -1, 18304, -1, + 18432, 18560, 18688, 18816, 18944, 19072, 19200, 19328, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 19456, 19584, 19712, 19840, 19968, -1, 20096, 20224, + 20352, 20480, 20608, 20736, 20864, 20992, 21120, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 21248, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, + 4224, 4224, 4224, 4224, 4224, 4224, 21376, 4224, + 21504, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 4224, 4224, 4224, 4224, 21504, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 21632, -1, 21760, 21888, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568, + 13568, 13568, 13568, 13568, 13568, 13568, 13568, 22016 + }, + { + 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, 0x0200, 0xbd08, 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, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, + 0x0842, 0x8421, 0x4210, 0x2108, 0x1083, 0x0842, 0x8421, 0x5290, + 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 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, 0x2d74, 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, + 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x4842, 0xa529, + 0x528c, 0x294a, 0x94a5, 0x4a32, 0xa329, 0x5294, 0xef4a, 0xc631, + 0x6318, 0x318c, 0x18c6, 0xec63, 0x1084, 0x0842, 0x8421, 0x4210, + 0x2108, 0x1084, 0x0842, 0xa421, 0xd294, 0xec7b, 0xf7bd, 0x7bde, + 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, + 0x14a5, 0x0843, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, + 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, + 0x0842, 0x8421, 0x5314, 0x3188, 0x94a6, 0x4a52, 0xc529, 0x6318, + 0x318a, 0x94a4, 0x4a52, 0x8429, 0x4210, 0x2108, 0x9484, 0x2312, + 0x0842, 0x8421, 0x4210, 0x1071, 0x0842, 0x9d21, 0x4210, 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, 0xd9d5, 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, 0x2895, 0x94a5, 0xbd52, 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, 0x909d, 0x7bde, 0xbdef, 0xdef7, 0xef7b, + 0x1bbd, 0x09d3, 0x8421, 0x4210, 0x213a, 0x13a4, 0x0842, 0x8421, + 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, + 0x0842, 0x8421, 0xde90, 0x3189, 0x94a6, 0xba52, 0xa631, 0x631b, + 0xe90a, 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, 0x4210, 0x294a, 0x94a5, 0x4a52, 0xbd29, + 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, + 0x4a52, 0xa529, 0x5294, 0xad7a, 0xd6b5, 0x6b5a, 0xb5a9, 0x5ad6, + 0xad7b, 0xc631, 0x6b18, 0x35ad, 0xdec6, 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, + 0x6319, 0xad4a, 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, 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, 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, 0x294b, 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, + 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, 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, 0x8421, 0x4210, 0x2108, + 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, 0x1084, + 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, + 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, + 0x8421, 0x4210, 0x2108, 0x1084, 0x4842, 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, 0xd210, 0xef7b, 0x18c6, + 0x8c63, 0xc631, 0x6318, 0x318c, 0x1086, 0x0842, 0xc621, 0xdef4, + 0xef7b, 0x2108, 0x1084, 0x0842, 0xdea9, 0xad7b, 0xd6b5, 0x6b5a, + 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, + 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xc529, + 0xd318, 0x8c7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, + 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, + 0x2108, 0x1084, 0x4c42, 0xa531, 0x5294, 0xe94a, 0x14c5, 0x4a63, + 0xa529, 0x5294, 0x318c, 0x98c6, 0x4a52, 0xa529, 0x5294, 0x2f7a, + 0x2108, 0x1084, 0x0842, 0xdef5, 0xef7b, 0x2108, 0x1084, 0x0842, + 0xdef5, 0xef7b, 0xc631, 0x6318, 0x311c, 0x18c6, 0xef63, 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, 0x1084, 0x0842, 0x8421, 0x4210, + 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x4842, + 0xa531, 0x6318, 0x298a, 0x18a5, 0x7bd3, 0xbdef, 0x1ef7, 0x8c63, + 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, + 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, 0x4a58, 0xa529, 0x5294, 0x294a, 0x94c5, 0x4a52, + 0x8529, 0x4210, 0x210a, 0x9884, 0x7bde, 0xbdef, 0xdef7, 0xef7b, + 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, 0x5ef7, 0x294a, + 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, 0xf46a, 0x94ae, 0x4a52, 0x2949, 0x1b9b, + 0x294a, 0x94a5, 0x4a52, 0x2949, 0xeb9b, 0x8c63, 0xc631, 0x6318, + 0x318c, 0xef7a, 0xce73, 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73, + 0xe739, 0x739c, 0xdef6, 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, 0x12ad, + 0x0000, 0xad40, 0xd6b5, 0x2a0a, 0xa0a8, 0x0002, 0x0d40, 0x0000, + 0x0810, 0x2421, 0x1ad4, 0x0002, 0x4a52, 0x4129, 0x2108, 0x5954, + 0xa86b, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0xa529, 0x5294, + 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, + 0x2529, 0x5210, 0x494a, 0xdef5, 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, + 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x7bda, 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, + 0xd6bd, 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, + 0xcdad, 0xd735, 0x735c, 0x35cd, 0x9cd7, 0x4a52, 0xa529, 0x5294, + 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x6b55, 0xb5ad, + 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, + 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0x4a52, 0x9b29, 0x5293, 0x2eca, + 0x94bb, 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, 0x6b5a, 0xb5ad, 0xdef6, 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, 0x8020, 0x4010, 0x2108, 0x1084, 0x0006, + 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, 0x1056, 0x2840, 0xf4a5, 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, 0xf7b1, 0x7bde, 0xbdef, 0xdef7, 0x2f7b, + 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, 0xf631, + 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, 0x8421, 0xde90, 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, 0x6b5a, 0xb5ad, 0x5ad6, + 0xad6b, 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, 0x0842, 0x8421, 0xd210, + 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, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, + 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x6321, 0x318c, 0x8c46, + 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, 0x8020, 0x0200, + 0x2008, 0x0080, 0x2902, 0x9ce7, 0x7bd8, 0xbdef, 0x5ef7, 0x1c4a, + 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0xbd08, + 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, + 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, + 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x4842, + 0x294a, 0x94a5, 0x4a52, 0xc4a5, 0x6318, 0xbd8c, 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, 0xe840, 0xf420, 0x7bde, 0xbdef, + 0xdef7, 0xef7b, 0x8020, 0x0200, 0x2008, 0xdef4, 0xef7b, 0xf7bd, + 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, + 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, + 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0x4207, 0x2108, + 0x1484, 0x4842, 0x8421, 0x4290, 0x2108, 0x1084, 0x0842, 0x8421, + 0x4210, 0x2108, 0x1084, 0x4a63, 0xb531, 0xdad6, 0xef7b, 0x294a, + 0x54a5, 0xb3ad, 0xdef6, 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, 0x94a5, 0x4a52, + 0xa529, 0x5294, 0x294a, 0x10a5, 0x0842, 0x3121, 0xd246, 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, 0x1084, 0x0842, + 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0xef7a, + 0x14a5, 0x0843, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, + 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x9084, + 0x4c62, 0xa529, 0x5318, 0x318c, 0xc626, 0x6318, 0x318c, 0x18c6, + 0x1f63, 0x2108, 0x1084, 0x0842, 0xdef5, 0x8c7b, 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, 0x1084, 0x0842, + 0x8421, 0x4210, 0x2108, 0x1083, 0x0842, 0xb5a9, 0xd312, 0xef7b, + 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, + 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x9485, + 0x0852, 0x8529, 0x4210, 0x2948, 0x90a4, 0x7bde, 0xbdef, 0xdef7, + 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0x4277, 0x8c46, 0xf7bd, 0x7bde, + 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, + 0x109d, 0x0842, 0x9de9, 0x4210, 0xe908, 0x109d, 0x0842, 0xbde9, + 0xdef7, 0xef7b, 0x1084, 0x0842, 0x84e9, 0x4210, 0xe908, 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, 0xef7b, 0xf7bd, + 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, + 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x8a63, + 0xc531, 0x6898, 0xef4a, 0x2108, 0x1084, 0x0842, 0xdef5, 0xef7b, + 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, + 0x4210, 0x2108, 0x1084, 0x7bd2, 0xbdef, 0xdef7, 0xef7b, 0x1084, + 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xbde9, 0x4277, + 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, + 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0xd210, 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, 0x4210, 0xef48, 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, 0x5084, + 0x294a, 0x94a5, 0x4a52, 0xa529, 0xf694, 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, 0x1084, 0x0842, 0x8421, 0x4210, + 0x2108, 0x1084, 0x4842, 0x4a8f, 0xa529, 0x5294, 0xf7bd, 0x7bde, + 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, + 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x8842, 0x4a52, + 0xd529, 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, 0x1084, 0x0842, + 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x8a94, + 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, + 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, + 0x4842, 0x3def, 0x18c6, 0x8c63, 0x1084, 0x0842, 0x8421, 0x4210, + 0x2108, 0x1084, 0x4842, 0x4aef, 0xa529, 0x5294, 0x1084, 0x0842, + 0x8421, 0x4210, 0x2108, 0x9084, 0x7bde, 0x4aef, 0xa529, 0x5294, + 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, + 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, + 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xa421, 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, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, + 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x294a, 0x94a5, + 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0xea94, + 0x18a6, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, + 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, + 0x0842, 0xa521, 0x5294, 0x294a, 0x94a5, 0x4a52, 0x3189, 0x18c6, + 0xef63, 0x2bbd, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x14a5, + 0x0842, 0x8421, 0x4210, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, + 0x18a5, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, + 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x98c6, + 0x4a52, 0xa631, 0x1894, 0x8c75, 0xf631, 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, 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, + 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, + 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0xe908, 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, 0xa421, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, + 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, + 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, + 0xf484, 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, 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, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xed6b, 0xd6bd, + 0x6b5a, 0xb5ad, 0x5ad6, 0xed6b, 0xd6bd, 0x6b5a, 0xb5ad, 0x5ad6, + 0xad6b, 0xd6bd, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xf7bd, 0x7bde, + 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, + 0x294a, 0x94a5, 0x4a52, 0xdea9, 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, + 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xed6b, 0xd6b5, + 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, + 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, + 0xb5ad, 0xdef6, 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, + 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, + 0xded6, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, + 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, + 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, + 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, + 0xd6b5, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, + 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, + 0x6b5a, 0xb5ad, 0xded6, 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, 0xdef7, + 0xef7b, 0xf6b5, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, + 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, + 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, + 0x5ad6, 0xad6b, 0xf7b5, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xd6b5, + 0x6b5a, 0xb5af, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, + 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, + 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xef7b, + 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x7bda, 0xbdef, + 0xdef7, 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, + 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x7b5a, 0xb5ad, 0xded6, + 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xd6b5, 0x6b5a, + 0xb5ad, 0x5ad6, 0xad6b, 0xf7b5, 0x7bde, 0xbdef, 0xdef7, 0xef7b, + 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, + 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, + 0x6b5a, 0xb5ad, 0x5ad6, 0xed6b, 0xd7b5, 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, 0xbdad, 0x5ad6, 0xef7b, + 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, + 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, + 0x6b5a, 0xb5ad, 0x5ad6, 0xef6b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, + 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, + 0xbdad, 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, 0xef7b, 0xf7bd, 0x7bde, + 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0x5af7, 0xad6b, + 0xd6bd, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd7b5, 0x7b5a, 0xb5ed, + 0x5ed7, 0xed6b, 0xd6b5, 0x6b5a, 0xb5ef, 0xdad6, 0xef6b, 0xd6b5, + 0x6bda, 0xb5ad, 0x5ad6, 0xad6b, 0xf7b5, 0x6bde, 0xb5ad, 0x5ad6, + 0xad6b, 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, 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, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, + 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x7bda, 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, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, + 0x7a42, 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, 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 0000000..09c6862 --- /dev/null +++ b/gnulib/lib/unictype/categ_or.c @@ -0,0 +1,42 @@ +/* Categories of Unicode characters. + Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..bdc4d7c --- /dev/null +++ b/gnulib/lib/unictype/categ_test.c @@ -0,0 +1,32 @@ +/* Categories of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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/combiningclass.c b/gnulib/lib/unictype/combiningclass.c new file mode 100644 index 0000000..66b090b --- /dev/null +++ b/gnulib/lib/unictype/combiningclass.c @@ -0,0 +1,47 @@ +/* Combining classes of Unicode characters. + Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unictype.h" + +/* Define u_combclass table. */ +#include "combiningclass.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/combiningclass.h b/gnulib/lib/unictype/combiningclass.h new file mode 100644 index 0000000..a87e75b --- /dev/null +++ b/gnulib/lib/unictype/combiningclass.h @@ -0,0 +1,999 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Combining class of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[53 << 7]; + } +u_combclass = +{ + { 0, 512 }, + { + -1, -1, -1, -1, -1, -1, 0, -1, + -1, 128, -1, 256, 384, 512, 640, 768, + 896, -1, 1024, 1152, 1152, 1152, 1152, 1280, + 1408, 1152, 1280, 1536, 1664, 1792, 1920, 2048, + 2176, 2304, -1, -1, -1, -1, 2432, -1, + -1, -1, -1, -1, -1, -1, 2560, 2688, + -1, 2816, 2944, -1, 3072, -1, 3200, 3328, + 3456, 3584, -1, 3712, -1, -1, -1, -1, + -1, 3840, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3968, 4096, 4224, -1, -1, -1, -1, + 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, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -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, 4736, -1, -1, + 4864, 4992, 5120, 5248, -1, 5376, -1, 5504, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 5632, -1, + -1, -1, -1, -1, 5760, -1, -1, -1, + -1, -1, -1, 5888, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 6016, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 6144, 6272, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 6400, 6528, 6656, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -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, 220, + 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, 230, 230, + 230, 230, 0, 230, 230, 230, 230, 230, + 230, 230, 230, 230, 0, 230, 230, 230, + 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, 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, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 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, 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, 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, + 9, 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, 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, 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, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 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, 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, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 230, 230, 230, 0, 1, 220, 220, 220, + 220, 220, 230, 230, 220, 220, 220, 220, + 230, 0, 1, 1, 1, 1, 1, 1, + 1, 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, + 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, 233, 220, 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, + 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, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 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, + 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, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 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, 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, 0, 0, 0, 0, + 0, 0, 0, 0, 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, + 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, 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, 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, + 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, + 230, 0, 230, 230, 220, 0, 0, 230, + 230, 0, 0, 0, 0, 0, 230, 230, + 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, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 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, 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, 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, 9, 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, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 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/combiningclass_byname.c b/gnulib/lib/unictype/combiningclass_byname.c new file mode 100644 index 0000000..3880523 --- /dev/null +++ b/gnulib/lib/unictype/combiningclass_byname.c @@ -0,0 +1,63 @@ +/* Canonical combining classes of Unicode characters. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unictype.h" + +#include + +#include "unictype/combiningclass_byname.h" + +int +uc_combining_class_byname (const char *ccc_name) +{ + size_t len; + + len = strlen (ccc_name); + if (len <= MAX_WORD_LENGTH) + { + char buf[MAX_WORD_LENGTH + 1]; + const struct named_combining_class *found; + + /* Copy ccc_name into buf, converting '_' and '-' to ' '. */ + { + const char *p = ccc_name; + char *q = buf; + + for (;; p++, q++) + { + char c = *p; + + if (c == '_' || c == '-') + c = ' '; + *q = c; + if (c == '\0') + break; + } + } + /* Here q == buf + len. */ + + /* Do a hash table lookup, with case-insensitive comparison. */ + found = uc_combining_class_lookup (buf, len); + if (found != NULL) + return found->combining_class; + } + /* Invalid combining class name. */ + return -1; +} diff --git a/gnulib/lib/unictype/combiningclass_byname.gperf b/gnulib/lib/unictype/combiningclass_byname.gperf new file mode 100644 index 0000000..4096850 --- /dev/null +++ b/gnulib/lib/unictype/combiningclass_byname.gperf @@ -0,0 +1,66 @@ +/* Categories of Unicode characters. */ +struct named_combining_class { int name; int combining_class; }; +%struct-type +%ignore-case +%language=ANSI-C +%define hash-function-name combining_class_hash +%define lookup-function-name uc_combining_class_lookup +%readonly-tables +%global-table +%define word-array-name combining_class_names +%pic +%define string-pool-name combining_class_stringpool +%% +NR, UC_CCC_NR +OV, UC_CCC_OV +NK, UC_CCC_NK +KV, UC_CCC_KV +VR, UC_CCC_VR +ATBL, UC_CCC_ATBL +ATB, UC_CCC_ATB +ATA, UC_CCC_ATA +ATAR, UC_CCC_ATAR +BL, UC_CCC_BL +B, UC_CCC_B +BR, UC_CCC_BR +L, UC_CCC_L +R, UC_CCC_R +AL, UC_CCC_AL +A, UC_CCC_A +AR, UC_CCC_AR +DB, UC_CCC_DB +DA, UC_CCC_DA +IS, UC_CCC_IS +Not Reordered, UC_CCC_NR +NotReordered, UC_CCC_NR +Overlay, UC_CCC_OV +Nukta, UC_CCC_NK +Kana Voicing, UC_CCC_KV +KanaVoicing, UC_CCC_KV +Virama, UC_CCC_VR +Attached Below Left, UC_CCC_ATBL +AttachedBelowLeft, UC_CCC_ATBL +Attached Below, UC_CCC_ATB +AttachedBelow, UC_CCC_ATB +Attached Above, UC_CCC_ATA +AttachedAbove, UC_CCC_ATA +Attached Above Right, UC_CCC_ATAR +AttachedAboveRight, UC_CCC_ATAR +Below Left, UC_CCC_BL +BelowLeft, UC_CCC_BL +Below, UC_CCC_B +Below Right, UC_CCC_BR +BelowRight, UC_CCC_BR +Left, UC_CCC_L +Right, UC_CCC_R +Above Left, UC_CCC_AL +AboveLeft, UC_CCC_AL +Above, UC_CCC_A +Above Right, UC_CCC_AR +AboveRight, UC_CCC_AR +Double Below, UC_CCC_DB +DoubleBelow, UC_CCC_DB +Double Above, UC_CCC_DA +DoubleAbove, UC_CCC_DA +Iota Subscript, UC_CCC_IS +IotaSubscript, UC_CCC_IS diff --git a/gnulib/lib/unictype/combiningclass_longname.c b/gnulib/lib/unictype/combiningclass_longname.c new file mode 100644 index 0000000..d328279 --- /dev/null +++ b/gnulib/lib/unictype/combiningclass_longname.c @@ -0,0 +1,130 @@ +/* Canonical combining classes of Unicode characters. + Copyright (C) 2002, 2006-2007, 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unictype.h" + +#include + +static const signed char u_combining_class_index_part1[10] = +{ + 0, /* Not Reordered */ + 1, /* Overlay */ + -1, + -1, + -1, + -1, + -1, + 2, /* Nukta */ + 3, /* Kana Voicing */ + 4 /* Virama */ +}; +static const signed char u_combining_class_index_part2[241 - 200] = +{ + 5, /* Attached Below Left */ + -1, + 6, /* Attached Below */ + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 7, /* Attached Above */ + -1, + 8, /* Attached Above Right */ + -1, + 9, /* Below Left */ + -1, + 10, /* Below */ + -1, + 11, /* Below Right */ + -1, + 12, /* Left */ + -1, + 13, /* Right */ + -1, + 14, /* Above Left */ + -1, + 15, /* Above */ + -1, + 16, /* Above Right */ + 17, /* Double Below */ + 18, /* Double Above */ + -1, + -1, + -1, + -1, + -1, + 19 /* Iota Subscript */ +}; + +static const char u_combining_class_long_name[20][21] = +{ + "Not Reordered", + "Overlay", + "Nukta", + "Kana Voicing", + "Virama", + "Attached Below Left", + "Attached Below", + "Attached Above", + "Attached Above Right", + "Below Left", + "Below", + "Below Right", + "Left", + "Right", + "Above Left", + "Above", + "Above Right", + "Double Below", + "Double Above", + "Iota Subscript" +}; + +const char * +uc_combining_class_long_name (int ccc) +{ + if (ccc >= 0) + { + int index; + + if (ccc < 10) + index = u_combining_class_index_part1[ccc]; + else if (ccc >= 200 && ccc < 241) + index = u_combining_class_index_part2[ccc - 200]; + else + return NULL; + + if (index >= 0) + { + if (index < sizeof (u_combining_class_long_name) / sizeof (u_combining_class_long_name[0])) + return u_combining_class_long_name[index]; + else + abort (); + } + } + return NULL; +} diff --git a/gnulib/lib/unictype/combiningclass_name.c b/gnulib/lib/unictype/combiningclass_name.c new file mode 100644 index 0000000..0cf2bb8 --- /dev/null +++ b/gnulib/lib/unictype/combiningclass_name.c @@ -0,0 +1,130 @@ +/* Canonical combining classes of Unicode characters. + Copyright (C) 2002, 2006-2007, 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unictype.h" + +#include + +static const signed char u_combining_class_index_part1[10] = +{ + 0, /* Not Reordered */ + 1, /* Overlay */ + -1, + -1, + -1, + -1, + -1, + 2, /* Nukta */ + 3, /* Kana Voicing */ + 4 /* Virama */ +}; +static const signed char u_combining_class_index_part2[241 - 200] = +{ + 5, /* Attached Below Left */ + -1, + 6, /* Attached Below */ + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 7, /* Attached Above */ + -1, + 8, /* Attached Above Right */ + -1, + 9, /* Below Left */ + -1, + 10, /* Below */ + -1, + 11, /* Below Right */ + -1, + 12, /* Left */ + -1, + 13, /* Right */ + -1, + 14, /* Above Left */ + -1, + 15, /* Above */ + -1, + 16, /* Above Right */ + 17, /* Double Below */ + 18, /* Double Above */ + -1, + -1, + -1, + -1, + -1, + 19 /* Iota Subscript */ +}; + +static const char u_combining_class_name[20][5] = +{ + "NR", /* Not Reordered */ + "OV", /* Overlay */ + "NK", /* Nukta */ + "KV", /* Kana Voicing */ + "VR", /* Virama */ + "ATBL", /* Attached Below Left */ + "ATB", /* Attached Below */ + "ATA", /* Attached Above */ + "ATAR", /* Attached Above Right */ + "BL", /* Below Left */ + "B", /* Below */ + "BR", /* Below Right */ + "L", /* Left */ + "R", /* Right */ + "AL", /* Above Left */ + "A", /* Above */ + "AR", /* Above Right */ + "DB", /* Double Below */ + "DA", /* Double Above */ + "IS" /* Iota Subscript */ +}; + +const char * +uc_combining_class_name (int ccc) +{ + if (ccc >= 0) + { + int index; + + if (ccc < 10) + index = u_combining_class_index_part1[ccc]; + else if (ccc >= 200 && ccc < 241) + index = u_combining_class_index_part2[ccc - 200]; + else + return NULL; + + if (index >= 0) + { + if (index < sizeof (u_combining_class_name) / sizeof (u_combining_class_name[0])) + return u_combining_class_name[index]; + else + abort (); + } + } + return NULL; +} diff --git a/gnulib/lib/unictype/ctype_alnum.c b/gnulib/lib/unictype/ctype_alnum.c new file mode 100644 index 0000000..2b328fe --- /dev/null +++ b/gnulib/lib/unictype/ctype_alnum.c @@ -0,0 +1,32 @@ +/* ISO C like properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..4399aa4 --- /dev/null +++ b/gnulib/lib/unictype/ctype_alnum.h @@ -0,0 +1,616 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* ISO C like properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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_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, + 4 + 384 * sizeof (short) / sizeof (int) + 608, + -1, + 4 + 384 * sizeof (short) / sizeof (int) + 624, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 4 + 384 * sizeof (short) / sizeof (int) + 336, + 4 + 384 * sizeof (short) / sizeof (int) + 640, + 4 + 384 * sizeof (short) / sizeof (int) + 656, + -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) + 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, + 4 + 384 * sizeof (short) / sizeof (int) + 336, + 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, + 4 + 384 * sizeof (short) / sizeof (int) + 704, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 4 + 384 * sizeof (short) / sizeof (int) + 720, + 4 + 384 * sizeof (short) / sizeof (int) + 736, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 4 + 384 * sizeof (short) / sizeof (int) + 752, + -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) + 768, + 4 + 384 * sizeof (short) / sizeof (int) + 336, + 4 + 384 * sizeof (short) / sizeof (int) + 336, + 4 + 384 * sizeof (short) / sizeof (int) + 336, + 4 + 384 * sizeof (short) / sizeof (int) + 336, + 4 + 384 * sizeof (short) / sizeof (int) + 336, + 4 + 384 * sizeof (short) / sizeof (int) + 336, + 4 + 384 * sizeof (short) / sizeof (int) + 336, + 4 + 384 * sizeof (short) / sizeof (int) + 784, + 4 + 384 * 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, + 4 + 384 * sizeof (short) / sizeof (int) + 336, + 4 + 384 * sizeof (short) / sizeof (int) + 800, + -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, 0xFFFE00FF, 0x027FFFFF, 0xFFFFFFFE, + 0x000000FF, 0x00000000, 0xFFFF0000, 0x000707FF, + 0x00000000, 0xFFFFFFFF, 0x000007FF, 0xFFFEC3FF, + 0xFFFFFFFF, 0xFFFFFFFF, 0x002FFFFF, 0x9FFFC060, + 0xFFFD0000, 0x0000FFFF, 0xFFFFE000, 0xFFFFFFFF, + 0xFFFFFFFF, 0x0002003F, 0xFFFFFFFF, 0x043007FF, + 0x043FFFFF, 0x00000110, 0x01FFFFFF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFF0, 0x23FFFFFF, 0xFF010000, 0xFEFEFFC3, + 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, 0x0006FFC3, + 0xFFFDDFE0, 0x27FFFFFF, 0x00004000, 0xFC00FFC3, + 0xFC7FFFE0, 0x2FFBFFFF, 0x0000007F, 0x00000000, + 0xFFFFFFFE, 0x07FF7FFF, 0x03FF7FBF, 0x00000000, + 0xFEF02596, 0x200DECAE, 0x33FF005F, 0x00000000, + 0x00000001, 0x000003FF, 0xFFFFFEFF, 0x00001FFF, + 0x00001F00, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0x800007FF, 0x3C3F03FF, 0xFFE1C062, + 0x03FF4003, 0xFFFFFFFF, 0xFFFF003F, 0x17FFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 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, 0xFFFF9FFF, + 0x07FFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0x0001C7FF, + 0x0003DFFF, 0x0003FFFF, 0x0003FFFF, 0x0001DFFF, + 0xFFFFFFFF, 0x000FFFFF, 0x10800000, 0x000003FF, + 0x03FF0000, 0xFFFFFFFF, 0xFFFFFFFF, 0x00FFFFFF, + 0xFFFFFFFF, 0xFFFF05FF, 0xFFFFFFFF, 0x003FFFFF, + 0x1FFFFFFF, 0x00000000, 0xFFFFFFC0, 0x001F3FFF, + 0xFFFFFFFF, 0x00000FFF, 0x03FF00FE, 0x00000000, + 0x007FFFFF, 0xFFFFFFFF, 0x001FFFFF, 0x00000000, + 0x03FF03FF, 0x00000080, 0x00000000, 0x00000000, + 0xFFFFFFE0, 0x000FFFFF, 0x03FF0FE0, 0x00000000, + 0xFFFFFFF8, 0x03FFC001, 0xFFFFFFFF, 0x0000003F, + 0xFFFFFFFF, 0x0000000F, 0xFFFFE3FF, 0x3FFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x0003DE00, + 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, + 0x1FFF0000, 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, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000781F, + 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, 0x07FFFFFF, 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, 0x00000FFF, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x00001FFF, 0x00000000, 0xFFFF0000, 0x3FFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFF1FFF, 0x00000FFF, 0xFFFFFFFF, 0x80007FFF, + 0x00FFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF, + 0xFF800000, 0xFFFFFFFC, 0xFFFFFFFF, 0xFFFFFFFF, + 0x000379FF, 0x000003FF, 0x00000000, 0xFC000000, + 0xFFFFF7BB, 0x00000007, 0xFFFFFFFF, 0x000FFFFF, + 0xFFFFFFFC, 0x000FFFFF, 0x03FF0000, 0x08FC0000, + 0xFFFFFFFF, 0xFFFF003F, 0x0000007F, 0x1FFFFFFF, + 0xFFFFFFF0, 0x0007FFFF, 0x03FF8000, 0x00000000, + 0xFFFFFFFF, 0x000001FF, 0x03FF0FF7, 0x047FFFFF, + 0xFFFFFFFF, 0x3E62FFFF, 0x38000005, 0x00000000, + 0x007E7E7E, 0x00007F7F, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xFFFFFFFF, 0x03FF0007, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFF000F, 0xFFFFF87F, 0x0FFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFF3FFF, 0xFFFFFFFF, 0xFFFF3FFF, + 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, 0x003FFFFF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x003FFFFF, 0x03FFFFFF, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFEEF0001, 0x000FFFFF, 0x00000000, 0x1FFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0x003FFFFF, 0x003FFFFF, 0x0007FFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0x000001FF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFF8, 0x00FFFFFF, 0x00000000, 0x0000FFC0, + 0xFFFFFFF8, 0x0000FFFF, 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, 0x00007FFF, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0x01FFFFFF, 0x00000000, 0x00000000, + 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, + 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, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFF0000, 0xFFFF1FFF, 0xFFFF03FF, 0xFFFF03FF, + 0x000007FF, 0x00000000, 0x00000000, 0xFFFFFFC0, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0x001FFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 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 0000000..63be5ff --- /dev/null +++ b/gnulib/lib/unictype/ctype_alpha.c @@ -0,0 +1,32 @@ +/* ISO C like properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..db408cf --- /dev/null +++ b/gnulib/lib/unictype/ctype_alpha.h @@ -0,0 +1,616 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* ISO C like properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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_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, + 4 + 384 * sizeof (short) / sizeof (int) + 608, + -1, + 4 + 384 * sizeof (short) / sizeof (int) + 624, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 4 + 384 * sizeof (short) / sizeof (int) + 336, + 4 + 384 * sizeof (short) / sizeof (int) + 640, + 4 + 384 * sizeof (short) / sizeof (int) + 656, + -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) + 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, + 4 + 384 * sizeof (short) / sizeof (int) + 336, + 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, + 4 + 384 * sizeof (short) / sizeof (int) + 704, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 4 + 384 * sizeof (short) / sizeof (int) + 720, + 4 + 384 * sizeof (short) / sizeof (int) + 736, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 4 + 384 * sizeof (short) / sizeof (int) + 752, + -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) + 768, + 4 + 384 * sizeof (short) / sizeof (int) + 336, + 4 + 384 * sizeof (short) / sizeof (int) + 336, + 4 + 384 * sizeof (short) / sizeof (int) + 336, + 4 + 384 * sizeof (short) / sizeof (int) + 336, + 4 + 384 * sizeof (short) / sizeof (int) + 336, + 4 + 384 * sizeof (short) / sizeof (int) + 336, + 4 + 384 * sizeof (short) / sizeof (int) + 336, + 4 + 384 * sizeof (short) / sizeof (int) + 784, + 4 + 384 * 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, + 4 + 384 * sizeof (short) / sizeof (int) + 336, + 4 + 384 * sizeof (short) / sizeof (int) + 800, + -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, 0xFFFE00FF, 0x027FFFFF, 0xFFFFFFFE, + 0x000000FF, 0x00000000, 0xFFFF0000, 0x000707FF, + 0x00000000, 0xFFFFFFFF, 0x000007FF, 0xFFFEC3FF, + 0xFFFFFFFF, 0xFFFFFFFF, 0x002FFFFF, 0x9FFFC060, + 0xFFFD0000, 0x0000FFFF, 0xFFFFE000, 0xFFFFFFFF, + 0xFFFFFFFF, 0x0002003F, 0xFFFFFFFF, 0x043007FF, + 0x043FFFFF, 0x00000110, 0x01FFFFFF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFF0, 0x23FFFFFF, 0xFF010000, 0xFEFEFFC3, + 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, 0x0006FFC3, + 0xFFFDDFE0, 0x27FFFFFF, 0x00004000, 0xFC00FFC3, + 0xFC7FFFE0, 0x2FFBFFFF, 0x0000007F, 0x00000000, + 0xFFFFFFFE, 0x07FF7FFF, 0x03FF7FBF, 0x00000000, + 0xFEF02596, 0x200DECAE, 0x33FF005F, 0x00000000, + 0x00000001, 0x000003FF, 0xFFFFFEFF, 0x00001FFF, + 0x00001F00, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0x800007FF, 0x3C3F03FF, 0xFFE1C062, + 0x03FF4003, 0xFFFFFFFF, 0xFFFF003F, 0x17FFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 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, 0xFFFF9FFF, + 0x07FFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0x0001C7FF, + 0x0003DFFF, 0x0003FFFF, 0x0003FFFF, 0x0001DFFF, + 0xFFFFFFFF, 0x000FFFFF, 0x10800000, 0x000003FF, + 0x03FF0000, 0xFFFFFFFF, 0xFFFFFFFF, 0x00FFFFFF, + 0xFFFFFFFF, 0xFFFF05FF, 0xFFFFFFFF, 0x003FFFFF, + 0x1FFFFFFF, 0x00000000, 0xFFFFFFC0, 0x001F3FFF, + 0xFFFFFFFF, 0x00000FFF, 0x03FF00FE, 0x00000000, + 0x007FFFFF, 0xFFFFFFFF, 0x001FFFFF, 0x00000000, + 0x03FF03FF, 0x00000080, 0x00000000, 0x00000000, + 0xFFFFFFE0, 0x000FFFFF, 0x03FF0FE0, 0x00000000, + 0xFFFFFFF8, 0x03FFC001, 0xFFFFFFFF, 0x0000003F, + 0xFFFFFFFF, 0x0000000F, 0xFFFFE3FF, 0x3FFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x0003DE00, + 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, + 0x1FFF0000, 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, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000781F, + 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, 0x07FFFFFF, 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, 0x00000FFF, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x00001FFF, 0x00000000, 0xFFFF0000, 0x3FFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFF1FFF, 0x00000FFF, 0xFFFFFFFF, 0x80007FFF, + 0x00FFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF, + 0xFF800000, 0xFFFFFFFC, 0xFFFFFFFF, 0xFFFFFFFF, + 0x000379FF, 0x000003FF, 0x00000000, 0xFC000000, + 0xFFFFF7BB, 0x00000007, 0xFFFFFFFF, 0x000FFFFF, + 0xFFFFFFFC, 0x000FFFFF, 0x03FF0000, 0x08FC0000, + 0xFFFFFFFF, 0xFFFF003F, 0x0000007F, 0x1FFFFFFF, + 0xFFFFFFF0, 0x0007FFFF, 0x03FF8000, 0x00000000, + 0xFFFFFFFF, 0x000001FF, 0x03FF0FF7, 0x047FFFFF, + 0xFFFFFFFF, 0x3E62FFFF, 0x38000005, 0x00000000, + 0x007E7E7E, 0x00007F7F, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xFFFFFFFF, 0x03FF0007, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFF000F, 0xFFFFF87F, 0x0FFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFF3FFF, 0xFFFFFFFF, 0xFFFF3FFF, + 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, 0x003FFFFF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x003FFFFF, 0x03FFFFFF, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFEEF0001, 0x000FFFFF, 0x00000000, 0x1FFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0x003FFFFF, 0x003FFFFF, 0x0007FFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0x000001FF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFF8, 0x00FFFFFF, 0x00000000, 0x0000FFC0, + 0xFFFFFFF8, 0x0000FFFF, 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, 0x00007FFF, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0x01FFFFFF, 0x00000000, 0x00000000, + 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, + 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, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFF0000, 0xFFFF1FFF, 0xFFFF03FF, 0xFFFF03FF, + 0x000007FF, 0x00000000, 0x00000000, 0xFFFFFFC0, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0x001FFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 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 0000000..cfb6091 --- /dev/null +++ b/gnulib/lib/unictype/ctype_blank.c @@ -0,0 +1,32 @@ +/* ISO C like properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..6b293fc --- /dev/null +++ b/gnulib/lib/unictype/ctype_blank.h @@ -0,0 +1,172 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* ISO C like properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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 0000000..7414f73 --- /dev/null +++ b/gnulib/lib/unictype/ctype_cntrl.c @@ -0,0 +1,32 @@ +/* ISO C like properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..5d242c9 --- /dev/null +++ b/gnulib/lib/unictype/ctype_cntrl.h @@ -0,0 +1,160 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* ISO C like properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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 0000000..bce5c01 --- /dev/null +++ b/gnulib/lib/unictype/ctype_digit.c @@ -0,0 +1,32 @@ +/* ISO C like properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..2cb82ac --- /dev/null +++ b/gnulib/lib/unictype/ctype_digit.h @@ -0,0 +1,156 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* ISO C like properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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 0000000..40dc089 --- /dev/null +++ b/gnulib/lib/unictype/ctype_graph.c @@ -0,0 +1,32 @@ +/* ISO C like properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..75a817f --- /dev/null +++ b/gnulib/lib/unictype/ctype_graph.h @@ -0,0 +1,926 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* ISO C like properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[61 << 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) + 160, + 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) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 400, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 416, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 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, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + -1, + -1, + -1, + -1, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 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, + -1, + 18 + 640 * sizeof (short) / sizeof (int) + 608, + 18 + 640 * sizeof (short) / sizeof (int) + 624, + 18 + 640 * sizeof (short) / sizeof (int) + 640, + 18 + 640 * sizeof (short) / sizeof (int) + 656, + 18 + 640 * sizeof (short) / sizeof (int) + 672, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 688, + 18 + 640 * sizeof (short) / sizeof (int) + 704, + -1, + -1, + -1, + -1, + -1, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 720, + -1, + -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) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 736, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -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) + 752, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 18 + 640 * sizeof (short) / sizeof (int) + 768, + 18 + 640 * sizeof (short) / sizeof (int) + 784, + 18 + 640 * sizeof (short) / sizeof (int) + 800, + 18 + 640 * sizeof (short) / sizeof (int) + 816, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 18 + 640 * sizeof (short) / sizeof (int) + 832, + 18 + 640 * sizeof (short) / sizeof (int) + 848, + 18 + 640 * sizeof (short) / sizeof (int) + 864, + 18 + 640 * sizeof (short) / sizeof (int) + 880, + -1, + -1, + -1, + -1, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 896, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 912, + 18 + 640 * sizeof (short) / sizeof (int) + 928, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -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) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 928, + -1, + -1, + 18 + 640 * sizeof (short) / sizeof (int) + 944, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -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) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 960 + }, + { + 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, 0xFFFE00FF, 0xFE7FFFFF, 0xFFFFFFFE, + 0xFFFE06FF, 0xFFFFFFFF, 0xFFFF00FF, 0x001F07FF, + 0xCFFFFFCF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFBFFF, 0xFFFFFFFF, 0xFFFFE7FF, 0xFFFFFFFF, + 0xFFFFFFFF, 0x0003FFFF, 0xFFFFFFFF, 0x07FFFFFF, + 0xFFFFFFFF, 0x7FFF3FFF, 0x4FFFFFFF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFEFFFFFF, + 0xFFF99FEE, 0xF3C5FDFF, 0xB080799F, 0x0FFFFFCF, + 0xFFF987EE, 0xD36DFDFF, 0x5E023987, 0x003FFFC0, + 0xFFFBBFEE, 0xF3EDFDFF, 0x00013BBF, 0x0002FFCF, + 0xFFF99FEE, 0xF3EDFDFF, 0xB0C0399F, 0x00FFFFCF, + 0xD63DC7EC, 0xC3FFC718, 0x00813DC7, 0x07FFFFC0, + 0xFFFDDFEE, 0xE3EFFDFF, 0x03603DDF, 0xFF00FFCF, + 0xFFFDDFEC, 0xF3EFFDFF, 0x40603DDF, 0x0006FFCF, + 0xFFFDDFEC, 0xE7FFFFFF, 0x00807DDF, 0xFE3FFFCF, + 0xFC7FFFEC, 0x2FFBFFFF, 0xFF5F847F, 0x001C0000, + 0xFFFFFFFE, 0x87FFFFFF, 0x0FFFFFFF, 0x00000000, + 0xFEF02596, 0x3BFFECAE, 0x33FF3F5F, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFEFF, 0xFFFE1FFF, + 0xFEFFFFFF, 0xDFFFFFFF, 0x07FFDFFF, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF003F, 0x1FFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0x3D7F3DFF, 0xFFFFFFFF, + 0xFFFF3DFF, 0x7F3DFFFF, 0xFF7FFF3D, 0xFFFFFFFF, + 0xFF3DFFFF, 0xFFFFFFFF, 0xE7FFFFFF, 0x1FFFFFFF, + 0x03FFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x001FFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x1FFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0x0001FFFF, + 0x001FDFFF, 0x007FFFFF, 0x000FFFFF, 0x000DDFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0x3FFFFFFF, 0x03FF03FF, + 0x03FF3FFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00FFFFFF, + 0xFFFFFFFF, 0xFFFF07FF, 0xFFFFFFFF, 0x003FFFFF, + 0x1FFFFFFF, 0x0FFF0FFF, 0xFFFFFFF1, 0x001F3FFF, + 0xFFFFFFFF, 0xFFFF0FFF, 0xC7FF03FF, 0xFFFFFFFF, + 0xCFFFFFFF, 0xFFFFFFFF, 0x7FFFFFFF, 0x9FFFFFFF, + 0x03FF03FF, 0x00003FFF, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF0FFF, 0x1FFFFFFF, + 0xFFFFFFFF, 0x03FFC7FF, 0xFFFFFFFF, 0xF00FFFFF, + 0xFFFFFFFF, 0xF8FFFFFF, 0xFFFFE3FF, 0xFFFFFFFF, + 0x00000000, 0x00000000, 0xFFFF0000, 0x0007FFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xF000007F, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF, + 0xFFFFFFFF, 0xFFDFFFFF, 0xEFCFFFDF, 0x7FDCFFFF, + 0xFFFFF880, 0xFFFFFCFF, 0x7FFFFFFF, 0xFFF3FC1F, + 0x1FFF7FFF, 0x03FFFFFF, 0xFFFF0000, 0x0001FFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFF03FF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000FFFFF, + 0xFFFFFFFF, 0x0000007F, 0x000007FF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFD7FF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0x03FF1FFF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFF7FFF, 0x7FFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFE03FFFF, + 0xFFFFFFFF, 0xFFFF003F, 0xFFFFFFFF, 0x8001803F, + 0x007FFFFF, 0x7F7F7F7F, 0x7F7F7F7F, 0xFFFFFFFF, + 0xFFFFFFFF, 0x0003FFFF, 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, 0x07FFFFFF, 0xFFFFFFFF, 0xFFFF000F, + 0x7FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 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, 0x00000FFF, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFF1FFF, 0xFFFFFFFF, 0xFFFF007F, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0x00000FFF, 0xFFFFFFFF, 0xF00FFFFF, + 0x00FFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00FFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x00037FFF, 0x000003FF, 0x00000000, 0xFC000000, + 0xFFFFFFFF, 0x03FF0FFF, 0xFFFFFFFF, 0x00FFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFC01F, 0x0FFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0x800FFFFF, 0x1FFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xC3FFBFFF, 0x00000000, + 0xFFFFFFFF, 0x007FFFFF, 0xF3FF3FFF, 0x0FFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xF8000007, 0x00000000, + 0x007E7E7E, 0x00007F7F, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xFFFFFFFF, 0x03FF3FFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFF000F, 0xFFFFF87F, 0x0FFFFFFF, + 0xFFFFFFFF, 0xFFFF3FFF, 0xFFFFFFFF, 0xFFFF3FFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFFFFF, 0x00000000, + 0xE0F8007F, 0x5F7FFFFF, 0xFFFFFFDB, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFF80003, 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, 0xFFBFFFFF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x8FFFFFFF, 0x83FFFFFF, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFEEFF06F, 0x870FFFFF, 0x01FF00FF, 0xFFFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFE3FFFFF, 0xFF3FFFFF, 0xFF07FFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0x000001FF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x7FFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFC3FFF, 0x0000FFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0x00000003, 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, 0x00007FFF, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0x01FFFFFF, 0x00000000, 0x00000000, + 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, + 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, 0x7FFE7FFF, 0xFFFEFFFE, 0x00000000, + 0xFFFF07FF, 0xFFFF7FFF, 0xFFFFFFFF, 0xFFFF03FF, + 0x07FFFFFF, 0x00000000, 0x00000000, 0xFFFFFFC0, + 0xFFFF0007, 0x07FFFFFF, 0x000301FF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFBF0001, 0xFFFFFFFF, 0x1FFFFFFF, + 0x000FFFFF, 0xFFFFFFFF, 0x000007DF, 0x0001FFFF, + 0xFFFFFFFF, 0x7FFFFFFF, 0xFFFFFFFD, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x1EFFFFFF, + 0xFFFFFFFF, 0x3FFFFFFF, 0xFFFF0000, 0x000000FF, + 0x00000000, 0x00000000, 0x00000000, 0xF8000000, + 0x755DFFFE, 0xFFEF2F3F, 0x0000FFE1, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000FFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0x001FFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 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 0000000..7b4b57f --- /dev/null +++ b/gnulib/lib/unictype/ctype_lower.c @@ -0,0 +1,32 @@ +/* ISO C like properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..33b7047 --- /dev/null +++ b/gnulib/lib/unictype/ctype_lower.h @@ -0,0 +1,327 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* ISO C like properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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, 0x900AAAA8, 0x0ADFAA85, 0x20268B29, + 0x00041F09, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000020, 0x388A0000, + 0x00000000, 0xFFFEF000, 0xAAE37FFF, 0x0927AAAA, + 0x00000000, 0xFFFF0000, 0xFFFFFFFF, 0xAAAAAAAA, + 0xAAAAA802, 0xAAAAAAAA, 0xAAAAD554, 0xAAAAAAAA, + 0xAAAAAAAA, 0x000000AA, 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, 0x0000500A, + 0xFFFFFFFF, 0x0000003F, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xAAAAAAAA, 0x00002AAA, + 0x00AAAAAA, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0xAAA8AAA8, 0xAAAAAAAA, 0x9400AAAA, + 0x000210AA, 0x000002AA, 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 0000000..7777cab --- /dev/null +++ b/gnulib/lib/unictype/ctype_print.c @@ -0,0 +1,32 @@ +/* ISO C like properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..aff0794 --- /dev/null +++ b/gnulib/lib/unictype/ctype_print.h @@ -0,0 +1,926 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* ISO C like properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[61 << 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) + 160, + 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) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 400, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 416, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 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, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 496, + -1, + -1, + -1, + -1, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 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, + -1, + 18 + 640 * sizeof (short) / sizeof (int) + 608, + 18 + 640 * sizeof (short) / sizeof (int) + 624, + 18 + 640 * sizeof (short) / sizeof (int) + 640, + 18 + 640 * sizeof (short) / sizeof (int) + 656, + 18 + 640 * sizeof (short) / sizeof (int) + 672, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 688, + 18 + 640 * sizeof (short) / sizeof (int) + 704, + -1, + -1, + -1, + -1, + -1, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 720, + -1, + -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) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 736, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -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) + 752, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 18 + 640 * sizeof (short) / sizeof (int) + 768, + 18 + 640 * sizeof (short) / sizeof (int) + 784, + 18 + 640 * sizeof (short) / sizeof (int) + 800, + 18 + 640 * sizeof (short) / sizeof (int) + 816, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 18 + 640 * sizeof (short) / sizeof (int) + 832, + 18 + 640 * sizeof (short) / sizeof (int) + 848, + 18 + 640 * sizeof (short) / sizeof (int) + 864, + 18 + 640 * sizeof (short) / sizeof (int) + 880, + -1, + -1, + -1, + -1, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 896, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 912, + 18 + 640 * sizeof (short) / sizeof (int) + 928, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -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) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 928, + -1, + -1, + 18 + 640 * sizeof (short) / sizeof (int) + 944, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -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) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 160, + 18 + 640 * sizeof (short) / sizeof (int) + 960 + }, + { + 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, 0xFFFE00FF, 0xFE7FFFFF, 0xFFFFFFFE, + 0xFFFE06FF, 0xFFFFFFFF, 0xFFFF00FF, 0x001F07FF, + 0xCFFFFFCF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFBFFF, 0xFFFFFFFF, 0xFFFFE7FF, 0xFFFFFFFF, + 0xFFFFFFFF, 0x0003FFFF, 0xFFFFFFFF, 0x07FFFFFF, + 0xFFFFFFFF, 0x7FFF3FFF, 0x4FFFFFFF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFEFFFFFF, + 0xFFF99FEE, 0xF3C5FDFF, 0xB080799F, 0x0FFFFFCF, + 0xFFF987EE, 0xD36DFDFF, 0x5E023987, 0x003FFFC0, + 0xFFFBBFEE, 0xF3EDFDFF, 0x00013BBF, 0x0002FFCF, + 0xFFF99FEE, 0xF3EDFDFF, 0xB0C0399F, 0x00FFFFCF, + 0xD63DC7EC, 0xC3FFC718, 0x00813DC7, 0x07FFFFC0, + 0xFFFDDFEE, 0xE3EFFDFF, 0x03603DDF, 0xFF00FFCF, + 0xFFFDDFEC, 0xF3EFFDFF, 0x40603DDF, 0x0006FFCF, + 0xFFFDDFEC, 0xE7FFFFFF, 0x00807DDF, 0xFE3FFFCF, + 0xFC7FFFEC, 0x2FFBFFFF, 0xFF5F847F, 0x001C0000, + 0xFFFFFFFE, 0x87FFFFFF, 0x0FFFFFFF, 0x00000000, + 0xFEF02596, 0x3BFFECAE, 0x33FF3F5F, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFEFF, 0xFFFE1FFF, + 0xFEFFFFFF, 0xDFFFFFFF, 0x07FFDFFF, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF003F, 0x1FFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0x3D7F3DFF, 0xFFFFFFFF, + 0xFFFF3DFF, 0x7F3DFFFF, 0xFF7FFF3D, 0xFFFFFFFF, + 0xFF3DFFFF, 0xFFFFFFFF, 0xE7FFFFFF, 0x1FFFFFFF, + 0x03FFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x001FFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x1FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0001FFFF, + 0x001FDFFF, 0x007FFFFF, 0x000FFFFF, 0x000DDFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0x3FFFFFFF, 0x03FF03FF, + 0x03FF7FFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00FFFFFF, + 0xFFFFFFFF, 0xFFFF07FF, 0xFFFFFFFF, 0x003FFFFF, + 0x1FFFFFFF, 0x0FFF0FFF, 0xFFFFFFF1, 0x001F3FFF, + 0xFFFFFFFF, 0xFFFF0FFF, 0xC7FF03FF, 0xFFFFFFFF, + 0xCFFFFFFF, 0xFFFFFFFF, 0x7FFFFFFF, 0x9FFFFFFF, + 0x03FF03FF, 0x00003FFF, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF0FFF, 0x1FFFFFFF, + 0xFFFFFFFF, 0x03FFC7FF, 0xFFFFFFFF, 0xF00FFFFF, + 0xFFFFFFFF, 0xF8FFFFFF, 0xFFFFE3FF, 0xFFFFFFFF, + 0x00000000, 0x00000000, 0xFFFF0000, 0x0007FFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xF000007F, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF, + 0xFFFFFFFF, 0xFFDFFFFF, 0xEFCFFFDF, 0x7FDCFFFF, + 0xFFFFFFFF, 0xFFFFFCFF, 0xFFFFFFFF, 0xFFF3FC1F, + 0x1FFF7FFF, 0x03FFFFFF, 0xFFFF0000, 0x0001FFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFF03FF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000FFFFF, + 0xFFFFFFFF, 0x0000007F, 0x000007FF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFD7FF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0x03FF1FFF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFF7FFF, 0x7FFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFE03FFFF, + 0xFFFFFFFF, 0xFFFF003F, 0xFFFFFFFF, 0x8001803F, + 0x007FFFFF, 0x7F7F7F7F, 0x7F7F7F7F, 0xFFFFFFFF, + 0xFFFFFFFF, 0x0003FFFF, 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, 0x07FFFFFF, 0xFFFFFFFF, 0xFFFF000F, + 0x7FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 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, 0x00000FFF, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFF1FFF, 0xFFFFFFFF, 0xFFFF007F, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0x00000FFF, 0xFFFFFFFF, 0xF00FFFFF, + 0x00FFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00FFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x00037FFF, 0x000003FF, 0x00000000, 0xFC000000, + 0xFFFFFFFF, 0x03FF0FFF, 0xFFFFFFFF, 0x00FFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFC01F, 0x0FFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0x800FFFFF, 0x1FFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xC3FFBFFF, 0x00000000, + 0xFFFFFFFF, 0x007FFFFF, 0xF3FF3FFF, 0x0FFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xF8000007, 0x00000000, + 0x007E7E7E, 0x00007F7F, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xFFFFFFFF, 0x03FF3FFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFF000F, 0xFFFFF87F, 0x0FFFFFFF, + 0xFFFFFFFF, 0xFFFF3FFF, 0xFFFFFFFF, 0xFFFF3FFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFFFFF, 0x00000000, + 0xE0F8007F, 0x5F7FFFFF, 0xFFFFFFDB, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFF80003, 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, 0xFFBFFFFF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x8FFFFFFF, 0x83FFFFFF, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFEEFF06F, 0x870FFFFF, 0x01FF00FF, 0xFFFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFE3FFFFF, 0xFF3FFFFF, 0xFF07FFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0x000001FF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x7FFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFC3FFF, 0x0000FFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0x00000003, 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, 0x00007FFF, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0x01FFFFFF, 0x00000000, 0x00000000, + 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, + 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, 0x7FFE7FFF, 0xFFFEFFFE, 0x00000000, + 0xFFFF07FF, 0xFFFF7FFF, 0xFFFFFFFF, 0xFFFF03FF, + 0x07FFFFFF, 0x00000000, 0x00000000, 0xFFFFFFC0, + 0xFFFF0007, 0x07FFFFFF, 0x000301FF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFBF0001, 0xFFFFFFFF, 0x1FFFFFFF, + 0x000FFFFF, 0xFFFFFFFF, 0x000007DF, 0x0001FFFF, + 0xFFFFFFFF, 0x7FFFFFFF, 0xFFFFFFFD, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x1EFFFFFF, + 0xFFFFFFFF, 0x3FFFFFFF, 0xFFFF0000, 0x000000FF, + 0x00000000, 0x00000000, 0x00000000, 0xF8000000, + 0x755DFFFE, 0xFFEF2F3F, 0x0000FFE1, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000FFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0x001FFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 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 0000000..a1be4fb --- /dev/null +++ b/gnulib/lib/unictype/ctype_punct.c @@ -0,0 +1,32 @@ +/* ISO C like properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..6640b92 --- /dev/null +++ b/gnulib/lib/unictype/ctype_punct.h @@ -0,0 +1,758 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* ISO C like properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[51 << 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, + 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) + 400, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 18 + 512 * 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, + 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) + 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, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 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, + 18 + 512 * sizeof (short) / sizeof (int) + 576, + -1, + -1, + 18 + 512 * sizeof (short) / sizeof (int) + 592, + 18 + 512 * sizeof (short) / sizeof (int) + 608, + -1, + 18 + 512 * sizeof (short) / sizeof (int) + 624, + 18 + 512 * sizeof (short) / sizeof (int) + 640, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 18 + 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, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -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) + 672, + 18 + 512 * sizeof (short) / sizeof (int) + 688, + -1, + 18 + 512 * sizeof (short) / sizeof (int) + 704, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 18 + 512 * sizeof (short) / sizeof (int) + 720, + 18 + 512 * sizeof (short) / sizeof (int) + 736, + 18 + 512 * sizeof (short) / sizeof (int) + 752, + 18 + 512 * sizeof (short) / sizeof (int) + 768, + -1, + -1, + -1, + -1, + 18 + 512 * 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, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -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) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 320, + 18 + 512 * sizeof (short) / sizeof (int) + 800 + }, + { + 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, 0xFFFFF800, 0x00013C00, + 0x00000000, 0x00000000, 0xFFD00000, 0x60003F9F, + 0x0002BFFF, 0xFFFF0000, 0x000007FF, 0x00000000, + 0x00000000, 0x0001FFC0, 0x00000000, 0x03CFF800, + 0xFBC00000, 0x7FFF3EEF, 0x4E000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x0000000F, 0xDC000000, 0x00FEFFFF, 0x0001003C, + 0x0000000E, 0xD0000000, 0x0080399F, 0x0FFC000C, + 0x0000000E, 0xD0000000, 0x00023987, 0x00230000, + 0x0000000E, 0xD0000000, 0x00003BBF, 0x0002000C, + 0x0000000E, 0xD0000000, 0x00C0399F, 0x00FD000C, + 0x00000004, 0xC0000000, 0x00803DC7, 0x07FF0000, + 0x0000000E, 0xC0000000, 0x00603DDF, 0xFF00000C, + 0x0000000C, 0xD0000000, 0x00603DDF, 0x0000000C, + 0x0000000C, 0xC0000000, 0x00803DDF, 0x023F000C, + 0x0000000C, 0x00000000, 0xFF5F8400, 0x001C0000, + 0x00000000, 0x80008000, 0x0C008040, 0x00000000, + 0x00000000, 0x1BF20000, 0x00003F00, 0x00000000, + 0xFFFFFFFE, 0xFFFFFC00, 0x00000000, 0xFFFE0000, + 0xFEFFE0FF, 0xDFFFFFFF, 0x07FFDFFF, 0x00000000, + 0x00000000, 0x7FFFF800, 0xC3C0FC00, 0x001E3F9D, + 0xFC00BFFC, 0x00000000, 0x00000000, 0x08000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xE0000000, 0x1FFFFFFF, + 0x03FF0000, 0x00000000, 0x00000000, 0x00000000, + 0x00000001, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 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, 0xC4000301, 0xFFFFFFFF, + 0xCF800000, 0x00000000, 0x7FE00000, 0x9FFFFFFF, + 0x00000000, 0x00003F7F, 0x00000000, 0x00000000, + 0x0000001F, 0xFFF00000, 0xFC00001F, 0x1FFFFFFF, + 0x00000007, 0x000007FE, 0x00000000, 0xF00FFFC0, + 0x00000000, 0xF8FFFFF0, 0x00000000, 0xC0000000, + 0x00000000, 0x00000000, 0xFFFF0000, 0x000421FF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xFFFFFFFF, 0xF000007F, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0xA0000000, 0xE000E003, 0x6000E000, + 0xFFFFF880, 0xFFFFFCFF, 0x7FFFFFFF, 0x7FF1FC1F, + 0x00007FFF, 0x03FFFFFF, 0xFFFF0000, 0x0001FFFF, + 0xC1D0037B, 0x0C0040AF, 0xFFFFBC1F, 0x00000000, + 0xFFFF0200, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000FFFFF, + 0xFFFFFFFF, 0x0000007F, 0x000007FF, 0xFFFFFFFF, + 0x0FFFFFFF, 0x00000000, 0x00000000, 0xFFFFFC00, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFD7FF, 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, 0x03FF1FFF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0xFE0387E0, + 0x00000000, 0x00000000, 0x00000000, 0x80010000, + 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, + 0xFFFFFFFF, 0x00037FFF, 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, 0xFFFFFFFF, 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, 0xC0000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x0000E000, 0x00000000, 0x00000000, 0x700F8000, + 0x00000000, 0x00000000, 0x00000000, 0x00FF0000, + 0x007FFFFF, 0x00000003, 0x00000000, 0x00000000, + 0x00000600, 0x00000000, 0x00000000, 0x00000000, + 0x00000844, 0x03FF0FF8, 0x00000000, 0x00F00000, + 0x00000003, 0xFFF00000, 0x0000C01F, 0x0703FFFF, + 0x00000000, 0x0000FFC0, 0x800FFF80, 0x00000000, + 0x0000000F, 0xFFF80000, 0xC0003FFF, 0x00000000, + 0x00000000, 0x007FFE00, 0xF0003008, 0x0B800000, + 0x00000000, 0xC19D0000, 0xC0000002, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00003FF8, + 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, 0xFFFC0000, 0x00000003, 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, 0xFF800000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x8FC00000, 0x80000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x0000F06E, 0x87000000, 0x01FF00FF, 0xE0000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0xFE000000, 0xFF000000, 0xFF000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x7FFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000007, 0xFF000000, 0xFFFC3FFF, 0x0000003F, + 0x00000007, 0xFFFF0000, 0x00000003, 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, 0x7FFE7FFF, 0xFFFEFFFE, 0x00000000, + 0x000007FF, 0x00006000, 0x0000FC00, 0x00000000, + 0x07FFF800, 0x00000000, 0x00000000, 0x00000000, + 0xFFFF0007, 0x07FFFFFF, 0x000301FF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFBF0001, 0xFFFFFFFF, 0x1FFFFFFF, + 0x000FFFFF, 0xFFFFFFFF, 0x000007DF, 0x0001FFFF, + 0xFFFFFFFF, 0x7FFFFFFF, 0xFFFFFFFD, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x1EFFFFFF, + 0xFFFFFFFF, 0x3FFFFFFF, 0xFFFF0000, 0x000000FF, + 0x00000000, 0x00000000, 0x00000000, 0xF8000000, + 0x755DFFFE, 0xFFEF2F3F, 0x0000FFE1, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000FFFFF, + 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 0000000..a7794dc --- /dev/null +++ b/gnulib/lib/unictype/ctype_space.c @@ -0,0 +1,32 @@ +/* ISO C like properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..71b335c --- /dev/null +++ b/gnulib/lib/unictype/ctype_space.h @@ -0,0 +1,172 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* ISO C like properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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 0000000..3b526e8 --- /dev/null +++ b/gnulib/lib/unictype/ctype_upper.c @@ -0,0 +1,32 @@ +/* ISO C like properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..e714636 --- /dev/null +++ b/gnulib/lib/unictype/ctype_upper.h @@ -0,0 +1,327 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* ISO C like properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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, 0xFFFE0055, 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, 0xC025EA9D, + 0x55555555, 0x55555555, 0x55555555, 0x00002805, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x55555555, 0x00001555, + 0x00555555, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x55545554, 0x55555555, 0x6A005555, + 0x00012855, 0x00000155, 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 0000000..ccbed7f --- /dev/null +++ b/gnulib/lib/unictype/ctype_xdigit.c @@ -0,0 +1,32 @@ +/* ISO C like properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..bd93871 --- /dev/null +++ b/gnulib/lib/unictype/ctype_xdigit.h @@ -0,0 +1,156 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* ISO C like properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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 0000000..cf5a336 --- /dev/null +++ b/gnulib/lib/unictype/decdigit.c @@ -0,0 +1,49 @@ +/* Values of decimal digit Unicode characters. + Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..020f35b --- /dev/null +++ b/gnulib/lib/unictype/decdigit.h @@ -0,0 +1,255 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Decimal digit values of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[13 << 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, 1152, 640, 0, + 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, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -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, 1408, 640, 640, -1, -1, 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, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -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, + 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, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -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, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -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, + 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, + 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 0000000..9c3a2a6 --- /dev/null +++ b/gnulib/lib/unictype/digit.c @@ -0,0 +1,49 @@ +/* Values of digit Unicode characters. + Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..5a11baf --- /dev/null +++ b/gnulib/lib/unictype/digit.h @@ -0,0 +1,351 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Digit values of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[25 << 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, 1408, -1, 1536, 768, 0, + 1664, -1, -1, -1, -1, -1, -1, -1, + 1792, 1920, -1, -1, -1, -1, -1, -1, + 2048, 2176, -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, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 896, -1, -1, -1, + -1, 768, 1920, 768, 768, -1, -1, 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, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -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, 2560, -1, -1, -1, + -1, -1, -1, -1, 2688, -1, -1, -1, + 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, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -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, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -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, -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, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x21, 0x43, 0x65, 0x87, 0xa9, 0x02, 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, + 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, 0x00, + 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x32, 0x54, 0x76, 0x98, 0x0a, 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, 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, + 0x11, 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 + } +}; diff --git a/gnulib/lib/unictype/identsyntaxmap.h b/gnulib/lib/unictype/identsyntaxmap.h new file mode 100644 index 0000000..9b61daa --- /dev/null +++ b/gnulib/lib/unictype/identsyntaxmap.h @@ -0,0 +1,42 @@ +/* Three-level bitmap lookup. + Copyright (C) 2000-2002, 2005-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +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/joininggroup_byname.c b/gnulib/lib/unictype/joininggroup_byname.c new file mode 100644 index 0000000..063ec2d --- /dev/null +++ b/gnulib/lib/unictype/joininggroup_byname.c @@ -0,0 +1,63 @@ +/* Arabic joining group of Unicode characters. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unictype.h" + +#include + +#include "unictype/joininggroup_byname.h" + +int +uc_joining_group_byname (const char *joining_group_name) +{ + size_t len; + + len = strlen (joining_group_name); + if (len <= MAX_WORD_LENGTH) + { + char buf[MAX_WORD_LENGTH + 1]; + const struct named_joining_group *found; + + /* Copy joining_group_name into buf, converting '_' and '-' to ' '. */ + { + const char *p = joining_group_name; + char *q = buf; + + for (;; p++, q++) + { + char c = *p; + + if (c == '_' || c == '-') + c = ' '; + *q = c; + if (c == '\0') + break; + } + } + /* Here q == buf + len. */ + + /* Do a hash table lookup, with case-insensitive comparison. */ + found = uc_joining_group_lookup (buf, len); + if (found != NULL) + return found->joining_group; + } + /* Invalid joining group name. */ + return -1; +} diff --git a/gnulib/lib/unictype/joininggroup_byname.gperf b/gnulib/lib/unictype/joininggroup_byname.gperf new file mode 100644 index 0000000..bc2fbc8 --- /dev/null +++ b/gnulib/lib/unictype/joininggroup_byname.gperf @@ -0,0 +1,85 @@ +/* Arabic joining group of Unicode characters. */ +struct named_joining_group { int name; int joining_group; }; +%struct-type +%ignore-case +%language=ANSI-C +%define hash-function-name joining_group_hash +%define lookup-function-name uc_joining_group_lookup +%readonly-tables +%global-table +%define word-array-name joining_group_names +%pic +%define string-pool-name joining_group_stringpool +%% +No Joining Group, UC_JOINING_GROUP_NONE +NoJoiningGroup, UC_JOINING_GROUP_NONE +Ain, UC_JOINING_GROUP_AIN +Alaph, UC_JOINING_GROUP_ALAPH +Alef, UC_JOINING_GROUP_ALEF +Beh, UC_JOINING_GROUP_BEH +Beth, UC_JOINING_GROUP_BETH +Burushaski Yeh Barree, UC_JOINING_GROUP_BURUSHASKI_YEH_BARREE +BurushaskiYehBarree, UC_JOINING_GROUP_BURUSHASKI_YEH_BARREE +Dal, UC_JOINING_GROUP_DAL +Dalath Rish, UC_JOINING_GROUP_DALATH_RISH +DalathRish, UC_JOINING_GROUP_DALATH_RISH +E, UC_JOINING_GROUP_E +Farsi Yeh, UC_JOINING_GROUP_FARSI_YEH +FarsiYeh, UC_JOINING_GROUP_FARSI_YEH +Fe, UC_JOINING_GROUP_FE +Feh, UC_JOINING_GROUP_FEH +Final Semkath, UC_JOINING_GROUP_FINAL_SEMKATH +FinalSemkath, UC_JOINING_GROUP_FINAL_SEMKATH +Gaf, UC_JOINING_GROUP_GAF +Gamal, UC_JOINING_GROUP_GAMAL +Hah, UC_JOINING_GROUP_HAH +He, UC_JOINING_GROUP_HE +Heh, UC_JOINING_GROUP_HEH +Heh Goal, UC_JOINING_GROUP_HEH_GOAL +HehGoal, UC_JOINING_GROUP_HEH_GOAL +Heth, UC_JOINING_GROUP_HETH +Kaf, UC_JOINING_GROUP_KAF +Kaph, UC_JOINING_GROUP_KAPH +Khaph, UC_JOINING_GROUP_KHAPH +Knotted Heh, UC_JOINING_GROUP_KNOTTED_HEH +KnottedHeh, UC_JOINING_GROUP_KNOTTED_HEH +Lam, UC_JOINING_GROUP_LAM +Lamadh, UC_JOINING_GROUP_LAMADH +Meem, UC_JOINING_GROUP_MEEM +Mim, UC_JOINING_GROUP_MIM +Noon, UC_JOINING_GROUP_NOON +Nun, UC_JOINING_GROUP_NUN +Nya, UC_JOINING_GROUP_NYA +Pe, UC_JOINING_GROUP_PE +Qaf, UC_JOINING_GROUP_QAF +Qaph, UC_JOINING_GROUP_QAPH +Reh, UC_JOINING_GROUP_REH +Reversed Pe, UC_JOINING_GROUP_REVERSED_PE +ReversedPe, UC_JOINING_GROUP_REVERSED_PE +Sad, UC_JOINING_GROUP_SAD +Sadhe, UC_JOINING_GROUP_SADHE +Seen, UC_JOINING_GROUP_SEEN +Semkath, UC_JOINING_GROUP_SEMKATH +Shin, UC_JOINING_GROUP_SHIN +Swash Kaf, UC_JOINING_GROUP_SWASH_KAF +SwashKaf, UC_JOINING_GROUP_SWASH_KAF +Syriac Waw, UC_JOINING_GROUP_SYRIAC_WAW +SyriacWaw, UC_JOINING_GROUP_SYRIAC_WAW +Tah, UC_JOINING_GROUP_TAH +Taw, UC_JOINING_GROUP_TAW +Teh Marbuta, UC_JOINING_GROUP_TEH_MARBUTA +TehMarbuta, UC_JOINING_GROUP_TEH_MARBUTA +Teh Marbuta Goal, UC_JOINING_GROUP_TEH_MARBUTA_GOAL +TehMarbutaGoal, UC_JOINING_GROUP_TEH_MARBUTA_GOAL +Teth, UC_JOINING_GROUP_TETH +Waw, UC_JOINING_GROUP_WAW +Yeh, UC_JOINING_GROUP_YEH +Yeh Barree, UC_JOINING_GROUP_YEH_BARREE +YehBarree, UC_JOINING_GROUP_YEH_BARREE +Yeh with tail, UC_JOINING_GROUP_YEH_WITH_TAIL +YehWithTail, UC_JOINING_GROUP_YEH_WITH_TAIL +Yudh, UC_JOINING_GROUP_YUDH +Yudh He, UC_JOINING_GROUP_YUDH_HE +YudhHe, UC_JOINING_GROUP_YUDH_HE +Zain, UC_JOINING_GROUP_ZAIN +Zhain, UC_JOINING_GROUP_ZHAIN diff --git a/gnulib/lib/unictype/joininggroup_name.c b/gnulib/lib/unictype/joininggroup_name.c new file mode 100644 index 0000000..373a3c4 --- /dev/null +++ b/gnulib/lib/unictype/joininggroup_name.c @@ -0,0 +1,55 @@ +/* Arabic joining group of Unicode characters. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unictype.h" + +/* Use a string pool, rather than a two-dimensional array, because the strings + have very different lengths. */ + +struct joining_group_stringpool_t + { +#define ELEM(tag,string) char tag[sizeof (string)]; +#include "unictype/joininggroup_name.h" +#undef ELEM + }; + +static const struct joining_group_stringpool_t joining_group_stringpool_contents = + { +#define ELEM(tag,string) string, +#include "unictype/joininggroup_name.h" +#undef ELEM + }; +#define joining_group_stringpool ((const char *) &joining_group_stringpool_contents) + +static const int joining_group_index[] = + { +#define ELEM(tag,string) (int)(long)&((struct joining_group_stringpool_t *)0)->tag, +#include "unictype/joininggroup_name.h" +#undef ELEM + }; + +const char * +uc_joining_group_name (int joining_group) +{ + if (joining_group >= 0 + && joining_group < sizeof (joining_group_index) / sizeof (joining_group_index[0])) + return joining_group_stringpool + joining_group_index[joining_group]; + return NULL; +} diff --git a/gnulib/lib/unictype/joininggroup_name.h b/gnulib/lib/unictype/joininggroup_name.h new file mode 100644 index 0000000..12436a4 --- /dev/null +++ b/gnulib/lib/unictype/joininggroup_name.h @@ -0,0 +1,74 @@ +/* Arabic joining group of Unicode characters. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +ELEM (NONE, "No Joining Group") +ELEM (AIN, "Ain") +ELEM (ALAPH, "Alaph") +ELEM (ALEF, "Alef") +ELEM (BEH, "Beh") +ELEM (BETH, "Beth") +ELEM (BURUSHASKI_YEH_BARREE, "Burushaski Yeh Barree") +ELEM (DAL, "Dal") +ELEM (DALATH_RISH, "Dalath Rish") +ELEM (E, "E") +ELEM (FARSI_YEH, "Farsi Yeh") +ELEM (FE, "Fe") +ELEM (FEH, "Feh") +ELEM (FINAL_SEMKATH, "Final Semkath") +ELEM (GAF, "Gaf") +ELEM (GAMAL, "Gamal") +ELEM (HAH, "Hah") +ELEM (HE, "He") +ELEM (HEH, "Heh") +ELEM (HEH_GOAL, "Heh Goal") +ELEM (HETH, "Heth") +ELEM (KAF, "Kaf") +ELEM (KAPH, "Kaph") +ELEM (KHAPH, "Khaph") +ELEM (KNOTTED_HEH, "Knotted Heh") +ELEM (LAM, "Lam") +ELEM (LAMADH, "Lamadh") +ELEM (MEEM, "Meem") +ELEM (MIM, "Mim") +ELEM (NOON, "Noon") +ELEM (NUN, "Nun") +ELEM (NYA, "Nya") +ELEM (PE, "Pe") +ELEM (QAF, "Qaf") +ELEM (QAPH, "Qaph") +ELEM (REH, "Reh") +ELEM (REVERSED_PE, "Reversed Pe") +ELEM (SAD, "Sad") +ELEM (SADHE, "Sadhe") +ELEM (SEEN, "Seen") +ELEM (SEMKATH, "Semkath") +ELEM (SHIN, "Shin") +ELEM (SWASH_KAF, "Swash Kaf") +ELEM (SYRIAC_WAW, "Syriac Waw") +ELEM (TAH, "Tah") +ELEM (TAW, "Taw") +ELEM (TEH_MARBUTA, "Teh Marbuta") +ELEM (TEH_MARBUTA_GOAL, "Teh Marbuta Goal") +ELEM (TETH, "Teth") +ELEM (WAW, "Waw") +ELEM (YEH, "Yeh") +ELEM (YEH_BARREE, "Yeh Barree") +ELEM (YEH_WITH_TAIL, "Yeh With Tail") +ELEM (YUDH, "Yudh") +ELEM (YUDH_HE, "Yudh He") +ELEM (ZAIN, "Zain") +ELEM (ZHAIN, "Zhain") diff --git a/gnulib/lib/unictype/joininggroup_of.c b/gnulib/lib/unictype/joininggroup_of.c new file mode 100644 index 0000000..5dc393e --- /dev/null +++ b/gnulib/lib/unictype/joininggroup_of.c @@ -0,0 +1,33 @@ +/* Arabic joining group of Unicode characters. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unictype.h" + +#include "unictype/joininggroup_of.h" + +int +uc_joining_group (ucs4_t uc) +{ + if (uc >= joining_group_header_0 + && uc < joining_group_header_0 + + sizeof (u_joining_group) / sizeof (u_joining_group[0])) + return u_joining_group[uc - joining_group_header_0]; + return UC_JOINING_GROUP_NONE; +} diff --git a/gnulib/lib/unictype/joininggroup_of.h b/gnulib/lib/unictype/joininggroup_of.h new file mode 100644 index 0000000..1dd4804 --- /dev/null +++ b/gnulib/lib/unictype/joininggroup_of.h @@ -0,0 +1,183 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Arabic joining type of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */ +#define joining_group_header_0 0x620 +static const unsigned char u_joining_group[0x780 - 0x620] = +{ + UC_JOINING_GROUP_YEH, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_ALEF, UC_JOINING_GROUP_ALEF, + UC_JOINING_GROUP_WAW, UC_JOINING_GROUP_ALEF, + UC_JOINING_GROUP_YEH, UC_JOINING_GROUP_ALEF, + UC_JOINING_GROUP_BEH, UC_JOINING_GROUP_TEH_MARBUTA, + UC_JOINING_GROUP_BEH, UC_JOINING_GROUP_BEH, + UC_JOINING_GROUP_HAH, UC_JOINING_GROUP_HAH, + UC_JOINING_GROUP_HAH, UC_JOINING_GROUP_DAL, + UC_JOINING_GROUP_DAL, UC_JOINING_GROUP_REH, + UC_JOINING_GROUP_REH, UC_JOINING_GROUP_SEEN, + UC_JOINING_GROUP_SEEN, UC_JOINING_GROUP_SAD, + UC_JOINING_GROUP_SAD, UC_JOINING_GROUP_TAH, + UC_JOINING_GROUP_TAH, UC_JOINING_GROUP_AIN, + UC_JOINING_GROUP_AIN, UC_JOINING_GROUP_GAF, + UC_JOINING_GROUP_GAF, UC_JOINING_GROUP_FARSI_YEH, + UC_JOINING_GROUP_FARSI_YEH, UC_JOINING_GROUP_FARSI_YEH, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_FEH, + UC_JOINING_GROUP_QAF, UC_JOINING_GROUP_KAF, + UC_JOINING_GROUP_LAM, UC_JOINING_GROUP_MEEM, + UC_JOINING_GROUP_NOON, UC_JOINING_GROUP_HEH, + UC_JOINING_GROUP_WAW, UC_JOINING_GROUP_YEH, + UC_JOINING_GROUP_YEH, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_BEH, UC_JOINING_GROUP_QAF, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_ALEF, + UC_JOINING_GROUP_ALEF, UC_JOINING_GROUP_ALEF, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_ALEF, + UC_JOINING_GROUP_WAW, UC_JOINING_GROUP_WAW, + UC_JOINING_GROUP_YEH, UC_JOINING_GROUP_BEH, + UC_JOINING_GROUP_BEH, UC_JOINING_GROUP_BEH, + UC_JOINING_GROUP_BEH, UC_JOINING_GROUP_BEH, + UC_JOINING_GROUP_BEH, UC_JOINING_GROUP_BEH, + UC_JOINING_GROUP_BEH, UC_JOINING_GROUP_HAH, + UC_JOINING_GROUP_HAH, UC_JOINING_GROUP_HAH, + UC_JOINING_GROUP_HAH, UC_JOINING_GROUP_HAH, + UC_JOINING_GROUP_HAH, UC_JOINING_GROUP_HAH, + UC_JOINING_GROUP_DAL, UC_JOINING_GROUP_DAL, + UC_JOINING_GROUP_DAL, UC_JOINING_GROUP_DAL, + UC_JOINING_GROUP_DAL, UC_JOINING_GROUP_DAL, + UC_JOINING_GROUP_DAL, UC_JOINING_GROUP_DAL, + UC_JOINING_GROUP_DAL, UC_JOINING_GROUP_REH, + UC_JOINING_GROUP_REH, UC_JOINING_GROUP_REH, + UC_JOINING_GROUP_REH, UC_JOINING_GROUP_REH, + UC_JOINING_GROUP_REH, UC_JOINING_GROUP_REH, + UC_JOINING_GROUP_REH, UC_JOINING_GROUP_REH, + UC_JOINING_GROUP_SEEN, UC_JOINING_GROUP_SEEN, + UC_JOINING_GROUP_SEEN, UC_JOINING_GROUP_SAD, + UC_JOINING_GROUP_SAD, UC_JOINING_GROUP_TAH, + UC_JOINING_GROUP_AIN, UC_JOINING_GROUP_FEH, + UC_JOINING_GROUP_FEH, UC_JOINING_GROUP_FEH, + UC_JOINING_GROUP_FEH, UC_JOINING_GROUP_FEH, + UC_JOINING_GROUP_FEH, UC_JOINING_GROUP_QAF, + UC_JOINING_GROUP_QAF, UC_JOINING_GROUP_GAF, + UC_JOINING_GROUP_SWASH_KAF, UC_JOINING_GROUP_GAF, + UC_JOINING_GROUP_KAF, UC_JOINING_GROUP_KAF, + UC_JOINING_GROUP_KAF, UC_JOINING_GROUP_GAF, + UC_JOINING_GROUP_GAF, UC_JOINING_GROUP_GAF, + UC_JOINING_GROUP_GAF, UC_JOINING_GROUP_GAF, + UC_JOINING_GROUP_GAF, UC_JOINING_GROUP_LAM, + UC_JOINING_GROUP_LAM, UC_JOINING_GROUP_LAM, + UC_JOINING_GROUP_LAM, UC_JOINING_GROUP_NOON, + UC_JOINING_GROUP_NOON, UC_JOINING_GROUP_NOON, + UC_JOINING_GROUP_NOON, UC_JOINING_GROUP_NYA, + UC_JOINING_GROUP_KNOTTED_HEH, UC_JOINING_GROUP_HAH, + UC_JOINING_GROUP_TEH_MARBUTA, UC_JOINING_GROUP_HEH_GOAL, + UC_JOINING_GROUP_HEH_GOAL, UC_JOINING_GROUP_TEH_MARBUTA_GOAL, + UC_JOINING_GROUP_WAW, UC_JOINING_GROUP_WAW, + UC_JOINING_GROUP_WAW, UC_JOINING_GROUP_WAW, + UC_JOINING_GROUP_WAW, UC_JOINING_GROUP_WAW, + UC_JOINING_GROUP_WAW, UC_JOINING_GROUP_WAW, + UC_JOINING_GROUP_FARSI_YEH, UC_JOINING_GROUP_YEH_WITH_TAIL, + UC_JOINING_GROUP_FARSI_YEH, UC_JOINING_GROUP_WAW, + UC_JOINING_GROUP_YEH, UC_JOINING_GROUP_YEH, + UC_JOINING_GROUP_YEH_BARREE, UC_JOINING_GROUP_YEH_BARREE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_TEH_MARBUTA, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_DAL, UC_JOINING_GROUP_REH, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_SEEN, UC_JOINING_GROUP_SAD, + UC_JOINING_GROUP_AIN, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_KNOTTED_HEH, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_ALAPH, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_BETH, UC_JOINING_GROUP_GAMAL, + UC_JOINING_GROUP_GAMAL, UC_JOINING_GROUP_DALATH_RISH, + UC_JOINING_GROUP_DALATH_RISH, UC_JOINING_GROUP_HE, + UC_JOINING_GROUP_SYRIAC_WAW, UC_JOINING_GROUP_ZAIN, + UC_JOINING_GROUP_HETH, UC_JOINING_GROUP_TETH, + UC_JOINING_GROUP_TETH, UC_JOINING_GROUP_YUDH, + UC_JOINING_GROUP_YUDH_HE, UC_JOINING_GROUP_KAPH, + UC_JOINING_GROUP_LAMADH, UC_JOINING_GROUP_MIM, + UC_JOINING_GROUP_NUN, UC_JOINING_GROUP_SEMKATH, + UC_JOINING_GROUP_FINAL_SEMKATH, UC_JOINING_GROUP_E, + UC_JOINING_GROUP_PE, UC_JOINING_GROUP_REVERSED_PE, + UC_JOINING_GROUP_SADHE, UC_JOINING_GROUP_QAPH, + UC_JOINING_GROUP_DALATH_RISH, UC_JOINING_GROUP_SHIN, + UC_JOINING_GROUP_TAW, UC_JOINING_GROUP_BETH, + UC_JOINING_GROUP_GAMAL, UC_JOINING_GROUP_DALATH_RISH, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE, + UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_ZHAIN, + UC_JOINING_GROUP_KHAPH, UC_JOINING_GROUP_FE, + UC_JOINING_GROUP_BEH, UC_JOINING_GROUP_BEH, + UC_JOINING_GROUP_BEH, UC_JOINING_GROUP_BEH, + UC_JOINING_GROUP_BEH, UC_JOINING_GROUP_BEH, + UC_JOINING_GROUP_BEH, UC_JOINING_GROUP_HAH, + UC_JOINING_GROUP_HAH, UC_JOINING_GROUP_DAL, + UC_JOINING_GROUP_DAL, UC_JOINING_GROUP_REH, + UC_JOINING_GROUP_SEEN, UC_JOINING_GROUP_AIN, + UC_JOINING_GROUP_AIN, UC_JOINING_GROUP_AIN, + UC_JOINING_GROUP_FEH, UC_JOINING_GROUP_FEH, + UC_JOINING_GROUP_GAF, UC_JOINING_GROUP_GAF, + UC_JOINING_GROUP_GAF, UC_JOINING_GROUP_MEEM, + UC_JOINING_GROUP_MEEM, UC_JOINING_GROUP_NOON, + UC_JOINING_GROUP_NOON, UC_JOINING_GROUP_NOON, + UC_JOINING_GROUP_LAM, UC_JOINING_GROUP_REH, + UC_JOINING_GROUP_REH, UC_JOINING_GROUP_SEEN, + UC_JOINING_GROUP_HAH, UC_JOINING_GROUP_HAH, + UC_JOINING_GROUP_SEEN, UC_JOINING_GROUP_REH, + UC_JOINING_GROUP_HAH, UC_JOINING_GROUP_ALEF, + UC_JOINING_GROUP_ALEF, UC_JOINING_GROUP_FARSI_YEH, + UC_JOINING_GROUP_FARSI_YEH, UC_JOINING_GROUP_YEH, + UC_JOINING_GROUP_WAW, UC_JOINING_GROUP_WAW, + UC_JOINING_GROUP_BURUSHASKI_YEH_BARREE, UC_JOINING_GROUP_BURUSHASKI_YEH_BARREE, + UC_JOINING_GROUP_HAH, UC_JOINING_GROUP_SEEN, + UC_JOINING_GROUP_SEEN, UC_JOINING_GROUP_KAF +}; diff --git a/gnulib/lib/unictype/joiningtype_byname.c b/gnulib/lib/unictype/joiningtype_byname.c new file mode 100644 index 0000000..11b4f69 --- /dev/null +++ b/gnulib/lib/unictype/joiningtype_byname.c @@ -0,0 +1,63 @@ +/* Arabic joining type of Unicode characters. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unictype.h" + +#include + +#include "unictype/joiningtype_byname.h" + +int +uc_joining_type_byname (const char *joining_type_name) +{ + size_t len; + + len = strlen (joining_type_name); + if (len <= MAX_WORD_LENGTH) + { + char buf[MAX_WORD_LENGTH + 1]; + const struct named_joining_type *found; + + /* Copy joining_type_name into buf, converting '_' and '-' to ' '. */ + { + const char *p = joining_type_name; + char *q = buf; + + for (;; p++, q++) + { + char c = *p; + + if (c == '_' || c == '-') + c = ' '; + *q = c; + if (c == '\0') + break; + } + } + /* Here q == buf + len. */ + + /* Do a hash table lookup, with case-insensitive comparison. */ + found = uc_joining_type_lookup (buf, len); + if (found != NULL) + return found->joining_type; + } + /* Invalid joining type name. */ + return -1; +} diff --git a/gnulib/lib/unictype/joiningtype_byname.gperf b/gnulib/lib/unictype/joiningtype_byname.gperf new file mode 100644 index 0000000..6b1e7d7 --- /dev/null +++ b/gnulib/lib/unictype/joiningtype_byname.gperf @@ -0,0 +1,30 @@ +/* Arabic joining type of Unicode characters. */ +struct named_joining_type { int name; int joining_type; }; +%struct-type +%ignore-case +%language=ANSI-C +%define hash-function-name joining_type_hash +%define lookup-function-name uc_joining_type_lookup +%readonly-tables +%global-table +%define word-array-name joining_type_names +%pic +%define string-pool-name joining_type_stringpool +%% +C, UC_JOINING_TYPE_C +D, UC_JOINING_TYPE_D +L, UC_JOINING_TYPE_L +R, UC_JOINING_TYPE_R +T, UC_JOINING_TYPE_T +U, UC_JOINING_TYPE_U +Join Causing, UC_JOINING_TYPE_C +JoinCausing, UC_JOINING_TYPE_C +Dual Joining, UC_JOINING_TYPE_D +DualJoining, UC_JOINING_TYPE_D +Left Joining, UC_JOINING_TYPE_L +LeftJoining, UC_JOINING_TYPE_L +Right Joining, UC_JOINING_TYPE_R +RightJoining, UC_JOINING_TYPE_R +Transparent, UC_JOINING_TYPE_T +Non Joining, UC_JOINING_TYPE_U +NonJoining, UC_JOINING_TYPE_U diff --git a/gnulib/lib/unictype/joiningtype_longname.c b/gnulib/lib/unictype/joiningtype_longname.c new file mode 100644 index 0000000..3948b0c --- /dev/null +++ b/gnulib/lib/unictype/joiningtype_longname.c @@ -0,0 +1,40 @@ +/* Arabic joining type of Unicode characters. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unictype.h" + +static const char u_joining_type_long_name[6][14] = +{ + "Non Joining", + "Transparent", + "Join Causing", + "Left Joining", + "Right Joining", + "Dual Joining" +}; + +const char * +uc_joining_type_long_name (int joining_type) +{ + if (joining_type >= 0 + && joining_type < sizeof (u_joining_type_long_name) / sizeof (u_joining_type_long_name[0])) + return u_joining_type_long_name[joining_type]; + return NULL; +} diff --git a/gnulib/lib/unictype/joiningtype_name.c b/gnulib/lib/unictype/joiningtype_name.c new file mode 100644 index 0000000..f1166ef --- /dev/null +++ b/gnulib/lib/unictype/joiningtype_name.c @@ -0,0 +1,35 @@ +/* Arabic joining type of Unicode characters. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unictype.h" + +static const char u_joining_type_name[6][2] = +{ + "U", "T", "C", "L", "R", "D" +}; + +const char * +uc_joining_type_name (int joining_type) +{ + if (joining_type >= 0 + && joining_type < sizeof (u_joining_type_name) / sizeof (u_joining_type_name[0])) + return u_joining_type_name[joining_type]; + return NULL; +} diff --git a/gnulib/lib/unictype/joiningtype_of.c b/gnulib/lib/unictype/joiningtype_of.c new file mode 100644 index 0000000..74a7855 --- /dev/null +++ b/gnulib/lib/unictype/joiningtype_of.c @@ -0,0 +1,54 @@ +/* Arabic joining type of Unicode characters. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unictype.h" + +/* Define u_joining_type table. */ +#include "joiningtype_of.h" + +int +uc_joining_type (ucs4_t uc) +{ + unsigned int index1 = uc >> joining_type_header_0; + if (index1 < joining_type_header_1) + { + int lookup1 = u_joining_type.level1[index1]; + if (lookup1 >= 0) + { + unsigned int index2 = (uc >> joining_type_header_2) & joining_type_header_3; + int lookup2 = u_joining_type.level2[lookup1 + index2]; + if (lookup2 >= 0) + { + unsigned int index3 = (uc & joining_type_header_4) + lookup2; + /* level3 contains 4-bit values. */ + unsigned int lookup3 = + (u_joining_type.level3[index3>>1] >> ((index3 % 2) * 4)) + & 0x0f; + + if (lookup3 != 0x0f) + return lookup3; + } + } + } + if (uc_is_general_category_withtable + (uc, UC_CATEGORY_MASK_Mn | UC_CATEGORY_MASK_Me | UC_CATEGORY_MASK_Cf)) + return UC_JOINING_TYPE_T; + return UC_JOINING_TYPE_U; +} diff --git a/gnulib/lib/unictype/joiningtype_of.h b/gnulib/lib/unictype/joiningtype_of.h new file mode 100644 index 0000000..7e2c8bc --- /dev/null +++ b/gnulib/lib/unictype/joiningtype_of.h @@ -0,0 +1,127 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Arabic joining type of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */ +#define joining_type_header_0 16 +#define joining_type_header_1 1 +#define joining_type_header_2 7 +#define joining_type_header_3 511 +#define joining_type_header_4 127 +static const +struct + { + int level1[1]; + short level2[1 << 9]; + unsigned char level3[5 * 64]; + } +u_joining_type = +{ + { 0 }, + { + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 0, 128, 256, 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, -1, -1, -1, -1, -1, + 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, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -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, 0xff, 0xff, 0xf0, 0x0f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x05, 0x44, 0x44, 0x45, 0x45, 0x55, 0x55, 0x45, + 0x44, 0x54, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, + 0x52, 0x55, 0x55, 0x55, 0x54, 0xf5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x55, + 0x4f, 0x44, 0x40, 0x44, 0x55, 0x55, 0x55, 0x55, + 0x55, 0x55, 0x55, 0x55, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x55, 0x55, 0x55, + 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, + 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, + 0x54, 0x45, 0x44, 0x44, 0x44, 0x44, 0x45, 0x45, + 0x55, 0x44, 0x4f, 0xff, 0xff, 0xff, 0x0f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x44, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x55, 0xf5, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x55, 0x45, 0x44, 0x44, 0x55, 0x55, 0x54, + 0x55, 0x55, 0x55, 0x55, 0x54, 0x54, 0x54, 0x45, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0x55, + 0x55, 0x55, 0x55, 0x55, 0x45, 0x44, 0x55, 0x55, + 0x55, 0x55, 0x55, 0x55, 0x55, 0x45, 0x54, 0x55, + 0x45, 0x45, 0x54, 0x55, 0x44, 0x55, 0x55, 0x55, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x55, 0x55, 0x55, + 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, + 0x55, 0x55, 0x55, 0x55, 0x55, 0xf5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff + } +}; diff --git a/gnulib/lib/unictype/mirror.c b/gnulib/lib/unictype/mirror.c new file mode 100644 index 0000000..4a6c983 --- /dev/null +++ b/gnulib/lib/unictype/mirror.c @@ -0,0 +1,49 @@ +/* Mirrored Unicode characters. + Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..786a010 --- /dev/null +++ b/gnulib/lib/unictype/mirror.h @@ -0,0 +1,503 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Mirrored Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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 0000000..d7417e2 --- /dev/null +++ b/gnulib/lib/unictype/numeric.c @@ -0,0 +1,55 @@ +/* Values of numeric Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..7680466 --- /dev/null +++ b/gnulib/lib/unictype/numeric.h @@ -0,0 +1,710 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Numeric values of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */ +static const uc_fraction_t u_numeric_values[113] = +{ + { 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, 7 }, + { 1, 8 }, + { 3, 8 }, + { 5, 8 }, + { 7, 8 }, + { 1, 9 }, + { 1, 10 }, + { 1, 16 }, + { 3, 16 } +}; +#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[54 * 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, 896, 1024, + 1152, 640, 1280, -1, 1408, 1408, 1536, -1, + 512, 1664, -1, -1, -1, -1, 1792, -1, + -1, -1, -1, -1, -1, 1920, -1, 2048, + 1664, -1, 2176, 2304, -1, 2432, 1408, 0, + 2560, -1, -1, -1, -1, -1, -1, -1, + 2688, 2816, 2944, 3072, -1, -1, -1, -1, + 3200, 3328, -1, -1, -1, -1, 3456, 3584, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3712, -1, -1, -1, -1, -1, -1, + 3840, -1, -1, 3968, 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, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -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, -1, -1, + 4608, 1408, 2816, 1408, 1408, -1, -1, 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, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 4736, 4864, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 1664, -1, + -1, -1, 4992, 5120, -1, -1, 5248, 5376, + -1, 4352, -1, -1, -1, -1, -1, -1, + 5504, -1, 5632, -1, 5760, -1, 5888, -1, + -1, -1, -1, -1, 6016, -1, -1, -1, + 6144, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 6272, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 6400, -1, + -1, -1, -1, -1, -1, -1, -1, 6528, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 6656, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 6784, -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, 0xf000, 0xc34e, 0xe1c1, 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, 0x0000, 0x1ab8, 0xa77e, 0x00e1, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 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, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xc101, 0x5080, 0x1c30, 0x0910, 0x0085, + 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, 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, 0xb6e8, 0xfbdb, 0x8f15, 0x65c9, 0x39f3, + 0x5ead, 0x05b3, 0x0182, 0x60a1, 0x2038, 0x8a12, 0xa305, 0xc331, + 0x82f1, 0x0182, 0x60a1, 0x2038, 0x8a12, 0xa305, 0xc331, 0x82f1, + 0xa2c1, 0x0012, 0xcc38, 0xd39c, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 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, 0x0800, 0x8406, 0xe182, 0x4880, + 0x0228, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6ae0, 0x9df8, 0x0386, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8200, 0x6101, + 0xc151, 0x9505, 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, 0x80dc, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 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, 0x1000, 0x00cc, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8200, 0xa101, + 0xa8b0, 0x82e0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8200, 0xa101, 0xa8b0, 0x82e0, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 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, 0xa72e, 0xf1db, 0xbe7a, 0xb01f, 0xf60a, 0x017e, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 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, 0x1828, 0x880e, 0x6284, + 0xf951, 0x66a4, 0x9ab4, 0x86ed, 0x060b, 0x0304, 0xc142, 0x4070, + 0x1424, 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, 0xd37e, 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, + 0x8081, 0x4060, 0x1828, 0x880e, 0x0284, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 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 0000000..69a9cba --- /dev/null +++ b/gnulib/lib/unictype/pr_alphabetic.c @@ -0,0 +1,35 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..0ba00fe --- /dev/null +++ b/gnulib/lib/unictype/pr_alphabetic.h @@ -0,0 +1,612 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[50 << 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, + 4 + 384 * sizeof (short) / sizeof (int) + 608, + -1, + 4 + 384 * sizeof (short) / sizeof (int) + 624, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 4 + 384 * sizeof (short) / sizeof (int) + 336, + 4 + 384 * sizeof (short) / sizeof (int) + 640, + 4 + 384 * sizeof (short) / sizeof (int) + 656, + -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) + 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, + 4 + 384 * sizeof (short) / sizeof (int) + 336, + 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, + 4 + 384 * sizeof (short) / sizeof (int) + 704, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 4 + 384 * sizeof (short) / sizeof (int) + 720, + 4 + 384 * sizeof (short) / sizeof (int) + 736, + -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) + 752, + 4 + 384 * sizeof (short) / sizeof (int) + 336, + 4 + 384 * sizeof (short) / sizeof (int) + 336, + 4 + 384 * sizeof (short) / sizeof (int) + 336, + 4 + 384 * sizeof (short) / sizeof (int) + 336, + 4 + 384 * sizeof (short) / sizeof (int) + 336, + 4 + 384 * sizeof (short) / sizeof (int) + 336, + 4 + 384 * sizeof (short) / sizeof (int) + 336, + 4 + 384 * sizeof (short) / sizeof (int) + 768, + 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, + 4 + 384 * sizeof (short) / sizeof (int) + 336, + 4 + 384 * sizeof (short) / sizeof (int) + 784, + -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, 0xFFFE00FF, 0x027FFFFF, 0xFFFFFFFE, + 0x000000FF, 0xBFFF0000, 0xFFFF00B6, 0x000707FF, + 0x07FF0000, 0xFFFFFFFF, 0xFEFFFFFF, 0xFFFFC000, + 0xFFFFFFFF, 0xFFFFFFFF, 0x1FEFFFFF, 0x9C00E1FE, + 0xFFFF0000, 0xFFFFFFFF, 0xFFFFE000, 0xFFFFFFFF, + 0xFFFFFFFF, 0x0003FFFF, 0xFFFFFC00, 0x043007FF, + 0xFCFFFFFF, 0x00001FFF, 0x01FFFFFF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xEFFFFFFF, 0xFFE1DFFF, 0xFEFE000F, + 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, 0x0006000F, + 0xFFFDDFEC, 0xE7FFFFFF, 0x00805DDF, 0xFC00000F, + 0xFC7FFFEC, 0x2FFBFFFF, 0xFF5F807F, 0x000C0000, + 0xFFFFFFFE, 0x07FFFFFF, 0x0000207F, 0x00000000, + 0xFEF02596, 0x3BFFECAE, 0x3000205F, 0x00000000, + 0x00000001, 0x00000000, 0xFFFFFEFF, 0xFFFE1FFF, + 0xFEFFFF03, 0x1FFFFFFF, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xF97FFFFF, 0xFFFF0000, 0xFFFFC1E7, + 0x3000407F, 0xFFFFFFFF, 0xFFFF003F, 0x17FFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 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, 0xFFFF9FFF, + 0x07FFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0x0001C7FF, + 0x000FDFFF, 0x000FFFFF, 0x000FFFFF, 0x000DDFFF, + 0xFFFFFFFF, 0xFFCFFFFF, 0x108001FF, 0x00000000, + 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x00FFFFFF, + 0xFFFFFFFF, 0xFFFF07FF, 0xFFFFFFFF, 0x003FFFFF, + 0x1FFFFFFF, 0x01FF0FFF, 0xFFFF0000, 0x001F3FFF, + 0xFFFFFFFF, 0xFFFF0FFF, 0x000003FF, 0x00000000, + 0x0FFFFFFF, 0xFFFFFFFF, 0x7FFFFFFF, 0x001FFFFE, + 0x00000000, 0x00000080, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFEFFFFF, 0x00000FEF, 0x00000000, + 0xFFFFFFFF, 0x0000C3FF, 0xFFFFFFFF, 0x0003FFBF, + 0xFFFFFFFF, 0x003FFFFF, 0xFC00E000, 0x3FFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x0007DE00, + 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, + 0x1FFF0000, 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, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000781F, + 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, 0x07FFFFFF, 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, 0x00000FFF, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x00001FFF, 0x00000000, 0xFFFF0000, 0x3FFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFF1FFF, 0x00000C00, 0xFFFFFFFF, 0x80007FFF, + 0x00FFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF, + 0xFF800000, 0xFFFFFFFC, 0xFFFFFFFF, 0xFFFFFFFF, + 0x000379FF, 0x000003FF, 0x00000000, 0xFC000000, + 0xFFFFF7BB, 0x000000FF, 0xFFFFFFFF, 0x000FFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0x0000000F, 0x08FC0000, + 0xFFFFFC00, 0xFFFF07FF, 0x0007FFFF, 0x1FFFFFFF, + 0xFFFFFFFF, 0xFFF7FFFF, 0x00008000, 0x00000000, + 0xFFFFFFFF, 0x007FFFFF, 0x00003FFF, 0x047FFFFF, + 0xFFFFFFFF, 0x7FFFFFFF, 0x38000005, 0x00000000, + 0x007E7E7E, 0x00007F7F, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xFFFFFFFF, 0x000007FF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFF000F, 0xFFFFF87F, 0x0FFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFF3FFF, 0xFFFFFFFF, 0xFFFF3FFF, + 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, 0x003FFFFF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x003FFFFF, 0x03FFFFFF, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFEEFF06F, 0x000FFFFF, 0x00000000, 0x1FFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0x003FFFFF, 0x003FFFFF, 0x0007FFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0x000001FF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F, 0x00000000, + 0xFFFFFFFC, 0x01FFFFFF, 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, 0x00007FFF, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0x01FFFFFF, 0x00000000, 0x00000000, + 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, + 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, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0x001FFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 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 0000000..ec9f48c --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..5a4ddf3 --- /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-uni-tables.c for Unicode 6.0.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 0000000..b0f260c --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..4f7c14b --- /dev/null +++ b/gnulib/lib/unictype/pr_bidi_arabic_digit.h @@ -0,0 +1,291 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[2 << 4]; + } +u_property_bidi_arabic_digit = +{ + { 2 }, + { + 3 * sizeof (int) / sizeof (short) + 0, + 3 * sizeof (int) / sizeof (short) + 128 + }, + { + -1, + -1, + -1, + 3 + 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, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 3 + 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 + }, + { + 0x0000000F, 0x00000000, 0x00000000, 0x00001BFF, + 0x00000000, 0x00000000, 0x20000000, 0x00000000, + 0x00008000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x7FFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 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 0000000..e6a733d --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..918eda6 --- /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-uni-tables.c for Unicode 6.0.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, 0x000007FF, 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 0000000..3a3d526 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..86f4015 --- /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-uni-tables.c for Unicode 6.0.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 0000000..d42549d --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..d9f9d5b --- /dev/null +++ b/gnulib/lib/unictype/pr_bidi_boundary_neutral.h @@ -0,0 +1,586 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[8 << 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, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 18 + 512 * 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, + 18 + 512 * sizeof (short) / sizeof (int) + 32, + 18 + 512 * 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, + 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, + 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, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -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, + 18 + 512 * sizeof (short) / sizeof (int) + 96, + 18 + 512 * sizeof (short) / sizeof (int) + 112, + 18 + 512 * sizeof (short) / sizeof (int) + 112, + 18 + 512 * sizeof (short) / sizeof (int) + 112, + 18 + 512 * sizeof (short) / sizeof (int) + 112, + 18 + 512 * sizeof (short) / sizeof (int) + 112, + 18 + 512 * sizeof (short) / sizeof (int) + 112, + 18 + 512 * 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, + 18 + 512 * sizeof (short) / sizeof (int) + 80 + }, + { + 0x0FFFC1FF, 0x00000000, 0x00000000, 0x80000000, + 0xFFFFFFDF, 0x00002000, 0x00000000, 0x00000000, + 0x00000000, 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 0000000..e5fc460 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..e282ed9 --- /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-uni-tables.c for Unicode 6.0.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 0000000..adb81d2 --- /dev/null +++ b/gnulib/lib/unictype/pr_bidi_control.c @@ -0,0 +1,35 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..413a01a --- /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-uni-tables.c for Unicode 6.0.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 0000000..2605f4e --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..0959cf5 --- /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-uni-tables.c for Unicode 6.0.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 0000000..a0356e7 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..2a94c12 --- /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-uni-tables.c for Unicode 6.0.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 0000000..e07901c --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..6dc0185 --- /dev/null +++ b/gnulib/lib/unictype/pr_bidi_eur_num_terminator.h @@ -0,0 +1,192 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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_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, + 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, + 2 + 128 * sizeof (short) / sizeof (int) + 144 + }, + { + 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, 0x080C0000, + 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, 0x03FFFFFF, 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, 0x03000000, 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 0000000..a4256b1 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..8fb100b --- /dev/null +++ b/gnulib/lib/unictype/pr_bidi_european_digit.h @@ -0,0 +1,311 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[7 << 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, + 3 + 256 * sizeof (short) / sizeof (int) + 96, + -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, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x000007FF, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000 + } +}; 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 0000000..9e9da84 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..a3e835f --- /dev/null +++ b/gnulib/lib/unictype/pr_bidi_hebrew_right_to_left.h @@ -0,0 +1,319 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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_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) + 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 + }, + { + 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, + 0x043FFFFF, 0xFFFFC110, 0xF1FFFFFF, 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, 0x01FFFFFF, 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, 0x80000000, + 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 0000000..e099da9 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..8a3c941 --- /dev/null +++ b/gnulib/lib/unictype/pr_bidi_left_to_right.h @@ -0,0 +1,726 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[43 << 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) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 416, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 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) + 480, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 496, + -1, + 18 + 512 * sizeof (short) / sizeof (int) + 512, + 18 + 512 * sizeof (short) / sizeof (int) + 528, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + -1, + -1, + -1, + -1, + 18 + 512 * sizeof (short) / sizeof (int) + 544, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 560, + 18 + 512 * sizeof (short) / sizeof (int) + 576, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 592, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 608, + 18 + 512 * sizeof (short) / sizeof (int) + 624, + 18 + 512 * sizeof (short) / sizeof (int) + 640, + 18 + 512 * sizeof (short) / sizeof (int) + 656, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 672, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 672, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 400, + 18 + 512 * sizeof (short) / sizeof (int) + 672 + }, + { + 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, + 0xFFFFFFF8, 0xEBFFFFFF, 0xFF01DE01, 0xFFFFFFF3, + 0xFFFFFFFD, 0xEFFFFFFF, 0xFFFFDFE1, 0xF7F3FFF3, + 0xFFFFFFF9, 0xEFFFFFFF, 0xFFFDC679, 0xFFDCFFFF, + 0xFFFFFFF9, 0xEFFFFFFF, 0xFFFFDE41, 0xFFFDFFF3, + 0xFFFFFFFD, 0x6FFFFFFF, 0xFFBFDFE1, 0xFFFFFFF3, + 0xFFFFFFFB, 0xFFFFFFFF, 0xFFFFDFFE, 0xF807FFFF, + 0xFFFFFFFF, 0x3FFFFFFF, 0xFF9FC23E, 0x80FFFFF3, + 0xFFFFFFFF, 0xEFFFFFFF, 0xFFFFCFFF, 0xFFFFFFF3, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFDFE1, 0xFFFFFFF3, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFA3FBFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0x780DFFFF, 0xFFFF807F, 0xFFFFFFFF, + 0xFFFFFFFF, 0xE40DFFFF, 0xFFFFC0FF, 0xFFFFFFFF, + 0xFCFFFFFF, 0xC15FFFFF, 0xFFFFFFFF, 0x8001FFFF, + 0x01001F20, 0xE0000000, 0xFFFFFFBF, 0xFFFFFFFF, + 0xFFFFFFFF, 0x99021FFF, 0x3CFFFFFF, 0xFFE1FFFE, + 0xDFFFDF9B, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0x1FFFFFFF, 0xFFFFFFFF, + 0xFC00FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFE, 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, 0x80BFFFFF, 0x6007E01A, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFF0, 0xE82FFFFF, 0xFFFFFFFB, 0xFFF007FF, + 0xFFFFFFFC, 0xFFFFFCC3, 0xFFFFFFFF, 0xFFFC5CBF, + 0xFFFFFFFF, 0xFF300FFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0x0008FFFF, 0xFFFFDE02, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x0FFFFF80, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0x5FFFFFFF, 0x1FFF1FFC, 0x9FFF1FFF, + 0x00004000, 0x00000000, 0x00000000, 0x800E0000, + 0xFFFF8000, 0xFC000000, 0x0000FFFF, 0xFFFE0000, + 0x3E2FFC84, 0xF3FFBD50, 0x0000C3E0, 0xFFFFFFFF, + 0x0000FDFF, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0xFFC00000, 0xFFFFFFFF, 0x07FFFFFF, + 0x00200000, 0x00000000, 0x00000000, 0xFFF00000, + 0x00000000, 0xFFFFFF80, 0xFFFFF800, 0x00000000, + 0xF0000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x000003FF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00001000, 0x00000000, 0x00000000, + 0x00000001, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00002800, 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, 0xFC00E000, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x01FC781F, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x7FFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, + 0x00000000, 0xFFFC0000, 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, 0xFFFFFFFF, 0xFFFFFFFF, + 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, 0xFFFCFFFF, + 0x00000000, 0xFFFFFFFC, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFEFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFF7BB, 0xFCFFF09F, 0xFFFFFFFF, 0xFF0FFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFEF, 0xFFFC0000, + 0xFFFFFFFF, 0xFFFFC03F, 0xFFFC007F, 0xFFFFFFFF, + 0xFFFFFFF8, 0xEC37FFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFF9981FF, 0xFFFFEFF7, 0xFFFFFFFF, + 0xFFFFFFFF, 0x3E62FFFF, 0xFFFFFFFD, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFDEDF, + 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, + 0xFFFFFFFD, 0x00FFFFFF, 0x0003FF80, 0xFFFFFFC0, + 0xFFFFFFFC, 0xF987FFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 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, 0xF7FFFFFF, 0xFFFFFFFF, + 0xFFDFFFFF, 0xFFFFFFFF, 0xFFFF7FFF, 0xFFFFFFFF, + 0xFFFFFDFF, 0xFFFFFFFF, 0x00003FF7, 0x00000000, + 0x00000000, 0x0000F000, 0x00000000, 0x00000000, + 0xFFF00000, 0x80018000, 0x00010001, 0xFFFFFFFF, + 0xFFFFF800, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x00000000, 0x0040FFFE, 0x00000000, 0xE0000000, + 0xFFF00000, 0x00000000, 0xFFFFF820, 0xFFFE0000, + 0x00000000, 0x80000000, 0x00000002, 0x00000000, + 0x00001000, 0x00000000, 0x00000000, 0xE1000000, + 0x00000000, 0xC0000010, 0x0000FFFF, 0xFFFFFF00, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x07FFFFFF, + 0x8AA20001, 0x0010D0C0, 0xFFFF001E, 0xFFFFFFFF, + 0x00000000, 0x00000000, 0xFFFFFFC0, 0xFFFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0xFFF00000, + 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 0000000..4f20ca4 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..50c5d5f --- /dev/null +++ b/gnulib/lib/unictype/pr_bidi_non_spacing_mark.h @@ -0,0 +1,532 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[27 << 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, + 16 + 384 * 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, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -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) + 384, + 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, + 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, + -1, + -1, + -1, + -1, + -1, + -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, 0xFFFFF800, 0x00010000, + 0x00000000, 0x00000000, 0x9FC00000, 0x00003D9F, + 0x00020000, 0xFFFF0000, 0x000007FF, 0x00000000, + 0x00000000, 0x0001FFC0, 0x00000000, 0x000FF800, + 0xFBC00000, 0x00003EEF, 0x0E000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000007, 0x14000000, 0x00FE21FE, 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, + 0xFEFFE0DF, 0x1FFFFFFF, 0x00000040, 0x00000000, + 0x00000000, 0x66FDE000, 0xC3000000, 0x001E0001, + 0x20002064, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xE0000000, 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, 0x7F400000, 0x9FF81FE5, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x0000000F, 0x17D00000, 0x00000004, 0x000FF800, + 0x00000003, 0x0000033C, 0x00000000, 0x0003A340, + 0x00000000, 0x00CFF000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xFFF70000, 0x000021FD, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xFFFFFFFF, 0xF000007F, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xFFFF0000, 0x0001FFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00038000, + 0x00000000, 0x00000000, 0x00000000, 0x80000000, + 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, 0x00030000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000844, 0x00000060, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000010, 0x0003FFFF, + 0x00000000, 0x00003FC0, 0x0003FF80, 0x00000000, + 0x00000007, 0x13C80000, 0x00000000, 0x00000000, + 0x00000000, 0x00667E00, 0x00001008, 0x00000000, + 0x00000000, 0xC19D0000, 0x00000002, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00002120, + 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, + 0x00000002, 0xFF000000, 0x0000007F, 0x00000000, + 0x00000003, 0x06780000, 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 0000000..a798717 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..995d2ff --- /dev/null +++ b/gnulib/lib/unictype/pr_bidi_other_neutral.h @@ -0,0 +1,435 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[38 << 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, + 3 + 256 * sizeof (short) / sizeof (int) + 128, + 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, + 3 + 256 * sizeof (short) / sizeof (int) + 336, + -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, + -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, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -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) + 416, + 3 + 256 * sizeof (short) / sizeof (int) + 432, + 3 + 256 * sizeof (short) / sizeof (int) + 448, + -1, + -1, + -1, + 3 + 256 * sizeof (short) / sizeof (int) + 464, + 3 + 256 * sizeof (short) / sizeof (int) + 480, + -1, + -1, + 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, + 3 + 256 * sizeof (short) / sizeof (int) + 512, + -1, + 3 + 256 * sizeof (short) / sizeof (int) + 528, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 3 + 256 * sizeof (short) / sizeof (int) + 544, + 3 + 256 * sizeof (short) / sizeof (int) + 560, + 3 + 256 * sizeof (short) / sizeof (int) + 576, + 3 + 256 * sizeof (short) / sizeof (int) + 592, + -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, 0x40000000, 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, 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, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x03FF0000, 0x00000000, 0x00000000, 0x00000000, + 0x00000001, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 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, 0xFFFF3C1F, 0x00000000, + 0xFFFF0200, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFF3FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0x003FFFFF, 0x00000000, 0xF8000000, + 0xFFDFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000FFFFF, + 0xFFFFFFFF, 0x0000007F, 0x000007FF, 0xFFFFFFFF, + 0x000000FF, 0x00000000, 0x00000000, 0xFFFFFC00, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFEFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFD7FF, 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, 0x03FF1FFF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0xFE0007E0, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0x0003FFFF, 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, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0xFE000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xFFFC0000, 0x0000003F, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0x00000023, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x08000000, 0x00000000, + 0x00200000, 0x00000000, 0x00008000, 0x00000000, + 0x00000200, 0x00000000, 0x00000008, 0x00000000, + 0xFFFFFFFF, 0xFFFF0FFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x000FFFFF, 0x7FFE7FFF, 0xFFFEFFFE, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFBF0001, 0xFFFFFFFF, 0x1FFFFFFF, + 0x000FFFFF, 0xFFFFFFFF, 0x000007DF, 0x0001FFFF, + 0xFFFFFFFF, 0x7FFFFFFF, 0xFFFFFFFD, 0xFFFFFFFF, + 0xFFFFEFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x1EFFFFFF, + 0xFFFFFFFF, 0x3FFFFFEF, 0xFFFF0000, 0x000000FF, + 0x00000000, 0x00000000, 0x00000000, 0xF8000000, + 0x755DFFFE, 0xFFEF2F3F, 0x0000FFE1, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000FFFFF, + 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 0000000..8276f43 --- /dev/null +++ b/gnulib/lib/unictype/pr_bidi_pdf.c @@ -0,0 +1,47 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..f32fe6f --- /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-uni-tables.c for Unicode 6.0.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 0000000..7c26550 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..f35a725 --- /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-uni-tables.c for Unicode 6.0.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 0000000..1bfe6f0 --- /dev/null +++ b/gnulib/lib/unictype/pr_bidi_whitespace.c @@ -0,0 +1,47 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..ffec908 --- /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-uni-tables.c for Unicode 6.0.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 0000000..94753ab --- /dev/null +++ b/gnulib/lib/unictype/pr_byname.c @@ -0,0 +1,339 @@ +/* Properties of Unicode characters. + Copyright (C) 2007, 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unictype.h" + +#include +#include + +/* Indices stored in the 'struct named_category' elements of the perfect hash + table. We don't use uc_general_category_t values or their addresses + directly, because this would introduce load-time relocations. */ +enum +{ + /* General. */ + UC_PROPERTY_INDEX_WHITE_SPACE, + UC_PROPERTY_INDEX_ALPHABETIC, + UC_PROPERTY_INDEX_OTHER_ALPHABETIC, + UC_PROPERTY_INDEX_NOT_A_CHARACTER, + UC_PROPERTY_INDEX_DEFAULT_IGNORABLE_CODE_POINT, + UC_PROPERTY_INDEX_OTHER_DEFAULT_IGNORABLE_CODE_POINT, + UC_PROPERTY_INDEX_DEPRECATED, + UC_PROPERTY_INDEX_LOGICAL_ORDER_EXCEPTION, + UC_PROPERTY_INDEX_VARIATION_SELECTOR, + UC_PROPERTY_INDEX_PRIVATE_USE, + UC_PROPERTY_INDEX_UNASSIGNED_CODE_VALUE, + /* Case. */ + UC_PROPERTY_INDEX_UPPERCASE, + UC_PROPERTY_INDEX_OTHER_UPPERCASE, + UC_PROPERTY_INDEX_LOWERCASE, + UC_PROPERTY_INDEX_OTHER_LOWERCASE, + UC_PROPERTY_INDEX_TITLECASE, + UC_PROPERTY_INDEX_CASED, + UC_PROPERTY_INDEX_CASE_IGNORABLE, + UC_PROPERTY_INDEX_CHANGES_WHEN_LOWERCASED, + UC_PROPERTY_INDEX_CHANGES_WHEN_UPPERCASED, + UC_PROPERTY_INDEX_CHANGES_WHEN_TITLECASED, + UC_PROPERTY_INDEX_CHANGES_WHEN_CASEFOLDED, + UC_PROPERTY_INDEX_CHANGES_WHEN_CASEMAPPED, + UC_PROPERTY_INDEX_SOFT_DOTTED, + /* Identifiers. */ + UC_PROPERTY_INDEX_ID_START, + UC_PROPERTY_INDEX_OTHER_ID_START, + UC_PROPERTY_INDEX_ID_CONTINUE, + UC_PROPERTY_INDEX_OTHER_ID_CONTINUE, + UC_PROPERTY_INDEX_XID_START, + UC_PROPERTY_INDEX_XID_CONTINUE, + UC_PROPERTY_INDEX_PATTERN_WHITE_SPACE, + UC_PROPERTY_INDEX_PATTERN_SYNTAX, + /* Shaping and rendering. */ + UC_PROPERTY_INDEX_JOIN_CONTROL, + UC_PROPERTY_INDEX_GRAPHEME_BASE, + UC_PROPERTY_INDEX_GRAPHEME_EXTEND, + UC_PROPERTY_INDEX_OTHER_GRAPHEME_EXTEND, + UC_PROPERTY_INDEX_GRAPHEME_LINK, + /* Bidi. */ + UC_PROPERTY_INDEX_BIDI_CONTROL, + UC_PROPERTY_INDEX_BIDI_LEFT_TO_RIGHT, + UC_PROPERTY_INDEX_BIDI_HEBREW_RIGHT_TO_LEFT, + UC_PROPERTY_INDEX_BIDI_ARABIC_RIGHT_TO_LEFT, + UC_PROPERTY_INDEX_BIDI_EUROPEAN_DIGIT, + UC_PROPERTY_INDEX_BIDI_EUR_NUM_SEPARATOR, + UC_PROPERTY_INDEX_BIDI_EUR_NUM_TERMINATOR, + UC_PROPERTY_INDEX_BIDI_ARABIC_DIGIT, + UC_PROPERTY_INDEX_BIDI_COMMON_SEPARATOR, + UC_PROPERTY_INDEX_BIDI_BLOCK_SEPARATOR, + UC_PROPERTY_INDEX_BIDI_SEGMENT_SEPARATOR, + UC_PROPERTY_INDEX_BIDI_WHITESPACE, + UC_PROPERTY_INDEX_BIDI_NON_SPACING_MARK, + UC_PROPERTY_INDEX_BIDI_BOUNDARY_NEUTRAL, + UC_PROPERTY_INDEX_BIDI_PDF, + UC_PROPERTY_INDEX_BIDI_EMBEDDING_OR_OVERRIDE, + UC_PROPERTY_INDEX_BIDI_OTHER_NEUTRAL, + /* Numeric. */ + UC_PROPERTY_INDEX_HEX_DIGIT, + UC_PROPERTY_INDEX_ASCII_HEX_DIGIT, + /* CJK. */ + UC_PROPERTY_INDEX_IDEOGRAPHIC, + UC_PROPERTY_INDEX_UNIFIED_IDEOGRAPH, + UC_PROPERTY_INDEX_RADICAL, + UC_PROPERTY_INDEX_IDS_BINARY_OPERATOR, + UC_PROPERTY_INDEX_IDS_TRINARY_OPERATOR, + /* Misc. */ + UC_PROPERTY_INDEX_ZERO_WIDTH, + UC_PROPERTY_INDEX_SPACE, + UC_PROPERTY_INDEX_NON_BREAK, + UC_PROPERTY_INDEX_ISO_CONTROL, + UC_PROPERTY_INDEX_FORMAT_CONTROL, + UC_PROPERTY_INDEX_DASH, + UC_PROPERTY_INDEX_HYPHEN, + UC_PROPERTY_INDEX_PUNCTUATION, + UC_PROPERTY_INDEX_LINE_SEPARATOR, + UC_PROPERTY_INDEX_PARAGRAPH_SEPARATOR, + UC_PROPERTY_INDEX_QUOTATION_MARK, + UC_PROPERTY_INDEX_SENTENCE_TERMINAL, + UC_PROPERTY_INDEX_TERMINAL_PUNCTUATION, + UC_PROPERTY_INDEX_CURRENCY_SYMBOL, + UC_PROPERTY_INDEX_MATH, + UC_PROPERTY_INDEX_OTHER_MATH, + UC_PROPERTY_INDEX_PAIRED_PUNCTUATION, + UC_PROPERTY_INDEX_LEFT_OF_PAIR, + UC_PROPERTY_INDEX_COMBINING, + UC_PROPERTY_INDEX_COMPOSITE, + UC_PROPERTY_INDEX_DECIMAL_DIGIT, + UC_PROPERTY_INDEX_NUMERIC, + UC_PROPERTY_INDEX_DIACRITIC, + UC_PROPERTY_INDEX_EXTENDER, + UC_PROPERTY_INDEX_IGNORABLE_CONTROL +}; + +/* 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) + /* Use a 'switch' statement here, because a table would introduce load-time + relocations. */ + switch (found->property_index) + { + case UC_PROPERTY_INDEX_WHITE_SPACE: + return UC_PROPERTY_WHITE_SPACE; + case UC_PROPERTY_INDEX_ALPHABETIC: + return UC_PROPERTY_ALPHABETIC; + case UC_PROPERTY_INDEX_OTHER_ALPHABETIC: + return UC_PROPERTY_OTHER_ALPHABETIC; + case UC_PROPERTY_INDEX_NOT_A_CHARACTER: + return UC_PROPERTY_NOT_A_CHARACTER; + case UC_PROPERTY_INDEX_DEFAULT_IGNORABLE_CODE_POINT: + return UC_PROPERTY_DEFAULT_IGNORABLE_CODE_POINT; + case UC_PROPERTY_INDEX_OTHER_DEFAULT_IGNORABLE_CODE_POINT: + return UC_PROPERTY_OTHER_DEFAULT_IGNORABLE_CODE_POINT; + case UC_PROPERTY_INDEX_DEPRECATED: + return UC_PROPERTY_DEPRECATED; + case UC_PROPERTY_INDEX_LOGICAL_ORDER_EXCEPTION: + return UC_PROPERTY_LOGICAL_ORDER_EXCEPTION; + case UC_PROPERTY_INDEX_VARIATION_SELECTOR: + return UC_PROPERTY_VARIATION_SELECTOR; + case UC_PROPERTY_INDEX_PRIVATE_USE: + return UC_PROPERTY_PRIVATE_USE; + case UC_PROPERTY_INDEX_UNASSIGNED_CODE_VALUE: + return UC_PROPERTY_UNASSIGNED_CODE_VALUE; + case UC_PROPERTY_INDEX_UPPERCASE: + return UC_PROPERTY_UPPERCASE; + case UC_PROPERTY_INDEX_OTHER_UPPERCASE: + return UC_PROPERTY_OTHER_UPPERCASE; + case UC_PROPERTY_INDEX_LOWERCASE: + return UC_PROPERTY_LOWERCASE; + case UC_PROPERTY_INDEX_OTHER_LOWERCASE: + return UC_PROPERTY_OTHER_LOWERCASE; + case UC_PROPERTY_INDEX_TITLECASE: + return UC_PROPERTY_TITLECASE; + case UC_PROPERTY_INDEX_CASED: + return UC_PROPERTY_CASED; + case UC_PROPERTY_INDEX_CASE_IGNORABLE: + return UC_PROPERTY_CASE_IGNORABLE; + case UC_PROPERTY_INDEX_CHANGES_WHEN_LOWERCASED: + return UC_PROPERTY_CHANGES_WHEN_LOWERCASED; + case UC_PROPERTY_INDEX_CHANGES_WHEN_UPPERCASED: + return UC_PROPERTY_CHANGES_WHEN_UPPERCASED; + case UC_PROPERTY_INDEX_CHANGES_WHEN_TITLECASED: + return UC_PROPERTY_CHANGES_WHEN_TITLECASED; + case UC_PROPERTY_INDEX_CHANGES_WHEN_CASEFOLDED: + return UC_PROPERTY_CHANGES_WHEN_CASEFOLDED; + case UC_PROPERTY_INDEX_CHANGES_WHEN_CASEMAPPED: + return UC_PROPERTY_CHANGES_WHEN_CASEMAPPED; + case UC_PROPERTY_INDEX_SOFT_DOTTED: + return UC_PROPERTY_SOFT_DOTTED; + case UC_PROPERTY_INDEX_ID_START: + return UC_PROPERTY_ID_START; + case UC_PROPERTY_INDEX_OTHER_ID_START: + return UC_PROPERTY_OTHER_ID_START; + case UC_PROPERTY_INDEX_ID_CONTINUE: + return UC_PROPERTY_ID_CONTINUE; + case UC_PROPERTY_INDEX_OTHER_ID_CONTINUE: + return UC_PROPERTY_OTHER_ID_CONTINUE; + case UC_PROPERTY_INDEX_XID_START: + return UC_PROPERTY_XID_START; + case UC_PROPERTY_INDEX_XID_CONTINUE: + return UC_PROPERTY_XID_CONTINUE; + case UC_PROPERTY_INDEX_PATTERN_WHITE_SPACE: + return UC_PROPERTY_PATTERN_WHITE_SPACE; + case UC_PROPERTY_INDEX_PATTERN_SYNTAX: + return UC_PROPERTY_PATTERN_SYNTAX; + case UC_PROPERTY_INDEX_JOIN_CONTROL: + return UC_PROPERTY_JOIN_CONTROL; + case UC_PROPERTY_INDEX_GRAPHEME_BASE: + return UC_PROPERTY_GRAPHEME_BASE; + case UC_PROPERTY_INDEX_GRAPHEME_EXTEND: + return UC_PROPERTY_GRAPHEME_EXTEND; + case UC_PROPERTY_INDEX_OTHER_GRAPHEME_EXTEND: + return UC_PROPERTY_OTHER_GRAPHEME_EXTEND; + case UC_PROPERTY_INDEX_GRAPHEME_LINK: + return UC_PROPERTY_GRAPHEME_LINK; + case UC_PROPERTY_INDEX_BIDI_CONTROL: + return UC_PROPERTY_BIDI_CONTROL; + case UC_PROPERTY_INDEX_BIDI_LEFT_TO_RIGHT: + return UC_PROPERTY_BIDI_LEFT_TO_RIGHT; + case UC_PROPERTY_INDEX_BIDI_HEBREW_RIGHT_TO_LEFT: + return UC_PROPERTY_BIDI_HEBREW_RIGHT_TO_LEFT; + case UC_PROPERTY_INDEX_BIDI_ARABIC_RIGHT_TO_LEFT: + return UC_PROPERTY_BIDI_ARABIC_RIGHT_TO_LEFT; + case UC_PROPERTY_INDEX_BIDI_EUROPEAN_DIGIT: + return UC_PROPERTY_BIDI_EUROPEAN_DIGIT; + case UC_PROPERTY_INDEX_BIDI_EUR_NUM_SEPARATOR: + return UC_PROPERTY_BIDI_EUR_NUM_SEPARATOR; + case UC_PROPERTY_INDEX_BIDI_EUR_NUM_TERMINATOR: + return UC_PROPERTY_BIDI_EUR_NUM_TERMINATOR; + case UC_PROPERTY_INDEX_BIDI_ARABIC_DIGIT: + return UC_PROPERTY_BIDI_ARABIC_DIGIT; + case UC_PROPERTY_INDEX_BIDI_COMMON_SEPARATOR: + return UC_PROPERTY_BIDI_COMMON_SEPARATOR; + case UC_PROPERTY_INDEX_BIDI_BLOCK_SEPARATOR: + return UC_PROPERTY_BIDI_BLOCK_SEPARATOR; + case UC_PROPERTY_INDEX_BIDI_SEGMENT_SEPARATOR: + return UC_PROPERTY_BIDI_SEGMENT_SEPARATOR; + case UC_PROPERTY_INDEX_BIDI_WHITESPACE: + return UC_PROPERTY_BIDI_WHITESPACE; + case UC_PROPERTY_INDEX_BIDI_NON_SPACING_MARK: + return UC_PROPERTY_BIDI_NON_SPACING_MARK; + case UC_PROPERTY_INDEX_BIDI_BOUNDARY_NEUTRAL: + return UC_PROPERTY_BIDI_BOUNDARY_NEUTRAL; + case UC_PROPERTY_INDEX_BIDI_PDF: + return UC_PROPERTY_BIDI_PDF; + case UC_PROPERTY_INDEX_BIDI_EMBEDDING_OR_OVERRIDE: + return UC_PROPERTY_BIDI_EMBEDDING_OR_OVERRIDE; + case UC_PROPERTY_INDEX_BIDI_OTHER_NEUTRAL: + return UC_PROPERTY_BIDI_OTHER_NEUTRAL; + case UC_PROPERTY_INDEX_HEX_DIGIT: + return UC_PROPERTY_HEX_DIGIT; + case UC_PROPERTY_INDEX_ASCII_HEX_DIGIT: + return UC_PROPERTY_ASCII_HEX_DIGIT; + case UC_PROPERTY_INDEX_IDEOGRAPHIC: + return UC_PROPERTY_IDEOGRAPHIC; + case UC_PROPERTY_INDEX_UNIFIED_IDEOGRAPH: + return UC_PROPERTY_UNIFIED_IDEOGRAPH; + case UC_PROPERTY_INDEX_RADICAL: + return UC_PROPERTY_RADICAL; + case UC_PROPERTY_INDEX_IDS_BINARY_OPERATOR: + return UC_PROPERTY_IDS_BINARY_OPERATOR; + case UC_PROPERTY_INDEX_IDS_TRINARY_OPERATOR: + return UC_PROPERTY_IDS_TRINARY_OPERATOR; + case UC_PROPERTY_INDEX_ZERO_WIDTH: + return UC_PROPERTY_ZERO_WIDTH; + case UC_PROPERTY_INDEX_SPACE: + return UC_PROPERTY_SPACE; + case UC_PROPERTY_INDEX_NON_BREAK: + return UC_PROPERTY_NON_BREAK; + case UC_PROPERTY_INDEX_ISO_CONTROL: + return UC_PROPERTY_ISO_CONTROL; + case UC_PROPERTY_INDEX_FORMAT_CONTROL: + return UC_PROPERTY_FORMAT_CONTROL; + case UC_PROPERTY_INDEX_DASH: + return UC_PROPERTY_DASH; + case UC_PROPERTY_INDEX_HYPHEN: + return UC_PROPERTY_HYPHEN; + case UC_PROPERTY_INDEX_PUNCTUATION: + return UC_PROPERTY_PUNCTUATION; + case UC_PROPERTY_INDEX_LINE_SEPARATOR: + return UC_PROPERTY_LINE_SEPARATOR; + case UC_PROPERTY_INDEX_PARAGRAPH_SEPARATOR: + return UC_PROPERTY_PARAGRAPH_SEPARATOR; + case UC_PROPERTY_INDEX_QUOTATION_MARK: + return UC_PROPERTY_QUOTATION_MARK; + case UC_PROPERTY_INDEX_SENTENCE_TERMINAL: + return UC_PROPERTY_SENTENCE_TERMINAL; + case UC_PROPERTY_INDEX_TERMINAL_PUNCTUATION: + return UC_PROPERTY_TERMINAL_PUNCTUATION; + case UC_PROPERTY_INDEX_CURRENCY_SYMBOL: + return UC_PROPERTY_CURRENCY_SYMBOL; + case UC_PROPERTY_INDEX_MATH: + return UC_PROPERTY_MATH; + case UC_PROPERTY_INDEX_OTHER_MATH: + return UC_PROPERTY_OTHER_MATH; + case UC_PROPERTY_INDEX_PAIRED_PUNCTUATION: + return UC_PROPERTY_PAIRED_PUNCTUATION; + case UC_PROPERTY_INDEX_LEFT_OF_PAIR: + return UC_PROPERTY_LEFT_OF_PAIR; + case UC_PROPERTY_INDEX_COMBINING: + return UC_PROPERTY_COMBINING; + case UC_PROPERTY_INDEX_COMPOSITE: + return UC_PROPERTY_COMPOSITE; + case UC_PROPERTY_INDEX_DECIMAL_DIGIT: + return UC_PROPERTY_DECIMAL_DIGIT; + case UC_PROPERTY_INDEX_NUMERIC: + return UC_PROPERTY_NUMERIC; + case UC_PROPERTY_INDEX_DIACRITIC: + return UC_PROPERTY_DIACRITIC; + case UC_PROPERTY_INDEX_EXTENDER: + return UC_PROPERTY_EXTENDER; + case UC_PROPERTY_INDEX_IGNORABLE_CONTROL: + return UC_PROPERTY_IGNORABLE_CONTROL; + default: + abort (); + } + 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 0000000..9c2031b --- /dev/null +++ b/gnulib/lib/unictype/pr_byname.gperf @@ -0,0 +1,218 @@ +struct named_property { int name; int property_index; }; +%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 +%pic +%define string-pool-name properties_stringpool +%% +white_space, UC_PROPERTY_INDEX_WHITE_SPACE +whitespace, UC_PROPERTY_INDEX_WHITE_SPACE +wspace, UC_PROPERTY_INDEX_WHITE_SPACE +alphabetic, UC_PROPERTY_INDEX_ALPHABETIC +alpha, UC_PROPERTY_INDEX_ALPHABETIC +other_alphabetic, UC_PROPERTY_INDEX_OTHER_ALPHABETIC +otheralphabetic, UC_PROPERTY_INDEX_OTHER_ALPHABETIC +oalpha, UC_PROPERTY_INDEX_OTHER_ALPHABETIC +not_a_character, UC_PROPERTY_INDEX_NOT_A_CHARACTER +notacharacter, UC_PROPERTY_INDEX_NOT_A_CHARACTER +default_ignorable_code_point, UC_PROPERTY_INDEX_DEFAULT_IGNORABLE_CODE_POINT +defaultignorablecodepoint, UC_PROPERTY_INDEX_DEFAULT_IGNORABLE_CODE_POINT +di, UC_PROPERTY_INDEX_DEFAULT_IGNORABLE_CODE_POINT +other_default_ignorable_code_point, UC_PROPERTY_INDEX_OTHER_DEFAULT_IGNORABLE_CODE_POINT +otherdefaultignorablecodepoint, UC_PROPERTY_INDEX_OTHER_DEFAULT_IGNORABLE_CODE_POINT +odi, UC_PROPERTY_INDEX_OTHER_DEFAULT_IGNORABLE_CODE_POINT +deprecated, UC_PROPERTY_INDEX_DEPRECATED +dep, UC_PROPERTY_INDEX_DEPRECATED +logical_order_exception, UC_PROPERTY_INDEX_LOGICAL_ORDER_EXCEPTION +logicalorderexception, UC_PROPERTY_INDEX_LOGICAL_ORDER_EXCEPTION +loe, UC_PROPERTY_INDEX_LOGICAL_ORDER_EXCEPTION +variation_selector, UC_PROPERTY_INDEX_VARIATION_SELECTOR +variationselector, UC_PROPERTY_INDEX_VARIATION_SELECTOR +vs, UC_PROPERTY_INDEX_VARIATION_SELECTOR +private_use, UC_PROPERTY_INDEX_PRIVATE_USE +privateuse, UC_PROPERTY_INDEX_PRIVATE_USE +unassigned_code_value, UC_PROPERTY_INDEX_UNASSIGNED_CODE_VALUE +unassignedcodevalue, UC_PROPERTY_INDEX_UNASSIGNED_CODE_VALUE +uppercase, UC_PROPERTY_INDEX_UPPERCASE +upper, UC_PROPERTY_INDEX_UPPERCASE +other_uppercase, UC_PROPERTY_INDEX_OTHER_UPPERCASE +otheruppercase, UC_PROPERTY_INDEX_OTHER_UPPERCASE +oupper, UC_PROPERTY_INDEX_OTHER_UPPERCASE +lowercase, UC_PROPERTY_INDEX_LOWERCASE +lower, UC_PROPERTY_INDEX_LOWERCASE +other_lowercase, UC_PROPERTY_INDEX_OTHER_LOWERCASE +otherlowercase, UC_PROPERTY_INDEX_OTHER_LOWERCASE +olower, UC_PROPERTY_INDEX_OTHER_LOWERCASE +titlecase, UC_PROPERTY_INDEX_TITLECASE +cased, UC_PROPERTY_INDEX_CASED +case_ignorable, UC_PROPERTY_INDEX_CASE_IGNORABLE +caseignorable, UC_PROPERTY_INDEX_CASE_IGNORABLE +ci, UC_PROPERTY_INDEX_CASE_IGNORABLE +changes_when_lowercased, UC_PROPERTY_INDEX_CHANGES_WHEN_LOWERCASED +changeswhenlowercased, UC_PROPERTY_INDEX_CHANGES_WHEN_LOWERCASED +cwl, UC_PROPERTY_INDEX_CHANGES_WHEN_LOWERCASED +changes_when_uppercased, UC_PROPERTY_INDEX_CHANGES_WHEN_UPPERCASED +changeswhenuppercased, UC_PROPERTY_INDEX_CHANGES_WHEN_UPPERCASED +cwu, UC_PROPERTY_INDEX_CHANGES_WHEN_UPPERCASED +changes_when_titlecased, UC_PROPERTY_INDEX_CHANGES_WHEN_TITLECASED +changeswhentitlecased, UC_PROPERTY_INDEX_CHANGES_WHEN_TITLECASED +cwt, UC_PROPERTY_INDEX_CHANGES_WHEN_TITLECASED +changes_when_casefolded, UC_PROPERTY_INDEX_CHANGES_WHEN_CASEFOLDED +changeswhencasefolded, UC_PROPERTY_INDEX_CHANGES_WHEN_CASEFOLDED +cwcf, UC_PROPERTY_INDEX_CHANGES_WHEN_CASEFOLDED +changes_when_casemapped, UC_PROPERTY_INDEX_CHANGES_WHEN_CASEMAPPED +changeswhencasemapped, UC_PROPERTY_INDEX_CHANGES_WHEN_CASEMAPPED +cwcm, UC_PROPERTY_INDEX_CHANGES_WHEN_CASEMAPPED +soft_dotted, UC_PROPERTY_INDEX_SOFT_DOTTED +softdotted, UC_PROPERTY_INDEX_SOFT_DOTTED +sd, UC_PROPERTY_INDEX_SOFT_DOTTED +id_start, UC_PROPERTY_INDEX_ID_START +idstart, UC_PROPERTY_INDEX_ID_START +ids, UC_PROPERTY_INDEX_ID_START +other_id_start, UC_PROPERTY_INDEX_OTHER_ID_START +otheridstart, UC_PROPERTY_INDEX_OTHER_ID_START +oids, UC_PROPERTY_INDEX_OTHER_ID_START +id_continue, UC_PROPERTY_INDEX_ID_CONTINUE +idcontinue, UC_PROPERTY_INDEX_ID_CONTINUE +idc, UC_PROPERTY_INDEX_ID_CONTINUE +other_id_continue, UC_PROPERTY_INDEX_OTHER_ID_CONTINUE +otheridcontinue, UC_PROPERTY_INDEX_OTHER_ID_CONTINUE +oidc, UC_PROPERTY_INDEX_OTHER_ID_CONTINUE +xid_start, UC_PROPERTY_INDEX_XID_START +xidstart, UC_PROPERTY_INDEX_XID_START +xids, UC_PROPERTY_INDEX_XID_START +xid_continue, UC_PROPERTY_INDEX_XID_CONTINUE +xidcontinue, UC_PROPERTY_INDEX_XID_CONTINUE +xidc, UC_PROPERTY_INDEX_XID_CONTINUE +pattern_white_space, UC_PROPERTY_INDEX_PATTERN_WHITE_SPACE +patternwhitespace, UC_PROPERTY_INDEX_PATTERN_WHITE_SPACE +pat_ws, UC_PROPERTY_INDEX_PATTERN_WHITE_SPACE +patws, UC_PROPERTY_INDEX_PATTERN_WHITE_SPACE +pattern_syntax, UC_PROPERTY_INDEX_PATTERN_SYNTAX +patternsyntax, UC_PROPERTY_INDEX_PATTERN_SYNTAX +pat_syn, UC_PROPERTY_INDEX_PATTERN_SYNTAX +patsyn, UC_PROPERTY_INDEX_PATTERN_SYNTAX +join_control, UC_PROPERTY_INDEX_JOIN_CONTROL +joincontrol, UC_PROPERTY_INDEX_JOIN_CONTROL +join_c, UC_PROPERTY_INDEX_JOIN_CONTROL +joinc, UC_PROPERTY_INDEX_JOIN_CONTROL +grapheme_base, UC_PROPERTY_INDEX_GRAPHEME_BASE +graphemebase, UC_PROPERTY_INDEX_GRAPHEME_BASE +gr_base, UC_PROPERTY_INDEX_GRAPHEME_BASE +grbase, UC_PROPERTY_INDEX_GRAPHEME_BASE +grapheme_extend, UC_PROPERTY_INDEX_GRAPHEME_EXTEND +graphemeextend, UC_PROPERTY_INDEX_GRAPHEME_EXTEND +gr_ext, UC_PROPERTY_INDEX_GRAPHEME_EXTEND +grext, UC_PROPERTY_INDEX_GRAPHEME_EXTEND +other_grapheme_extend, UC_PROPERTY_INDEX_OTHER_GRAPHEME_EXTEND +othergraphemeextend, UC_PROPERTY_INDEX_OTHER_GRAPHEME_EXTEND +ogr_ext, UC_PROPERTY_INDEX_OTHER_GRAPHEME_EXTEND +ogrext, UC_PROPERTY_INDEX_OTHER_GRAPHEME_EXTEND +grapheme_link, UC_PROPERTY_INDEX_GRAPHEME_LINK +graphemelink, UC_PROPERTY_INDEX_GRAPHEME_LINK +gr_link, UC_PROPERTY_INDEX_GRAPHEME_LINK +grlink, UC_PROPERTY_INDEX_GRAPHEME_LINK +bidi_control, UC_PROPERTY_INDEX_BIDI_CONTROL +bidicontrol, UC_PROPERTY_INDEX_BIDI_CONTROL +bidi_c, UC_PROPERTY_INDEX_BIDI_CONTROL +bidic, UC_PROPERTY_INDEX_BIDI_CONTROL +bidi_left_to_right, UC_PROPERTY_INDEX_BIDI_LEFT_TO_RIGHT +bidilefttoright, UC_PROPERTY_INDEX_BIDI_LEFT_TO_RIGHT +bidi_hebrew_right_to_left, UC_PROPERTY_INDEX_BIDI_HEBREW_RIGHT_TO_LEFT +bidihebrewrighttoleft, UC_PROPERTY_INDEX_BIDI_HEBREW_RIGHT_TO_LEFT +bidi_arabic_right_to_left, UC_PROPERTY_INDEX_BIDI_ARABIC_RIGHT_TO_LEFT +bidiarabicrighttoleft, UC_PROPERTY_INDEX_BIDI_ARABIC_RIGHT_TO_LEFT +bidi_european_digit, UC_PROPERTY_INDEX_BIDI_EUROPEAN_DIGIT +bidieuropeandigit, UC_PROPERTY_INDEX_BIDI_EUROPEAN_DIGIT +bidi_eur_num_separator, UC_PROPERTY_INDEX_BIDI_EUR_NUM_SEPARATOR +bidieurnumseparator, UC_PROPERTY_INDEX_BIDI_EUR_NUM_SEPARATOR +bidi_eur_num_terminator, UC_PROPERTY_INDEX_BIDI_EUR_NUM_TERMINATOR +bidieurnumterminator, UC_PROPERTY_INDEX_BIDI_EUR_NUM_TERMINATOR +bidi_arabic_digit, UC_PROPERTY_INDEX_BIDI_ARABIC_DIGIT +bidiarabicdigit, UC_PROPERTY_INDEX_BIDI_ARABIC_DIGIT +bidi_common_separator, UC_PROPERTY_INDEX_BIDI_COMMON_SEPARATOR +bidicommonseparator, UC_PROPERTY_INDEX_BIDI_COMMON_SEPARATOR +bidi_block_separator, UC_PROPERTY_INDEX_BIDI_BLOCK_SEPARATOR +bidiblockseparator, UC_PROPERTY_INDEX_BIDI_BLOCK_SEPARATOR +bidi_segment_separator, UC_PROPERTY_INDEX_BIDI_SEGMENT_SEPARATOR +bidisegmentseparator, UC_PROPERTY_INDEX_BIDI_SEGMENT_SEPARATOR +bidi_whitespace, UC_PROPERTY_INDEX_BIDI_WHITESPACE +bidiwhitespace, UC_PROPERTY_INDEX_BIDI_WHITESPACE +bidi_non_spacing_mark, UC_PROPERTY_INDEX_BIDI_NON_SPACING_MARK +bidinonspacingmark, UC_PROPERTY_INDEX_BIDI_NON_SPACING_MARK +bidi_boundary_neutral, UC_PROPERTY_INDEX_BIDI_BOUNDARY_NEUTRAL +bidiboundaryneutral, UC_PROPERTY_INDEX_BIDI_BOUNDARY_NEUTRAL +bidi_pdf, UC_PROPERTY_INDEX_BIDI_PDF +bidipdf, UC_PROPERTY_INDEX_BIDI_PDF +bidi_embedding_or_override, UC_PROPERTY_INDEX_BIDI_EMBEDDING_OR_OVERRIDE +bidiembeddingoroverride, UC_PROPERTY_INDEX_BIDI_EMBEDDING_OR_OVERRIDE +bidi_other_neutral, UC_PROPERTY_INDEX_BIDI_OTHER_NEUTRAL +bidiotherneutral, UC_PROPERTY_INDEX_BIDI_OTHER_NEUTRAL +hex_digit, UC_PROPERTY_INDEX_HEX_DIGIT +hexdigit, UC_PROPERTY_INDEX_HEX_DIGIT +hex, UC_PROPERTY_INDEX_HEX_DIGIT +ascii_hex_digit, UC_PROPERTY_INDEX_ASCII_HEX_DIGIT +asciihexdigit, UC_PROPERTY_INDEX_ASCII_HEX_DIGIT +ahex, UC_PROPERTY_INDEX_ASCII_HEX_DIGIT +ideographic, UC_PROPERTY_INDEX_IDEOGRAPHIC +ideo, UC_PROPERTY_INDEX_IDEOGRAPHIC +unified_ideograph, UC_PROPERTY_INDEX_UNIFIED_IDEOGRAPH +unifiedideograph, UC_PROPERTY_INDEX_UNIFIED_IDEOGRAPH +uideo, UC_PROPERTY_INDEX_UNIFIED_IDEOGRAPH +radical, UC_PROPERTY_INDEX_RADICAL +ids_binary_operator, UC_PROPERTY_INDEX_IDS_BINARY_OPERATOR +idsbinaryoperator, UC_PROPERTY_INDEX_IDS_BINARY_OPERATOR +idsb, UC_PROPERTY_INDEX_IDS_BINARY_OPERATOR +ids_trinary_operator, UC_PROPERTY_INDEX_IDS_TRINARY_OPERATOR +idstrinaryoperator, UC_PROPERTY_INDEX_IDS_TRINARY_OPERATOR +idst, UC_PROPERTY_INDEX_IDS_TRINARY_OPERATOR +zero_width, UC_PROPERTY_INDEX_ZERO_WIDTH +zerowidth, UC_PROPERTY_INDEX_ZERO_WIDTH +space, UC_PROPERTY_INDEX_SPACE +non_break, UC_PROPERTY_INDEX_NON_BREAK +nonbreak, UC_PROPERTY_INDEX_NON_BREAK +iso_control, UC_PROPERTY_INDEX_ISO_CONTROL +isocontrol, UC_PROPERTY_INDEX_ISO_CONTROL +format_control, UC_PROPERTY_INDEX_FORMAT_CONTROL +formatcontrol, UC_PROPERTY_INDEX_FORMAT_CONTROL +dash, UC_PROPERTY_INDEX_DASH +hyphen, UC_PROPERTY_INDEX_HYPHEN +punctuation, UC_PROPERTY_INDEX_PUNCTUATION +line_separator, UC_PROPERTY_INDEX_LINE_SEPARATOR +lineseparator, UC_PROPERTY_INDEX_LINE_SEPARATOR +paragraph_separator, UC_PROPERTY_INDEX_PARAGRAPH_SEPARATOR +paragraphseparator, UC_PROPERTY_INDEX_PARAGRAPH_SEPARATOR +quotation_mark, UC_PROPERTY_INDEX_QUOTATION_MARK +quotationmark, UC_PROPERTY_INDEX_QUOTATION_MARK +qmark, UC_PROPERTY_INDEX_QUOTATION_MARK +sentence_terminal, UC_PROPERTY_INDEX_SENTENCE_TERMINAL +sentenceterminal, UC_PROPERTY_INDEX_SENTENCE_TERMINAL +terminal_punctuation, UC_PROPERTY_INDEX_TERMINAL_PUNCTUATION +terminalpunctuation, UC_PROPERTY_INDEX_TERMINAL_PUNCTUATION +term, UC_PROPERTY_INDEX_TERMINAL_PUNCTUATION +currency_symbol, UC_PROPERTY_INDEX_CURRENCY_SYMBOL +currencysymbol, UC_PROPERTY_INDEX_CURRENCY_SYMBOL +math, UC_PROPERTY_INDEX_MATH +other_math, UC_PROPERTY_INDEX_OTHER_MATH +othermath, UC_PROPERTY_INDEX_OTHER_MATH +omath, UC_PROPERTY_INDEX_OTHER_MATH +paired_punctuation, UC_PROPERTY_INDEX_PAIRED_PUNCTUATION +pairedpunctuation, UC_PROPERTY_INDEX_PAIRED_PUNCTUATION +left_of_pair, UC_PROPERTY_INDEX_LEFT_OF_PAIR +leftofpair, UC_PROPERTY_INDEX_LEFT_OF_PAIR +combining, UC_PROPERTY_INDEX_COMBINING +composite, UC_PROPERTY_INDEX_COMPOSITE +decimal_digit, UC_PROPERTY_INDEX_DECIMAL_DIGIT +decimaldigit, UC_PROPERTY_INDEX_DECIMAL_DIGIT +numeric, UC_PROPERTY_INDEX_NUMERIC +diacritic, UC_PROPERTY_INDEX_DIACRITIC +dia, UC_PROPERTY_INDEX_DIACRITIC +extender, UC_PROPERTY_INDEX_EXTENDER +ext, UC_PROPERTY_INDEX_EXTENDER +ignorable_control, UC_PROPERTY_INDEX_IGNORABLE_CONTROL +ignorablecontrol, UC_PROPERTY_INDEX_IGNORABLE_CONTROL diff --git a/gnulib/lib/unictype/pr_case_ignorable.c b/gnulib/lib/unictype/pr_case_ignorable.c new file mode 100644 index 0000000..d9c0a49 --- /dev/null +++ b/gnulib/lib/unictype/pr_case_ignorable.c @@ -0,0 +1,35 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unictype.h" + +#include "bitmap.h" + +/* Define u_property_case_ignorable table. */ +#include "pr_case_ignorable.h" + +bool +uc_is_property_case_ignorable (ucs4_t uc) +{ + return bitmap_lookup (&u_property_case_ignorable, uc); +} + +const uc_property_t UC_PROPERTY_CASE_IGNORABLE = + { &uc_is_property_case_ignorable }; diff --git a/gnulib/lib/unictype/pr_case_ignorable.h b/gnulib/lib/unictype/pr_case_ignorable.h new file mode 100644 index 0000000..15f2472 --- /dev/null +++ b/gnulib/lib/unictype/pr_case_ignorable.h @@ -0,0 +1,552 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[32 << 4]; + } +u_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, + 16 + 384 * sizeof (short) / sizeof (int) + 320, + 16 + 384 * sizeof (short) / sizeof (int) + 336, + 16 + 384 * sizeof (short) / sizeof (int) + 352, + 16 + 384 * 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, + 16 + 384 * sizeof (short) / sizeof (int) + 384, + -1, + 16 + 384 * sizeof (short) / sizeof (int) + 400, + 16 + 384 * sizeof (short) / sizeof (int) + 416, + -1, + -1, + -1, + -1, + 16 + 384 * sizeof (short) / sizeof (int) + 432, + -1, + -1, + 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, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -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) + 464, + 16 + 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, + 16 + 384 * 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, + -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, 0xFFFF0000, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0430FFFF, + 0x000000B0, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x000003F8, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x02000000, 0x00000000, + 0xFFFE0000, 0xBFFFFFFF, 0x000000B6, 0x00100000, + 0x07FF000F, 0x00000000, 0xFFFFF801, 0x00010000, + 0x00000000, 0x00000000, 0xBFC00000, 0x00003DFF, + 0x00028000, 0xFFFF0000, 0x000007FF, 0x00000000, + 0x00000000, 0x0001FFC0, 0x00000000, 0x043FF800, + 0xFFC00000, 0x00003FFF, 0x0E000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000007, 0x14000000, 0x00FE21FE, 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, + 0xFEFFE0DF, 0x1FFFFFFF, 0x00000040, 0x00000000, + 0x00000000, 0x66FDE000, 0xC3000000, 0x001E0001, + 0x20002064, 0x00000000, 0x00000000, 0x10000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xE0000000, 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, 0x7F400000, 0x9FF81FE5, + 0x00000000, 0x00000080, 0x00000000, 0x00000000, + 0x0000000F, 0x17D00000, 0x00000004, 0x000FF800, + 0x00000003, 0x0000033C, 0x00000000, 0x0003A340, + 0x00000000, 0x00CFF000, 0x00000000, 0x3F000000, + 0x00000000, 0x00000000, 0xFFF70000, 0x000021FD, + 0x00000000, 0xFFFFF000, 0xFFFFFFFF, 0x01000003, + 0xF8000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xF000007F, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0xA0000000, 0xE000E003, 0x6000E000, + 0x0300F800, 0x00007C90, 0x00000000, 0x8002FC1F, + 0x1FFF0000, 0x00000000, 0xFFFF0000, 0x0001FFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x20000000, + 0x00000000, 0x00000000, 0x00000000, 0x00038000, + 0x00000000, 0x00000000, 0x00000000, 0x80008000, + 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, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x3F000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00001000, 0x00000000, 0x00000000, 0xB0078000, + 0x00000000, 0x00000000, 0x00000000, 0x00030000, + 0xFFFFFFFF, 0x00000003, 0x00000000, 0x00010000, + 0x00000700, 0x00000000, 0x00000000, 0x00000000, + 0x00000844, 0x00000060, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000010, 0x0003FFFF, + 0x00000000, 0x00003FC0, 0x0003FF80, 0x00000000, + 0x00000007, 0x13C80000, 0x00008000, 0x00000000, + 0x00000000, 0x00667E00, 0x00001008, 0x00010000, + 0x00000000, 0xC19D0000, 0x20000002, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00002120, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x40000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0xFFFC0000, 0x00000003, 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, + 0x00000002, 0xFF000000, 0x0000007F, 0x00000000, + 0x00000003, 0x26780000, 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/unictype/pr_cased.c b/gnulib/lib/unictype/pr_cased.c new file mode 100644 index 0000000..075ebd0 --- /dev/null +++ b/gnulib/lib/unictype/pr_cased.c @@ -0,0 +1,35 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unictype.h" + +#include "bitmap.h" + +/* Define u_property_cased table. */ +#include "pr_cased.h" + +bool +uc_is_property_cased (ucs4_t uc) +{ + return bitmap_lookup (&u_property_cased, uc); +} + +const uc_property_t UC_PROPERTY_CASED = + { &uc_is_property_cased }; diff --git a/gnulib/lib/unictype/pr_cased.h b/gnulib/lib/unictype/pr_cased.h new file mode 100644 index 0000000..96ae141 --- /dev/null +++ b/gnulib/lib/unictype/pr_cased.h @@ -0,0 +1,343 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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_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, 0xFFFE00FF, 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, 0x00000000, + 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, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000781F, + 0xFFFFFFFF, 0x0000003F, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xFFFFFFFF, 0x00003FFF, + 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0xFFFFFFFC, 0xFFFFFFFF, 0xFFFFFFFF, + 0x000378FF, 0x000003FF, 0x00000000, 0x04000000, + 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/unictype/pr_changes_when_casefolded.c b/gnulib/lib/unictype/pr_changes_when_casefolded.c new file mode 100644 index 0000000..df2d089 --- /dev/null +++ b/gnulib/lib/unictype/pr_changes_when_casefolded.c @@ -0,0 +1,35 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unictype.h" + +#include "bitmap.h" + +/* Define u_property_changes_when_casefolded table. */ +#include "pr_changes_when_casefolded.h" + +bool +uc_is_property_changes_when_casefolded (ucs4_t uc) +{ + return bitmap_lookup (&u_property_changes_when_casefolded, uc); +} + +const uc_property_t UC_PROPERTY_CHANGES_WHEN_CASEFOLDED = + { &uc_is_property_changes_when_casefolded }; diff --git a/gnulib/lib/unictype/pr_changes_when_casefolded.h b/gnulib/lib/unictype/pr_changes_when_casefolded.h new file mode 100644 index 0000000..44393b4 --- /dev/null +++ b/gnulib/lib/unictype/pr_changes_when_casefolded.h @@ -0,0 +1,331 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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_property_changes_when_casefolded = +{ + { 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, + 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, + -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, 0x00200000, 0xFF7FFFFF, 0x00000000, + 0x55555555, 0xAA555555, 0x555556AA, 0xAB555555, + 0xB1DBCED6, 0x11AED2D5, 0x4AAAADB0, 0x55D65555, + 0x55555555, 0x6C055555, 0x0000557A, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000020, 0x00450000, + 0xFFFED740, 0x00000FFB, 0x55638004, 0xE6B35555, + 0xFFFFFFFF, 0x0000FFFF, 0x00000000, 0x55555555, + 0x55555401, 0x55555555, 0x55552AAB, 0x55555555, + 0x55555555, 0xFFFE0055, 0x007FFFFF, 0x00000000, + 0x00000080, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0xFFFFFFFF, 0x0000003F, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x55555555, 0x55555555, 0x55555555, 0x55555555, + 0x4C155555, 0x55555555, 0x55555555, 0x55555555, + 0x3F00FF00, 0xFF00FF00, 0xAA003F00, 0x0000FF00, + 0xFFFFFFFF, 0x1F9CFFFF, 0x0F001F9C, 0x1F9C1F00, + 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, 0xC025EA9D, + 0x55555555, 0x55555555, 0x55555555, 0x00002805, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x55555555, 0x00001555, + 0x00555555, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x55545554, 0x55555555, 0x6A005555, + 0x00012855, 0x00000155, 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, 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/pr_changes_when_casemapped.c b/gnulib/lib/unictype/pr_changes_when_casemapped.c new file mode 100644 index 0000000..83ed258 --- /dev/null +++ b/gnulib/lib/unictype/pr_changes_when_casemapped.c @@ -0,0 +1,35 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unictype.h" + +#include "bitmap.h" + +/* Define u_property_changes_when_casemapped table. */ +#include "pr_changes_when_casemapped.h" + +bool +uc_is_property_changes_when_casemapped (ucs4_t uc) +{ + return bitmap_lookup (&u_property_changes_when_casemapped, uc); +} + +const uc_property_t UC_PROPERTY_CHANGES_WHEN_CASEMAPPED = + { &uc_is_property_changes_when_casemapped }; diff --git a/gnulib/lib/unictype/pr_changes_when_casemapped.h b/gnulib/lib/unictype/pr_changes_when_casemapped.h new file mode 100644 index 0000000..34f528c --- /dev/null +++ b/gnulib/lib/unictype/pr_changes_when_casemapped.h @@ -0,0 +1,335 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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_changes_when_casemapped = +{ + { 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, + -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, 0x07FFFFFE, + 0x00000000, 0x00200000, 0xFF7FFFFF, 0xFF7FFFFF, + 0xFFFFFFFF, 0xFEFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xF7FFDFFF, 0xB3FFF3FF, 0xFFFFFFF0, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFC0FFFFD, 0x0ADFFFFF, 0x20268B29, + 0x00041F09, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000020, 0x38CF0000, + 0xFFFFD740, 0xFFFFFFFB, 0xFFE3FFFF, 0xEFB7FFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFC03, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFE00FF, 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, + 0x00000000, 0x00000000, 0x00000000, 0x22000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x4FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF, + 0xFFFFFFFF, 0x5FDFFFFF, 0x0FCF1FDC, 0x1FDC1FFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00040C40, 0x00004000, 0xFFFFFFFF, + 0x00000018, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0xFFC00000, 0xFFFFFFFF, 0x000003FF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFF7FFF, 0x7FFFFFFF, 0xC06DFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000780F, + 0xFFFFFFFF, 0x0000003F, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xFFFFFFFF, 0x00003FFF, + 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0xFFFCFFFC, 0xFFFFFFFF, 0xFE00FFFF, + 0x000338FF, 0x000003FF, 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 + } +}; diff --git a/gnulib/lib/unictype/pr_changes_when_lowercased.c b/gnulib/lib/unictype/pr_changes_when_lowercased.c new file mode 100644 index 0000000..5a2deb8 --- /dev/null +++ b/gnulib/lib/unictype/pr_changes_when_lowercased.c @@ -0,0 +1,35 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unictype.h" + +#include "bitmap.h" + +/* Define u_property_changes_when_lowercased table. */ +#include "pr_changes_when_lowercased.h" + +bool +uc_is_property_changes_when_lowercased (ucs4_t uc) +{ + return bitmap_lookup (&u_property_changes_when_lowercased, uc); +} + +const uc_property_t UC_PROPERTY_CHANGES_WHEN_LOWERCASED = + { &uc_is_property_changes_when_lowercased }; diff --git a/gnulib/lib/unictype/pr_changes_when_lowercased.h b/gnulib/lib/unictype/pr_changes_when_lowercased.h new file mode 100644 index 0000000..57e62ed --- /dev/null +++ b/gnulib/lib/unictype/pr_changes_when_lowercased.h @@ -0,0 +1,327 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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_property_changes_when_lowercased = +{ + { 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, 0xFFFE0055, 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, 0xC025EA9D, + 0x55555555, 0x55555555, 0x55555555, 0x00002805, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x55555555, 0x00001555, + 0x00555555, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x55545554, 0x55555555, 0x6A005555, + 0x00012855, 0x00000155, 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/pr_changes_when_titlecased.c b/gnulib/lib/unictype/pr_changes_when_titlecased.c new file mode 100644 index 0000000..6613e85 --- /dev/null +++ b/gnulib/lib/unictype/pr_changes_when_titlecased.c @@ -0,0 +1,35 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unictype.h" + +#include "bitmap.h" + +/* Define u_property_changes_when_titlecased table. */ +#include "pr_changes_when_titlecased.h" + +bool +uc_is_property_changes_when_titlecased (ucs4_t uc) +{ + return bitmap_lookup (&u_property_changes_when_titlecased, uc); +} + +const uc_property_t UC_PROPERTY_CHANGES_WHEN_TITLECASED = + { &uc_is_property_changes_when_titlecased }; diff --git a/gnulib/lib/unictype/pr_changes_when_titlecased.h b/gnulib/lib/unictype/pr_changes_when_titlecased.h new file mode 100644 index 0000000..d0b6cd7 --- /dev/null +++ b/gnulib/lib/unictype/pr_changes_when_titlecased.h @@ -0,0 +1,331 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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_property_changes_when_titlecased = +{ + { 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, + -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, 0xAAAAAB55, 0xD4AAAAAA, + 0x46241129, 0xA251212A, 0xB55556D0, 0xAA2BAAAA, + 0xAAAAAAAA, 0x900AAAA8, 0x0ADFAA85, 0x20268B29, + 0x00041F09, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000020, 0x388A0000, + 0x00010000, 0xFFFFF000, 0xAAE37FFF, 0x0927AAAA, + 0x00000000, 0xFFFF0000, 0xFFFFFFFF, 0xAAAAAAAA, + 0xAAAAA802, 0xAAAAAAAA, 0xAAAAD554, 0xAAAAAAAA, + 0xAAAAAAAA, 0x000000AA, 0x00000000, 0xFFFFFFFE, + 0x000000FF, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x22000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, + 0x0FEAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, + 0x003F00FF, 0x00FF00FF, 0x00FF003F, 0x3FFF00FF, + 0x00FF00FF, 0x40DF00FF, 0x00CF00DC, 0x00DC00FF, + 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, 0x0000500A, + 0xFFFFFFFF, 0x0000003F, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xAAAAAAAA, 0x00002AAA, + 0x00AAAAAA, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0xAAA8AAA8, 0xAAAAAAAA, 0x9400AAAA, + 0x000210AA, 0x000002AA, 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 + } +}; diff --git a/gnulib/lib/unictype/pr_changes_when_uppercased.c b/gnulib/lib/unictype/pr_changes_when_uppercased.c new file mode 100644 index 0000000..82a59c6 --- /dev/null +++ b/gnulib/lib/unictype/pr_changes_when_uppercased.c @@ -0,0 +1,35 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unictype.h" + +#include "bitmap.h" + +/* Define u_property_changes_when_uppercased table. */ +#include "pr_changes_when_uppercased.h" + +bool +uc_is_property_changes_when_uppercased (ucs4_t uc) +{ + return bitmap_lookup (&u_property_changes_when_uppercased, uc); +} + +const uc_property_t UC_PROPERTY_CHANGES_WHEN_UPPERCASED = + { &uc_is_property_changes_when_uppercased }; diff --git a/gnulib/lib/unictype/pr_changes_when_uppercased.h b/gnulib/lib/unictype/pr_changes_when_uppercased.h new file mode 100644 index 0000000..849bdc8 --- /dev/null +++ b/gnulib/lib/unictype/pr_changes_when_uppercased.h @@ -0,0 +1,331 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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_property_changes_when_uppercased = +{ + { 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, + -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, 0xAAAAAB55, 0xD4AAAAAA, + 0x46241129, 0xA251212A, 0xB5555B60, 0xAA2DAAAA, + 0xAAAAAAAA, 0x900AAAA8, 0x0ADFAA85, 0x20268B29, + 0x00041F09, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000020, 0x388A0000, + 0x00010000, 0xFFFFF000, 0xAAE37FFF, 0x0927AAAA, + 0x00000000, 0xFFFF0000, 0xFFFFFFFF, 0xAAAAAAAA, + 0xAAAAA802, 0xAAAAAAAA, 0xAAAAD554, 0xAAAAAAAA, + 0xAAAAAAAA, 0x000000AA, 0x00000000, 0xFFFFFFFE, + 0x000000FF, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x22000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, + 0x0FEAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, + 0x003F00FF, 0x00FF00FF, 0x00FF003F, 0x3FFF00FF, + 0xFFFFFFFF, 0x50DFFFFF, 0x00CF10DC, 0x10DC00FF, + 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, 0x0000500A, + 0xFFFFFFFF, 0x0000003F, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xAAAAAAAA, 0x00002AAA, + 0x00AAAAAA, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0xAAA8AAA8, 0xAAAAAAAA, 0x9400AAAA, + 0x000210AA, 0x000002AA, 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 + } +}; diff --git a/gnulib/lib/unictype/pr_combining.c b/gnulib/lib/unictype/pr_combining.c new file mode 100644 index 0000000..5620877 --- /dev/null +++ b/gnulib/lib/unictype/pr_combining.c @@ -0,0 +1,35 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..c920b3a --- /dev/null +++ b/gnulib/lib/unictype/pr_combining.h @@ -0,0 +1,532 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[27 << 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, + 16 + 384 * 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, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -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) + 384, + 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, + 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, + -1, + -1, + -1, + -1, + -1, + -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, 0xFFFFF800, 0x00010000, + 0x00000000, 0x00000000, 0x9FC00000, 0x00003D9F, + 0x00020000, 0xFFFF0000, 0x000007FF, 0x00000000, + 0x00000000, 0x0001FFC0, 0x00000000, 0x000FF800, + 0xFBC00000, 0x00003EEF, 0x0E000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x0000000F, 0xDC000000, 0x00FEFFFF, 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, + 0xFEFFE0DF, 0x1FFFFFFF, 0x00000040, 0x00000000, + 0x00000000, 0x7FFFF800, 0xC3C00000, 0x001E3F9D, + 0x3C00BFFC, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xE0000000, 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, 0x7FE00000, 0x9FFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x0000001F, 0xFFF00000, 0x0000001F, 0x000FF800, + 0x00000007, 0x000007FE, 0x00000000, 0x000FFFC0, + 0x00000000, 0x00FFFFF0, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xFFF70000, 0x000421FF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xFFFFFFFF, 0xF000007F, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xFFFF0000, 0x0001FFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00038000, + 0x00000000, 0x00000000, 0x00000000, 0x80000000, + 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, 0x00030000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000844, 0x000000F8, 0x00000000, 0x00000000, + 0x00000003, 0xFFF00000, 0x0000001F, 0x0003FFFF, + 0x00000000, 0x00003FC0, 0x000FFF80, 0x00000000, + 0x0000000F, 0xFFF80000, 0x00000001, 0x00000000, + 0x00000000, 0x007FFE00, 0x00003008, 0x08000000, + 0x00000000, 0xC19D0000, 0x00000002, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x000037F8, + 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, + 0x00000007, 0xFF000000, 0x0000007F, 0x00000000, + 0x00000007, 0x07FF0000, 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 0000000..d12ab65 --- /dev/null +++ b/gnulib/lib/unictype/pr_composite.c @@ -0,0 +1,35 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..890af97 --- /dev/null +++ b/gnulib/lib/unictype/pr_composite.h @@ -0,0 +1,387 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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_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, + 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, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -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, + -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, + -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, 0xFFFF0000, 0x0DEE0DEE, + 0x0C000200, 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, + 0x14000000, 0x00000800, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xC0000000, 0x0000001F, + 0x00000000, 0xF8000000, 0x00000001, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFF07FF, 0x000067FF, 0x0000FC00, 0x00000000, + 0x00010000, 0x00000000, 0x00000000, 0x00000000, + 0x00000003, 0x00000000, 0x000001FF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000 + } +}; diff --git a/gnulib/lib/unictype/pr_currency_symbol.c b/gnulib/lib/unictype/pr_currency_symbol.c new file mode 100644 index 0000000..8418f68 --- /dev/null +++ b/gnulib/lib/unictype/pr_currency_symbol.c @@ -0,0 +1,47 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..79219a7 --- /dev/null +++ b/gnulib/lib/unictype/pr_currency_symbol.h @@ -0,0 +1,192 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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_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, + 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, + 2 + 128 * sizeof (short) / sizeof (int) + 128, + 2 + 128 * sizeof (short) / sizeof (int) + 144 + }, + { + 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, 0x080C0000, + 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, 0x03FFFFFF, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x01000000, 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, 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 0000000..c2b6b32 --- /dev/null +++ b/gnulib/lib/unictype/pr_dash.c @@ -0,0 +1,35 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..6df9fbb --- /dev/null +++ b/gnulib/lib/unictype/pr_dash.h @@ -0,0 +1,188 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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_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, + 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, + 2 + 128 * sizeof (short) / sizeof (int) + 80, + -1, + -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, + 2 + 128 * sizeof (short) / sizeof (int) + 128 + }, + { + 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, + 0x00000001, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 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 0000000..b44acf1 --- /dev/null +++ b/gnulib/lib/unictype/pr_decimal_digit.c @@ -0,0 +1,47 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..980a867 --- /dev/null +++ b/gnulib/lib/unictype/pr_decimal_digit.h @@ -0,0 +1,355 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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_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, + 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, + 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 + }, + { + 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, + 0x03FF03FF, 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, 0x03FF0000, 0x00000000, + 0x00000000, 0x00000000, 0x03FF0000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x03FF0000, + 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, 0x0000FFC0, + 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, 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 0000000..95529f8 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..6c5470f --- /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-uni-tables.c for Unicode 6.0.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 0000000..e514269 --- /dev/null +++ b/gnulib/lib/unictype/pr_deprecated.c @@ -0,0 +1,35 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..4bb6261 --- /dev/null +++ b/gnulib/lib/unictype/pr_deprecated.h @@ -0,0 +1,324 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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_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 + }, + { + 16 + 256 * sizeof (short) / sizeof (int) + 0, + -1, + -1, + 16 + 256 * sizeof (short) / sizeof (int) + 16, + -1, + -1, + -1, + 16 + 256 * sizeof (short) / sizeof (int) + 32, + -1, + -1, + -1, + 16 + 256 * sizeof (short) / sizeof (int) + 48, + -1, + -1, + -1, + -1, + 16 + 256 * sizeof (short) / sizeof (int) + 64, + 16 + 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, + -1, + 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, + -1, + -1, + -1, + -1, + -1, + -1, + -1 + }, + { + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000200, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00080000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x02800000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000018, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x0000FC00, + 0x00000000, 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, + 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 0000000..9ea3b47 --- /dev/null +++ b/gnulib/lib/unictype/pr_diacritic.c @@ -0,0 +1,35 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..494bc08 --- /dev/null +++ b/gnulib/lib/unictype/pr_diacritic.h @@ -0,0 +1,379 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[24 << 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, + 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, + 3 + 256 * sizeof (short) / sizeof (int) + 320, + -1, + 3 + 256 * sizeof (short) / sizeof (int) + 336, + -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, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -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, + -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, + 0x03000000, 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, + 0x0C00BF80, 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, 0x9FE00000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00100000, 0x00000010, 0x000FF800, + 0x00000000, 0x00000400, 0x00000000, 0x00000000, + 0x00000000, 0x00C00000, 0x00000000, 0x3F000000, + 0x00000000, 0x00000000, 0xFFFF0000, 0x000021FF, + 0x00000000, 0xFFFFF000, 0xFFFFFFFF, 0x000007FF, + 0x00000000, 0x00000000, 0x0000FFF0, 0xE0000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0xA0000000, 0xE000E003, 0x6000E000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00038000, + 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, 0x0000FC00, 0x00000000, 0x00000000, + 0x1E000000, 0x00000000, 0x00000000, 0x10000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0xB0008000, + 0x00000000, 0x00000000, 0x00000000, 0x00030000, + 0xFF800000, 0x00000003, 0x00000000, 0x00000000, + 0x00000100, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000010, 0x0003FFFF, + 0x00000000, 0x00007800, 0x00080000, 0x00000000, + 0x00000000, 0x00080000, 0x00000001, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x08000000, + 0x00000000, 0x80000000, 0x00000007, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00003000, + 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, 0x06000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 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 0000000..0808584 --- /dev/null +++ b/gnulib/lib/unictype/pr_extender.c @@ -0,0 +1,35 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..21f6e56 --- /dev/null +++ b/gnulib/lib/unictype/pr_extender.h @@ -0,0 +1,204 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[13 << 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, + 2 + 128 * sizeof (short) / sizeof (int) + 80, + 2 + 128 * sizeof (short) / sizeof (int) + 96, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 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, + 2 + 128 * sizeof (short) / sizeof (int) + 128, + -1, + -1, + 2 + 128 * sizeof (short) / sizeof (int) + 144, + 2 + 128 * sizeof (short) / sizeof (int) + 160, + 2 + 128 * 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, + 2 + 128 * sizeof (short) / sizeof (int) + 192 + }, + { + 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, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000080, 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, 0x00000000, + 0x00000000, 0x00000000, 0x00008000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00010000, + 0x00000000, 0x00000000, 0x20000000, 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 0000000..cc40888 --- /dev/null +++ b/gnulib/lib/unictype/pr_format_control.c @@ -0,0 +1,35 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..42298d1 --- /dev/null +++ b/gnulib/lib/unictype/pr_format_control.h @@ -0,0 +1,440 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[4 << 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, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 16 + 384 * 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, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -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) + 32, + -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, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -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, + 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 0000000..f2b4e13 --- /dev/null +++ b/gnulib/lib/unictype/pr_grapheme_base.c @@ -0,0 +1,35 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..f7f9cec --- /dev/null +++ b/gnulib/lib/unictype/pr_grapheme_base.h @@ -0,0 +1,652 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[60 << 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) + 160, + 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) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 400, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 416, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 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) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 496, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 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, + 4 + 384 * sizeof (short) / sizeof (int) + 576, + 4 + 384 * sizeof (short) / sizeof (int) + 592, + 4 + 384 * sizeof (short) / sizeof (int) + 608, + -1, + 4 + 384 * sizeof (short) / sizeof (int) + 624, + 4 + 384 * sizeof (short) / sizeof (int) + 640, + 4 + 384 * sizeof (short) / sizeof (int) + 656, + 4 + 384 * sizeof (short) / sizeof (int) + 672, + 4 + 384 * sizeof (short) / sizeof (int) + 688, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 704, + 4 + 384 * sizeof (short) / sizeof (int) + 720, + -1, + -1, + -1, + -1, + -1, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 736, + -1, + -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) + 160, + 4 + 384 * 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, + 4 + 384 * sizeof (short) / sizeof (int) + 768, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 4 + 384 * sizeof (short) / sizeof (int) + 784, + 4 + 384 * sizeof (short) / sizeof (int) + 800, + 4 + 384 * sizeof (short) / sizeof (int) + 816, + 4 + 384 * sizeof (short) / sizeof (int) + 832, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 4 + 384 * sizeof (short) / sizeof (int) + 848, + 4 + 384 * sizeof (short) / sizeof (int) + 864, + 4 + 384 * sizeof (short) / sizeof (int) + 880, + 4 + 384 * sizeof (short) / sizeof (int) + 896, + -1, + -1, + -1, + -1, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 912, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 928, + 4 + 384 * sizeof (short) / sizeof (int) + 944, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -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) + 160, + 4 + 384 * sizeof (short) / sizeof (int) + 944, + -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, 0xFFFE00FF, 0xFE7FFFFF, 0xFFFFFFFE, + 0x000006FF, 0x40000000, 0xFFFF0049, 0x001F07FF, + 0xC800FFC0, 0xFFFFFFFF, 0x000007FF, 0xFFFEFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0x403FFFFF, 0xFFFFC260, + 0xFFFD3FFF, 0x0000FFFF, 0xFFFFE000, 0xFFFFFFFF, + 0xFFFFFFFF, 0x0002003F, 0xFFFFFFFF, 0x07F007FF, + 0x043FFFFF, 0x7FFF0110, 0x41FFFFFF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFF8, 0xEBFFFFFF, 0xFF01DE01, 0xFEFFFFF3, + 0xFFF99FEC, 0xA3C5FDFF, 0xB0005981, 0x0FFFFFC3, + 0xFFF987E8, 0xC36DFDFF, 0x5E000001, 0x001CFFC0, + 0xFFFBBFE8, 0xE3EDFDFF, 0x00011A01, 0x0002FFC3, + 0xFFF99FEC, 0x23EDFDFF, 0xB0001981, 0x00FFFFC3, + 0xD63DC7E8, 0x83FFC718, 0x00011DC6, 0x07FFFFC0, + 0xFFFDDFEE, 0x23EFFDFF, 0x0300001E, 0xFF00FFC3, + 0xFFFDDFEC, 0x63EFFDFF, 0x40000D9B, 0x0006FFC3, + 0xFFFDDFEC, 0xA7FFFFFF, 0x00005DC1, 0xFE3FFFC3, + 0xFC7FFFEC, 0x2FFBFFFF, 0x7F03007F, 0x001C0000, + 0xFFFFFFFE, 0x800DFFFF, 0x0FFF807F, 0x00000000, + 0xFEF02596, 0x200DECAE, 0x33FF005F, 0x00000000, + 0xFCFFFFFF, 0xFD5FFFFF, 0xFFFFFEFF, 0x80001FFF, + 0x00001F20, 0xC0000000, 0x07FFDFBF, 0x00000000, + 0xFFFFFFFF, 0x99021FFF, 0x3CFFFFFF, 0xFFE1FFFE, + 0xDFFFDF9B, 0xFFFFFFFF, 0xFFFF003F, 0x1FFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0x3D7F3DFF, 0xFFFFFFFF, + 0xFFFF3DFF, 0x7F3DFFFF, 0xFF7FFF3D, 0xFFFFFFFF, + 0xFF3DFFFF, 0xFFFFFFFF, 0x07FFFFFF, 0x1FFFFFFF, + 0x03FFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x001FFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x1FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0001FFFF, + 0x0003DFFF, 0x0063FFFF, 0x0003FFFF, 0x0001DFFF, + 0xFFFFFFFF, 0xC04FFFFF, 0x1FF001BF, 0x03FF03FF, + 0x03FF47FF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00FFFFFF, + 0xFFFFFFFF, 0xFFFF05FF, 0xFFFFFFFF, 0x003FFFFF, + 0x1FFFFFFF, 0x01FB0E78, 0xFFFFFFF1, 0x001F3FFF, + 0xFFFFFFFF, 0xFFFF0FFF, 0xC7FF03FF, 0xFFFFFFFF, + 0xCE7FFFFF, 0xFFFFFFFF, 0x00BFFFFF, 0x0007E01A, + 0x03FF03FF, 0x00003FFF, 0x00000000, 0x00000000, + 0xFFFFFFF0, 0xE82FFFFF, 0xFFFF0FFB, 0x1FF007FF, + 0xFFFFFFFC, 0x03FFC4C3, 0xFFFFFFFF, 0xF00C5CBF, + 0xFFFFFFFF, 0xF8300FFF, 0xFFFFE3FF, 0xFFFFFFFF, + 0x00000000, 0x00000000, 0x00080000, 0x0007DE02, + 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, + 0x1FFF7FFF, 0x03FFFFFF, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFF03FF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000FFFFF, + 0xFFFFFFFF, 0x0000007F, 0x000007FF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFD7FF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0x03FF1FFF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFF7FFF, 0x7FFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFE007FFF, + 0xFFFFFFFF, 0xFFFF003F, 0xFFFFFFFF, 0x0001803F, + 0x007FFFFF, 0x7F7F7F7F, 0x7F7F7F7F, 0x00000000, + 0xFFFFFFFF, 0x0003FFFF, 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, 0x07FFFFFF, 0xFFFFFFFF, 0xFFFF000F, + 0x7FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 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, 0x00000FFF, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFF1FFF, 0xFFFFFFFF, 0xFFFF007F, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0x00000FFF, 0xFFFFFFFF, 0xC0087FFF, + 0x00FFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00FCFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x00037FFF, 0x000003FF, 0x00000000, 0xFC000000, + 0xFFFFF7BB, 0x03FF0F9F, 0xFFFFFFFF, 0x00FFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFC00F, 0x0FFC0000, + 0xFFFFFFFF, 0xFFFFC03F, 0x800C007F, 0x1FFFFFFF, + 0xFFFFFFF8, 0xEC37FFFF, 0xC3FFBFFF, 0x00000000, + 0xFFFFFFFF, 0x001981FF, 0xF3FF2FF7, 0x0FFFFFFF, + 0xFFFFFFFF, 0x3E62FFFF, 0xF8000005, 0x00000000, + 0x007E7E7E, 0x00007F7F, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xFFFFFFFF, 0x03FF1EDF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFF000F, 0xFFFFF87F, 0x0FFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFF3FFF, 0xFFFFFFFF, 0xFFFF3FFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFFFFF, 0x00000000, + 0xA0F8007F, 0x5F7FFFFF, 0xFFFFFFDB, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFF80003, 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, 0xFFBFFFFF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x8FFFFFFF, 0x83FFFFFF, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFEEF0001, 0x000FFFFF, 0x01FF00FF, 0xFFFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFE3FFFFF, 0xFF3FFFFF, 0xFF07FFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0x000001FF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x7FFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFD, 0x00FFFFFF, 0xFFFC3F80, 0x0000FFFF, + 0xFFFFFFFC, 0xD987FFFF, 0x00000003, 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, 0x00007FFF, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0x01FFFFFF, 0x00000000, 0x00000000, + 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, + 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, 0x7FFE7FFF, 0xFFFEFFFE, 0x00000000, + 0xFFFF07FF, 0xFFFF7FFF, 0xFFFFFFFF, 0xFFFF03FF, + 0x07FFFFFF, 0x00000000, 0x00000000, 0xFFFFFFC0, + 0xFFFF0007, 0x07FFFFFF, 0x000301FF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFBF0001, 0xFFFFFFFF, 0x1FFFFFFF, + 0x000FFFFF, 0xFFFFFFFF, 0x000007DF, 0x0001FFFF, + 0xFFFFFFFF, 0x7FFFFFFF, 0xFFFFFFFD, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x1EFFFFFF, + 0xFFFFFFFF, 0x3FFFFFFF, 0xFFFF0000, 0x000000FF, + 0x00000000, 0x00000000, 0x00000000, 0xF8000000, + 0x755DFFFE, 0xFFEF2F3F, 0x0000FFE1, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000FFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0x001FFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 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 0000000..9c69b76 --- /dev/null +++ b/gnulib/lib/unictype/pr_grapheme_extend.c @@ -0,0 +1,35 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..f6c570b --- /dev/null +++ b/gnulib/lib/unictype/pr_grapheme_extend.h @@ -0,0 +1,532 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[27 << 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, + 16 + 384 * 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, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -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) + 384, + 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, + 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, + -1, + -1, + -1, + -1, + -1, + -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, 0xFFFFF800, 0x00010000, + 0x00000000, 0x00000000, 0x9FC00000, 0x00003D9F, + 0x00020000, 0xFFFF0000, 0x000007FF, 0x00000000, + 0x00000000, 0x0001FFC0, 0x00000000, 0x000FF800, + 0xFBC00000, 0x00003EEF, 0x0E000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000007, 0x14000000, 0x00FE21FE, 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, + 0xFEFFE0DF, 0x1FFFFFFF, 0x00000040, 0x00000000, + 0x00000000, 0x66FDE000, 0xC3000000, 0x001E0001, + 0x20002064, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xE0000000, 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, 0x7F400000, 0x9FF81FE5, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x0000000F, 0x17D00000, 0x00000004, 0x000FF800, + 0x00000003, 0x0000033C, 0x00000000, 0x0003A340, + 0x00000000, 0x00CFF000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xFFF70000, 0x000021FD, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xFFFFFFFF, 0xF000007F, + 0x00003000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xFFFF0000, 0x0001FFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00038000, + 0x00000000, 0x00000000, 0x00000000, 0x80000000, + 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, 0x00030000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000844, 0x00000060, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000010, 0x0003FFFF, + 0x00000000, 0x00003FC0, 0x0003FF80, 0x00000000, + 0x00000007, 0x13C80000, 0x00000000, 0x00000000, + 0x00000000, 0x00667E00, 0x00001008, 0x00000000, + 0x00000000, 0xC19D0000, 0x00000002, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00002120, + 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, + 0x00000002, 0xFF000000, 0x0000007F, 0x00000000, + 0x00000003, 0x06780000, 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 0000000..0615d23 --- /dev/null +++ b/gnulib/lib/unictype/pr_grapheme_link.c @@ -0,0 +1,35 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..32acdb1 --- /dev/null +++ b/gnulib/lib/unictype/pr_grapheme_link.h @@ -0,0 +1,331 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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_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, + 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, + 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, + -1, + -1, + -1, + -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, + -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, + -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, 0x00000001, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000010, 0x00000000, + 0x00000000, 0x00000400, 0x00000000, 0x000C0000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x80000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000040, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000010, 0x00000000, + 0x00000000, 0x00000000, 0x00080000, 0x00000000, + 0x00000000, 0x00000000, 0x00000001, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00002000, + 0x00000000, 0x80000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000040, 0x00000000, + 0x00000000, 0x02000000, 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 0000000..45640bc --- /dev/null +++ b/gnulib/lib/unictype/pr_hex_digit.c @@ -0,0 +1,35 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..c459d00 --- /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-uni-tables.c for Unicode 6.0.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 0000000..ad6031c --- /dev/null +++ b/gnulib/lib/unictype/pr_hyphen.c @@ -0,0 +1,35 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..2714ac9 --- /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-uni-tables.c for Unicode 6.0.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 0000000..d2c58a5 --- /dev/null +++ b/gnulib/lib/unictype/pr_id_continue.c @@ -0,0 +1,35 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..5bc130e --- /dev/null +++ b/gnulib/lib/unictype/pr_id_continue.h @@ -0,0 +1,756 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[51 << 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, + 16 + 512 * sizeof (short) / sizeof (int) + 576, + -1, + 16 + 512 * sizeof (short) / sizeof (int) + 592, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 16 + 512 * sizeof (short) / sizeof (int) + 304, + 16 + 512 * sizeof (short) / sizeof (int) + 608, + 16 + 512 * sizeof (short) / sizeof (int) + 624, + -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) + 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, + 16 + 512 * sizeof (short) / sizeof (int) + 304, + 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, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 16 + 512 * sizeof (short) / sizeof (int) + 672, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 16 + 512 * sizeof (short) / sizeof (int) + 688, + 16 + 512 * sizeof (short) / sizeof (int) + 704, + 16 + 512 * sizeof (short) / sizeof (int) + 720, + 16 + 512 * sizeof (short) / sizeof (int) + 736, + -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) + 752, + 16 + 512 * sizeof (short) / sizeof (int) + 304, + 16 + 512 * sizeof (short) / sizeof (int) + 304, + 16 + 512 * sizeof (short) / sizeof (int) + 304, + 16 + 512 * sizeof (short) / sizeof (int) + 304, + 16 + 512 * sizeof (short) / sizeof (int) + 304, + 16 + 512 * sizeof (short) / sizeof (int) + 304, + 16 + 512 * sizeof (short) / sizeof (int) + 304, + 16 + 512 * sizeof (short) / sizeof (int) + 768, + 16 + 512 * 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, + 16 + 512 * sizeof (short) / sizeof (int) + 304, + 16 + 512 * sizeof (short) / sizeof (int) + 784, + -1, + -1, + 16 + 512 * 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 + }, + { + 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, 0xFFFE00FF, 0x027FFFFF, 0xFFFFFFFE, + 0xFFFE00FF, 0xBFFFFFFF, 0xFFFF00B6, 0x000707FF, + 0x07FF0000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFC3FF, + 0xFFFFFFFF, 0xFFFFFFFF, 0x9FEFFFFF, 0x9FFFFDFF, + 0xFFFF0000, 0xFFFFFFFF, 0xFFFFE7FF, 0xFFFFFFFF, + 0xFFFFFFFF, 0x0003FFFF, 0xFFFFFFFF, 0x043FFFFF, + 0xFFFFFFFF, 0x00003FFF, 0x0FFFFFFF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFEFEFFCF, + 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, 0x0006FFCF, + 0xFFFDDFEC, 0xE7FFFFFF, 0x00807DDF, 0xFC00FFCF, + 0xFC7FFFEC, 0x2FFBFFFF, 0xFF5F847F, 0x000C0000, + 0xFFFFFFFE, 0x07FFFFFF, 0x03FF7FFF, 0x00000000, + 0xFEF02596, 0x3BFFECAE, 0x33FF3F5F, 0x00000000, + 0x03000001, 0xC2A003FF, 0xFFFFFEFF, 0xFFFE1FFF, + 0xFEFFFFDF, 0x1FFFFFFF, 0x00000040, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF03FF, 0xFFFFFFFF, + 0x3FFFFFFF, 0xFFFFFFFF, 0xFFFF003F, 0x17FFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0x3D7F3DFF, 0xFFFFFFFF, + 0xFFFF3DFF, 0x7F3DFFFF, 0xFF7FFF3D, 0xFFFFFFFF, + 0xFF3DFFFF, 0xFFFFFFFF, 0xE7FFFFFF, 0x0003FE00, + 0x0000FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x001FFFFF, + 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF9FFF, + 0x07FFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0x0001C7FF, + 0x001FDFFF, 0x001FFFFF, 0x000FFFFF, 0x000DDFFF, + 0xFFFFFFFF, 0xFFCFFFFF, 0x308FFFFF, 0x000003FF, + 0x03FF3800, 0xFFFFFFFF, 0xFFFFFFFF, 0x00FFFFFF, + 0xFFFFFFFF, 0xFFFF07FF, 0xFFFFFFFF, 0x003FFFFF, + 0x1FFFFFFF, 0x0FFF0FFF, 0xFFFFFFC0, 0x001F3FFF, + 0xFFFFFFFF, 0xFFFF0FFF, 0x07FF03FF, 0x00000000, + 0x0FFFFFFF, 0xFFFFFFFF, 0x7FFFFFFF, 0x9FFFFFFF, + 0x03FF03FF, 0x00000080, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0x03FF0FFF, 0x000FF800, + 0xFFFFFFFF, 0x03FFC7FF, 0xFFFFFFFF, 0x000FFFFF, + 0xFFFFFFFF, 0x00FFFFFF, 0xFFFFE3FF, 0x3FFFFFFF, + 0x00000000, 0x00000000, 0xFFF70000, 0x0007FFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xF000007F, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF, + 0xFFFFFFFF, 0x5FDFFFFF, 0x0FCF1FDC, 0x1FDC1FFF, + 0x00000000, 0x80000000, 0x00100001, 0x80020000, + 0x1FFF0000, 0x00000000, 0x1FFF0000, 0x0001FFE2, + 0x3F2FFC84, 0xF3FFFD50, 0x000043E0, 0xFFFFFFFF, + 0x000001FF, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFF7FFF, 0x7FFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0003F81F, + 0xFFFFFFFF, 0xFFFF003F, 0xFFFFFFFF, 0x8000803F, + 0x007FFFFF, 0x7F7F7F7F, 0x7F7F7F7F, 0xFFFFFFFF, + 0x000000E0, 0x1F3EFFFE, 0xFFFFFFFE, 0xFFFFFFFF, + 0xFE7FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0xF7FFFFFF, + 0xFFFFFFE0, 0xFFFE3FFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x00007FFF, 0x07FFFFFF, 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, 0x00000FFF, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x00001FFF, 0x00000000, 0xFFFF0000, 0x3FFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFF1FFF, 0x00000FFF, 0xFFFFFFFF, 0xB000FFFF, + 0x00FFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0003FFFF, + 0xFF800000, 0xFFFFFFFC, 0xFFFFFFFF, 0xFFFFFFFF, + 0x000379FF, 0x000003FF, 0x00000000, 0xFC000000, + 0xFFFFFFFF, 0x000000FF, 0xFFFFFFFF, 0x000FFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0x03FF001F, 0x08FFFFFF, + 0xFFFFFFFF, 0xFFFF3FFF, 0x000FFFFF, 0x1FFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0x03FF8001, 0x00000000, + 0xFFFFFFFF, 0x007FFFFF, 0x03FF3FFF, 0x0C7FFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0x38000007, 0x00000000, + 0x007E7E7E, 0x00007F7F, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xFFFFFFFF, 0x03FF37FF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFF000F, 0xFFFFF87F, 0x0FFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFF3FFF, 0xFFFFFFFF, 0xFFFF3FFF, + 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, 0x003FFFFF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x003FFFFF, 0x03FFFFFF, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFEEFF06F, 0x870FFFFF, 0x00000000, 0x1FFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0x003FFFFF, 0x003FFFFF, 0x0007FFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0x000001FF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0x0000007F, 0x0000FFC0, + 0xFFFFFFFF, 0x07FFFFFF, 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, 0x00007FFF, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0x01FFFFFF, 0x00000000, 0x00000000, + 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, + 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, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0x001FFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 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 0000000..2b12837 --- /dev/null +++ b/gnulib/lib/unictype/pr_id_start.c @@ -0,0 +1,35 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..ecddf47 --- /dev/null +++ b/gnulib/lib/unictype/pr_id_start.h @@ -0,0 +1,604 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[48 << 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, + 4 + 384 * sizeof (short) / sizeof (int) + 576, + -1, + 4 + 384 * sizeof (short) / sizeof (int) + 592, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 608, + 4 + 384 * sizeof (short) / sizeof (int) + 624, + -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) + 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, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 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, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 4 + 384 * sizeof (short) / sizeof (int) + 672, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 4 + 384 * sizeof (short) / sizeof (int) + 688, + 4 + 384 * 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, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 720, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 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, + -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) + 752, + -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, 0xFFFE00FF, 0x027FFFFF, 0xFFFFFFFE, + 0x000000FF, 0x00000000, 0xFFFF0000, 0x000707FF, + 0x00000000, 0xFFFFFFFF, 0x000007FF, 0xFFFEC000, + 0xFFFFFFFF, 0xFFFFFFFF, 0x002FFFFF, 0x9C00C060, + 0xFFFD0000, 0x0000FFFF, 0xFFFFE000, 0xFFFFFFFF, + 0xFFFFFFFF, 0x0002003F, 0xFFFFFC00, 0x043007FF, + 0x043FFFFF, 0x00000110, 0x01FFFFFF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFF0, 0x23FFFFFF, 0xFF010000, 0xFEFE0003, + 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, 0x00060003, + 0xFFFDDFE0, 0x27FFFFFF, 0x00004000, 0xFC000003, + 0xFC7FFFE0, 0x2FFBFFFF, 0x0000007F, 0x00000000, + 0xFFFFFFFE, 0x000DFFFF, 0x0000007F, 0x00000000, + 0xFEF02596, 0x200DECAE, 0x3000005F, 0x00000000, + 0x00000001, 0x00000000, 0xFFFFFEFF, 0x00001FFF, + 0x00001F00, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0x800007FF, 0x3C3F0000, 0xFFE1C062, + 0x00004003, 0xFFFFFFFF, 0xFFFF003F, 0x17FFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 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, 0xFFFF9FFF, + 0x07FFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0x0001C7FF, + 0x0003DFFF, 0x0003FFFF, 0x0003FFFF, 0x0001DFFF, + 0xFFFFFFFF, 0x000FFFFF, 0x10800000, 0x00000000, + 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x00FFFFFF, + 0xFFFFFFFF, 0xFFFF05FF, 0xFFFFFFFF, 0x003FFFFF, + 0x1FFFFFFF, 0x00000000, 0xFFFF0000, 0x001F3FFF, + 0xFFFFFFFF, 0x00000FFF, 0x000000FE, 0x00000000, + 0x007FFFFF, 0xFFFFFFFF, 0x001FFFFF, 0x00000000, + 0x00000000, 0x00000080, 0x00000000, 0x00000000, + 0xFFFFFFE0, 0x000FFFFF, 0x00000FE0, 0x00000000, + 0xFFFFFFF8, 0x0000C001, 0xFFFFFFFF, 0x0000003F, + 0xFFFFFFFF, 0x0000000F, 0xFC00E000, 0x3FFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x0003DE00, + 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, + 0x1FFF0000, 0x00000000, 0x00000000, 0x00000000, + 0x3F2FFC84, 0xF3FFFD50, 0x000043E0, 0xFFFFFFFF, + 0x000001FF, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFF7FFF, 0x7FFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000781F, + 0xFFFFFFFF, 0xFFFF003F, 0xFFFFFFFF, 0x0000803F, + 0x007FFFFF, 0x7F7F7F7F, 0x7F7F7F7F, 0x00000000, + 0x000000E0, 0x1F3E03FE, 0xFFFFFFFE, 0xFFFFFFFF, + 0xF87FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0xF7FFFFFF, + 0xFFFFFFE0, 0xFFFE3FFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x00007FFF, 0x07FFFFFF, 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, 0x00000FFF, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x00001FFF, 0x00000000, 0xFFFF0000, 0x3FFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFF1FFF, 0x00000C00, 0xFFFFFFFF, 0x80007FFF, + 0x00FFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF, + 0xFF800000, 0xFFFFFFFC, 0xFFFFFFFF, 0xFFFFFFFF, + 0x000379FF, 0x000003FF, 0x00000000, 0xFC000000, + 0xFFFFF7BB, 0x00000007, 0xFFFFFFFF, 0x000FFFFF, + 0xFFFFFFFC, 0x000FFFFF, 0x00000000, 0x08FC0000, + 0xFFFFFC00, 0xFFFF003F, 0x0000007F, 0x1FFFFFFF, + 0xFFFFFFF0, 0x0007FFFF, 0x00008000, 0x00000000, + 0xFFFFFFFF, 0x000001FF, 0x00000FF7, 0x047FFFFF, + 0xFFFFFFFF, 0x3E62FFFF, 0x38000005, 0x00000000, + 0x007E7E7E, 0x00007F7F, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xFFFFFFFF, 0x00000007, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFF000F, 0xFFFFF87F, 0x0FFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFF3FFF, 0xFFFFFFFF, 0xFFFF3FFF, + 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, 0x003FFFFF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x003FFFFF, 0x03FFFFFF, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFEEF0001, 0x000FFFFF, 0x00000000, 0x1FFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0x003FFFFF, 0x003FFFFF, 0x0007FFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0x000001FF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFF8, 0x00FFFFFF, 0x00000000, 0x00000000, + 0xFFFFFFF8, 0x0000FFFF, 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, 0x00007FFF, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0x01FFFFFF, 0x00000000, 0x00000000, + 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, + 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, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0x001FFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 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 0000000..f97e092 --- /dev/null +++ b/gnulib/lib/unictype/pr_ideographic.c @@ -0,0 +1,35 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..e0f23d4 --- /dev/null +++ b/gnulib/lib/unictype/pr_ideographic.h @@ -0,0 +1,320 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[9 << 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, + 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) + 112, + 4 + 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, + 4 + 256 * sizeof (short) / sizeof (int) + 16, + 4 + 256 * sizeof (short) / sizeof (int) + 128, + -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, 0x00000FFF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFF3FFF, 0xFFFFFFFF, 0xFFFF3FFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFFFFF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0x001FFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 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 0000000..a59893f --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..d559b60 --- /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-uni-tables.c for Unicode 6.0.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 0000000..3574250 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..db1f752 --- /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-uni-tables.c for Unicode 6.0.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 0000000..fe2b2b9 --- /dev/null +++ b/gnulib/lib/unictype/pr_ignorable_control.c @@ -0,0 +1,35 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..a75a29c --- /dev/null +++ b/gnulib/lib/unictype/pr_ignorable_control.h @@ -0,0 +1,456 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[8 << 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, + 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, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -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) + 96, + -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, + -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, 0x20000000, 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_iso_control.c b/gnulib/lib/unictype/pr_iso_control.c new file mode 100644 index 0000000..3c1bd50 --- /dev/null +++ b/gnulib/lib/unictype/pr_iso_control.c @@ -0,0 +1,47 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..c12e04f --- /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-uni-tables.c for Unicode 6.0.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 0000000..f3613a2 --- /dev/null +++ b/gnulib/lib/unictype/pr_join_control.c @@ -0,0 +1,47 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..d3965a4 --- /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-uni-tables.c for Unicode 6.0.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 0000000..4d92c85 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..42c062d --- /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-uni-tables.c for Unicode 6.0.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 0000000..6688d47 --- /dev/null +++ b/gnulib/lib/unictype/pr_line_separator.c @@ -0,0 +1,55 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..518e3fe --- /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-uni-tables.c for Unicode 6.0.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 0000000..44a6a00 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..3592b41 --- /dev/null +++ b/gnulib/lib/unictype/pr_logical_order_exception.h @@ -0,0 +1,160 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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_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, + 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 + }, + { + 0x00000000, 0x00000000, 0x0000001F, 0x00000000, + 0x00000000, 0x00000000, 0x0000001F, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x1A600000, 0x00000000, 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 0000000..3dc0d96 --- /dev/null +++ b/gnulib/lib/unictype/pr_lowercase.c @@ -0,0 +1,35 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..5f98c21 --- /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-uni-tables.c for Unicode 6.0.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, 0x000000AA, 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, 0x00000000, + 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, 0x0000501A, + 0xFFFFFFFF, 0x0000003F, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xAAAAAAAA, 0x00002AAA, + 0x00AAAAAA, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0xAAABAAA8, 0xAAAAAAAA, 0x95FFAAAA, + 0x000250AA, 0x000002AA, 0x00000000, 0x04000000, + 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 0000000..15fbd75 --- /dev/null +++ b/gnulib/lib/unictype/pr_math.c @@ -0,0 +1,35 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..e4bf2ce --- /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-uni-tables.c for Unicode 6.0.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, + 0x3F2FFC84, 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, 0xFFFFD7FF, 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 0000000..38e9824 --- /dev/null +++ b/gnulib/lib/unictype/pr_non_break.c @@ -0,0 +1,35 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..e70ec82 --- /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-uni-tables.c for Unicode 6.0.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 0000000..07c6bc9 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..31f75b7 --- /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-uni-tables.c for Unicode 6.0.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 0000000..192181d --- /dev/null +++ b/gnulib/lib/unictype/pr_numeric.c @@ -0,0 +1,35 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..4ab5e4f --- /dev/null +++ b/gnulib/lib/unictype/pr_numeric.h @@ -0,0 +1,552 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[35 << 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, + 4 + 384 * sizeof (short) / sizeof (int) + 448, + 4 + 384 * sizeof (short) / sizeof (int) + 464, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -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, + 4 + 384 * sizeof (short) / sizeof (int) + 496, + -1, + 4 + 384 * sizeof (short) / sizeof (int) + 512, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 4 + 384 * sizeof (short) / sizeof (int) + 528, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -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) + 544, + -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, 0x00FCFFC0, + 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, 0x07FF0000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x03FF03FF, 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, 0xFFFF0000, 0xFFFFFFFF, + 0x000003EF, 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, 0x0000FFC0, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x003F0000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x03FF0000, 0x00000000, + 0x000003FF, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x03FF0000, 0x00000000, + 0x00000000, 0x00000000, 0x03FF0000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x03FF0000, + 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, 0xFF000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x0FC00000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x000000FF, 0x60000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xFF000000, 0xFF000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x7FFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xFFFC0000, 0x0000FFFF, + 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, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x000007FF, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 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 0000000..b8c9efb --- /dev/null +++ b/gnulib/lib/unictype/pr_other_alphabetic.c @@ -0,0 +1,35 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..5348558 --- /dev/null +++ b/gnulib/lib/unictype/pr_other_alphabetic.h @@ -0,0 +1,363 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[20 << 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, + 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, + -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, 0xFEFFF800, 0x00010000, + 0x00000000, 0x00000000, 0x1FC00000, 0x0000219E, + 0x00020000, 0xFFFF0000, 0x00000000, 0x00000000, + 0x00000000, 0x0001FFC0, 0x00000000, 0x00000000, + 0xF8C00000, 0x00001EEF, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x0000000F, 0xCC000000, 0x00E0DFFF, 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, + 0xFEFFE003, 0x1FFFFFFF, 0x00000000, 0x00000000, + 0x00000000, 0x797FF800, 0xC3C00000, 0x001E0185, + 0x3000007C, 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, 0x7FE00000, 0x001FFFFE, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x0000001F, 0xFFE00000, 0x0000000F, 0x00000000, + 0x00000007, 0x000003FE, 0x00000000, 0x0003FF80, + 0x00000000, 0x003FFFF0, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00040000, + 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, + 0x0000000F, 0xFFF00000, 0x00000000, 0x00000000, + 0x00000000, 0x007FFE00, 0x00003008, 0x00000000, + 0x00000000, 0x419D0000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x000007F8, + 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, + 0x00000007, 0xFF000000, 0x0000003F, 0x00000000, + 0x00000004, 0x01FF0000, 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 0000000..11aac32 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..8303ef6 --- /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-uni-tables.c for Unicode 6.0.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 0000000..0997ece --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..7d98a4c --- /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-uni-tables.c for Unicode 6.0.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 0000000..1be5c0e --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..d029114 --- /dev/null +++ b/gnulib/lib/unictype/pr_other_id_continue.h @@ -0,0 +1,168 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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_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, + 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, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -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, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x04000000, 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 0000000..9ad652d --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..82122b6 --- /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-uni-tables.c for Unicode 6.0.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 0000000..8324a2c --- /dev/null +++ b/gnulib/lib/unictype/pr_other_lowercase.c @@ -0,0 +1,35 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..e3e39b6 --- /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-uni-tables.c for Unicode 6.0.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 0000000..25f895b --- /dev/null +++ b/gnulib/lib/unictype/pr_other_math.c @@ -0,0 +1,35 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..9e8a456 --- /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-uni-tables.c for Unicode 6.0.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, + 0x3E2FFC84, 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 0000000..a7fa7ee --- /dev/null +++ b/gnulib/lib/unictype/pr_other_uppercase.c @@ -0,0 +1,35 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..fe143dd --- /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-uni-tables.c for Unicode 6.0.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 0000000..3c11913 --- /dev/null +++ b/gnulib/lib/unictype/pr_paired_punctuation.c @@ -0,0 +1,35 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..bf19712 --- /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-uni-tables.c for Unicode 6.0.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 0000000..c5ce2e9 --- /dev/null +++ b/gnulib/lib/unictype/pr_paragraph_separator.c @@ -0,0 +1,55 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..c5e458a --- /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-uni-tables.c for Unicode 6.0.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 0000000..656ba21 --- /dev/null +++ b/gnulib/lib/unictype/pr_pattern_syntax.c @@ -0,0 +1,35 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..70a23a5 --- /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-uni-tables.c for Unicode 6.0.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 0000000..617694f --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..98698db --- /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-uni-tables.c for Unicode 6.0.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 0000000..dc96133 --- /dev/null +++ b/gnulib/lib/unictype/pr_private_use.c @@ -0,0 +1,49 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..b432856 --- /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-uni-tables.c for Unicode 6.0.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 0000000..d30d00c --- /dev/null +++ b/gnulib/lib/unictype/pr_punctuation.c @@ -0,0 +1,47 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..a057b4a --- /dev/null +++ b/gnulib/lib/unictype/pr_punctuation.h @@ -0,0 +1,415 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[33 << 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, + 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, + 3 + 256 * sizeof (short) / sizeof (int) + 224, + 3 + 256 * sizeof (short) / sizeof (int) + 240, + -1, + 3 + 256 * sizeof (short) / sizeof (int) + 256, + 3 + 256 * sizeof (short) / sizeof (int) + 272, + -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, + -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, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -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, + 3 + 256 * sizeof (short) / sizeof (int) + 448, + -1, + -1, + 3 + 256 * sizeof (short) / sizeof (int) + 464, + 3 + 256 * sizeof (short) / sizeof (int) + 480, + -1, + -1, + 3 + 256 * sizeof (short) / sizeof (int) + 496, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 3 + 256 * 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, + -1, + -1, + -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, 0x7FFF0000, 0x40000000, 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, 0x061F0000, 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, + 0x00000001, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 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, 0x00000000, 0x00000000, + 0xC0000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00003F7F, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xFC000000, 0x00000001, + 0x00000000, 0x00000000, 0x00000000, 0xF0000000, + 0x00000000, 0xF8000000, 0x00000000, 0xC0000000, + 0x00000000, 0x00000000, 0x00080000, 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, 0x00010000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0x00037FFF, 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, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0xC0000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x0000E000, 0x00000000, 0x00000000, 0x40080000, + 0x00000000, 0x00000000, 0x00000000, 0x00FC0000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00F00000, + 0x00000000, 0x00000000, 0x0000C000, 0x07000000, + 0x00000000, 0x0000C000, 0x80000000, 0x00000000, + 0x00000000, 0x00000000, 0xC0003FFE, 0x00000000, + 0x00000000, 0x00000000, 0xF0000000, 0x00000000, + 0x00000000, 0x00000000, 0xC0000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000800, + 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, 0x00800000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x80000000, 0x80000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x01FF0000, 0x80000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0xFE000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00003F80, 0x00000000, + 0x00000000, 0xD8000000, 0x00000003, 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 0000000..52789df --- /dev/null +++ b/gnulib/lib/unictype/pr_quotation_mark.c @@ -0,0 +1,35 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..8dfa68c --- /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-uni-tables.c for Unicode 6.0.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 0000000..bbc72e0 --- /dev/null +++ b/gnulib/lib/unictype/pr_radical.c @@ -0,0 +1,35 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..f24e4f0 --- /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-uni-tables.c for Unicode 6.0.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 0000000..4f9aa5a --- /dev/null +++ b/gnulib/lib/unictype/pr_sentence_terminal.c @@ -0,0 +1,35 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..68e5c7a --- /dev/null +++ b/gnulib/lib/unictype/pr_sentence_terminal.h @@ -0,0 +1,363 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[20 << 4]; + } +u_property_sentence_terminal = +{ + { 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, + -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, + 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, + -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, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -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, + 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, + 3 + 256 * sizeof (short) / sizeof (int) + 272, + -1, + -1, + -1, + -1, + -1, + 3 + 256 * sizeof (short) / sizeof (int) + 288, + -1, + -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, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1 + }, + { + 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, 0x00600000, 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, 0x00000F00, 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, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x80000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x0000C000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00880000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00C00000, + 0x00000000, 0x00000000, 0x0000C000, 0x00000000, + 0x00000000, 0x00008000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000300, 0x00000000, + 0x00000000, 0x00000000, 0xE0000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000800, + 0x00000000, 0x00000000, 0x00C40000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x80004002, 0x00000000, 0x00000000, 0x00000002, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00C00000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000180, 0x00000000, + 0x00000000, 0xC0000000, 0x00000003, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 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 0000000..0798c8e --- /dev/null +++ b/gnulib/lib/unictype/pr_soft_dotted.c @@ -0,0 +1,35 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..bc9e168 --- /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-uni-tables.c for Unicode 6.0.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 0000000..4ef3b23 --- /dev/null +++ b/gnulib/lib/unictype/pr_space.c @@ -0,0 +1,47 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..a805a8e --- /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-uni-tables.c for Unicode 6.0.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 0000000..5aaa716 --- /dev/null +++ b/gnulib/lib/unictype/pr_terminal_punctuation.c @@ -0,0 +1,35 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..d3ea66e --- /dev/null +++ b/gnulib/lib/unictype/pr_terminal_punctuation.h @@ -0,0 +1,383 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[25 << 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, + 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, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -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) + 304, + -1, + 3 + 256 * sizeof (short) / sizeof (int) + 320, + -1, + -1, + 3 + 256 * sizeof (short) / sizeof (int) + 336, + 3 + 256 * sizeof (short) / sizeof (int) + 352, + -1, + -1, + 3 + 256 * sizeof (short) / sizeof (int) + 368, + -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, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -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, 0x7FFF0000, 0x40000000, 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, 0x00000F00, 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, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0xC0000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x0000E000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00F80000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00C00000, + 0x00000000, 0x00000000, 0x0000C000, 0x00000000, + 0x00000000, 0x00008000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000380, 0x00000000, + 0x00000000, 0x00000000, 0xE0000000, 0x00000000, + 0x00000000, 0x00000000, 0x80000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000800, + 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, 0x00800000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x80000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0xFC000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00003F80, 0x00000000, + 0x00000000, 0xC0000000, 0x00000003, 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_test.c b/gnulib/lib/unictype/pr_test.c new file mode 100644 index 0000000..67f40d9 --- /dev/null +++ b/gnulib/lib/unictype/pr_test.c @@ -0,0 +1,27 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2005-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..bc564c4 --- /dev/null +++ b/gnulib/lib/unictype/pr_titlecase.c @@ -0,0 +1,47 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..aabc6e0 --- /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-uni-tables.c for Unicode 6.0.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 0000000..e6661a6 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..74ac22f --- /dev/null +++ b/gnulib/lib/unictype/pr_unassigned_code_value.h @@ -0,0 +1,920 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[60 << 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, + -1, + 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, + -1, + 16 + 640 * sizeof (short) / sizeof (int) + 288, + 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, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 16 + 640 * 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, + 16 + 640 * sizeof (short) / sizeof (int) + 384, + -1, + -1, + 16 + 640 * sizeof (short) / sizeof (int) + 400, + 16 + 640 * sizeof (short) / sizeof (int) + 416, + 16 + 640 * sizeof (short) / sizeof (int) + 432, + 16 + 640 * 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, + 16 + 640 * sizeof (short) / sizeof (int) + 464, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 16 + 640 * sizeof (short) / sizeof (int) + 480, + 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) + 640, + 16 + 640 * sizeof (short) / sizeof (int) + 656, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + -1, + 16 + 640 * sizeof (short) / sizeof (int) + 672, + 16 + 640 * sizeof (short) / sizeof (int) + 688, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + -1, + -1, + 16 + 640 * sizeof (short) / sizeof (int) + 704, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + -1, + 16 + 640 * sizeof (short) / sizeof (int) + 720, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 736, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 752, + 16 + 640 * sizeof (short) / sizeof (int) + 768, + 16 + 640 * sizeof (short) / sizeof (int) + 784, + 16 + 640 * sizeof (short) / sizeof (int) + 800, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 816, + 16 + 640 * sizeof (short) / sizeof (int) + 832, + 16 + 640 * sizeof (short) / sizeof (int) + 848, + 16 + 640 * sizeof (short) / sizeof (int) + 864, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 880, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -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) + 896, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 16 + 640 * sizeof (short) / sizeof (int) + 912, + 16 + 640 * sizeof (short) / sizeof (int) + 928, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + -1, + 16 + 640 * sizeof (short) / sizeof (int) + 928, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 880, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 880, + 16 + 640 * sizeof (short) / sizeof (int) + 944, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 576, + 16 + 640 * sizeof (short) / sizeof (int) + 880 + }, + { + 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, 0x0001FF00, 0x01800000, 0x00000001, + 0x0001F900, 0x00000000, 0x0000FF00, 0xFFE0F800, + 0x30000030, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00004000, 0x00000000, 0x00001800, 0x00000000, + 0x00000000, 0xFFFC0000, 0x00000000, 0xF8000000, + 0x00000000, 0x8000C000, 0xB0000000, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x01000000, + 0x00066011, 0x0C3A0200, 0x4F7F8660, 0xF0000030, + 0x00067811, 0x2C920200, 0xA1FDC678, 0xFFC0003F, + 0x00044011, 0x0C120200, 0xFFFEC440, 0xFFFD0030, + 0x00066011, 0x0C120200, 0x4F3FC660, 0xFF000030, + 0x29C23813, 0x3C0038E7, 0xFF7EC238, 0xF800003F, + 0x00022011, 0x1C100200, 0xFC9FC220, 0x00FF0030, + 0x00022013, 0x0C100200, 0xBF9FC220, 0xFFF90030, + 0x00022013, 0x18000000, 0xFF7F8220, 0x01C00030, + 0x03800013, 0xD0040000, 0x00A07B80, 0xFFE3FFFF, + 0x00000001, 0x78000000, 0xF0000000, 0xFFFFFFFF, + 0x010FDA69, 0xC4001351, 0xCC00C0A0, 0xFFFFFFFF, + 0x00000000, 0x00000000, 0x00000100, 0x0001E000, + 0x01000000, 0x20000000, 0xF8002000, 0xFFFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x0000FFC0, 0xE0000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xC280C200, 0x00000000, + 0x0000C200, 0x80C20000, 0x008000C2, 0x00000000, + 0x00C20000, 0x00000000, 0x18000000, 0xE0000000, + 0xFC000000, 0x00000000, 0x00000000, 0xFFE00000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xE0000000, 0x00000000, 0x00000000, 0xFFFE0000, + 0xFFE02000, 0xFF800000, 0xFFF00000, 0xFFF22000, + 0x00000000, 0x00000000, 0xC0000000, 0xFC00FC00, + 0xFC008000, 0x00000000, 0x00000000, 0xFF000000, + 0x00000000, 0x0000F800, 0x00000000, 0xFFC00000, + 0xE0000000, 0xF000F000, 0x0000000E, 0xFFE0C000, + 0x00000000, 0x0000F000, 0x3800FC00, 0x00000000, + 0x30000000, 0x00000000, 0x80000000, 0x60000000, + 0xFC00FC00, 0xFFFFC000, 0xFFFFFFFF, 0xFFFFFFFF, + 0x00000000, 0x00000000, 0x0000F000, 0xE0000000, + 0x00000000, 0xFC003800, 0x00000000, 0x0FF00000, + 0x00000000, 0x07000000, 0x00001C00, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF, 0xFFF80000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x0FFFFF80, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xC0C00000, 0x00000000, 0x5500C0C0, 0xC0000000, + 0x00000000, 0x00200000, 0x10300020, 0x80230000, + 0x00000000, 0x00000000, 0x00000000, 0x000C03E0, + 0xE0008000, 0xFC000000, 0x0000FFFF, 0xFFFE0000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x0000FC00, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0xFFF00000, + 0x00000000, 0xFFFFFF80, 0xFFFFF800, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000001, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00002800, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xFC00E000, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x00000000, 0x00008000, 0x80000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x01FC0000, + 0x00000000, 0x0000FFC0, 0x00000000, 0x7FFE7FC0, + 0xFF800000, 0x80808080, 0x80808080, 0x00000000, + 0x00000000, 0xFFFC0000, 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, 0xF8000000, 0x00000000, 0x0000FFF0, + 0x80000000, 0x00000000, 0x00000000, 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, 0xFFFFF000, 0xFFFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x0000E000, 0x00000000, 0x0000FF80, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0xFFFFF000, 0x00000000, 0x0FF00000, + 0xFF000000, 0x00000000, 0x00000000, 0xFF000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFC8000, 0xFFFFFC00, 0xFFFFFFFF, 0x03FFFFFF, + 0x00000000, 0xFC00F000, 0x00000000, 0xFF000000, + 0x00000000, 0x00000000, 0xFC003FE0, 0xF0000000, + 0x00000000, 0x00000000, 0x7FF00000, 0xE0000000, + 0x00000000, 0x00000000, 0x3C004000, 0xFFFFFFFF, + 0x00000000, 0xFF800000, 0x0C00C000, 0xF0000000, + 0x00000000, 0x00000000, 0x07FFFFF8, 0xFFFFFFFF, + 0xFF818181, 0xFFFF8080, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0xFC00C000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x0000FFF0, 0x00000780, 0xF0000000, + 0x00000000, 0x0000C000, 0x00000000, 0x0000C000, + 0x00000000, 0x00000000, 0xFC000000, 0xFFFFFFFF, + 0x1F07FF80, 0xA0800000, 0x00000024, 0x00000000, + 0x00000000, 0x00000000, 0x0007FFFC, 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, 0x00400000, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x70000000, 0x7C000000, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x01100F90, 0x78F00000, 0xFE00FF00, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x00000000, 0x01C00000, 0x00C00000, 0x00F80000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x00000000, 0x00000000, 0xFFFFFE00, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x80000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x00000000, 0x00000000, 0x0003C000, 0xFFFF0000, + 0x00000000, 0x00000000, 0xFFFFFFFC, 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, 0xFFFF8000, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x00000000, 0xFE000000, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFC, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 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, 0x80018000, 0x00010001, 0xFFFFFFFF, + 0x0000F800, 0x00008000, 0x00000000, 0x0000FC00, + 0xF8000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F, + 0x0000FFF8, 0xF8000000, 0xFFFCFE00, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x00000000, 0x0040FFFE, 0x00000000, 0xE0000000, + 0xFFF00000, 0x00000000, 0xFFFFF820, 0xFFFE0000, + 0x00000000, 0x80000000, 0x00000002, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0xE1000000, + 0x00000000, 0xC0000000, 0x0000FFFF, 0xFFFFFF00, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x07FFFFFF, + 0x8AA20001, 0x0010D0C0, 0xFFFF001E, 0xFFFFFFFF, + 0x00000000, 0x00000000, 0xFFFFFFC0, 0xFFFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0xFFF00000, + 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, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0xFFE00000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 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 0000000..0a4da25 --- /dev/null +++ b/gnulib/lib/unictype/pr_unified_ideograph.c @@ -0,0 +1,35 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..a32c65c --- /dev/null +++ b/gnulib/lib/unictype/pr_unified_ideograph.h @@ -0,0 +1,312 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[7 << 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, + 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) + 80, + 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 + }, + { + 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, 0x00000FFF, 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, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0x001FFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x3FFFFFFF, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 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 0000000..106ef40 --- /dev/null +++ b/gnulib/lib/unictype/pr_uppercase.c @@ -0,0 +1,35 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..9002116 --- /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-uni-tables.c for Unicode 6.0.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, 0xFFFE0055, 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, 0xC025EA9D, + 0x55555555, 0x55555555, 0x55555555, 0x00002805, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x55555555, 0x00001555, + 0x00555555, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x55545554, 0x55555555, 0x6A005555, + 0x00012855, 0x00000155, 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 0000000..587d482 --- /dev/null +++ b/gnulib/lib/unictype/pr_variation_selector.c @@ -0,0 +1,35 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..ede3709 --- /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-uni-tables.c for Unicode 6.0.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 0000000..491b68a --- /dev/null +++ b/gnulib/lib/unictype/pr_white_space.c @@ -0,0 +1,35 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..bd2ac52 --- /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-uni-tables.c for Unicode 6.0.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 0000000..6a5564a --- /dev/null +++ b/gnulib/lib/unictype/pr_xid_continue.c @@ -0,0 +1,35 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..975e5ef --- /dev/null +++ b/gnulib/lib/unictype/pr_xid_continue.h @@ -0,0 +1,756 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[51 << 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, + 16 + 512 * sizeof (short) / sizeof (int) + 576, + -1, + 16 + 512 * sizeof (short) / sizeof (int) + 592, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 16 + 512 * sizeof (short) / sizeof (int) + 304, + 16 + 512 * sizeof (short) / sizeof (int) + 608, + 16 + 512 * sizeof (short) / sizeof (int) + 624, + -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) + 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, + 16 + 512 * sizeof (short) / sizeof (int) + 304, + 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, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 16 + 512 * sizeof (short) / sizeof (int) + 672, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 16 + 512 * sizeof (short) / sizeof (int) + 688, + 16 + 512 * sizeof (short) / sizeof (int) + 704, + 16 + 512 * sizeof (short) / sizeof (int) + 720, + 16 + 512 * sizeof (short) / sizeof (int) + 736, + -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) + 752, + 16 + 512 * sizeof (short) / sizeof (int) + 304, + 16 + 512 * sizeof (short) / sizeof (int) + 304, + 16 + 512 * sizeof (short) / sizeof (int) + 304, + 16 + 512 * sizeof (short) / sizeof (int) + 304, + 16 + 512 * sizeof (short) / sizeof (int) + 304, + 16 + 512 * sizeof (short) / sizeof (int) + 304, + 16 + 512 * sizeof (short) / sizeof (int) + 304, + 16 + 512 * sizeof (short) / sizeof (int) + 768, + 16 + 512 * 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, + 16 + 512 * sizeof (short) / sizeof (int) + 304, + 16 + 512 * sizeof (short) / sizeof (int) + 784, + -1, + -1, + 16 + 512 * 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 + }, + { + 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, 0xFFFE00FF, 0x027FFFFF, 0xFFFFFFFE, + 0xFFFE00FF, 0xBFFFFFFF, 0xFFFF00B6, 0x000707FF, + 0x07FF0000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFC3FF, + 0xFFFFFFFF, 0xFFFFFFFF, 0x9FEFFFFF, 0x9FFFFDFF, + 0xFFFF0000, 0xFFFFFFFF, 0xFFFFE7FF, 0xFFFFFFFF, + 0xFFFFFFFF, 0x0003FFFF, 0xFFFFFFFF, 0x043FFFFF, + 0xFFFFFFFF, 0x00003FFF, 0x0FFFFFFF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFEFEFFCF, + 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, 0x0006FFCF, + 0xFFFDDFEC, 0xE7FFFFFF, 0x00807DDF, 0xFC00FFCF, + 0xFC7FFFEC, 0x2FFBFFFF, 0xFF5F847F, 0x000C0000, + 0xFFFFFFFE, 0x07FFFFFF, 0x03FF7FFF, 0x00000000, + 0xFEF02596, 0x3BFFECAE, 0x33FF3F5F, 0x00000000, + 0x03000001, 0xC2A003FF, 0xFFFFFEFF, 0xFFFE1FFF, + 0xFEFFFFDF, 0x1FFFFFFF, 0x00000040, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF03FF, 0xFFFFFFFF, + 0x3FFFFFFF, 0xFFFFFFFF, 0xFFFF003F, 0x17FFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0x3D7F3DFF, 0xFFFFFFFF, + 0xFFFF3DFF, 0x7F3DFFFF, 0xFF7FFF3D, 0xFFFFFFFF, + 0xFF3DFFFF, 0xFFFFFFFF, 0xE7FFFFFF, 0x0003FE00, + 0x0000FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x001FFFFF, + 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF9FFF, + 0x07FFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0x0001C7FF, + 0x001FDFFF, 0x001FFFFF, 0x000FFFFF, 0x000DDFFF, + 0xFFFFFFFF, 0xFFCFFFFF, 0x308FFFFF, 0x000003FF, + 0x03FF3800, 0xFFFFFFFF, 0xFFFFFFFF, 0x00FFFFFF, + 0xFFFFFFFF, 0xFFFF07FF, 0xFFFFFFFF, 0x003FFFFF, + 0x1FFFFFFF, 0x0FFF0FFF, 0xFFFFFFC0, 0x001F3FFF, + 0xFFFFFFFF, 0xFFFF0FFF, 0x07FF03FF, 0x00000000, + 0x0FFFFFFF, 0xFFFFFFFF, 0x7FFFFFFF, 0x9FFFFFFF, + 0x03FF03FF, 0x00000080, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0x03FF0FFF, 0x000FF800, + 0xFFFFFFFF, 0x03FFC7FF, 0xFFFFFFFF, 0x000FFFFF, + 0xFFFFFFFF, 0x00FFFFFF, 0xFFFFE3FF, 0x3FFFFFFF, + 0x00000000, 0x00000000, 0xFFF70000, 0x0007FFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xF000007F, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF, + 0xFFFFFFFF, 0x5FDFFFFF, 0x0FCF1FDC, 0x1FDC1FFF, + 0x00000000, 0x80000000, 0x00100001, 0x80020000, + 0x1FFF0000, 0x00000000, 0x1FFF0000, 0x0001FFE2, + 0x3F2FFC84, 0xF3FFFD50, 0x000043E0, 0xFFFFFFFF, + 0x000001FF, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFF7FFF, 0x7FFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0003F81F, + 0xFFFFFFFF, 0xFFFF003F, 0xFFFFFFFF, 0x8000803F, + 0x007FFFFF, 0x7F7F7F7F, 0x7F7F7F7F, 0xFFFFFFFF, + 0x000000E0, 0x1F3EFFFE, 0xFFFFFFFE, 0xFFFFFFFF, + 0xE67FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0xF7FFFFFF, + 0xFFFFFFE0, 0xFFFE3FFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x00007FFF, 0x07FFFFFF, 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, 0x00000FFF, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x00001FFF, 0x00000000, 0xFFFF0000, 0x3FFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFF1FFF, 0x00000FFF, 0xFFFFFFFF, 0xB000FFFF, + 0x00FFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0003FFFF, + 0xFF800000, 0xFFFFFFFC, 0xFFFFFFFF, 0xFFFFFFFF, + 0x000379FF, 0x000003FF, 0x00000000, 0xFC000000, + 0xFFFFFFFF, 0x000000FF, 0xFFFFFFFF, 0x000FFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0x03FF001F, 0x08FFFFFF, + 0xFFFFFFFF, 0xFFFF3FFF, 0x000FFFFF, 0x1FFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0x03FF8001, 0x00000000, + 0xFFFFFFFF, 0x007FFFFF, 0x03FF3FFF, 0x0C7FFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0x38000007, 0x00000000, + 0x007E7E7E, 0x00007F7F, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xFFFFFFFF, 0x03FF37FF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFF000F, 0xFFFFF87F, 0x0FFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFF3FFF, 0xFFFFFFFF, 0xFFFF3FFF, + 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, 0x003FFFFF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x003FFFFF, 0x03FFFFFF, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFEEFF06F, 0x870FFFFF, 0x00000000, 0x1FFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0x003FFFFF, 0x003FFFFF, 0x0007FFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0x000001FF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0x0000007F, 0x0000FFC0, + 0xFFFFFFFF, 0x07FFFFFF, 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, 0x00007FFF, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0x01FFFFFF, 0x00000000, 0x00000000, + 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, + 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, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0x001FFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 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 0000000..6676c0b --- /dev/null +++ b/gnulib/lib/unictype/pr_xid_start.c @@ -0,0 +1,35 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..7b28f82 --- /dev/null +++ b/gnulib/lib/unictype/pr_xid_start.h @@ -0,0 +1,604 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[48 << 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, + 4 + 384 * sizeof (short) / sizeof (int) + 576, + -1, + 4 + 384 * sizeof (short) / sizeof (int) + 592, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 608, + 4 + 384 * sizeof (short) / sizeof (int) + 624, + -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) + 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, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 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, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 4 + 384 * sizeof (short) / sizeof (int) + 672, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 4 + 384 * sizeof (short) / sizeof (int) + 688, + 4 + 384 * 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, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 720, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 4 + 384 * sizeof (short) / sizeof (int) + 304, + 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, + -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) + 752, + -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, 0xFFFE00FF, 0x027FFFFF, 0xFFFFFFFE, + 0x000000FF, 0x00000000, 0xFFFF0000, 0x000707FF, + 0x00000000, 0xFFFFFFFF, 0x000007FF, 0xFFFEC000, + 0xFFFFFFFF, 0xFFFFFFFF, 0x002FFFFF, 0x9C00C060, + 0xFFFD0000, 0x0000FFFF, 0xFFFFE000, 0xFFFFFFFF, + 0xFFFFFFFF, 0x0002003F, 0xFFFFFC00, 0x043007FF, + 0x043FFFFF, 0x00000110, 0x01FFFFFF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFF0, 0x23FFFFFF, 0xFF010000, 0xFEFE0003, + 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, 0x00060003, + 0xFFFDDFE0, 0x27FFFFFF, 0x00004000, 0xFC000003, + 0xFC7FFFE0, 0x2FFBFFFF, 0x0000007F, 0x00000000, + 0xFFFFFFFE, 0x0005FFFF, 0x0000007F, 0x00000000, + 0xFEF02596, 0x2005ECAE, 0x3000005F, 0x00000000, + 0x00000001, 0x00000000, 0xFFFFFEFF, 0x00001FFF, + 0x00001F00, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0x800007FF, 0x3C3F0000, 0xFFE1C062, + 0x00004003, 0xFFFFFFFF, 0xFFFF003F, 0x17FFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 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, 0xFFFF9FFF, + 0x07FFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0x0001C7FF, + 0x0003DFFF, 0x0003FFFF, 0x0003FFFF, 0x0001DFFF, + 0xFFFFFFFF, 0x000FFFFF, 0x10800000, 0x00000000, + 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x00FFFFFF, + 0xFFFFFFFF, 0xFFFF05FF, 0xFFFFFFFF, 0x003FFFFF, + 0x1FFFFFFF, 0x00000000, 0xFFFF0000, 0x001F3FFF, + 0xFFFFFFFF, 0x00000FFF, 0x000000FE, 0x00000000, + 0x007FFFFF, 0xFFFFFFFF, 0x001FFFFF, 0x00000000, + 0x00000000, 0x00000080, 0x00000000, 0x00000000, + 0xFFFFFFE0, 0x000FFFFF, 0x00000FE0, 0x00000000, + 0xFFFFFFF8, 0x0000C001, 0xFFFFFFFF, 0x0000003F, + 0xFFFFFFFF, 0x0000000F, 0xFC00E000, 0x3FFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x0003DE00, + 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, + 0x1FFF0000, 0x00000000, 0x00000000, 0x00000000, + 0x3F2FFC84, 0xF3FFFD50, 0x000043E0, 0xFFFFFFFF, + 0x000001FF, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFF7FFF, 0x7FFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000781F, + 0xFFFFFFFF, 0xFFFF003F, 0xFFFFFFFF, 0x0000803F, + 0x007FFFFF, 0x7F7F7F7F, 0x7F7F7F7F, 0x00000000, + 0x000000E0, 0x1F3E03FE, 0xFFFFFFFE, 0xFFFFFFFF, + 0xE07FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0xF7FFFFFF, + 0xFFFFFFE0, 0xFFFE3FFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x00007FFF, 0x07FFFFFF, 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, 0x00000FFF, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x00001FFF, 0x00000000, 0xFFFF0000, 0x3FFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFF1FFF, 0x00000C00, 0xFFFFFFFF, 0x80007FFF, + 0x00FFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF, + 0xFF800000, 0xFFFFFFFC, 0xFFFFFFFF, 0xFFFFFFFF, + 0x000379FF, 0x000003FF, 0x00000000, 0xFC000000, + 0xFFFFF7BB, 0x00000007, 0xFFFFFFFF, 0x000FFFFF, + 0xFFFFFFFC, 0x000FFFFF, 0x00000000, 0x08FC0000, + 0xFFFFFC00, 0xFFFF003F, 0x0000007F, 0x1FFFFFFF, + 0xFFFFFFF0, 0x0007FFFF, 0x00008000, 0x00000000, + 0xFFFFFFFF, 0x000001FF, 0x00000FF7, 0x047FFFFF, + 0xFFFFFFFF, 0x3E62FFFF, 0x38000005, 0x00000000, + 0x007E7E7E, 0x00007F7F, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xFFFFFFFF, 0x00000007, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFF000F, 0xFFFFF87F, 0x0FFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFF3FFF, 0xFFFFFFFF, 0xFFFF3FFF, + 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, 0x003FFFFF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x003FFFFF, 0x03FFFFFF, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFEEF0001, 0x000FFFFF, 0x00000000, 0x1FFFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0x003FFFFF, 0x003FFFFF, 0x0007FFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0x000001FF, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFF8, 0x00FFFFFF, 0x00000000, 0x00000000, + 0xFFFFFFF8, 0x0000FFFF, 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, 0x00007FFF, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0x01FFFFFF, 0x00000000, 0x00000000, + 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, + 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, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0x001FFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 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 0000000..282a391 --- /dev/null +++ b/gnulib/lib/unictype/pr_zero_width.c @@ -0,0 +1,35 @@ +/* Properties of Unicode characters. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..2cd20ad --- /dev/null +++ b/gnulib/lib/unictype/pr_zero_width.h @@ -0,0 +1,456 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[8 << 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, + 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, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -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) + 96, + -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, + -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, 0x20000000, 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/scripts.c b/gnulib/lib/unictype/scripts.c new file mode 100644 index 0000000..cbaa273 --- /dev/null +++ b/gnulib/lib/unictype/scripts.c @@ -0,0 +1,75 @@ +/* Scripts of Unicode characters. + Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unictype.h" + +#include + +#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 0000000..dc984c3 --- /dev/null +++ b/gnulib/lib/unictype/scripts.h @@ -0,0 +1,4337 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Unicode scripts. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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 }, { 0x02E9, 0, 1 }, + { 0x02EC, 1, 0 }, { 0x02FF, 0, 1 }, + { 0x0374, 1, 1 }, + { 0x037E, 1, 1 }, + { 0x0385, 1, 1 }, + { 0x0387, 1, 1 }, + { 0x0589, 1, 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 }, + { 0x0E3F, 1, 1 }, + { 0x0FD5, 1, 0 }, { 0x0FD8, 0, 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 }, + { 0x1CD3, 1, 1 }, + { 0x1CE1, 1, 1 }, + { 0x1CE9, 1, 0 }, { 0x1CEC, 0, 1 }, + { 0x1CEE, 1, 0 }, { 0x1CF2, 0, 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 }, { 0x20B9, 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, 0 }, { 0x215F, 0, 1 }, + { 0x2189, 1, 1 }, + { 0x2190, 1, 0 }, { 0x23F3, 0, 1 }, + { 0x2400, 1, 0 }, { 0x2426, 0, 1 }, + { 0x2440, 1, 0 }, { 0x244A, 0, 1 }, + { 0x2460, 1, 0 }, { 0x26FF, 0, 1 }, + { 0x2701, 1, 0 }, { 0x27CA, 0, 1 }, + { 0x27CC, 1, 1 }, + { 0x27CE, 1, 0 }, { 0x27FF, 0, 1 }, + { 0x2900, 1, 0 }, { 0x2B4C, 0, 1 }, + { 0x2B50, 1, 0 }, { 0x2B59, 0, 1 }, + { 0x2E00, 1, 0 }, { 0x2E31, 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 }, { 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 }, + { 0xA830, 1, 0 }, { 0xA839, 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 }, + { 0x1F0A0, 1, 0 }, { 0x1F0AE, 0, 1 }, + { 0x1F0B1, 1, 0 }, { 0x1F0BE, 0, 1 }, + { 0x1F0C1, 1, 0 }, { 0x1F0CF, 0, 1 }, + { 0x1F0D1, 1, 0 }, { 0x1F0DF, 0, 1 }, + { 0x1F100, 1, 0 }, { 0x1F10A, 0, 1 }, + { 0x1F110, 1, 0 }, { 0x1F12E, 0, 1 }, + { 0x1F130, 1, 0 }, { 0x1F169, 0, 1 }, + { 0x1F170, 1, 0 }, { 0x1F19A, 0, 1 }, + { 0x1F1E6, 1, 0 }, { 0x1F1FF, 0, 1 }, + { 0x1F201, 1, 0 }, { 0x1F202, 0, 1 }, + { 0x1F210, 1, 0 }, { 0x1F23A, 0, 1 }, + { 0x1F240, 1, 0 }, { 0x1F248, 0, 1 }, + { 0x1F250, 1, 0 }, { 0x1F251, 0, 1 }, + { 0x1F300, 1, 0 }, { 0x1F320, 0, 1 }, + { 0x1F330, 1, 0 }, { 0x1F335, 0, 1 }, + { 0x1F337, 1, 0 }, { 0x1F37C, 0, 1 }, + { 0x1F380, 1, 0 }, { 0x1F393, 0, 1 }, + { 0x1F3A0, 1, 0 }, { 0x1F3C4, 0, 1 }, + { 0x1F3C6, 1, 0 }, { 0x1F3CA, 0, 1 }, + { 0x1F3E0, 1, 0 }, { 0x1F3F0, 0, 1 }, + { 0x1F400, 1, 0 }, { 0x1F43E, 0, 1 }, + { 0x1F440, 1, 1 }, + { 0x1F442, 1, 0 }, { 0x1F4F7, 0, 1 }, + { 0x1F4F9, 1, 0 }, { 0x1F4FC, 0, 1 }, + { 0x1F500, 1, 0 }, { 0x1F53D, 0, 1 }, + { 0x1F550, 1, 0 }, { 0x1F567, 0, 1 }, + { 0x1F5FB, 1, 0 }, { 0x1F5FF, 0, 1 }, + { 0x1F601, 1, 0 }, { 0x1F610, 0, 1 }, + { 0x1F612, 1, 0 }, { 0x1F614, 0, 1 }, + { 0x1F616, 1, 1 }, + { 0x1F618, 1, 1 }, + { 0x1F61A, 1, 1 }, + { 0x1F61C, 1, 0 }, { 0x1F61E, 0, 1 }, + { 0x1F620, 1, 0 }, { 0x1F625, 0, 1 }, + { 0x1F628, 1, 0 }, { 0x1F62B, 0, 1 }, + { 0x1F62D, 1, 1 }, + { 0x1F630, 1, 0 }, { 0x1F633, 0, 1 }, + { 0x1F635, 1, 0 }, { 0x1F640, 0, 1 }, + { 0x1F645, 1, 0 }, { 0x1F64F, 0, 1 }, + { 0x1F680, 1, 0 }, { 0x1F6C5, 0, 1 }, + { 0x1F700, 1, 0 }, { 0x1F773, 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 }, { 0x209C, 0, 1 }, + { 0x212A, 1, 0 }, { 0x212B, 0, 1 }, + { 0x2132, 1, 1 }, + { 0x214E, 1, 1 }, + { 0x2160, 1, 0 }, { 0x2188, 0, 1 }, + { 0x2C60, 1, 0 }, { 0x2C7F, 0, 1 }, + { 0xA722, 1, 0 }, { 0xA787, 0, 1 }, + { 0xA78B, 1, 0 }, { 0xA78E, 0, 1 }, + { 0xA790, 1, 0 }, { 0xA791, 0, 1 }, + { 0xA7A0, 1, 0 }, { 0xA7A9, 0, 1 }, + { 0xA7FA, 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 }, { 0x0484, 0, 1 }, + { 0x0487, 1, 0 }, { 0x0527, 0, 1 }, + { 0x1D2B, 1, 1 }, + { 0x1D78, 1, 1 }, + { 0x2DE0, 1, 0 }, { 0x2DFF, 0, 1 }, + { 0xA640, 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[] = +{ + { 0x0600, 1, 0 }, { 0x0603, 0, 1 }, + { 0x0606, 1, 0 }, { 0x060B, 0, 1 }, + { 0x060D, 1, 0 }, { 0x061A, 0, 1 }, + { 0x061E, 1, 1 }, + { 0x0620, 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 }, { 0xFBC1, 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 }, + { 0x10E60, 1, 0 }, { 0x10E7E, 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[] = +{ + { 0x0900, 1, 0 }, { 0x0950, 0, 1 }, + { 0x0953, 1, 0 }, { 0x0963, 0, 1 }, + { 0x0966, 1, 0 }, { 0x096F, 0, 1 }, + { 0x0971, 1, 0 }, { 0x0977, 0, 1 }, + { 0x0979, 1, 0 }, { 0x097F, 0, 1 }, + { 0xA8E0, 1, 0 }, { 0xA8FB, 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 }, { 0x09FB, 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 }, { 0x0B77, 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 }, + { 0x0CF1, 1, 0 }, { 0x0CF2, 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 }, { 0x0D3A, 0, 1 }, + { 0x0D3D, 1, 0 }, { 0x0D44, 0, 1 }, + { 0x0D46, 1, 0 }, { 0x0D48, 0, 1 }, + { 0x0D4A, 1, 0 }, { 0x0D4E, 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 }, { 0x0F97, 0, 1 }, + { 0x0F99, 1, 0 }, { 0x0FBC, 0, 1 }, + { 0x0FBE, 1, 0 }, { 0x0FCC, 0, 1 }, + { 0x0FCE, 1, 0 }, { 0x0FD4, 0, 1 }, + { 0x0FD9, 1, 0 }, { 0x0FDA, 0, 1 } +}; +static const uc_interval_t script_myanmar_intervals[] = +{ + { 0x1000, 1, 0 }, { 0x109F, 0, 1 }, + { 0xAA60, 1, 0 }, { 0xAA7B, 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 }, { 0x11FF, 0, 1 }, + { 0x302E, 1, 0 }, { 0x302F, 0, 1 }, + { 0x3131, 1, 0 }, { 0x318E, 0, 1 }, + { 0x3200, 1, 0 }, { 0x321E, 0, 1 }, + { 0x3260, 1, 0 }, { 0x327E, 0, 1 }, + { 0xA960, 1, 0 }, { 0xA97C, 0, 1 }, + { 0xAC00, 1, 0 }, { 0xD7A3, 0, 1 }, + { 0xD7B0, 1, 0 }, { 0xD7C6, 0, 1 }, + { 0xD7CB, 1, 0 }, { 0xD7FB, 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 }, + { 0x135D, 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 }, + { 0xAB01, 1, 0 }, { 0xAB06, 0, 1 }, + { 0xAB09, 1, 0 }, { 0xAB0E, 0, 1 }, + { 0xAB11, 1, 0 }, { 0xAB16, 0, 1 }, + { 0xAB20, 1, 0 }, { 0xAB26, 0, 1 }, + { 0xAB28, 1, 0 }, { 0xAB2E, 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[] = +{ + { 0x1400, 1, 0 }, { 0x167F, 0, 1 }, + { 0x18B0, 1, 0 }, { 0x18F5, 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 }, + { 0x1B001, 1, 1 }, + { 0x1F200, 1, 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 }, + { 0x1B000, 1, 1 } +}; +static const uc_interval_t script_bopomofo_intervals[] = +{ + { 0x02EA, 1, 0 }, { 0x02EB, 0, 1 }, + { 0x3105, 1, 0 }, { 0x312D, 0, 1 }, + { 0x31A0, 1, 0 }, { 0x31BA, 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 }, { 0x9FCB, 0, 1 }, + { 0xF900, 1, 0 }, { 0xFA2D, 0, 1 }, + { 0xFA30, 1, 0 }, { 0xFA6D, 0, 1 }, + { 0xFA70, 1, 0 }, { 0xFAD9, 0, 1 }, + { 0x20000, 1, 0 }, { 0x2A6D6, 0, 1 }, + { 0x2A700, 1, 0 }, { 0x2B734, 0, 1 }, + { 0x2B740, 1, 0 }, { 0x2B81D, 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 }, + { 0x0485, 1, 0 }, { 0x0486, 0, 1 }, + { 0x064B, 1, 0 }, { 0x0655, 0, 1 }, + { 0x065F, 1, 1 }, + { 0x0670, 1, 1 }, + { 0x0951, 1, 0 }, { 0x0952, 0, 1 }, + { 0x1CD0, 1, 0 }, { 0x1CD2, 0, 1 }, + { 0x1CD4, 1, 0 }, { 0x1CE0, 0, 1 }, + { 0x1CE2, 1, 0 }, { 0x1CE8, 0, 1 }, + { 0x1CED, 1, 1 }, + { 0x1DC0, 1, 0 }, { 0x1DE6, 0, 1 }, + { 0x1DFC, 1, 0 }, { 0x1DFF, 0, 1 }, + { 0x200C, 1, 0 }, { 0x200D, 0, 1 }, + { 0x20D0, 1, 0 }, { 0x20F0, 0, 1 }, + { 0x302A, 1, 0 }, { 0x302D, 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 }, { 0x2CF1, 0, 1 }, + { 0x2CF9, 1, 0 }, { 0x2CFF, 0, 1 } +}; +static const uc_interval_t script_new_tai_lue_intervals[] = +{ + { 0x1980, 1, 0 }, { 0x19AB, 0, 1 }, + { 0x19B0, 1, 0 }, { 0x19C9, 0, 1 }, + { 0x19D0, 1, 0 }, { 0x19DA, 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, 0 }, { 0x2D70, 0, 1 }, + { 0x2D7F, 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 }, { 0x1091B, 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_interval_t script_tai_tham_intervals[] = +{ + { 0x1A20, 1, 0 }, { 0x1A5E, 0, 1 }, + { 0x1A60, 1, 0 }, { 0x1A7C, 0, 1 }, + { 0x1A7F, 1, 0 }, { 0x1A89, 0, 1 }, + { 0x1A90, 1, 0 }, { 0x1A99, 0, 1 }, + { 0x1AA0, 1, 0 }, { 0x1AAD, 0, 1 } +}; +static const uc_interval_t script_tai_viet_intervals[] = +{ + { 0xAA80, 1, 0 }, { 0xAAC2, 0, 1 }, + { 0xAADB, 1, 0 }, { 0xAADF, 0, 1 } +}; +static const uc_interval_t script_avestan_intervals[] = +{ + { 0x10B00, 1, 0 }, { 0x10B35, 0, 1 }, + { 0x10B39, 1, 0 }, { 0x10B3F, 0, 1 } +}; +static const uc_interval_t script_egyptian_hieroglyphs_intervals[] = +{ + { 0x13000, 1, 0 }, { 0x1342E, 0, 1 } +}; +static const uc_interval_t script_samaritan_intervals[] = +{ + { 0x0800, 1, 0 }, { 0x082D, 0, 1 }, + { 0x0830, 1, 0 }, { 0x083E, 0, 1 } +}; +static const uc_interval_t script_lisu_intervals[] = +{ + { 0xA4D0, 1, 0 }, { 0xA4FF, 0, 1 } +}; +static const uc_interval_t script_bamum_intervals[] = +{ + { 0xA6A0, 1, 0 }, { 0xA6F7, 0, 1 }, + { 0x16800, 1, 0 }, { 0x16A38, 0, 1 } +}; +static const uc_interval_t script_javanese_intervals[] = +{ + { 0xA980, 1, 0 }, { 0xA9CD, 0, 1 }, + { 0xA9CF, 1, 0 }, { 0xA9D9, 0, 1 }, + { 0xA9DE, 1, 0 }, { 0xA9DF, 0, 1 } +}; +static const uc_interval_t script_meetei_mayek_intervals[] = +{ + { 0xABC0, 1, 0 }, { 0xABED, 0, 1 }, + { 0xABF0, 1, 0 }, { 0xABF9, 0, 1 } +}; +static const uc_interval_t script_imperial_aramaic_intervals[] = +{ + { 0x10840, 1, 0 }, { 0x10855, 0, 1 }, + { 0x10857, 1, 0 }, { 0x1085F, 0, 1 } +}; +static const uc_interval_t script_old_south_arabian_intervals[] = +{ + { 0x10A60, 1, 0 }, { 0x10A7F, 0, 1 } +}; +static const uc_interval_t script_inscriptional_parthian_intervals[] = +{ + { 0x10B40, 1, 0 }, { 0x10B55, 0, 1 }, + { 0x10B58, 1, 0 }, { 0x10B5F, 0, 1 } +}; +static const uc_interval_t script_inscriptional_pahlavi_intervals[] = +{ + { 0x10B60, 1, 0 }, { 0x10B72, 0, 1 }, + { 0x10B78, 1, 0 }, { 0x10B7F, 0, 1 } +}; +static const uc_interval_t script_old_turkic_intervals[] = +{ + { 0x10C00, 1, 0 }, { 0x10C48, 0, 1 } +}; +static const uc_interval_t script_kaithi_intervals[] = +{ + { 0x11080, 1, 0 }, { 0x110C1, 0, 1 } +}; +static const uc_interval_t script_batak_intervals[] = +{ + { 0x1BC0, 1, 0 }, { 0x1BF3, 0, 1 }, + { 0x1BFC, 1, 0 }, { 0x1BFF, 0, 1 } +}; +static const uc_interval_t script_brahmi_intervals[] = +{ + { 0x11000, 1, 0 }, { 0x1104D, 0, 1 }, + { 0x11052, 1, 0 }, { 0x1106F, 0, 1 } +}; +static const uc_interval_t script_mandaic_intervals[] = +{ + { 0x0840, 1, 0 }, { 0x085B, 0, 1 }, + { 0x085E, 1, 1 } +}; +static const uc_script_t scripts[95] = +{ + { + 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" + }, + { + sizeof (script_tai_tham_intervals) / sizeof (uc_interval_t), + script_tai_tham_intervals, + "Tai_Tham" + }, + { + sizeof (script_tai_viet_intervals) / sizeof (uc_interval_t), + script_tai_viet_intervals, + "Tai_Viet" + }, + { + sizeof (script_avestan_intervals) / sizeof (uc_interval_t), + script_avestan_intervals, + "Avestan" + }, + { + sizeof (script_egyptian_hieroglyphs_intervals) / sizeof (uc_interval_t), + script_egyptian_hieroglyphs_intervals, + "Egyptian_Hieroglyphs" + }, + { + sizeof (script_samaritan_intervals) / sizeof (uc_interval_t), + script_samaritan_intervals, + "Samaritan" + }, + { + sizeof (script_lisu_intervals) / sizeof (uc_interval_t), + script_lisu_intervals, + "Lisu" + }, + { + sizeof (script_bamum_intervals) / sizeof (uc_interval_t), + script_bamum_intervals, + "Bamum" + }, + { + sizeof (script_javanese_intervals) / sizeof (uc_interval_t), + script_javanese_intervals, + "Javanese" + }, + { + sizeof (script_meetei_mayek_intervals) / sizeof (uc_interval_t), + script_meetei_mayek_intervals, + "Meetei_Mayek" + }, + { + sizeof (script_imperial_aramaic_intervals) / sizeof (uc_interval_t), + script_imperial_aramaic_intervals, + "Imperial_Aramaic" + }, + { + sizeof (script_old_south_arabian_intervals) / sizeof (uc_interval_t), + script_old_south_arabian_intervals, + "Old_South_Arabian" + }, + { + sizeof (script_inscriptional_parthian_intervals) / sizeof (uc_interval_t), + script_inscriptional_parthian_intervals, + "Inscriptional_Parthian" + }, + { + sizeof (script_inscriptional_pahlavi_intervals) / sizeof (uc_interval_t), + script_inscriptional_pahlavi_intervals, + "Inscriptional_Pahlavi" + }, + { + sizeof (script_old_turkic_intervals) / sizeof (uc_interval_t), + script_old_turkic_intervals, + "Old_Turkic" + }, + { + sizeof (script_kaithi_intervals) / sizeof (uc_interval_t), + script_kaithi_intervals, + "Kaithi" + }, + { + sizeof (script_batak_intervals) / sizeof (uc_interval_t), + script_batak_intervals, + "Batak" + }, + { + sizeof (script_brahmi_intervals) / sizeof (uc_interval_t), + script_brahmi_intervals, + "Brahmi" + }, + { + sizeof (script_mandaic_intervals) / sizeof (uc_interval_t), + script_mandaic_intervals, + "Mandaic" + } +}; +#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[163 << 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, 896, 1024, 1152, 1280, 1408, 1536, 1664, + 1792, -1, 1920, 2048, 2176, 2304, 2432, 2560, + 2688, 2816, 2944, 3072, 3200, 3328, 3456, 3584, + 3712, 3840, 3968, 3968, 4096, 4224, 4352, 4480, + 4608, 4608, 4608, 4608, 4608, 4736, 4864, 4992, + 5120, 5248, 5376, 5504, 5632, 5760, 5888, 6016, + 6144, 6272, 6400, 6528, 256, 256, 6656, 6784, + 6912, 7040, 7168, 7296, 7424, 7424, 7424, 7552, + 7680, 7424, 7424, 7424, 7424, 7424, 7808, 7936, + 8064, 8064, 7424, 7424, 7424, 7424, 8192, -1, + 8320, 8448, 8576, 8704, 8832, 8960, 9088, 9216, + 9344, 9472, 9600, 9728, 9856, 9984, 10112, 7424, + 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088, + 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088, + 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088, + 9088, 9088, 9088, 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, 11776, 11904, 12032, 12160, 12288, + 3968, 3968, 3968, 3968, 3968, 3968, 3968, 3968, + 3968, 3968, 3968, 3968, 3968, 3968, 3968, 3968, + 3968, 3968, 3968, 3968, 3968, 3968, 3968, 3968, + 3968, 3968, 3968, 3968, 3968, 3968, 3968, 3968, + 3968, 3968, 3968, 3968, 3968, 3968, 3968, 3968, + 3968, 3968, 3968, 3968, 3968, 3968, 3968, 3968, + 3968, 3968, 3968, 3968, 3968, 3968, 3968, 3968, + 3968, 3968, 3968, 3968, 3968, 3968, 3968, 3968, + 3968, 3968, 3968, 3968, 3968, 3968, 3968, 3968, + 3968, 3968, 3968, 3968, 3968, 3968, 3968, 3968, + 3968, 3968, 3968, 3968, 3968, 3968, 3968, 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, 9088, 9088, 12544, 12672, 12800, 12928, + 13056, 13056, 13184, 13312, 13440, 13568, 13696, 13824, + 13952, 14080, 14208, 14336, -1, 14464, 14592, 14720, + 14848, 14976, -1, -1, -1, -1, -1, -1, + 15104, -1, 15232, -1, 15360, -1, 15488, -1, + 15616, -1, -1, -1, 15744, -1, -1, -1, + 15872, 16000, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 16128, 16128, 16128, 16128, 16128, 16128, 16256, -1, + 16384, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 16512, 16512, 16512, 16512, 16512, 16512, 16512, 16512, + 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, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -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, 16768, 16768, 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, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 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, + 7424, 17152, 17280, 17408, 17536, -1, 17664, -1, + 17792, 17920, 18048, 7424, 7424, 18176, 7424, 18304, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 18432, 18560, 18688, 18816, 18944, -1, 19072, 19200, + 19328, 19456, 19584, 19712, 19840, 19968, 7552, -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, 20096, 9088, 9088, + 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088, + 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088, + 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088, + 9088, 9088, 9088, 9088, 9088, 9088, 20224, 9088, + 20352, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -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, 20352, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 20480, -1, 20608, 20736, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -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, 34, 34, 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, 40, 40, 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, 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, + 6, 6, 6, 6, 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, + 6, 6, 6, 6, 6, 6, 6, 6, + 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, 40, + 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, + 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 255, 255, + 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 255, + 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 255, 255, 94, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 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, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, + 9, 40, 40, 9, 9, 9, 9, 9, + 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, 9, 9, 9, 9, 9, + 255, 9, 9, 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, 10, 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, 13, 13, 13, 13, 13, 13, + 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, 16, 16, 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, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 255, 255, 17, 17, 17, + 17, 17, 17, 17, 17, 255, 17, 17, + 17, 255, 17, 17, 17, 17, 17, 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, 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, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 255, 21, 21, + 21, 21, 21, 21, 21, 0, 0, 0, + 0, 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, + 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, 22, 22, 22, 22, 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, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, + 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, 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, + 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, + 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, + 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, + 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 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, 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, 55, 55, 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, 55, 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, + 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 255, + 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 255, 255, 77, + 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 255, 255, 255, 255, 255, 255, + 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 255, 255, 255, 255, 255, 255, + 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 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, + 92, 92, 92, 92, 92, 92, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 92, + 92, 92, 92, 92, 255, 255, 255, 255, + 255, 255, 255, 255, 92, 92, 92, 92, + 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, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 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, 0, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, + 40, 0, 40, 40, 40, 40, 40, 40, + 40, 0, 0, 0, 0, 40, 0, 0, + 0, 0, 0, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 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, 40, 40, 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, 1, 1, 1, + 1, 1, 1, 1, 1, 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, 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, + 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, 0, 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, + 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, + 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, + 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, 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, 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, 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, + 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, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 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, 54, 54, 54, 54, 54, + 54, 54, 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, + 57, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 57, + 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, 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, + 35, 35, 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, 24, 24, + 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, + 34, 34, 34, 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, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 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, 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, + 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, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 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, + 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, 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, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 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, 1, 1, 255, + 1, 1, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 1, 1, 1, 1, 1, 1, 1, 1, + 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, 1, 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, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 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, + 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, 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, + 24, 24, 24, 24, 24, 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, + 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 255, 84, + 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 255, 255, 255, 255, 84, 84, + 255, 255, 255, 255, 255, 255, 255, 255, + 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, + 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, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 78, 78, 78, 78, 78, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 25, 25, 25, 25, 25, 25, 255, + 255, 25, 25, 25, 25, 25, 25, 255, + 255, 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, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 255, 255, + 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 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, 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, 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, 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, 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, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 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, 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, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 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, + 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 255, 86, + 86, 86, 86, 86, 86, 86, 86, 86, + 255, 255, 255, 255, 255, 255, 255, 255, + 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, 63, 63, 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, + 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, + 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 255, 255, + 255, 79, 79, 79, 79, 79, 79, 79, + 88, 88, 88, 88, 88, 88, 88, 88, + 88, 88, 88, 88, 88, 88, 88, 88, + 88, 88, 88, 88, 88, 88, 255, 255, + 88, 88, 88, 88, 88, 88, 88, 88, + 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 255, 255, 255, 255, 255, + 89, 89, 89, 89, 89, 89, 89, 89, + 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, + 90, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 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, 255, + 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 255, 255, + 255, 255, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 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, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 33, 32, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 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, + 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, + 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, 255, + 255, 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, + 255, 255, 255, 255, 255, 255, 255, 255, + 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, + 0, 0, 0, 0, 0, 0, 0, 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, 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, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 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, + 32, 0, 0, 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, 255, 255, 255, 255, 255, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 255, 255, 255, 255, 255, 255, 255, + 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, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 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, + 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, 255, 255, 255, + 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, + 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, 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, 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, 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, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 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, 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, + 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, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 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, + 255, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 255, 0, 0, 0, 255, 0, 255, + 0, 255, 0, 255, 0, 0, 0, 255, + 0, 0, 0, 0, 0, 0, 255, 255, + 0, 0, 0, 0, 255, 0, 255, 255, + 0, 0, 0, 0, 255, 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, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 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, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 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, 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, + 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 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 0000000..6352fdf --- /dev/null +++ b/gnulib/lib/unictype/scripts_byname.gperf @@ -0,0 +1,109 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Unicode scripts. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */ +struct named_script { int 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 +%pic +%define string-pool-name script_stringpool +%% +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 +Tai_Tham, 77 +Tai_Viet, 78 +Avestan, 79 +Egyptian_Hieroglyphs, 80 +Samaritan, 81 +Lisu, 82 +Bamum, 83 +Javanese, 84 +Meetei_Mayek, 85 +Imperial_Aramaic, 86 +Old_South_Arabian, 87 +Inscriptional_Parthian, 88 +Inscriptional_Pahlavi, 89 +Old_Turkic, 90 +Kaithi, 91 +Batak, 92 +Brahmi, 93 +Mandaic, 94 diff --git a/gnulib/lib/unictype/sy_c_ident.c b/gnulib/lib/unictype/sy_c_ident.c new file mode 100644 index 0000000..b46e43c --- /dev/null +++ b/gnulib/lib/unictype/sy_c_ident.c @@ -0,0 +1,31 @@ +/* Syntax properties of Unicode characters. + Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..387aeed --- /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-uni-tables.c for Unicode 6.0.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 0000000..3c125ee --- /dev/null +++ b/gnulib/lib/unictype/sy_c_whitespace.c @@ -0,0 +1,27 @@ +/* Syntax properties of Unicode characters. + Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..e78fa6f --- /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-uni-tables.c for Unicode 6.0.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 0000000..f4a2311 --- /dev/null +++ b/gnulib/lib/unictype/sy_java_ident.c @@ -0,0 +1,31 @@ +/* Syntax properties of Unicode characters. + Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..46decd6 --- /dev/null +++ b/gnulib/lib/unictype/sy_java_ident.h @@ -0,0 +1,389 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Language syntax properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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[21 << 5]; + unsigned short level3[126 * 16]; + } +u_java_ident = +{ + { + 0, 32, 64, 96, 128, 160, 160, 160, + 160, 192, 224, 160, 160, 256, -1, 288, + 320, 352, 384, 416, -1, -1, 448, -1, + -1, -1, -1, 480, -1, 512, -1, -1, + 160, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 544, 576, -1, -1, -1, 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, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 640 + }, + { + 0, 128, 256, 256, 256, 384, 512, 640, + 256, 768, 896, 1024, 1152, 1280, 1408, 1536, + 1664, -1, 1792, 1920, 2048, 2176, 2304, 2432, + 2560, 2688, 2816, 2944, 3072, 3200, 3328, 3456, + 3584, 3712, 256, 256, 3840, 3968, 4096, 4224, + 4352, 256, 256, 256, 4480, 4608, 4736, 4864, + 4992, 5120, 5248, 5376, 5504, 5632, 5760, 5888, + 6016, 6144, 256, 6272, 256, 256, 6400, 6528, + 6656, 6784, 6912, 7040, -1, -1, -1, -1, + -1, -1, -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, -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, 8320, 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, 8448, + 256, 256, 256, 256, 256, 256, 256, 256, + 256, 8576, 256, 256, 8704, 8832, 8960, 9088, + 9216, 9344, 9472, 9600, 9728, 9856, 9984, 10112, + 256, 256, 256, 256, 256, 256, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 10240, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -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, 10368, 10496, 10624, 10752, + 256, 256, 10880, 11008, 11136, 11264, 11392, 11520, + 11648, 11776, 11904, 12032, -1, 12160, 12288, 12416, + 256, 12544, -1, -1, -1, -1, -1, -1, + 12672, -1, 12800, -1, 12928, -1, 13056, -1, + 13184, -1, -1, -1, -1, -1, -1, -1, + 13312, 13440, -1, -1, -1, -1, -1, -1, + -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, 13568, -1, + 13696, -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, + 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, -1, -1, -1, -1, -1, + 256, 256, 256, 256, 13952, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 14080, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 14208, 14336, 14464, -1, -1, -1, + 14592, 14720, 14848, 256, 256, 14976, 15104, 15232, + -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, 15360, 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, 15488, 256, + 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, + 256, 256, 256, 256, 15616, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 15744, -1, 15872, 16000, -1, -1, -1, -1, + -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, 0x0000, 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, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x5540, 0x5555, 0x5555, 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, + 0x0000, 0x0000, 0x5000, 0x5545, 0x5455, 0xa554, 0xaaaa, 0xaaaa, + 0x0000, 0x0000, 0x0000, 0xaa54, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, + 0x0055, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5150, + 0x5555, 0x5555, 0x5554, 0x0000, 0x5a50, 0x5555, 0x0002, 0x0002, + 0x0256, 0x2800, 0x0028, 0x0000, 0x0000, 0x0008, 0x0a88, 0x51a0, + 0x6955, 0x8569, 0x6aaa, 0x20aa, 0x5a50, 0x5555, 0xaa00, 0xaa2a, + 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, 0xaa82, 0xaaaa, + 0x025a, 0x0800, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x5280, + 0x5955, 0x8559, 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, 0x5400, 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, 0xa555, 0x0000, 0x0000, 0x0000, 0x0000, + 0xa000, 0xaaaa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa880, + 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, 0x5680, 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, 0x0000, 0x0000, + 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, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 0xaaaa, + 0x0000, 0x0000, 0x0000, 0xa800, 0x5555, 0xaa55, 0x5555, 0xaa55, + 0x5aaa, 0x5555, 0x0000, 0x0000, 0x0000, 0xa000, 0xa800, 0xaaaa, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xaa00, 0x5555, 0x5555, + 0x0001, 0xaaa5, 0x5555, 0xaaa5, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, + 0x0000, 0x0000, 0x4000, 0xaa55, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x5400, 0x9555, 0x5555, 0x5555, 0x5555, 0x6955, + 0x5555, 0xaaa5, 0x5555, 0xaaa5, 0x2aaa, 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, + 0x0000, 0x0000, 0x0000, 0x0000, 0x5000, 0x5555, 0xaa55, 0xaaaa, + 0x0000, 0x0000, 0x0000, 0x0000, 0x5500, 0x5555, 0x5555, 0xaaaa, + 0x5555, 0x02a5, 0x5555, 0x0005, 0x0000, 0x0000, 0x0000, 0xa000, + 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, + 0xaaaa, 0xaaaa, 0x5595, 0x5555, 0x5555, 0x0401, 0xaa90, 0xaaaa, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x5555, 0x5555, 0x5555, 0x5555, 0x9555, 0xaaaa, 0xaaaa, 0x55aa, + 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, 0x0000, 0xa800, 0x0000, 0x0000, 0x0000, 0xaaa0, + 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, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xa800, 0x402a, 0xaaa5, 0xaaaa, + 0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 0xaaaa, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 0x2aaa, 0xaaaa, 0x6aaa, + 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, 0xaa80, + 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, + 0x0000, 0xaa00, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, + 0x0000, 0xa800, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, + 0xaaaa, 0xaaaa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa000, + 0x0000, 0xa800, 0x0000, 0x0000, 0x5555, 0xaa05, 0xaaaa, 0xaaaa, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0xaaaa, 0x25aa, + 0x0000, 0x0000, 0x0000, 0xaaaa, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xaaa5, 0xaaaa, + 0xaaaa, 0xaaaa, 0x2aaa, 0x0000, 0x000a, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8028, 0xaaa0, 0xaaaa, 0x0000, 0xaaa0, 0xaaaa, 0xaaaa, + 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0x000a, + 0x1010, 0x0040, 0x0000, 0x0000, 0x5540, 0xaaaa, 0xaaaa, 0xaaa8, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xaa00, 0xaaaa, + 0x0005, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5500, 0x5555, + 0xa955, 0xaaaa, 0x5555, 0xaaa5, 0x5555, 0x5555, 0x0005, 0xaa2a, + 0x5555, 0x0005, 0x0000, 0x0000, 0x5000, 0xa555, 0x0000, 0x0000, + 0x4000, 0x5555, 0xaa55, 0xaaaa, 0x0000, 0x0000, 0x0000, 0xa800, + 0x0055, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5540, 0x5555, + 0xaaa9, 0x2aaa, 0x5555, 0xaaa5, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5554, 0x9555, 0xaaaa, + 0x0040, 0xa500, 0x5555, 0xaaa5, 0x0000, 0x0000, 0x8000, 0xaa4a, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4151, 0x5001, + 0xaa84, 0xaaaa, 0xaaaa, 0xa02a, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, + 0x8002, 0x8002, 0x8002, 0xaaaa, 0x8000, 0x8000, 0xaaaa, 0xaaaa, + 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, + 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, + 0x0000, 0x0000, 0x0000, 0x0000, 0x5540, 0xa595, 0x5555, 0xaaa5, + 0x0000, 0x0000, 0x0000, 0x0000, 0xaa00, 0xaaaa, 0x0000, 0x0000, + 0x8000, 0x002a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xaa00, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 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, + 0x0000, 0x0000, 0xa000, 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, 0x0000, 0x0000, 0x0000, 0xa800, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 0xaaaa, + 0x0000, 0x0000, 0xa000, 0xaaaa, 0x0000, 0x0000, 0xaa80, 0xaaaa, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xaaa8, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, + 0x0015, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5555, + 0x9555, 0xaaaa, 0xaaaa, 0xaaaa, 0x5aaa, 0x5555, 0xaaaa, 0xaaaa, + 0x0015, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5555, 0xae95, + 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, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0xaaaa, 0xaaaa, + 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xaaa8, + 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, + 0xaaa0, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, + 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 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, 0x0000, 0x0000, 0x0000, 0xa800, 0xaaaa, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 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 0000000..3b03ae2 --- /dev/null +++ b/gnulib/lib/unictype/sy_java_whitespace.c @@ -0,0 +1,27 @@ +/* Syntax properties of Unicode characters. + Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..ec51d0e --- /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-uni-tables.c for Unicode 6.0.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/unigbrk.in.h b/gnulib/lib/unigbrk.in.h new file mode 100644 index 0000000..906fc1d --- /dev/null +++ b/gnulib/lib/unigbrk.in.h @@ -0,0 +1,120 @@ +/* Grapheme cluster breaks in Unicode strings. + Copyright (C) 2010-2011 Free Software Foundation, Inc. + Written by Ben Pfaff , 2010. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#ifndef _UNIGBRK_H +#define _UNIGBRK_H + +/* Get bool. */ +#include + +/* Get size_t. */ +#include + +#include "unitypes.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* ========================================================================= */ + +/* Property defined in Unicode Standard Annex #29, section "Grapheme Cluster + Boundaries" + */ + +/* Possible values of the Grapheme_Cluster_Break property. + This enumeration may be extended in the future. */ +enum +{ + GBP_OTHER = 0, + GBP_CR = 1, + GBP_LF = 2, + GBP_CONTROL = 3, + GBP_EXTEND = 4, + GBP_PREPEND = 5, + GBP_SPACINGMARK = 6, + GBP_L = 7, + GBP_V = 8, + GBP_T = 9, + GBP_LV = 10, + GBP_LVT = 11 +}; + +/* Return the Grapheme_Cluster_Break property of a Unicode character. */ +extern int + uc_graphemeclusterbreak_property (ucs4_t uc); + +/* ========================================================================= */ + +/* Grapheme cluster breaks. */ + +/* Returns true if there is a grapheme cluster boundary between Unicode code + points A and B. A "grapheme cluster" is an approximation to a + user-perceived character, which sometimes corresponds to multiple code + points. For example, an English letter followed by an acute accent can be + expressed as two consecutive Unicode code points, but it is perceived by the + user as only a single character and therefore constitutes a single grapheme + cluster. + + Implements extended (not legacy) grapheme cluster rules, because UAX #29 + indicates that they are preferred. + + Use A == 0 or B == 0 to indicate start of text or end of text, + respectively. */ +extern bool + uc_is_grapheme_break (ucs4_t a, ucs4_t b); + +/* Returns the start of the next grapheme cluster following S, or NULL if the + end of the string has been reached. */ +extern const uint8_t * + u8_grapheme_next (const uint8_t *s, const uint8_t *end); +extern const uint16_t * + u16_grapheme_next (const uint16_t *s, const uint16_t *end); +extern const uint32_t * + u32_grapheme_next (const uint32_t *s, const uint32_t *end); + +/* Returns the start of the previous grapheme cluster before S, or NULL if the + start of the string has been reached. */ +extern const uint8_t * + u8_grapheme_prev (const uint8_t *s, const uint8_t *start); +extern const uint16_t * + u16_grapheme_prev (const uint16_t *s, const uint16_t *start); +extern const uint32_t * + u32_grapheme_prev (const uint32_t *s, const uint32_t *start); + +/* Determine the grapheme cluster boundaries in S, and store the result at + p[0..n-1]. p[i] = 1 means that a new grapheme cluster begins at s[i]. p[i] + = 0 means that s[i-1] and s[i] are part of the same grapheme cluster. p[0] + will always be 1. + */ +extern void + u8_grapheme_breaks (const uint8_t *s, size_t n, char *p); +extern void + u16_grapheme_breaks (const uint16_t *s, size_t n, char *p); +extern void + u32_grapheme_breaks (const uint32_t *s, size_t n, char *p); +extern void + ulc_grapheme_breaks (const char *s, size_t n, char *p); + +/* ========================================================================= */ + +#ifdef __cplusplus +} +#endif + + +#endif /* _UNIGBRK_H */ diff --git a/gnulib/lib/unigbrk/gbrkprop.h b/gnulib/lib/unigbrk/gbrkprop.h new file mode 100644 index 0000000..847d2e7 --- /dev/null +++ b/gnulib/lib/unigbrk/gbrkprop.h @@ -0,0 +1,842 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Grapheme break property of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */ +#define gbrkprop_header_0 16 +#define gbrkprop_header_1 15 +#define gbrkprop_header_2 7 +#define gbrkprop_header_3 511 +#define gbrkprop_header_4 127 +static const +struct + { + int level1[15]; + short level2[3 << 9]; + unsigned char level3[(78 << 7) / 2]; + } +unigbrkprop = +{ + { + 0, 512, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 1024 + }, + { + 0, 64, -1, -1, -1, -1, 128, -1, + -1, 192, -1, 256, 320, 384, 448, 512, + 576, -1, 640, 704, 768, 832, 896, 960, + 1024, 1088, 1152, 1216, 1280, 1344, 1408, 1472, + 1536, 1600, 1664, 1728, -1, -1, 1792, -1, + -1, -1, -1, -1, -1, -1, 1856, 1920, + 1984, 2048, 2112, 2176, 2240, -1, 2304, 2368, + 2432, 2496, -1, 2560, -1, -1, -1, -1, + 2624, 2688, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 2752, 2816, 2880, -1, -1, -1, -1, + 2944, 3008, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -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, 3136, -1, -1, + 3200, 3264, 3328, 3392, 3456, 3520, -1, 3584, + 3648, 3712, 3776, 3840, 3904, 3968, 4032, 3648, + 3712, 3776, 3840, 3904, 3968, 4032, 3648, 3712, + 3776, 3840, 3904, 3968, 4032, 3648, 3712, 3776, + 3840, 3904, 3968, 4032, 3648, 3712, 3776, 3840, + 3904, 3968, 4032, 3648, 3712, 3776, 3840, 3904, + 3968, 4032, 3648, 3712, 3776, 3840, 3904, 3968, + 4032, 3648, 3712, 3776, 3840, 3904, 3968, 4032, + 3648, 3712, 3776, 3840, 3904, 3968, 4032, 3648, + 3712, 3776, 3840, 3904, 3968, 4032, 3648, 3712, + 3776, 3840, 3904, 3968, 4032, 3648, 3712, 3776, + 3840, 3904, 3968, 4032, 3648, 3712, 3776, 4096, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 4160, -1, + -1, -1, -1, -1, 4224, 4288, -1, 4352, + -1, -1, -1, 4416, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 4480, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 4544, 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, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 4672, 4736, 4800, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 4864, -1, 4928, 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, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1 + }, + { + 0x33, 0x33, 0x33, 0x33, 0x33, 0x32, 0x13, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x40, 0x44, 0x44, 0x44, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, + 0x40, 0x04, 0x44, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x33, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x44, 0x44, 0x44, 0x34, 0x40, + 0x44, 0x44, 0x04, 0x40, 0x04, 0x44, 0x44, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x44, 0x44, + 0x44, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x44, 0x44, 0x40, 0x44, 0x44, + 0x44, 0x44, 0x40, 0x44, 0x40, 0x44, 0x44, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x44, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x44, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x04, 0x66, + 0x46, 0x44, 0x44, 0x44, 0x64, 0x66, 0x46, 0x66, + 0x40, 0x44, 0x44, 0x44, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x64, + 0x46, 0x44, 0x04, 0x60, 0x06, 0x60, 0x46, 0x00, + 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x66, + 0x46, 0x04, 0x00, 0x40, 0x04, 0x40, 0x44, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x44, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x66, + 0x46, 0x44, 0x44, 0x40, 0x64, 0x60, 0x46, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, + 0x46, 0x44, 0x04, 0x60, 0x06, 0x60, 0x46, 0x00, + 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, + 0x64, 0x06, 0x00, 0x66, 0x06, 0x66, 0x46, 0x00, + 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, + 0x64, 0x66, 0x06, 0x44, 0x04, 0x44, 0x44, 0x00, + 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x46, + 0x66, 0x64, 0x06, 0x64, 0x06, 0x66, 0x44, 0x00, + 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, + 0x46, 0x44, 0x04, 0x66, 0x06, 0x66, 0x46, 0x00, + 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x40, + 0x66, 0x44, 0x04, 0x04, 0x66, 0x66, 0x66, 0x46, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x46, 0x66, 0x44, 0x44, 0x44, 0x04, 0x00, 0x00, + 0x55, 0x55, 0x65, 0x40, 0x44, 0x44, 0x44, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x46, 0x66, 0x44, 0x44, 0x44, 0x40, 0x04, 0x00, + 0x55, 0x55, 0x05, 0x00, 0x44, 0x44, 0x44, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x40, 0x40, 0x00, 0x00, 0x66, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x64, + 0x44, 0x44, 0x04, 0x44, 0x00, 0x00, 0x40, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x40, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x46, 0x44, + 0x64, 0x44, 0x44, 0x44, 0x46, 0x64, 0x46, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x66, 0x44, 0x00, 0x00, 0x44, + 0x04, 0x66, 0x06, 0x60, 0x66, 0x66, 0x66, 0x00, + 0x40, 0x44, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x64, 0x46, 0x64, 0x66, 0x66, 0x46, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x46, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x44, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x44, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x44, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x33, 0x46, 0x44, 0x44, 0x44, 0x66, + 0x66, 0x66, 0x66, 0x64, 0x46, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x44, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x44, 0x64, 0x66, 0x46, 0x64, 0x66, 0x00, 0x00, + 0x66, 0x64, 0x66, 0x66, 0x46, 0x44, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x06, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x40, 0x64, 0x66, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x60, 0x64, 0x44, 0x44, 0x44, 0x04, + 0x64, 0x64, 0x46, 0x44, 0x44, 0x44, 0x64, 0x66, + 0x66, 0x46, 0x44, 0x44, 0x44, 0x44, 0x04, 0x40, + 0x44, 0x44, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x64, 0x44, 0x44, 0x64, 0x64, 0x66, + 0x66, 0x64, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x44, 0x44, + 0x44, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x44, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x44, 0x44, 0x66, 0x44, 0x06, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x64, 0x44, 0x66, 0x46, 0x46, + 0x44, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x44, 0x44, + 0x44, 0x44, 0x66, 0x44, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x44, 0x04, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x64, 0x44, 0x44, 0x44, 0x04, 0x00, 0x40, 0x00, + 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x44, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x44, 0x33, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x33, 0x33, 0x33, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x33, 0x33, 0x03, 0x00, 0x00, 0x33, 0x33, 0x33, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x44, 0x44, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x44, 0x04, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x04, 0x00, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x60, 0x46, 0x64, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x44, 0x44, 0x44, 0x44, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x40, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x07, 0x00, + 0x44, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x40, 0x66, 0x44, 0x44, 0x66, 0x64, 0x66, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x44, 0x44, 0x64, + 0x46, 0x64, 0x46, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x64, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x44, 0x54, 0x45, 0x54, 0x50, 0x05, 0x44, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x60, 0x46, 0x66, 0x64, 0x06, 0x46, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x08, 0x00, 0x90, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x44, 0x44, 0x44, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x33, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, + 0x40, 0x44, 0x40, 0x04, 0x00, 0x00, 0x44, 0x44, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x44, 0x04, 0x00, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x46, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x44, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x66, 0x46, 0x44, 0x64, 0x46, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x46, 0x44, 0x00, 0x60, 0x44, + 0x44, 0x34, 0x33, 0x33, 0x33, 0x43, 0x44, 0x44, + 0x44, 0x04, 0x40, 0x44, 0x44, 0x44, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x44, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x44, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 + } +}; diff --git a/gnulib/lib/unigbrk/u16-grapheme-breaks.c b/gnulib/lib/unigbrk/u16-grapheme-breaks.c new file mode 100644 index 0000000..b922434 --- /dev/null +++ b/gnulib/lib/unigbrk/u16-grapheme-breaks.c @@ -0,0 +1,44 @@ +/* Grapheme cluster breaks function. + Copyright (C) 2010-2011 Free Software Foundation, Inc. + Written by Ben Pfaff , 2010. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unigbrk.h" + +#include "unistr.h" + +void +u16_grapheme_breaks (const uint16_t *s, size_t n, char *p) +{ + ucs4_t prev; + int mblen; + + prev = 0; + for (; n > 0; s += mblen, p += mblen, n -= mblen) + { + ucs4_t next; + + mblen = u16_mbtouc (&next, s, n); + + p[0] = uc_is_grapheme_break (prev, next); + if (mblen > 1) + p[1] = 0; + + prev = next; + } +} diff --git a/gnulib/lib/unigbrk/u16-grapheme-next.c b/gnulib/lib/unigbrk/u16-grapheme-next.c new file mode 100644 index 0000000..c4bed19 --- /dev/null +++ b/gnulib/lib/unigbrk/u16-grapheme-next.c @@ -0,0 +1,46 @@ +/* Next grapheme cluster function. + Copyright (C) 2010-2011 Free Software Foundation, Inc. + Written by Ben Pfaff , 2010. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unigbrk.h" + +#include "unistr.h" + +const uint16_t * +u16_grapheme_next (const uint16_t *s, const uint16_t *end) +{ + ucs4_t prev; + int mblen; + + if (s == end) + return NULL; + + for (s += u16_mbtouc (&prev, s, end - s); s != end; s += mblen) + { + ucs4_t next; + + mblen = u16_mbtouc (&next, s, end - s); + if (uc_is_grapheme_break (prev, next)) + break; + + prev = next; + } + + return s; +} diff --git a/gnulib/lib/unigbrk/u16-grapheme-prev.c b/gnulib/lib/unigbrk/u16-grapheme-prev.c new file mode 100644 index 0000000..ff7a065 --- /dev/null +++ b/gnulib/lib/unigbrk/u16-grapheme-prev.c @@ -0,0 +1,54 @@ +/* Previous grapheme cluster function. + Copyright (C) 2010-2011 Free Software Foundation, Inc. + Written by Ben Pfaff , 2010. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unigbrk.h" + +#include "unistr.h" + +const uint16_t * +u16_grapheme_prev (const uint16_t *s, const uint16_t *start) +{ + ucs4_t next; + + if (s == start) + return NULL; + + s = u16_prev (&next, s, start); + while (s != start) + { + const uint16_t *prev_s; + ucs4_t prev; + + prev_s = u16_prev (&prev, s, start); + if (prev_s == NULL) + { + /* Ill-formed UTF-16 encoding. */ + return start; + } + + if (uc_is_grapheme_break (prev, next)) + break; + + s = prev_s; + next = prev; + } + + return s; +} diff --git a/gnulib/lib/unigbrk/u32-grapheme-breaks.c b/gnulib/lib/unigbrk/u32-grapheme-breaks.c new file mode 100644 index 0000000..09dc238 --- /dev/null +++ b/gnulib/lib/unigbrk/u32-grapheme-breaks.c @@ -0,0 +1,42 @@ +/* Grapheme cluster breaks function. + Copyright (C) 2010-2011 Free Software Foundation, Inc. + Written by Ben Pfaff , 2010. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unigbrk.h" + +#include "unistr.h" + +void +u32_grapheme_breaks (const uint32_t *s, size_t n, char *p) +{ + ucs4_t prev; + size_t i; + + prev = 0; + for (i = 0; i < n; i++) + { + ucs4_t next; + + u32_mbtouc (&next, &s[i], 1); + + p[i] = uc_is_grapheme_break (prev, next); + + prev = next; + } +} diff --git a/gnulib/lib/unigbrk/u32-grapheme-next.c b/gnulib/lib/unigbrk/u32-grapheme-next.c new file mode 100644 index 0000000..52dc514 --- /dev/null +++ b/gnulib/lib/unigbrk/u32-grapheme-next.c @@ -0,0 +1,46 @@ +/* Next grapheme cluster function. + Copyright (C) 2010-2011 Free Software Foundation, Inc. + Written by Ben Pfaff , 2010. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unigbrk.h" + +#include "unistr.h" + +const uint32_t * +u32_grapheme_next (const uint32_t *s, const uint32_t *end) +{ + ucs4_t prev; + + if (s == end) + return NULL; + + u32_mbtouc (&prev, s, end - s); + for (s++; s != end; s++) + { + ucs4_t next; + + u32_mbtouc (&next, s, end - s); + if (uc_is_grapheme_break (prev, next)) + break; + + prev = next; + } + + return s; +} diff --git a/gnulib/lib/unigbrk/u32-grapheme-prev.c b/gnulib/lib/unigbrk/u32-grapheme-prev.c new file mode 100644 index 0000000..fb0ea13 --- /dev/null +++ b/gnulib/lib/unigbrk/u32-grapheme-prev.c @@ -0,0 +1,51 @@ +/* Previous grapheme cluster function. + Copyright (C) 2010-2011 Free Software Foundation, Inc. + Written by Ben Pfaff , 2010. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unigbrk.h" + +#include "unistr.h" + +const uint32_t * +u32_grapheme_prev (const uint32_t *s, const uint32_t *start) +{ + ucs4_t next; + + if (s == start) + return NULL; + + u32_prev (&next, s, start); + for (s--; s != start; s--) + { + ucs4_t prev; + + if (u32_prev (&prev, s, start) == NULL) + { + /* Ill-formed UTF-32 encoding. */ + return start; + } + + if (uc_is_grapheme_break (prev, next)) + break; + + next = prev; + } + + return s; +} diff --git a/gnulib/lib/unigbrk/u8-grapheme-breaks.c b/gnulib/lib/unigbrk/u8-grapheme-breaks.c new file mode 100644 index 0000000..f145bdc --- /dev/null +++ b/gnulib/lib/unigbrk/u8-grapheme-breaks.c @@ -0,0 +1,46 @@ +/* Grapheme cluster breaks function. + Copyright (C) 2001-2003, 2006-2011 Free Software Foundation, Inc. + Written by Ben Pfaff , 2010, + based on code written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unigbrk.h" + +#include "unistr.h" + +void +u8_grapheme_breaks (const uint8_t *s, size_t n, char *p) +{ + ucs4_t prev; + int mblen; + + prev = 0; + for (; n > 0; s += mblen, p += mblen, n -= mblen) + { + ucs4_t next; + int i; + + mblen = u8_mbtouc (&next, s, n); + + p[0] = uc_is_grapheme_break (prev, next); + for (i = 1; i < mblen; i++) + p[i] = 0; + + prev = next; + } +} diff --git a/gnulib/lib/unigbrk/u8-grapheme-next.c b/gnulib/lib/unigbrk/u8-grapheme-next.c new file mode 100644 index 0000000..068f174 --- /dev/null +++ b/gnulib/lib/unigbrk/u8-grapheme-next.c @@ -0,0 +1,46 @@ +/* Next grapheme cluster function. + Copyright (C) 2010-2011 Free Software Foundation, Inc. + Written by Ben Pfaff , 2010. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unigbrk.h" + +#include "unistr.h" + +const uint8_t * +u8_grapheme_next (const uint8_t *s, const uint8_t *end) +{ + ucs4_t prev; + int mblen; + + if (s == end) + return NULL; + + for (s += u8_mbtouc (&prev, s, end - s); s != end; s += mblen) + { + ucs4_t next; + + mblen = u8_mbtouc (&next, s, end - s); + if (uc_is_grapheme_break (prev, next)) + break; + + prev = next; + } + + return s; +} diff --git a/gnulib/lib/unigbrk/u8-grapheme-prev.c b/gnulib/lib/unigbrk/u8-grapheme-prev.c new file mode 100644 index 0000000..d89e181 --- /dev/null +++ b/gnulib/lib/unigbrk/u8-grapheme-prev.c @@ -0,0 +1,54 @@ +/* Previous grapheme cluster function. + Copyright (C) 2010-2011 Free Software Foundation, Inc. + Written by Ben Pfaff , 2010. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unigbrk.h" + +#include "unistr.h" + +const uint8_t * +u8_grapheme_prev (const uint8_t *s, const uint8_t *start) +{ + ucs4_t next; + + if (s == start) + return NULL; + + s = u8_prev (&next, s, start); + while (s != start) + { + const uint8_t *prev_s; + ucs4_t prev; + + prev_s = u8_prev (&prev, s, start); + if (prev_s == NULL) + { + /* Ill-formed UTF-8 encoding. */ + return start; + } + + if (uc_is_grapheme_break (prev, next)) + break; + + s = prev_s; + next = prev; + } + + return s; +} diff --git a/gnulib/lib/unigbrk/uc-gbrk-prop.c b/gnulib/lib/unigbrk/uc-gbrk-prop.c new file mode 100644 index 0000000..c349afb --- /dev/null +++ b/gnulib/lib/unigbrk/uc-gbrk-prop.c @@ -0,0 +1,45 @@ +/* Grapheme cluster break property function. + Copyright (C) 2010-2011 Free Software Foundation, Inc. + Written by Ben Pfaff , 2010. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unigbrk.h" + +#include "gbrkprop.h" + +int +uc_graphemeclusterbreak_property (ucs4_t uc) +{ + unsigned int index1 = uc >> gbrkprop_header_0; + if (index1 < gbrkprop_header_1) + { + int lookup1 = unigbrkprop.level1[index1]; + if (lookup1 >= 0) + { + unsigned int index2 = (uc >> gbrkprop_header_2) & gbrkprop_header_3; + int lookup2 = unigbrkprop.level2[lookup1 + index2]; + if (lookup2 >= 0) + { + unsigned int index3 = uc & gbrkprop_header_4; + unsigned char lookup3 = unigbrkprop.level3[lookup2 + index3 / 2]; + return (lookup3 >> ((uc & 1) << 2)) & 0x0f; + } + } + } + return GBP_OTHER; +} diff --git a/gnulib/lib/unigbrk/uc-is-grapheme-break.c b/gnulib/lib/unigbrk/uc-is-grapheme-break.c new file mode 100644 index 0000000..c67a5da --- /dev/null +++ b/gnulib/lib/unigbrk/uc-is-grapheme-break.c @@ -0,0 +1,106 @@ +/* Grapheme cluster break function. + Copyright (C) 2010-2011 Free Software Foundation, Inc. + Written by Ben Pfaff , 2010. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unigbrk.h" + +/* Evaluates to true if there is an extended grapheme cluster break between + code points with GBP_* values A and B, false if there is not. The comments + are the grapheme cluster boundary rules from in UAX #29. */ +#define UC_IS_GRAPHEME_BREAK(A, B) \ + (/* GB1 and GB2 are covered--just use a GBP_CONTROL character, such \ + as 0, for sot and eot. */ \ + \ + /* GB3 */ \ + (A) == GBP_CR && (B) == GBP_LF ? false : \ + \ + /* GB4 */ \ + (A) == GBP_CONTROL || (A) == GBP_CR || (A) == GBP_LF ? true : \ + \ + /* GB5 */ \ + (B) == GBP_CONTROL || (B) == GBP_CR || (B) == GBP_LF ? true : \ + \ + /* GB6 */ \ + (A) == GBP_L && ((B) == GBP_L || (B) == GBP_V \ + || (B) == GBP_LV || (B) == GBP_LVT) ? false : \ + \ + /* GB7 */ \ + ((A) == GBP_LV || (A) == GBP_V) \ + && ((B) == GBP_V || (B) == GBP_T) ? false : \ + \ + /* GB8 */ \ + ((A) == GBP_LVT || (A) == GBP_T) && (B) == GBP_T ? false : \ + \ + /* GB9 */ \ + (B) == GBP_EXTEND ? false : \ + \ + /* GB9a */ \ + (B) == GBP_SPACINGMARK ? false : \ + \ + /* GB9b */ \ + (A) == GBP_PREPEND ? false \ + \ + /* GB10 */ \ + : true) + +#define UC_GRAPHEME_BREAKS_FOR(A) \ + ( (UC_IS_GRAPHEME_BREAK(A, GBP_OTHER) << GBP_OTHER) \ + | (UC_IS_GRAPHEME_BREAK(A, GBP_CR) << GBP_CR) \ + | (UC_IS_GRAPHEME_BREAK(A, GBP_LF) << GBP_LF) \ + | (UC_IS_GRAPHEME_BREAK(A, GBP_CONTROL) << GBP_CONTROL) \ + | (UC_IS_GRAPHEME_BREAK(A, GBP_EXTEND) << GBP_EXTEND) \ + | (UC_IS_GRAPHEME_BREAK(A, GBP_PREPEND) << GBP_PREPEND) \ + | (UC_IS_GRAPHEME_BREAK(A, GBP_SPACINGMARK) << GBP_SPACINGMARK) \ + | (UC_IS_GRAPHEME_BREAK(A, GBP_L) << GBP_L) \ + | (UC_IS_GRAPHEME_BREAK(A, GBP_V) << GBP_V) \ + | (UC_IS_GRAPHEME_BREAK(A, GBP_T) << GBP_T) \ + | (UC_IS_GRAPHEME_BREAK(A, GBP_LV) << GBP_LV) \ + | (UC_IS_GRAPHEME_BREAK(A, GBP_LVT) << GBP_LVT)) + +static const unsigned short int gb_table[12] = + { + UC_GRAPHEME_BREAKS_FOR(0), /* GBP_OTHER */ + UC_GRAPHEME_BREAKS_FOR(1), /* GBP_CR */ + UC_GRAPHEME_BREAKS_FOR(2), /* GBP_LF */ + UC_GRAPHEME_BREAKS_FOR(3), /* GBP_CONTROL */ + UC_GRAPHEME_BREAKS_FOR(4), /* GBP_EXTEND */ + UC_GRAPHEME_BREAKS_FOR(5), /* GBP_PREPEND */ + UC_GRAPHEME_BREAKS_FOR(6), /* GBP_SPACINGMARK */ + UC_GRAPHEME_BREAKS_FOR(7), /* GBP_L */ + UC_GRAPHEME_BREAKS_FOR(8), /* GBP_V */ + UC_GRAPHEME_BREAKS_FOR(9), /* GBP_T */ + UC_GRAPHEME_BREAKS_FOR(10), /* GBP_LV */ + UC_GRAPHEME_BREAKS_FOR(11), /* GBP_LVT */ + }; + +bool +uc_is_grapheme_break (ucs4_t a, ucs4_t b) +{ + int a_gcp, b_gcp; + + if ((a | b) < 0x300) + { + /* GB3 is the only relevant rule for this case. */ + return a != '\r' || b != '\n'; + } + + a_gcp = uc_graphemeclusterbreak_property (a); + b_gcp = uc_graphemeclusterbreak_property (b); + return (gb_table[a_gcp] >> b_gcp) & 1; +} diff --git a/gnulib/lib/unigbrk/ulc-grapheme-breaks.c b/gnulib/lib/unigbrk/ulc-grapheme-breaks.c new file mode 100644 index 0000000..68dde87 --- /dev/null +++ b/gnulib/lib/unigbrk/ulc-grapheme-breaks.c @@ -0,0 +1,130 @@ +/* Grapheme cluster breaks function. + Copyright (C) 2001-2003, 2006-2011 Free Software Foundation, Inc. + Written by Ben Pfaff , 2010, + based on code written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unigbrk.h" + +#include +#include + +#include "c-ctype.h" +#include "c-strcaseeq.h" +#include "localcharset.h" +#include "uniconv.h" + +static 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 +/* Assume that every ASCII character starts a new grapheme, which is often + true, except that CR-LF is a single grapheme. */ +static void +ascii_grapheme_breaks (const char *s, size_t n, char *p) +{ + size_t i; + + p[0] = 1; + for (i = 1; i < n; i++) + { + bool is_ascii = c_isprint (s[i]) || c_isspace (s[i]); + p[i] = is_ascii && (s[i] != '\n' || s[i - 1] != '\r'); + } +} +#endif + +/* Grapheme boundaries in 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_grapheme_breaks (const char *s, size_t n, char *p) +{ + if (n > 0) + { + const char *encoding = locale_charset (); + + if (is_utf8_encoding (encoding)) + u8_grapheme_breaks ((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 grapheme breaks of the UTF-8 string. */ + u8_grapheme_breaks (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 + /* Fall back to ASCII as best we can. */ + ascii_grapheme_breaks (s, n, p); +#else + /* We cannot make any assumptions. */ + p[0] = 1; + memset (p + 1, 0, n - 1); +#endif + } + } +} diff --git a/gnulib/lib/unilbrk.in.h b/gnulib/lib/unilbrk.in.h new file mode 100644 index 0000000..0a14866 --- /dev/null +++ b/gnulib/lib/unilbrk.in.h @@ -0,0 +1,110 @@ +/* Line breaking of Unicode strings. + Copyright (C) 2001-2003, 2005-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#ifndef _UNILBRK_H +#define _UNILBRK_H + +/* Get size_t. */ +#include + +#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 0000000..aacd2d7 --- /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 6.0.0. */ + +/* Copyright (C) 2000-2002, 2004, 2008 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#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[166 << 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 0000000..6c1baff --- /dev/null +++ b/gnulib/lib/unilbrk/lbrkprop2.h @@ -0,0 +1,2942 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Line breaking properties of Unicode characters. */ +/* Generated automatically by gen-lbrk for Unicode 6.0.0. */ + +/* Copyright (C) 2000-2002, 2004, 2008 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +const lbrkprop_t unilbrkprop = +{ + { + 0, 512, 1024, 1024, -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, + 1664, -1, 1792, 1920, 2048, 2176, 2304, 2432, + 2560, 2688, 2816, 2944, 3072, 3200, 3328, 3456, + 3584, 3712, 3840, 3968, 4096, 4224, 4352, 4480, + 4608, 256, 256, 256, 256, 4736, 4864, 4992, + 5120, 5248, 5376, 5504, 5632, 5760, 5888, 6016, + 6144, 6272, 256, 6400, 256, 256, 6528, 6656, + 6784, 6912, 7040, 7168, 7296, 7424, 7552, 7680, + 7808, 7936, 8064, 8192, 8320, 8448, 8576, 8704, + 256, 256, 256, 8832, 256, 256, 8960, -1, + 9088, 9216, 9344, 9472, 9600, 9728, 9856, 9984, + 10112, 10240, 10368, 10496, 10624, 10752, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 10880, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 11008, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 11136, 256, 256, 11264, 11392, 256, 11520, + 11648, 11776, 11904, 12032, 12160, 12288, 12416, 12544, + 12672, 12800, 12928, 13056, 13184, 13312, 13440, 12672, + 12800, 12928, 13056, 13184, 13312, 13440, 12672, 12800, + 12928, 13056, 13184, 13312, 13440, 12672, 12800, 12928, + 13056, 13184, 13312, 13440, 12672, 12800, 12928, 13056, + 13184, 13312, 13440, 12672, 12800, 12928, 13056, 13184, + 13312, 13440, 12672, 12800, 12928, 13056, 13184, 13312, + 13440, 12672, 12800, 12928, 13056, 13184, 13312, 13440, + 12672, 12800, 12928, 13056, 13184, 13312, 13440, 12672, + 12800, 12928, 13056, 13184, 13312, 13440, 12672, 12800, + 12928, 13056, 13184, 13312, 13440, 12672, 12800, 12928, + 13056, 13184, 13312, 13440, 12672, 12800, 12928, 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, 9856, 9856, 9856, 9856, 13696, 13824, + 256, 256, 13952, 14080, 14208, 14336, 14464, 14592, + 14720, 14848, 14976, 15104, -1, 15232, 15360, 15488, + 256, 15616, -1, -1, -1, -1, -1, -1, + 15744, -1, 15872, -1, 16000, -1, 16128, -1, + 16256, -1, -1, -1, 16384, -1, -1, -1, + 16512, 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, + 256, 256, 256, 256, 256, 256, 16768, -1, + 16896, -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, 17024, 17152, 17280, 256, + 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, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -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, 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, + 17664, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -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, 17792, 17920, 18048, 18176, -1, 18304, -1, + 18432, 18560, 18688, 256, 256, 18816, 256, 18944, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 19072, 19200, 19328, 19456, 19584, -1, 19712, 19840, + 19968, 20096, 20224, 20352, 20480, 20608, 7680, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, + 9856, 9856, 9856, 9856, 9856, 9856, 9856, 20736, + 20864, -1, 20992, 21120, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -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_CP, 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_CP, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_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_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_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_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_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_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_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_AL, 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_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_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_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, + LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_CM, LBP_CM, LBP_CM, + LBP_AL, 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_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_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_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_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_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_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_CM, LBP_CM, + LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_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_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_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_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_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_PO, LBP_PO, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_PO, LBP_AL, LBP_PR, 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_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_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_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_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_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_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_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_AL, 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_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, + LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, + LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, + LBP_CM, LBP_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_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_GL, LBP_GL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_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_SA, LBP_SA, LBP_SA, LBP_SA, 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_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, 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_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, + 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_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_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_CM, LBP_CM, 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_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_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_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_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_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_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_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_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_SA, LBP_SA, 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_SA, 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_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, + LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, + LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, + LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, + LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, + LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, + LBP_SA, LBP_SA, LBP_SA, LBP_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_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, + LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, + LBP_SA, LBP_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_CM, + 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_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_SA, LBP_SA, LBP_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_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_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_AL, 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_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_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_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_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_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_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_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_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_AL, 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_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_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, + LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, + LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, + LBP_CM, LBP_CM, LBP_CM, LBP_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_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_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_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, 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_PO, 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_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, + LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, + LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_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_AL, LBP_AL, LBP_AL, 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_AI, 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_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_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_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_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_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_AI, + LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_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_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_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_AI, + LBP_AL, LBP_AL, LBP_AL, LBP_QU, LBP_QU, LBP_QU, LBP_QU, LBP_AL, + LBP_AL, 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_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_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_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_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_AI, LBP_AI, LBP_AI, + LBP_AI, LBP_AI, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_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_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_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_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_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_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_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_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_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, + LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_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_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_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_ID, LBP_ID, LBP_ID, LBP_ID, + LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, + LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, + LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, + LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, + LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, + LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, + LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, + LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, + LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, + LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, + LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, + LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, + LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, + LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, + LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, + LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, + LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, + LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, + LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, + LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, + LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, + LBP_ID, LBP_ID, LBP_ID, LBP_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_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_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_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_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_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_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_AL, LBP_AL, LBP_AL, LBP_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_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_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_AL, LBP_BA, 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_AL, LBP_AL, LBP_AL, LBP_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_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_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_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_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_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_PO, 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_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_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_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_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_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_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_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_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_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_BA, + LBP_BA, LBP_BA, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, 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_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_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_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_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, + LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, + LBP_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_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, + LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, + LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, + LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, + LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, + LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, + LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_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_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_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_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_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_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_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_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_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_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, + LBP_CM, LBP_CM, LBP_CM, LBP_BA, 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_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_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_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_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_AL, LBP_AL, LBP_AL, LBP_AL, LBP_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_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_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_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_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_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_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_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_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_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_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_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_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_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_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_CM, LBP_CM, LBP_CM, LBP_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_BA, 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_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_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_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_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_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_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_OP, LBP_OP, LBP_OP, LBP_CL, LBP_CL, 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_CL, 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_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_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_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_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_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_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_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_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_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_AL, LBP_AL, LBP_AL, LBP_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_AL, LBP_AL, LBP_AL, LBP_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_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_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_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_AL, 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_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_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_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_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_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, + LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, + LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, + LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_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_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + 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_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_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_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_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_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_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_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_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_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_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_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_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_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_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_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_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_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, + LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_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_AL, LBP_AL, LBP_AL, LBP_AL, LBP_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_AL, LBP_XX, + LBP_AL, LBP_XX, 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_XX, LBP_XX, + 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_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_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_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, + LBP_AL, LBP_AL, LBP_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_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, + LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, + LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, + LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, + LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, + LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, + LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, + LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, + LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, + LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, + LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, + LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, + LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, + LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, + LBP_ID, LBP_ID, LBP_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_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 0000000..054da45 --- /dev/null +++ b/gnulib/lib/unilbrk/lbrktables.c @@ -0,0 +1,64 @@ +/* Line breaking auxiliary tables. + Copyright (C) 2001-2003, 2006-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unilbrk/lbrktables.h" + +/* Define unilbrkprop, table of line breaking properties. */ +#include "unilbrk/lbrkprop2.h" + +const unsigned char unilbrk_table[25][25] = +{ + /* after */ + /* WJ GL B2 BA BB HY CL CP 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, 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, 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, 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, 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, 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, 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, P, D, P, D, I, P, D, I, I, P, D, D, D, D, D, D, D, }, +/* CP */ { P, I, D, I, D, I, P, P, P, D, P, D, I, P, I, I, I, P, I, D, D, D, D, D, D, }, +/* EX */ { P, I, D, I, D, I, P, 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, 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, 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, P, }, +/* QU */ { P, I, I, I, I, I, P, 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, 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, P, I, I, I, I, P, I, I, I, P, I, D, D, D, D, D, D, }, +/* PO */ { P, I, D, I, D, I, P, 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, 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, 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, P, I, I, I, I, P, I, D, D, P, I, D, D, D, D, D, D, }, +/* H2 */ { P, I, D, I, D, I, P, 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, 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, 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, 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, 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, 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 + "

Some sentence.

" */ +/* 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 0000000..4f69de7 --- /dev/null +++ b/gnulib/lib/unilbrk/lbrktables.h @@ -0,0 +1,95 @@ +/* Line breaking auxiliary tables. + Copyright (C) 2001-2003, 2006-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include "unitypes.h" + +/* Line breaking classification. */ + +enum +{ + /* Values >= 25 are resolved at run time. */ + LBP_BK = 25, /* 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 = 26, /* 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 = 27, /* zero width space */ + LBP_GL = 1, /* non-breaking (glue) */ + LBP_SP = 28, /* 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 = 29, /* contingent break opportunity */ + LBP_CL = 6, /* closing punctuation */ + LBP_CP = 7, /* closing parenthesis */ + LBP_EX = 8, /* exclamation/interrogation */ + LBP_IN = 9, /* inseparable */ + LBP_NS = 10, /* non starter */ + LBP_OP = 11, /* opening punctuation */ + LBP_QU = 12, /* ambiguous quotation */ + LBP_IS = 13, /* infix separator (numeric) */ + LBP_NU = 14, /* numeric */ + LBP_PO = 15, /* postfix (numeric) */ + LBP_PR = 16, /* prefix (numeric) */ + LBP_SY = 17, /* symbols allowing breaks */ + LBP_AI = 30, /* ambiguous (alphabetic or ideograph) */ + LBP_AL = 18, /* ordinary alphabetic and symbol characters */ + LBP_H2 = 19, /* Hangul LV syllable */ + LBP_H3 = 20, /* Hangul LVT syllable */ + LBP_ID = 21, /* ideographic */ + LBP_JL = 22, /* Hangul L Jamo */ + LBP_JV = 23, /* Hangul V Jamo */ + LBP_JT = 24, /* Hangul T Jamo */ + LBP_SA = 31, /* complex context (South East Asian) */ + LBP_XX = 32 /* 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[25][25]; + +/* 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 0000000..39fe3a3 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unilbrk.h" + +#include +#include + +#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 0000000..a669e87 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..93c5f7b --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unilbrk.h" + +#include + +#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 0000000..61ec21d --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..f094d6f --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unilbrk.h" + +#include +#include + +#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 +#include + +/* 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 0000000..a9d7030 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 +#include +#include + +/* 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 0000000..7279385 --- /dev/null +++ b/gnulib/lib/unilbrk/ulc-common.c @@ -0,0 +1,51 @@ +/* Line breaking auxiliary functions. + Copyright (C) 2001-2003, 2006-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..61b97fe --- /dev/null +++ b/gnulib/lib/unilbrk/ulc-common.h @@ -0,0 +1,31 @@ +/* Line breaking auxiliary functions. + Copyright (C) 2001-2003, 2006-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +/* Get size_t. */ +#include + +#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 0000000..1632010 --- /dev/null +++ b/gnulib/lib/unilbrk/ulc-possible-linebreaks.c @@ -0,0 +1,212 @@ +/* Line breaking of strings. + Copyright (C) 2001-2003, 2006-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unilbrk.h" + +#include +#include + +#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 +#include +#include + +/* 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 0000000..1625dfc --- /dev/null +++ b/gnulib/lib/unilbrk/ulc-width-linebreaks.c @@ -0,0 +1,231 @@ +/* Line breaking of strings. + Copyright (C) 2001-2003, 2006-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unilbrk.h" + +#include +#include + +#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 +#include + +/* 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.in.h b/gnulib/lib/uniname.in.h new file mode 100644 index 0000000..4a202e8 --- /dev/null +++ b/gnulib/lib/uniname.in.h @@ -0,0 +1,45 @@ +/* Association between Unicode characters and their names. + Copyright (C) 2000-2002, 2005, 2007, 2009-2011 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 . */ + +#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 0000000..d08e93f --- /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 0000000..6998b81 --- /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-2011 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 . */ + +#include + +/* Specification. */ +#include "uniname.h" + +#include +#include +#include +#include +#include + +#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 0000000..7b6db1f --- /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.in.h b/gnulib/lib/uninorm.in.h new file mode 100644 index 0000000..a40cc33 --- /dev/null +++ b/gnulib/lib/uninorm.in.h @@ -0,0 +1,245 @@ +/* Normalization forms (composition and decomposition) of Unicode strings. + Copyright (C) 2001-2002, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#ifndef _UNINORM_H +#define _UNINORM_H + +/* Get size_t. */ +#include + +#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, /* A font variant (e.g. a blackletter form). */ + UC_DECOMP_NOBREAK, /* A no-break version of a space or hyphen. */ + UC_DECOMP_INITIAL, /* An initial presentation form (Arabic). */ + UC_DECOMP_MEDIAL, /* A medial presentation form (Arabic). */ + UC_DECOMP_FINAL, /* A final presentation form (Arabic). */ + UC_DECOMP_ISOLATED,/* An isolated presentation form (Arabic). */ + UC_DECOMP_CIRCLE, /* An encircled form. */ + UC_DECOMP_SUPER, /* A superscript form. */ + UC_DECOMP_SUB, /* A subscript form. */ + UC_DECOMP_VERTICAL,/* A vertical layout presentation form. */ + UC_DECOMP_WIDE, /* A wide (or zenkaku) compatibility character. */ + UC_DECOMP_NARROW, /* A narrow (or hankaku) compatibility character. */ + UC_DECOMP_SMALL, /* A small variant form (CNS compatibility). */ + UC_DECOMP_SQUARE, /* A CJK squared font variant. */ + UC_DECOMP_FRACTION,/* A vulgar fraction form. */ + UC_DECOMP_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 0000000..944a187 --- /dev/null +++ b/gnulib/lib/uninorm/canonical-decomposition.c @@ -0,0 +1,108 @@ +/* Canonical decomposition of Unicode characters. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "uninorm.h" + +#include + +#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 + , 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 0000000..e84d3ef --- /dev/null +++ b/gnulib/lib/uninorm/compat-decomposition.c @@ -0,0 +1,31 @@ +/* Compatibility decomposition of Unicode characters. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..fde9b91 --- /dev/null +++ b/gnulib/lib/uninorm/composition-table.gperf @@ -0,0 +1,961 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Canonical composition of Unicode characters. */ +/* Generated automatically by gen-uni-tables for Unicode 6.0.0. */ + +/* Copyright (C) 2009 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +struct composition_rule { char codes[6]; }; +%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\x00\x41\x00\x03\x00", 0x00c0 +"\x00\x00\x41\x00\x03\x01", 0x00c1 +"\x00\x00\x41\x00\x03\x02", 0x00c2 +"\x00\x00\x41\x00\x03\x03", 0x00c3 +"\x00\x00\x41\x00\x03\x08", 0x00c4 +"\x00\x00\x41\x00\x03\x0a", 0x00c5 +"\x00\x00\x43\x00\x03\x27", 0x00c7 +"\x00\x00\x45\x00\x03\x00", 0x00c8 +"\x00\x00\x45\x00\x03\x01", 0x00c9 +"\x00\x00\x45\x00\x03\x02", 0x00ca +"\x00\x00\x45\x00\x03\x08", 0x00cb +"\x00\x00\x49\x00\x03\x00", 0x00cc +"\x00\x00\x49\x00\x03\x01", 0x00cd +"\x00\x00\x49\x00\x03\x02", 0x00ce +"\x00\x00\x49\x00\x03\x08", 0x00cf +"\x00\x00\x4e\x00\x03\x03", 0x00d1 +"\x00\x00\x4f\x00\x03\x00", 0x00d2 +"\x00\x00\x4f\x00\x03\x01", 0x00d3 +"\x00\x00\x4f\x00\x03\x02", 0x00d4 +"\x00\x00\x4f\x00\x03\x03", 0x00d5 +"\x00\x00\x4f\x00\x03\x08", 0x00d6 +"\x00\x00\x55\x00\x03\x00", 0x00d9 +"\x00\x00\x55\x00\x03\x01", 0x00da +"\x00\x00\x55\x00\x03\x02", 0x00db +"\x00\x00\x55\x00\x03\x08", 0x00dc +"\x00\x00\x59\x00\x03\x01", 0x00dd +"\x00\x00\x61\x00\x03\x00", 0x00e0 +"\x00\x00\x61\x00\x03\x01", 0x00e1 +"\x00\x00\x61\x00\x03\x02", 0x00e2 +"\x00\x00\x61\x00\x03\x03", 0x00e3 +"\x00\x00\x61\x00\x03\x08", 0x00e4 +"\x00\x00\x61\x00\x03\x0a", 0x00e5 +"\x00\x00\x63\x00\x03\x27", 0x00e7 +"\x00\x00\x65\x00\x03\x00", 0x00e8 +"\x00\x00\x65\x00\x03\x01", 0x00e9 +"\x00\x00\x65\x00\x03\x02", 0x00ea +"\x00\x00\x65\x00\x03\x08", 0x00eb +"\x00\x00\x69\x00\x03\x00", 0x00ec +"\x00\x00\x69\x00\x03\x01", 0x00ed +"\x00\x00\x69\x00\x03\x02", 0x00ee +"\x00\x00\x69\x00\x03\x08", 0x00ef +"\x00\x00\x6e\x00\x03\x03", 0x00f1 +"\x00\x00\x6f\x00\x03\x00", 0x00f2 +"\x00\x00\x6f\x00\x03\x01", 0x00f3 +"\x00\x00\x6f\x00\x03\x02", 0x00f4 +"\x00\x00\x6f\x00\x03\x03", 0x00f5 +"\x00\x00\x6f\x00\x03\x08", 0x00f6 +"\x00\x00\x75\x00\x03\x00", 0x00f9 +"\x00\x00\x75\x00\x03\x01", 0x00fa +"\x00\x00\x75\x00\x03\x02", 0x00fb +"\x00\x00\x75\x00\x03\x08", 0x00fc +"\x00\x00\x79\x00\x03\x01", 0x00fd +"\x00\x00\x79\x00\x03\x08", 0x00ff +"\x00\x00\x41\x00\x03\x04", 0x0100 +"\x00\x00\x61\x00\x03\x04", 0x0101 +"\x00\x00\x41\x00\x03\x06", 0x0102 +"\x00\x00\x61\x00\x03\x06", 0x0103 +"\x00\x00\x41\x00\x03\x28", 0x0104 +"\x00\x00\x61\x00\x03\x28", 0x0105 +"\x00\x00\x43\x00\x03\x01", 0x0106 +"\x00\x00\x63\x00\x03\x01", 0x0107 +"\x00\x00\x43\x00\x03\x02", 0x0108 +"\x00\x00\x63\x00\x03\x02", 0x0109 +"\x00\x00\x43\x00\x03\x07", 0x010a +"\x00\x00\x63\x00\x03\x07", 0x010b +"\x00\x00\x43\x00\x03\x0c", 0x010c +"\x00\x00\x63\x00\x03\x0c", 0x010d +"\x00\x00\x44\x00\x03\x0c", 0x010e +"\x00\x00\x64\x00\x03\x0c", 0x010f +"\x00\x00\x45\x00\x03\x04", 0x0112 +"\x00\x00\x65\x00\x03\x04", 0x0113 +"\x00\x00\x45\x00\x03\x06", 0x0114 +"\x00\x00\x65\x00\x03\x06", 0x0115 +"\x00\x00\x45\x00\x03\x07", 0x0116 +"\x00\x00\x65\x00\x03\x07", 0x0117 +"\x00\x00\x45\x00\x03\x28", 0x0118 +"\x00\x00\x65\x00\x03\x28", 0x0119 +"\x00\x00\x45\x00\x03\x0c", 0x011a +"\x00\x00\x65\x00\x03\x0c", 0x011b +"\x00\x00\x47\x00\x03\x02", 0x011c +"\x00\x00\x67\x00\x03\x02", 0x011d +"\x00\x00\x47\x00\x03\x06", 0x011e +"\x00\x00\x67\x00\x03\x06", 0x011f +"\x00\x00\x47\x00\x03\x07", 0x0120 +"\x00\x00\x67\x00\x03\x07", 0x0121 +"\x00\x00\x47\x00\x03\x27", 0x0122 +"\x00\x00\x67\x00\x03\x27", 0x0123 +"\x00\x00\x48\x00\x03\x02", 0x0124 +"\x00\x00\x68\x00\x03\x02", 0x0125 +"\x00\x00\x49\x00\x03\x03", 0x0128 +"\x00\x00\x69\x00\x03\x03", 0x0129 +"\x00\x00\x49\x00\x03\x04", 0x012a +"\x00\x00\x69\x00\x03\x04", 0x012b +"\x00\x00\x49\x00\x03\x06", 0x012c +"\x00\x00\x69\x00\x03\x06", 0x012d +"\x00\x00\x49\x00\x03\x28", 0x012e +"\x00\x00\x69\x00\x03\x28", 0x012f +"\x00\x00\x49\x00\x03\x07", 0x0130 +"\x00\x00\x4a\x00\x03\x02", 0x0134 +"\x00\x00\x6a\x00\x03\x02", 0x0135 +"\x00\x00\x4b\x00\x03\x27", 0x0136 +"\x00\x00\x6b\x00\x03\x27", 0x0137 +"\x00\x00\x4c\x00\x03\x01", 0x0139 +"\x00\x00\x6c\x00\x03\x01", 0x013a +"\x00\x00\x4c\x00\x03\x27", 0x013b +"\x00\x00\x6c\x00\x03\x27", 0x013c +"\x00\x00\x4c\x00\x03\x0c", 0x013d +"\x00\x00\x6c\x00\x03\x0c", 0x013e +"\x00\x00\x4e\x00\x03\x01", 0x0143 +"\x00\x00\x6e\x00\x03\x01", 0x0144 +"\x00\x00\x4e\x00\x03\x27", 0x0145 +"\x00\x00\x6e\x00\x03\x27", 0x0146 +"\x00\x00\x4e\x00\x03\x0c", 0x0147 +"\x00\x00\x6e\x00\x03\x0c", 0x0148 +"\x00\x00\x4f\x00\x03\x04", 0x014c +"\x00\x00\x6f\x00\x03\x04", 0x014d +"\x00\x00\x4f\x00\x03\x06", 0x014e +"\x00\x00\x6f\x00\x03\x06", 0x014f +"\x00\x00\x4f\x00\x03\x0b", 0x0150 +"\x00\x00\x6f\x00\x03\x0b", 0x0151 +"\x00\x00\x52\x00\x03\x01", 0x0154 +"\x00\x00\x72\x00\x03\x01", 0x0155 +"\x00\x00\x52\x00\x03\x27", 0x0156 +"\x00\x00\x72\x00\x03\x27", 0x0157 +"\x00\x00\x52\x00\x03\x0c", 0x0158 +"\x00\x00\x72\x00\x03\x0c", 0x0159 +"\x00\x00\x53\x00\x03\x01", 0x015a +"\x00\x00\x73\x00\x03\x01", 0x015b +"\x00\x00\x53\x00\x03\x02", 0x015c +"\x00\x00\x73\x00\x03\x02", 0x015d +"\x00\x00\x53\x00\x03\x27", 0x015e +"\x00\x00\x73\x00\x03\x27", 0x015f +"\x00\x00\x53\x00\x03\x0c", 0x0160 +"\x00\x00\x73\x00\x03\x0c", 0x0161 +"\x00\x00\x54\x00\x03\x27", 0x0162 +"\x00\x00\x74\x00\x03\x27", 0x0163 +"\x00\x00\x54\x00\x03\x0c", 0x0164 +"\x00\x00\x74\x00\x03\x0c", 0x0165 +"\x00\x00\x55\x00\x03\x03", 0x0168 +"\x00\x00\x75\x00\x03\x03", 0x0169 +"\x00\x00\x55\x00\x03\x04", 0x016a +"\x00\x00\x75\x00\x03\x04", 0x016b +"\x00\x00\x55\x00\x03\x06", 0x016c +"\x00\x00\x75\x00\x03\x06", 0x016d +"\x00\x00\x55\x00\x03\x0a", 0x016e +"\x00\x00\x75\x00\x03\x0a", 0x016f +"\x00\x00\x55\x00\x03\x0b", 0x0170 +"\x00\x00\x75\x00\x03\x0b", 0x0171 +"\x00\x00\x55\x00\x03\x28", 0x0172 +"\x00\x00\x75\x00\x03\x28", 0x0173 +"\x00\x00\x57\x00\x03\x02", 0x0174 +"\x00\x00\x77\x00\x03\x02", 0x0175 +"\x00\x00\x59\x00\x03\x02", 0x0176 +"\x00\x00\x79\x00\x03\x02", 0x0177 +"\x00\x00\x59\x00\x03\x08", 0x0178 +"\x00\x00\x5a\x00\x03\x01", 0x0179 +"\x00\x00\x7a\x00\x03\x01", 0x017a +"\x00\x00\x5a\x00\x03\x07", 0x017b +"\x00\x00\x7a\x00\x03\x07", 0x017c +"\x00\x00\x5a\x00\x03\x0c", 0x017d +"\x00\x00\x7a\x00\x03\x0c", 0x017e +"\x00\x00\x4f\x00\x03\x1b", 0x01a0 +"\x00\x00\x6f\x00\x03\x1b", 0x01a1 +"\x00\x00\x55\x00\x03\x1b", 0x01af +"\x00\x00\x75\x00\x03\x1b", 0x01b0 +"\x00\x00\x41\x00\x03\x0c", 0x01cd +"\x00\x00\x61\x00\x03\x0c", 0x01ce +"\x00\x00\x49\x00\x03\x0c", 0x01cf +"\x00\x00\x69\x00\x03\x0c", 0x01d0 +"\x00\x00\x4f\x00\x03\x0c", 0x01d1 +"\x00\x00\x6f\x00\x03\x0c", 0x01d2 +"\x00\x00\x55\x00\x03\x0c", 0x01d3 +"\x00\x00\x75\x00\x03\x0c", 0x01d4 +"\x00\x00\xdc\x00\x03\x04", 0x01d5 +"\x00\x00\xfc\x00\x03\x04", 0x01d6 +"\x00\x00\xdc\x00\x03\x01", 0x01d7 +"\x00\x00\xfc\x00\x03\x01", 0x01d8 +"\x00\x00\xdc\x00\x03\x0c", 0x01d9 +"\x00\x00\xfc\x00\x03\x0c", 0x01da +"\x00\x00\xdc\x00\x03\x00", 0x01db +"\x00\x00\xfc\x00\x03\x00", 0x01dc +"\x00\x00\xc4\x00\x03\x04", 0x01de +"\x00\x00\xe4\x00\x03\x04", 0x01df +"\x00\x02\x26\x00\x03\x04", 0x01e0 +"\x00\x02\x27\x00\x03\x04", 0x01e1 +"\x00\x00\xc6\x00\x03\x04", 0x01e2 +"\x00\x00\xe6\x00\x03\x04", 0x01e3 +"\x00\x00\x47\x00\x03\x0c", 0x01e6 +"\x00\x00\x67\x00\x03\x0c", 0x01e7 +"\x00\x00\x4b\x00\x03\x0c", 0x01e8 +"\x00\x00\x6b\x00\x03\x0c", 0x01e9 +"\x00\x00\x4f\x00\x03\x28", 0x01ea +"\x00\x00\x6f\x00\x03\x28", 0x01eb +"\x00\x01\xea\x00\x03\x04", 0x01ec +"\x00\x01\xeb\x00\x03\x04", 0x01ed +"\x00\x01\xb7\x00\x03\x0c", 0x01ee +"\x00\x02\x92\x00\x03\x0c", 0x01ef +"\x00\x00\x6a\x00\x03\x0c", 0x01f0 +"\x00\x00\x47\x00\x03\x01", 0x01f4 +"\x00\x00\x67\x00\x03\x01", 0x01f5 +"\x00\x00\x4e\x00\x03\x00", 0x01f8 +"\x00\x00\x6e\x00\x03\x00", 0x01f9 +"\x00\x00\xc5\x00\x03\x01", 0x01fa +"\x00\x00\xe5\x00\x03\x01", 0x01fb +"\x00\x00\xc6\x00\x03\x01", 0x01fc +"\x00\x00\xe6\x00\x03\x01", 0x01fd +"\x00\x00\xd8\x00\x03\x01", 0x01fe +"\x00\x00\xf8\x00\x03\x01", 0x01ff +"\x00\x00\x41\x00\x03\x0f", 0x0200 +"\x00\x00\x61\x00\x03\x0f", 0x0201 +"\x00\x00\x41\x00\x03\x11", 0x0202 +"\x00\x00\x61\x00\x03\x11", 0x0203 +"\x00\x00\x45\x00\x03\x0f", 0x0204 +"\x00\x00\x65\x00\x03\x0f", 0x0205 +"\x00\x00\x45\x00\x03\x11", 0x0206 +"\x00\x00\x65\x00\x03\x11", 0x0207 +"\x00\x00\x49\x00\x03\x0f", 0x0208 +"\x00\x00\x69\x00\x03\x0f", 0x0209 +"\x00\x00\x49\x00\x03\x11", 0x020a +"\x00\x00\x69\x00\x03\x11", 0x020b +"\x00\x00\x4f\x00\x03\x0f", 0x020c +"\x00\x00\x6f\x00\x03\x0f", 0x020d +"\x00\x00\x4f\x00\x03\x11", 0x020e +"\x00\x00\x6f\x00\x03\x11", 0x020f +"\x00\x00\x52\x00\x03\x0f", 0x0210 +"\x00\x00\x72\x00\x03\x0f", 0x0211 +"\x00\x00\x52\x00\x03\x11", 0x0212 +"\x00\x00\x72\x00\x03\x11", 0x0213 +"\x00\x00\x55\x00\x03\x0f", 0x0214 +"\x00\x00\x75\x00\x03\x0f", 0x0215 +"\x00\x00\x55\x00\x03\x11", 0x0216 +"\x00\x00\x75\x00\x03\x11", 0x0217 +"\x00\x00\x53\x00\x03\x26", 0x0218 +"\x00\x00\x73\x00\x03\x26", 0x0219 +"\x00\x00\x54\x00\x03\x26", 0x021a +"\x00\x00\x74\x00\x03\x26", 0x021b +"\x00\x00\x48\x00\x03\x0c", 0x021e +"\x00\x00\x68\x00\x03\x0c", 0x021f +"\x00\x00\x41\x00\x03\x07", 0x0226 +"\x00\x00\x61\x00\x03\x07", 0x0227 +"\x00\x00\x45\x00\x03\x27", 0x0228 +"\x00\x00\x65\x00\x03\x27", 0x0229 +"\x00\x00\xd6\x00\x03\x04", 0x022a +"\x00\x00\xf6\x00\x03\x04", 0x022b +"\x00\x00\xd5\x00\x03\x04", 0x022c +"\x00\x00\xf5\x00\x03\x04", 0x022d +"\x00\x00\x4f\x00\x03\x07", 0x022e +"\x00\x00\x6f\x00\x03\x07", 0x022f +"\x00\x02\x2e\x00\x03\x04", 0x0230 +"\x00\x02\x2f\x00\x03\x04", 0x0231 +"\x00\x00\x59\x00\x03\x04", 0x0232 +"\x00\x00\x79\x00\x03\x04", 0x0233 +"\x00\x00\xa8\x00\x03\x01", 0x0385 +"\x00\x03\x91\x00\x03\x01", 0x0386 +"\x00\x03\x95\x00\x03\x01", 0x0388 +"\x00\x03\x97\x00\x03\x01", 0x0389 +"\x00\x03\x99\x00\x03\x01", 0x038a +"\x00\x03\x9f\x00\x03\x01", 0x038c +"\x00\x03\xa5\x00\x03\x01", 0x038e +"\x00\x03\xa9\x00\x03\x01", 0x038f +"\x00\x03\xca\x00\x03\x01", 0x0390 +"\x00\x03\x99\x00\x03\x08", 0x03aa +"\x00\x03\xa5\x00\x03\x08", 0x03ab +"\x00\x03\xb1\x00\x03\x01", 0x03ac +"\x00\x03\xb5\x00\x03\x01", 0x03ad +"\x00\x03\xb7\x00\x03\x01", 0x03ae +"\x00\x03\xb9\x00\x03\x01", 0x03af +"\x00\x03\xcb\x00\x03\x01", 0x03b0 +"\x00\x03\xb9\x00\x03\x08", 0x03ca +"\x00\x03\xc5\x00\x03\x08", 0x03cb +"\x00\x03\xbf\x00\x03\x01", 0x03cc +"\x00\x03\xc5\x00\x03\x01", 0x03cd +"\x00\x03\xc9\x00\x03\x01", 0x03ce +"\x00\x03\xd2\x00\x03\x01", 0x03d3 +"\x00\x03\xd2\x00\x03\x08", 0x03d4 +"\x00\x04\x15\x00\x03\x00", 0x0400 +"\x00\x04\x15\x00\x03\x08", 0x0401 +"\x00\x04\x13\x00\x03\x01", 0x0403 +"\x00\x04\x06\x00\x03\x08", 0x0407 +"\x00\x04\x1a\x00\x03\x01", 0x040c +"\x00\x04\x18\x00\x03\x00", 0x040d +"\x00\x04\x23\x00\x03\x06", 0x040e +"\x00\x04\x18\x00\x03\x06", 0x0419 +"\x00\x04\x38\x00\x03\x06", 0x0439 +"\x00\x04\x35\x00\x03\x00", 0x0450 +"\x00\x04\x35\x00\x03\x08", 0x0451 +"\x00\x04\x33\x00\x03\x01", 0x0453 +"\x00\x04\x56\x00\x03\x08", 0x0457 +"\x00\x04\x3a\x00\x03\x01", 0x045c +"\x00\x04\x38\x00\x03\x00", 0x045d +"\x00\x04\x43\x00\x03\x06", 0x045e +"\x00\x04\x74\x00\x03\x0f", 0x0476 +"\x00\x04\x75\x00\x03\x0f", 0x0477 +"\x00\x04\x16\x00\x03\x06", 0x04c1 +"\x00\x04\x36\x00\x03\x06", 0x04c2 +"\x00\x04\x10\x00\x03\x06", 0x04d0 +"\x00\x04\x30\x00\x03\x06", 0x04d1 +"\x00\x04\x10\x00\x03\x08", 0x04d2 +"\x00\x04\x30\x00\x03\x08", 0x04d3 +"\x00\x04\x15\x00\x03\x06", 0x04d6 +"\x00\x04\x35\x00\x03\x06", 0x04d7 +"\x00\x04\xd8\x00\x03\x08", 0x04da +"\x00\x04\xd9\x00\x03\x08", 0x04db +"\x00\x04\x16\x00\x03\x08", 0x04dc +"\x00\x04\x36\x00\x03\x08", 0x04dd +"\x00\x04\x17\x00\x03\x08", 0x04de +"\x00\x04\x37\x00\x03\x08", 0x04df +"\x00\x04\x18\x00\x03\x04", 0x04e2 +"\x00\x04\x38\x00\x03\x04", 0x04e3 +"\x00\x04\x18\x00\x03\x08", 0x04e4 +"\x00\x04\x38\x00\x03\x08", 0x04e5 +"\x00\x04\x1e\x00\x03\x08", 0x04e6 +"\x00\x04\x3e\x00\x03\x08", 0x04e7 +"\x00\x04\xe8\x00\x03\x08", 0x04ea +"\x00\x04\xe9\x00\x03\x08", 0x04eb +"\x00\x04\x2d\x00\x03\x08", 0x04ec +"\x00\x04\x4d\x00\x03\x08", 0x04ed +"\x00\x04\x23\x00\x03\x04", 0x04ee +"\x00\x04\x43\x00\x03\x04", 0x04ef +"\x00\x04\x23\x00\x03\x08", 0x04f0 +"\x00\x04\x43\x00\x03\x08", 0x04f1 +"\x00\x04\x23\x00\x03\x0b", 0x04f2 +"\x00\x04\x43\x00\x03\x0b", 0x04f3 +"\x00\x04\x27\x00\x03\x08", 0x04f4 +"\x00\x04\x47\x00\x03\x08", 0x04f5 +"\x00\x04\x2b\x00\x03\x08", 0x04f8 +"\x00\x04\x4b\x00\x03\x08", 0x04f9 +"\x00\x06\x27\x00\x06\x53", 0x0622 +"\x00\x06\x27\x00\x06\x54", 0x0623 +"\x00\x06\x48\x00\x06\x54", 0x0624 +"\x00\x06\x27\x00\x06\x55", 0x0625 +"\x00\x06\x4a\x00\x06\x54", 0x0626 +"\x00\x06\xd5\x00\x06\x54", 0x06c0 +"\x00\x06\xc1\x00\x06\x54", 0x06c2 +"\x00\x06\xd2\x00\x06\x54", 0x06d3 +"\x00\x09\x28\x00\x09\x3c", 0x0929 +"\x00\x09\x30\x00\x09\x3c", 0x0931 +"\x00\x09\x33\x00\x09\x3c", 0x0934 +"\x00\x09\xc7\x00\x09\xbe", 0x09cb +"\x00\x09\xc7\x00\x09\xd7", 0x09cc +"\x00\x0b\x47\x00\x0b\x56", 0x0b48 +"\x00\x0b\x47\x00\x0b\x3e", 0x0b4b +"\x00\x0b\x47\x00\x0b\x57", 0x0b4c +"\x00\x0b\x92\x00\x0b\xd7", 0x0b94 +"\x00\x0b\xc6\x00\x0b\xbe", 0x0bca +"\x00\x0b\xc7\x00\x0b\xbe", 0x0bcb +"\x00\x0b\xc6\x00\x0b\xd7", 0x0bcc +"\x00\x0c\x46\x00\x0c\x56", 0x0c48 +"\x00\x0c\xbf\x00\x0c\xd5", 0x0cc0 +"\x00\x0c\xc6\x00\x0c\xd5", 0x0cc7 +"\x00\x0c\xc6\x00\x0c\xd6", 0x0cc8 +"\x00\x0c\xc6\x00\x0c\xc2", 0x0cca +"\x00\x0c\xca\x00\x0c\xd5", 0x0ccb +"\x00\x0d\x46\x00\x0d\x3e", 0x0d4a +"\x00\x0d\x47\x00\x0d\x3e", 0x0d4b +"\x00\x0d\x46\x00\x0d\x57", 0x0d4c +"\x00\x0d\xd9\x00\x0d\xca", 0x0dda +"\x00\x0d\xd9\x00\x0d\xcf", 0x0ddc +"\x00\x0d\xdc\x00\x0d\xca", 0x0ddd +"\x00\x0d\xd9\x00\x0d\xdf", 0x0dde +"\x00\x10\x25\x00\x10\x2e", 0x1026 +"\x00\x1b\x05\x00\x1b\x35", 0x1b06 +"\x00\x1b\x07\x00\x1b\x35", 0x1b08 +"\x00\x1b\x09\x00\x1b\x35", 0x1b0a +"\x00\x1b\x0b\x00\x1b\x35", 0x1b0c +"\x00\x1b\x0d\x00\x1b\x35", 0x1b0e +"\x00\x1b\x11\x00\x1b\x35", 0x1b12 +"\x00\x1b\x3a\x00\x1b\x35", 0x1b3b +"\x00\x1b\x3c\x00\x1b\x35", 0x1b3d +"\x00\x1b\x3e\x00\x1b\x35", 0x1b40 +"\x00\x1b\x3f\x00\x1b\x35", 0x1b41 +"\x00\x1b\x42\x00\x1b\x35", 0x1b43 +"\x00\x00\x41\x00\x03\x25", 0x1e00 +"\x00\x00\x61\x00\x03\x25", 0x1e01 +"\x00\x00\x42\x00\x03\x07", 0x1e02 +"\x00\x00\x62\x00\x03\x07", 0x1e03 +"\x00\x00\x42\x00\x03\x23", 0x1e04 +"\x00\x00\x62\x00\x03\x23", 0x1e05 +"\x00\x00\x42\x00\x03\x31", 0x1e06 +"\x00\x00\x62\x00\x03\x31", 0x1e07 +"\x00\x00\xc7\x00\x03\x01", 0x1e08 +"\x00\x00\xe7\x00\x03\x01", 0x1e09 +"\x00\x00\x44\x00\x03\x07", 0x1e0a +"\x00\x00\x64\x00\x03\x07", 0x1e0b +"\x00\x00\x44\x00\x03\x23", 0x1e0c +"\x00\x00\x64\x00\x03\x23", 0x1e0d +"\x00\x00\x44\x00\x03\x31", 0x1e0e +"\x00\x00\x64\x00\x03\x31", 0x1e0f +"\x00\x00\x44\x00\x03\x27", 0x1e10 +"\x00\x00\x64\x00\x03\x27", 0x1e11 +"\x00\x00\x44\x00\x03\x2d", 0x1e12 +"\x00\x00\x64\x00\x03\x2d", 0x1e13 +"\x00\x01\x12\x00\x03\x00", 0x1e14 +"\x00\x01\x13\x00\x03\x00", 0x1e15 +"\x00\x01\x12\x00\x03\x01", 0x1e16 +"\x00\x01\x13\x00\x03\x01", 0x1e17 +"\x00\x00\x45\x00\x03\x2d", 0x1e18 +"\x00\x00\x65\x00\x03\x2d", 0x1e19 +"\x00\x00\x45\x00\x03\x30", 0x1e1a +"\x00\x00\x65\x00\x03\x30", 0x1e1b +"\x00\x02\x28\x00\x03\x06", 0x1e1c +"\x00\x02\x29\x00\x03\x06", 0x1e1d +"\x00\x00\x46\x00\x03\x07", 0x1e1e +"\x00\x00\x66\x00\x03\x07", 0x1e1f +"\x00\x00\x47\x00\x03\x04", 0x1e20 +"\x00\x00\x67\x00\x03\x04", 0x1e21 +"\x00\x00\x48\x00\x03\x07", 0x1e22 +"\x00\x00\x68\x00\x03\x07", 0x1e23 +"\x00\x00\x48\x00\x03\x23", 0x1e24 +"\x00\x00\x68\x00\x03\x23", 0x1e25 +"\x00\x00\x48\x00\x03\x08", 0x1e26 +"\x00\x00\x68\x00\x03\x08", 0x1e27 +"\x00\x00\x48\x00\x03\x27", 0x1e28 +"\x00\x00\x68\x00\x03\x27", 0x1e29 +"\x00\x00\x48\x00\x03\x2e", 0x1e2a +"\x00\x00\x68\x00\x03\x2e", 0x1e2b +"\x00\x00\x49\x00\x03\x30", 0x1e2c +"\x00\x00\x69\x00\x03\x30", 0x1e2d +"\x00\x00\xcf\x00\x03\x01", 0x1e2e +"\x00\x00\xef\x00\x03\x01", 0x1e2f +"\x00\x00\x4b\x00\x03\x01", 0x1e30 +"\x00\x00\x6b\x00\x03\x01", 0x1e31 +"\x00\x00\x4b\x00\x03\x23", 0x1e32 +"\x00\x00\x6b\x00\x03\x23", 0x1e33 +"\x00\x00\x4b\x00\x03\x31", 0x1e34 +"\x00\x00\x6b\x00\x03\x31", 0x1e35 +"\x00\x00\x4c\x00\x03\x23", 0x1e36 +"\x00\x00\x6c\x00\x03\x23", 0x1e37 +"\x00\x1e\x36\x00\x03\x04", 0x1e38 +"\x00\x1e\x37\x00\x03\x04", 0x1e39 +"\x00\x00\x4c\x00\x03\x31", 0x1e3a +"\x00\x00\x6c\x00\x03\x31", 0x1e3b +"\x00\x00\x4c\x00\x03\x2d", 0x1e3c +"\x00\x00\x6c\x00\x03\x2d", 0x1e3d +"\x00\x00\x4d\x00\x03\x01", 0x1e3e +"\x00\x00\x6d\x00\x03\x01", 0x1e3f +"\x00\x00\x4d\x00\x03\x07", 0x1e40 +"\x00\x00\x6d\x00\x03\x07", 0x1e41 +"\x00\x00\x4d\x00\x03\x23", 0x1e42 +"\x00\x00\x6d\x00\x03\x23", 0x1e43 +"\x00\x00\x4e\x00\x03\x07", 0x1e44 +"\x00\x00\x6e\x00\x03\x07", 0x1e45 +"\x00\x00\x4e\x00\x03\x23", 0x1e46 +"\x00\x00\x6e\x00\x03\x23", 0x1e47 +"\x00\x00\x4e\x00\x03\x31", 0x1e48 +"\x00\x00\x6e\x00\x03\x31", 0x1e49 +"\x00\x00\x4e\x00\x03\x2d", 0x1e4a +"\x00\x00\x6e\x00\x03\x2d", 0x1e4b +"\x00\x00\xd5\x00\x03\x01", 0x1e4c +"\x00\x00\xf5\x00\x03\x01", 0x1e4d +"\x00\x00\xd5\x00\x03\x08", 0x1e4e +"\x00\x00\xf5\x00\x03\x08", 0x1e4f +"\x00\x01\x4c\x00\x03\x00", 0x1e50 +"\x00\x01\x4d\x00\x03\x00", 0x1e51 +"\x00\x01\x4c\x00\x03\x01", 0x1e52 +"\x00\x01\x4d\x00\x03\x01", 0x1e53 +"\x00\x00\x50\x00\x03\x01", 0x1e54 +"\x00\x00\x70\x00\x03\x01", 0x1e55 +"\x00\x00\x50\x00\x03\x07", 0x1e56 +"\x00\x00\x70\x00\x03\x07", 0x1e57 +"\x00\x00\x52\x00\x03\x07", 0x1e58 +"\x00\x00\x72\x00\x03\x07", 0x1e59 +"\x00\x00\x52\x00\x03\x23", 0x1e5a +"\x00\x00\x72\x00\x03\x23", 0x1e5b +"\x00\x1e\x5a\x00\x03\x04", 0x1e5c +"\x00\x1e\x5b\x00\x03\x04", 0x1e5d +"\x00\x00\x52\x00\x03\x31", 0x1e5e +"\x00\x00\x72\x00\x03\x31", 0x1e5f +"\x00\x00\x53\x00\x03\x07", 0x1e60 +"\x00\x00\x73\x00\x03\x07", 0x1e61 +"\x00\x00\x53\x00\x03\x23", 0x1e62 +"\x00\x00\x73\x00\x03\x23", 0x1e63 +"\x00\x01\x5a\x00\x03\x07", 0x1e64 +"\x00\x01\x5b\x00\x03\x07", 0x1e65 +"\x00\x01\x60\x00\x03\x07", 0x1e66 +"\x00\x01\x61\x00\x03\x07", 0x1e67 +"\x00\x1e\x62\x00\x03\x07", 0x1e68 +"\x00\x1e\x63\x00\x03\x07", 0x1e69 +"\x00\x00\x54\x00\x03\x07", 0x1e6a +"\x00\x00\x74\x00\x03\x07", 0x1e6b +"\x00\x00\x54\x00\x03\x23", 0x1e6c +"\x00\x00\x74\x00\x03\x23", 0x1e6d +"\x00\x00\x54\x00\x03\x31", 0x1e6e +"\x00\x00\x74\x00\x03\x31", 0x1e6f +"\x00\x00\x54\x00\x03\x2d", 0x1e70 +"\x00\x00\x74\x00\x03\x2d", 0x1e71 +"\x00\x00\x55\x00\x03\x24", 0x1e72 +"\x00\x00\x75\x00\x03\x24", 0x1e73 +"\x00\x00\x55\x00\x03\x30", 0x1e74 +"\x00\x00\x75\x00\x03\x30", 0x1e75 +"\x00\x00\x55\x00\x03\x2d", 0x1e76 +"\x00\x00\x75\x00\x03\x2d", 0x1e77 +"\x00\x01\x68\x00\x03\x01", 0x1e78 +"\x00\x01\x69\x00\x03\x01", 0x1e79 +"\x00\x01\x6a\x00\x03\x08", 0x1e7a +"\x00\x01\x6b\x00\x03\x08", 0x1e7b +"\x00\x00\x56\x00\x03\x03", 0x1e7c +"\x00\x00\x76\x00\x03\x03", 0x1e7d +"\x00\x00\x56\x00\x03\x23", 0x1e7e +"\x00\x00\x76\x00\x03\x23", 0x1e7f +"\x00\x00\x57\x00\x03\x00", 0x1e80 +"\x00\x00\x77\x00\x03\x00", 0x1e81 +"\x00\x00\x57\x00\x03\x01", 0x1e82 +"\x00\x00\x77\x00\x03\x01", 0x1e83 +"\x00\x00\x57\x00\x03\x08", 0x1e84 +"\x00\x00\x77\x00\x03\x08", 0x1e85 +"\x00\x00\x57\x00\x03\x07", 0x1e86 +"\x00\x00\x77\x00\x03\x07", 0x1e87 +"\x00\x00\x57\x00\x03\x23", 0x1e88 +"\x00\x00\x77\x00\x03\x23", 0x1e89 +"\x00\x00\x58\x00\x03\x07", 0x1e8a +"\x00\x00\x78\x00\x03\x07", 0x1e8b +"\x00\x00\x58\x00\x03\x08", 0x1e8c +"\x00\x00\x78\x00\x03\x08", 0x1e8d +"\x00\x00\x59\x00\x03\x07", 0x1e8e +"\x00\x00\x79\x00\x03\x07", 0x1e8f +"\x00\x00\x5a\x00\x03\x02", 0x1e90 +"\x00\x00\x7a\x00\x03\x02", 0x1e91 +"\x00\x00\x5a\x00\x03\x23", 0x1e92 +"\x00\x00\x7a\x00\x03\x23", 0x1e93 +"\x00\x00\x5a\x00\x03\x31", 0x1e94 +"\x00\x00\x7a\x00\x03\x31", 0x1e95 +"\x00\x00\x68\x00\x03\x31", 0x1e96 +"\x00\x00\x74\x00\x03\x08", 0x1e97 +"\x00\x00\x77\x00\x03\x0a", 0x1e98 +"\x00\x00\x79\x00\x03\x0a", 0x1e99 +"\x00\x01\x7f\x00\x03\x07", 0x1e9b +"\x00\x00\x41\x00\x03\x23", 0x1ea0 +"\x00\x00\x61\x00\x03\x23", 0x1ea1 +"\x00\x00\x41\x00\x03\x09", 0x1ea2 +"\x00\x00\x61\x00\x03\x09", 0x1ea3 +"\x00\x00\xc2\x00\x03\x01", 0x1ea4 +"\x00\x00\xe2\x00\x03\x01", 0x1ea5 +"\x00\x00\xc2\x00\x03\x00", 0x1ea6 +"\x00\x00\xe2\x00\x03\x00", 0x1ea7 +"\x00\x00\xc2\x00\x03\x09", 0x1ea8 +"\x00\x00\xe2\x00\x03\x09", 0x1ea9 +"\x00\x00\xc2\x00\x03\x03", 0x1eaa +"\x00\x00\xe2\x00\x03\x03", 0x1eab +"\x00\x1e\xa0\x00\x03\x02", 0x1eac +"\x00\x1e\xa1\x00\x03\x02", 0x1ead +"\x00\x01\x02\x00\x03\x01", 0x1eae +"\x00\x01\x03\x00\x03\x01", 0x1eaf +"\x00\x01\x02\x00\x03\x00", 0x1eb0 +"\x00\x01\x03\x00\x03\x00", 0x1eb1 +"\x00\x01\x02\x00\x03\x09", 0x1eb2 +"\x00\x01\x03\x00\x03\x09", 0x1eb3 +"\x00\x01\x02\x00\x03\x03", 0x1eb4 +"\x00\x01\x03\x00\x03\x03", 0x1eb5 +"\x00\x1e\xa0\x00\x03\x06", 0x1eb6 +"\x00\x1e\xa1\x00\x03\x06", 0x1eb7 +"\x00\x00\x45\x00\x03\x23", 0x1eb8 +"\x00\x00\x65\x00\x03\x23", 0x1eb9 +"\x00\x00\x45\x00\x03\x09", 0x1eba +"\x00\x00\x65\x00\x03\x09", 0x1ebb +"\x00\x00\x45\x00\x03\x03", 0x1ebc +"\x00\x00\x65\x00\x03\x03", 0x1ebd +"\x00\x00\xca\x00\x03\x01", 0x1ebe +"\x00\x00\xea\x00\x03\x01", 0x1ebf +"\x00\x00\xca\x00\x03\x00", 0x1ec0 +"\x00\x00\xea\x00\x03\x00", 0x1ec1 +"\x00\x00\xca\x00\x03\x09", 0x1ec2 +"\x00\x00\xea\x00\x03\x09", 0x1ec3 +"\x00\x00\xca\x00\x03\x03", 0x1ec4 +"\x00\x00\xea\x00\x03\x03", 0x1ec5 +"\x00\x1e\xb8\x00\x03\x02", 0x1ec6 +"\x00\x1e\xb9\x00\x03\x02", 0x1ec7 +"\x00\x00\x49\x00\x03\x09", 0x1ec8 +"\x00\x00\x69\x00\x03\x09", 0x1ec9 +"\x00\x00\x49\x00\x03\x23", 0x1eca +"\x00\x00\x69\x00\x03\x23", 0x1ecb +"\x00\x00\x4f\x00\x03\x23", 0x1ecc +"\x00\x00\x6f\x00\x03\x23", 0x1ecd +"\x00\x00\x4f\x00\x03\x09", 0x1ece +"\x00\x00\x6f\x00\x03\x09", 0x1ecf +"\x00\x00\xd4\x00\x03\x01", 0x1ed0 +"\x00\x00\xf4\x00\x03\x01", 0x1ed1 +"\x00\x00\xd4\x00\x03\x00", 0x1ed2 +"\x00\x00\xf4\x00\x03\x00", 0x1ed3 +"\x00\x00\xd4\x00\x03\x09", 0x1ed4 +"\x00\x00\xf4\x00\x03\x09", 0x1ed5 +"\x00\x00\xd4\x00\x03\x03", 0x1ed6 +"\x00\x00\xf4\x00\x03\x03", 0x1ed7 +"\x00\x1e\xcc\x00\x03\x02", 0x1ed8 +"\x00\x1e\xcd\x00\x03\x02", 0x1ed9 +"\x00\x01\xa0\x00\x03\x01", 0x1eda +"\x00\x01\xa1\x00\x03\x01", 0x1edb +"\x00\x01\xa0\x00\x03\x00", 0x1edc +"\x00\x01\xa1\x00\x03\x00", 0x1edd +"\x00\x01\xa0\x00\x03\x09", 0x1ede +"\x00\x01\xa1\x00\x03\x09", 0x1edf +"\x00\x01\xa0\x00\x03\x03", 0x1ee0 +"\x00\x01\xa1\x00\x03\x03", 0x1ee1 +"\x00\x01\xa0\x00\x03\x23", 0x1ee2 +"\x00\x01\xa1\x00\x03\x23", 0x1ee3 +"\x00\x00\x55\x00\x03\x23", 0x1ee4 +"\x00\x00\x75\x00\x03\x23", 0x1ee5 +"\x00\x00\x55\x00\x03\x09", 0x1ee6 +"\x00\x00\x75\x00\x03\x09", 0x1ee7 +"\x00\x01\xaf\x00\x03\x01", 0x1ee8 +"\x00\x01\xb0\x00\x03\x01", 0x1ee9 +"\x00\x01\xaf\x00\x03\x00", 0x1eea +"\x00\x01\xb0\x00\x03\x00", 0x1eeb +"\x00\x01\xaf\x00\x03\x09", 0x1eec +"\x00\x01\xb0\x00\x03\x09", 0x1eed +"\x00\x01\xaf\x00\x03\x03", 0x1eee +"\x00\x01\xb0\x00\x03\x03", 0x1eef +"\x00\x01\xaf\x00\x03\x23", 0x1ef0 +"\x00\x01\xb0\x00\x03\x23", 0x1ef1 +"\x00\x00\x59\x00\x03\x00", 0x1ef2 +"\x00\x00\x79\x00\x03\x00", 0x1ef3 +"\x00\x00\x59\x00\x03\x23", 0x1ef4 +"\x00\x00\x79\x00\x03\x23", 0x1ef5 +"\x00\x00\x59\x00\x03\x09", 0x1ef6 +"\x00\x00\x79\x00\x03\x09", 0x1ef7 +"\x00\x00\x59\x00\x03\x03", 0x1ef8 +"\x00\x00\x79\x00\x03\x03", 0x1ef9 +"\x00\x03\xb1\x00\x03\x13", 0x1f00 +"\x00\x03\xb1\x00\x03\x14", 0x1f01 +"\x00\x1f\x00\x00\x03\x00", 0x1f02 +"\x00\x1f\x01\x00\x03\x00", 0x1f03 +"\x00\x1f\x00\x00\x03\x01", 0x1f04 +"\x00\x1f\x01\x00\x03\x01", 0x1f05 +"\x00\x1f\x00\x00\x03\x42", 0x1f06 +"\x00\x1f\x01\x00\x03\x42", 0x1f07 +"\x00\x03\x91\x00\x03\x13", 0x1f08 +"\x00\x03\x91\x00\x03\x14", 0x1f09 +"\x00\x1f\x08\x00\x03\x00", 0x1f0a +"\x00\x1f\x09\x00\x03\x00", 0x1f0b +"\x00\x1f\x08\x00\x03\x01", 0x1f0c +"\x00\x1f\x09\x00\x03\x01", 0x1f0d +"\x00\x1f\x08\x00\x03\x42", 0x1f0e +"\x00\x1f\x09\x00\x03\x42", 0x1f0f +"\x00\x03\xb5\x00\x03\x13", 0x1f10 +"\x00\x03\xb5\x00\x03\x14", 0x1f11 +"\x00\x1f\x10\x00\x03\x00", 0x1f12 +"\x00\x1f\x11\x00\x03\x00", 0x1f13 +"\x00\x1f\x10\x00\x03\x01", 0x1f14 +"\x00\x1f\x11\x00\x03\x01", 0x1f15 +"\x00\x03\x95\x00\x03\x13", 0x1f18 +"\x00\x03\x95\x00\x03\x14", 0x1f19 +"\x00\x1f\x18\x00\x03\x00", 0x1f1a +"\x00\x1f\x19\x00\x03\x00", 0x1f1b +"\x00\x1f\x18\x00\x03\x01", 0x1f1c +"\x00\x1f\x19\x00\x03\x01", 0x1f1d +"\x00\x03\xb7\x00\x03\x13", 0x1f20 +"\x00\x03\xb7\x00\x03\x14", 0x1f21 +"\x00\x1f\x20\x00\x03\x00", 0x1f22 +"\x00\x1f\x21\x00\x03\x00", 0x1f23 +"\x00\x1f\x20\x00\x03\x01", 0x1f24 +"\x00\x1f\x21\x00\x03\x01", 0x1f25 +"\x00\x1f\x20\x00\x03\x42", 0x1f26 +"\x00\x1f\x21\x00\x03\x42", 0x1f27 +"\x00\x03\x97\x00\x03\x13", 0x1f28 +"\x00\x03\x97\x00\x03\x14", 0x1f29 +"\x00\x1f\x28\x00\x03\x00", 0x1f2a +"\x00\x1f\x29\x00\x03\x00", 0x1f2b +"\x00\x1f\x28\x00\x03\x01", 0x1f2c +"\x00\x1f\x29\x00\x03\x01", 0x1f2d +"\x00\x1f\x28\x00\x03\x42", 0x1f2e +"\x00\x1f\x29\x00\x03\x42", 0x1f2f +"\x00\x03\xb9\x00\x03\x13", 0x1f30 +"\x00\x03\xb9\x00\x03\x14", 0x1f31 +"\x00\x1f\x30\x00\x03\x00", 0x1f32 +"\x00\x1f\x31\x00\x03\x00", 0x1f33 +"\x00\x1f\x30\x00\x03\x01", 0x1f34 +"\x00\x1f\x31\x00\x03\x01", 0x1f35 +"\x00\x1f\x30\x00\x03\x42", 0x1f36 +"\x00\x1f\x31\x00\x03\x42", 0x1f37 +"\x00\x03\x99\x00\x03\x13", 0x1f38 +"\x00\x03\x99\x00\x03\x14", 0x1f39 +"\x00\x1f\x38\x00\x03\x00", 0x1f3a +"\x00\x1f\x39\x00\x03\x00", 0x1f3b +"\x00\x1f\x38\x00\x03\x01", 0x1f3c +"\x00\x1f\x39\x00\x03\x01", 0x1f3d +"\x00\x1f\x38\x00\x03\x42", 0x1f3e +"\x00\x1f\x39\x00\x03\x42", 0x1f3f +"\x00\x03\xbf\x00\x03\x13", 0x1f40 +"\x00\x03\xbf\x00\x03\x14", 0x1f41 +"\x00\x1f\x40\x00\x03\x00", 0x1f42 +"\x00\x1f\x41\x00\x03\x00", 0x1f43 +"\x00\x1f\x40\x00\x03\x01", 0x1f44 +"\x00\x1f\x41\x00\x03\x01", 0x1f45 +"\x00\x03\x9f\x00\x03\x13", 0x1f48 +"\x00\x03\x9f\x00\x03\x14", 0x1f49 +"\x00\x1f\x48\x00\x03\x00", 0x1f4a +"\x00\x1f\x49\x00\x03\x00", 0x1f4b +"\x00\x1f\x48\x00\x03\x01", 0x1f4c +"\x00\x1f\x49\x00\x03\x01", 0x1f4d +"\x00\x03\xc5\x00\x03\x13", 0x1f50 +"\x00\x03\xc5\x00\x03\x14", 0x1f51 +"\x00\x1f\x50\x00\x03\x00", 0x1f52 +"\x00\x1f\x51\x00\x03\x00", 0x1f53 +"\x00\x1f\x50\x00\x03\x01", 0x1f54 +"\x00\x1f\x51\x00\x03\x01", 0x1f55 +"\x00\x1f\x50\x00\x03\x42", 0x1f56 +"\x00\x1f\x51\x00\x03\x42", 0x1f57 +"\x00\x03\xa5\x00\x03\x14", 0x1f59 +"\x00\x1f\x59\x00\x03\x00", 0x1f5b +"\x00\x1f\x59\x00\x03\x01", 0x1f5d +"\x00\x1f\x59\x00\x03\x42", 0x1f5f +"\x00\x03\xc9\x00\x03\x13", 0x1f60 +"\x00\x03\xc9\x00\x03\x14", 0x1f61 +"\x00\x1f\x60\x00\x03\x00", 0x1f62 +"\x00\x1f\x61\x00\x03\x00", 0x1f63 +"\x00\x1f\x60\x00\x03\x01", 0x1f64 +"\x00\x1f\x61\x00\x03\x01", 0x1f65 +"\x00\x1f\x60\x00\x03\x42", 0x1f66 +"\x00\x1f\x61\x00\x03\x42", 0x1f67 +"\x00\x03\xa9\x00\x03\x13", 0x1f68 +"\x00\x03\xa9\x00\x03\x14", 0x1f69 +"\x00\x1f\x68\x00\x03\x00", 0x1f6a +"\x00\x1f\x69\x00\x03\x00", 0x1f6b +"\x00\x1f\x68\x00\x03\x01", 0x1f6c +"\x00\x1f\x69\x00\x03\x01", 0x1f6d +"\x00\x1f\x68\x00\x03\x42", 0x1f6e +"\x00\x1f\x69\x00\x03\x42", 0x1f6f +"\x00\x03\xb1\x00\x03\x00", 0x1f70 +"\x00\x03\xb5\x00\x03\x00", 0x1f72 +"\x00\x03\xb7\x00\x03\x00", 0x1f74 +"\x00\x03\xb9\x00\x03\x00", 0x1f76 +"\x00\x03\xbf\x00\x03\x00", 0x1f78 +"\x00\x03\xc5\x00\x03\x00", 0x1f7a +"\x00\x03\xc9\x00\x03\x00", 0x1f7c +"\x00\x1f\x00\x00\x03\x45", 0x1f80 +"\x00\x1f\x01\x00\x03\x45", 0x1f81 +"\x00\x1f\x02\x00\x03\x45", 0x1f82 +"\x00\x1f\x03\x00\x03\x45", 0x1f83 +"\x00\x1f\x04\x00\x03\x45", 0x1f84 +"\x00\x1f\x05\x00\x03\x45", 0x1f85 +"\x00\x1f\x06\x00\x03\x45", 0x1f86 +"\x00\x1f\x07\x00\x03\x45", 0x1f87 +"\x00\x1f\x08\x00\x03\x45", 0x1f88 +"\x00\x1f\x09\x00\x03\x45", 0x1f89 +"\x00\x1f\x0a\x00\x03\x45", 0x1f8a +"\x00\x1f\x0b\x00\x03\x45", 0x1f8b +"\x00\x1f\x0c\x00\x03\x45", 0x1f8c +"\x00\x1f\x0d\x00\x03\x45", 0x1f8d +"\x00\x1f\x0e\x00\x03\x45", 0x1f8e +"\x00\x1f\x0f\x00\x03\x45", 0x1f8f +"\x00\x1f\x20\x00\x03\x45", 0x1f90 +"\x00\x1f\x21\x00\x03\x45", 0x1f91 +"\x00\x1f\x22\x00\x03\x45", 0x1f92 +"\x00\x1f\x23\x00\x03\x45", 0x1f93 +"\x00\x1f\x24\x00\x03\x45", 0x1f94 +"\x00\x1f\x25\x00\x03\x45", 0x1f95 +"\x00\x1f\x26\x00\x03\x45", 0x1f96 +"\x00\x1f\x27\x00\x03\x45", 0x1f97 +"\x00\x1f\x28\x00\x03\x45", 0x1f98 +"\x00\x1f\x29\x00\x03\x45", 0x1f99 +"\x00\x1f\x2a\x00\x03\x45", 0x1f9a +"\x00\x1f\x2b\x00\x03\x45", 0x1f9b +"\x00\x1f\x2c\x00\x03\x45", 0x1f9c +"\x00\x1f\x2d\x00\x03\x45", 0x1f9d +"\x00\x1f\x2e\x00\x03\x45", 0x1f9e +"\x00\x1f\x2f\x00\x03\x45", 0x1f9f +"\x00\x1f\x60\x00\x03\x45", 0x1fa0 +"\x00\x1f\x61\x00\x03\x45", 0x1fa1 +"\x00\x1f\x62\x00\x03\x45", 0x1fa2 +"\x00\x1f\x63\x00\x03\x45", 0x1fa3 +"\x00\x1f\x64\x00\x03\x45", 0x1fa4 +"\x00\x1f\x65\x00\x03\x45", 0x1fa5 +"\x00\x1f\x66\x00\x03\x45", 0x1fa6 +"\x00\x1f\x67\x00\x03\x45", 0x1fa7 +"\x00\x1f\x68\x00\x03\x45", 0x1fa8 +"\x00\x1f\x69\x00\x03\x45", 0x1fa9 +"\x00\x1f\x6a\x00\x03\x45", 0x1faa +"\x00\x1f\x6b\x00\x03\x45", 0x1fab +"\x00\x1f\x6c\x00\x03\x45", 0x1fac +"\x00\x1f\x6d\x00\x03\x45", 0x1fad +"\x00\x1f\x6e\x00\x03\x45", 0x1fae +"\x00\x1f\x6f\x00\x03\x45", 0x1faf +"\x00\x03\xb1\x00\x03\x06", 0x1fb0 +"\x00\x03\xb1\x00\x03\x04", 0x1fb1 +"\x00\x1f\x70\x00\x03\x45", 0x1fb2 +"\x00\x03\xb1\x00\x03\x45", 0x1fb3 +"\x00\x03\xac\x00\x03\x45", 0x1fb4 +"\x00\x03\xb1\x00\x03\x42", 0x1fb6 +"\x00\x1f\xb6\x00\x03\x45", 0x1fb7 +"\x00\x03\x91\x00\x03\x06", 0x1fb8 +"\x00\x03\x91\x00\x03\x04", 0x1fb9 +"\x00\x03\x91\x00\x03\x00", 0x1fba +"\x00\x03\x91\x00\x03\x45", 0x1fbc +"\x00\x00\xa8\x00\x03\x42", 0x1fc1 +"\x00\x1f\x74\x00\x03\x45", 0x1fc2 +"\x00\x03\xb7\x00\x03\x45", 0x1fc3 +"\x00\x03\xae\x00\x03\x45", 0x1fc4 +"\x00\x03\xb7\x00\x03\x42", 0x1fc6 +"\x00\x1f\xc6\x00\x03\x45", 0x1fc7 +"\x00\x03\x95\x00\x03\x00", 0x1fc8 +"\x00\x03\x97\x00\x03\x00", 0x1fca +"\x00\x03\x97\x00\x03\x45", 0x1fcc +"\x00\x1f\xbf\x00\x03\x00", 0x1fcd +"\x00\x1f\xbf\x00\x03\x01", 0x1fce +"\x00\x1f\xbf\x00\x03\x42", 0x1fcf +"\x00\x03\xb9\x00\x03\x06", 0x1fd0 +"\x00\x03\xb9\x00\x03\x04", 0x1fd1 +"\x00\x03\xca\x00\x03\x00", 0x1fd2 +"\x00\x03\xb9\x00\x03\x42", 0x1fd6 +"\x00\x03\xca\x00\x03\x42", 0x1fd7 +"\x00\x03\x99\x00\x03\x06", 0x1fd8 +"\x00\x03\x99\x00\x03\x04", 0x1fd9 +"\x00\x03\x99\x00\x03\x00", 0x1fda +"\x00\x1f\xfe\x00\x03\x00", 0x1fdd +"\x00\x1f\xfe\x00\x03\x01", 0x1fde +"\x00\x1f\xfe\x00\x03\x42", 0x1fdf +"\x00\x03\xc5\x00\x03\x06", 0x1fe0 +"\x00\x03\xc5\x00\x03\x04", 0x1fe1 +"\x00\x03\xcb\x00\x03\x00", 0x1fe2 +"\x00\x03\xc1\x00\x03\x13", 0x1fe4 +"\x00\x03\xc1\x00\x03\x14", 0x1fe5 +"\x00\x03\xc5\x00\x03\x42", 0x1fe6 +"\x00\x03\xcb\x00\x03\x42", 0x1fe7 +"\x00\x03\xa5\x00\x03\x06", 0x1fe8 +"\x00\x03\xa5\x00\x03\x04", 0x1fe9 +"\x00\x03\xa5\x00\x03\x00", 0x1fea +"\x00\x03\xa1\x00\x03\x14", 0x1fec +"\x00\x00\xa8\x00\x03\x00", 0x1fed +"\x00\x1f\x7c\x00\x03\x45", 0x1ff2 +"\x00\x03\xc9\x00\x03\x45", 0x1ff3 +"\x00\x03\xce\x00\x03\x45", 0x1ff4 +"\x00\x03\xc9\x00\x03\x42", 0x1ff6 +"\x00\x1f\xf6\x00\x03\x45", 0x1ff7 +"\x00\x03\x9f\x00\x03\x00", 0x1ff8 +"\x00\x03\xa9\x00\x03\x00", 0x1ffa +"\x00\x03\xa9\x00\x03\x45", 0x1ffc +"\x00\x21\x90\x00\x03\x38", 0x219a +"\x00\x21\x92\x00\x03\x38", 0x219b +"\x00\x21\x94\x00\x03\x38", 0x21ae +"\x00\x21\xd0\x00\x03\x38", 0x21cd +"\x00\x21\xd4\x00\x03\x38", 0x21ce +"\x00\x21\xd2\x00\x03\x38", 0x21cf +"\x00\x22\x03\x00\x03\x38", 0x2204 +"\x00\x22\x08\x00\x03\x38", 0x2209 +"\x00\x22\x0b\x00\x03\x38", 0x220c +"\x00\x22\x23\x00\x03\x38", 0x2224 +"\x00\x22\x25\x00\x03\x38", 0x2226 +"\x00\x22\x3c\x00\x03\x38", 0x2241 +"\x00\x22\x43\x00\x03\x38", 0x2244 +"\x00\x22\x45\x00\x03\x38", 0x2247 +"\x00\x22\x48\x00\x03\x38", 0x2249 +"\x00\x00\x3d\x00\x03\x38", 0x2260 +"\x00\x22\x61\x00\x03\x38", 0x2262 +"\x00\x22\x4d\x00\x03\x38", 0x226d +"\x00\x00\x3c\x00\x03\x38", 0x226e +"\x00\x00\x3e\x00\x03\x38", 0x226f +"\x00\x22\x64\x00\x03\x38", 0x2270 +"\x00\x22\x65\x00\x03\x38", 0x2271 +"\x00\x22\x72\x00\x03\x38", 0x2274 +"\x00\x22\x73\x00\x03\x38", 0x2275 +"\x00\x22\x76\x00\x03\x38", 0x2278 +"\x00\x22\x77\x00\x03\x38", 0x2279 +"\x00\x22\x7a\x00\x03\x38", 0x2280 +"\x00\x22\x7b\x00\x03\x38", 0x2281 +"\x00\x22\x82\x00\x03\x38", 0x2284 +"\x00\x22\x83\x00\x03\x38", 0x2285 +"\x00\x22\x86\x00\x03\x38", 0x2288 +"\x00\x22\x87\x00\x03\x38", 0x2289 +"\x00\x22\xa2\x00\x03\x38", 0x22ac +"\x00\x22\xa8\x00\x03\x38", 0x22ad +"\x00\x22\xa9\x00\x03\x38", 0x22ae +"\x00\x22\xab\x00\x03\x38", 0x22af +"\x00\x22\x7c\x00\x03\x38", 0x22e0 +"\x00\x22\x7d\x00\x03\x38", 0x22e1 +"\x00\x22\x91\x00\x03\x38", 0x22e2 +"\x00\x22\x92\x00\x03\x38", 0x22e3 +"\x00\x22\xb2\x00\x03\x38", 0x22ea +"\x00\x22\xb3\x00\x03\x38", 0x22eb +"\x00\x22\xb4\x00\x03\x38", 0x22ec +"\x00\x22\xb5\x00\x03\x38", 0x22ed +"\x00\x30\x4b\x00\x30\x99", 0x304c +"\x00\x30\x4d\x00\x30\x99", 0x304e +"\x00\x30\x4f\x00\x30\x99", 0x3050 +"\x00\x30\x51\x00\x30\x99", 0x3052 +"\x00\x30\x53\x00\x30\x99", 0x3054 +"\x00\x30\x55\x00\x30\x99", 0x3056 +"\x00\x30\x57\x00\x30\x99", 0x3058 +"\x00\x30\x59\x00\x30\x99", 0x305a +"\x00\x30\x5b\x00\x30\x99", 0x305c +"\x00\x30\x5d\x00\x30\x99", 0x305e +"\x00\x30\x5f\x00\x30\x99", 0x3060 +"\x00\x30\x61\x00\x30\x99", 0x3062 +"\x00\x30\x64\x00\x30\x99", 0x3065 +"\x00\x30\x66\x00\x30\x99", 0x3067 +"\x00\x30\x68\x00\x30\x99", 0x3069 +"\x00\x30\x6f\x00\x30\x99", 0x3070 +"\x00\x30\x6f\x00\x30\x9a", 0x3071 +"\x00\x30\x72\x00\x30\x99", 0x3073 +"\x00\x30\x72\x00\x30\x9a", 0x3074 +"\x00\x30\x75\x00\x30\x99", 0x3076 +"\x00\x30\x75\x00\x30\x9a", 0x3077 +"\x00\x30\x78\x00\x30\x99", 0x3079 +"\x00\x30\x78\x00\x30\x9a", 0x307a +"\x00\x30\x7b\x00\x30\x99", 0x307c +"\x00\x30\x7b\x00\x30\x9a", 0x307d +"\x00\x30\x46\x00\x30\x99", 0x3094 +"\x00\x30\x9d\x00\x30\x99", 0x309e +"\x00\x30\xab\x00\x30\x99", 0x30ac +"\x00\x30\xad\x00\x30\x99", 0x30ae +"\x00\x30\xaf\x00\x30\x99", 0x30b0 +"\x00\x30\xb1\x00\x30\x99", 0x30b2 +"\x00\x30\xb3\x00\x30\x99", 0x30b4 +"\x00\x30\xb5\x00\x30\x99", 0x30b6 +"\x00\x30\xb7\x00\x30\x99", 0x30b8 +"\x00\x30\xb9\x00\x30\x99", 0x30ba +"\x00\x30\xbb\x00\x30\x99", 0x30bc +"\x00\x30\xbd\x00\x30\x99", 0x30be +"\x00\x30\xbf\x00\x30\x99", 0x30c0 +"\x00\x30\xc1\x00\x30\x99", 0x30c2 +"\x00\x30\xc4\x00\x30\x99", 0x30c5 +"\x00\x30\xc6\x00\x30\x99", 0x30c7 +"\x00\x30\xc8\x00\x30\x99", 0x30c9 +"\x00\x30\xcf\x00\x30\x99", 0x30d0 +"\x00\x30\xcf\x00\x30\x9a", 0x30d1 +"\x00\x30\xd2\x00\x30\x99", 0x30d3 +"\x00\x30\xd2\x00\x30\x9a", 0x30d4 +"\x00\x30\xd5\x00\x30\x99", 0x30d6 +"\x00\x30\xd5\x00\x30\x9a", 0x30d7 +"\x00\x30\xd8\x00\x30\x99", 0x30d9 +"\x00\x30\xd8\x00\x30\x9a", 0x30da +"\x00\x30\xdb\x00\x30\x99", 0x30dc +"\x00\x30\xdb\x00\x30\x9a", 0x30dd +"\x00\x30\xa6\x00\x30\x99", 0x30f4 +"\x00\x30\xef\x00\x30\x99", 0x30f7 +"\x00\x30\xf0\x00\x30\x99", 0x30f8 +"\x00\x30\xf1\x00\x30\x99", 0x30f9 +"\x00\x30\xf2\x00\x30\x99", 0x30fa +"\x00\x30\xfd\x00\x30\x99", 0x30fe +"\x01\x10\x99\x01\x10\xba", 0x1109a +"\x01\x10\x9b\x01\x10\xba", 0x1109c +"\x01\x10\xa5\x01\x10\xba", 0x110ab diff --git a/gnulib/lib/uninorm/composition.c b/gnulib/lib/uninorm/composition.c new file mode 100644 index 0000000..23868ba --- /dev/null +++ b/gnulib/lib/uninorm/composition.c @@ -0,0 +1,87 @@ +/* Canonical composition of Unicode characters. + Copyright (C) 2002, 2006, 2009, 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "uninorm.h" + +#include + +struct composition_rule { char codes[6]; unsigned int combined; }; + +#include "composition-table.h" + +ucs4_t +uc_composition (ucs4_t uc1, ucs4_t uc2) +{ + if (uc1 < 0x12000 && uc2 < 0x12000) + { + 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[6]; + const struct composition_rule *rule; + + codes[0] = (uc1 >> 16) & 0xff; + codes[1] = (uc1 >> 8) & 0xff; + codes[2] = uc1 & 0xff; + codes[3] = (uc2 >> 16) & 0xff; + codes[4] = (uc2 >> 8) & 0xff; + codes[5] = uc2 & 0xff; + + rule = gl_uninorm_compose_lookup (codes, 6); + 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 0000000..6e85094 --- /dev/null +++ b/gnulib/lib/uninorm/decompose-internal.c @@ -0,0 +1,28 @@ +/* Decomposition of Unicode strings. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..1cf9bb2 --- /dev/null +++ b/gnulib/lib/uninorm/decompose-internal.h @@ -0,0 +1,36 @@ +/* Decomposition of Unicode strings. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +#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 0000000..62987a6 --- /dev/null +++ b/gnulib/lib/uninorm/decomposing-form.c @@ -0,0 +1,29 @@ +/* Decomposing variant of a normalization form. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..2eed8d2 --- /dev/null +++ b/gnulib/lib/uninorm/decomposition-table.c @@ -0,0 +1,23 @@ +/* Decomposition of Unicode characters. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..e363905 --- /dev/null +++ b/gnulib/lib/uninorm/decomposition-table.h @@ -0,0 +1,48 @@ +/* Decomposition of Unicode characters. + Copyright (C) 2001-2003, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + + +#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 0000000..ccf1bec --- /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 6.0.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[20 << 5]; + unsigned short level3[263 << 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 0000000..7cab0c8 --- /dev/null +++ b/gnulib/lib/uninorm/decomposition-table2.h @@ -0,0 +1,3261 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Decomposition of Unicode characters. */ +/* Generated automatically by gen-uni-tables.c for Unicode 6.0.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, + 0x24, 0x00, 0x68, 0x24, 0x00, 0x6B, 0x24, 0x00, 0x6C, 0x24, 0x00, 0x6D, + 0x24, 0x00, 0x6E, 0x24, 0x00, 0x70, 0x24, 0x00, 0x73, 0x24, 0x00, 0x74, + 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, 0x37, 0xBC, 0x00, 0x31, 0x80, 0x20, 0x44, + 0x00, 0x00, 0x39, 0xBC, 0x00, 0x31, 0x80, 0x20, 0x44, 0x80, 0x00, 0x31, + 0x00, 0x00, 0x30, 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, 0xBC, 0x00, 0x30, + 0x80, 0x20, 0x44, 0x00, 0x00, 0x33, 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, 0x1C, 0x55, 0x4F, + 0x1C, 0x5E, 0x7C, 0x1C, 0x65, 0x87, 0x1C, 0x7B, 0x8F, 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, 0x60, 0x75, 0x02, 0x42, 0xEE, 0x00, 0x82, 0x18, 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, 0x10, 0x99, 0x01, 0x10, 0xBA, + 0x81, 0x10, 0x9B, 0x01, 0x10, 0xBA, 0x81, 0x10, 0xA5, 0x01, 0x10, 0xBA, + 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, 0xC0, 0x00, 0x30, 0x00, 0x00, 0x2E, + 0xC0, 0x00, 0x30, 0x00, 0x00, 0x2C, 0xC0, 0x00, 0x31, 0x00, 0x00, 0x2C, + 0xC0, 0x00, 0x32, 0x00, 0x00, 0x2C, 0xC0, 0x00, 0x33, 0x00, 0x00, 0x2C, + 0xC0, 0x00, 0x34, 0x00, 0x00, 0x2C, 0xC0, 0x00, 0x35, 0x00, 0x00, 0x2C, + 0xC0, 0x00, 0x36, 0x00, 0x00, 0x2C, 0xC0, 0x00, 0x37, 0x00, 0x00, 0x2C, + 0xC0, 0x00, 0x38, 0x00, 0x00, 0x2C, 0xC0, 0x00, 0x39, 0x00, 0x00, 0x2C, + 0xC0, 0x00, 0x28, 0x80, 0x00, 0x41, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, + 0x80, 0x00, 0x42, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x43, + 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x44, 0x00, 0x00, 0x29, + 0xC0, 0x00, 0x28, 0x80, 0x00, 0x45, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, + 0x80, 0x00, 0x46, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x47, + 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x48, 0x00, 0x00, 0x29, + 0xC0, 0x00, 0x28, 0x80, 0x00, 0x49, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, + 0x80, 0x00, 0x4A, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x4B, + 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x4C, 0x00, 0x00, 0x29, + 0xC0, 0x00, 0x28, 0x80, 0x00, 0x4D, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, + 0x80, 0x00, 0x4E, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x4F, + 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x50, 0x00, 0x00, 0x29, + 0xC0, 0x00, 0x28, 0x80, 0x00, 0x51, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, + 0x80, 0x00, 0x52, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x53, + 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x54, 0x00, 0x00, 0x29, + 0xC0, 0x00, 0x28, 0x80, 0x00, 0x55, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, + 0x80, 0x00, 0x56, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x57, + 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x58, 0x00, 0x00, 0x29, + 0xC0, 0x00, 0x28, 0x80, 0x00, 0x59, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, + 0x80, 0x00, 0x5A, 0x00, 0x00, 0x29, 0xC0, 0x30, 0x14, 0x80, 0x00, 0x53, + 0x00, 0x30, 0x15, 0x1C, 0x00, 0x43, 0x1C, 0x00, 0x52, 0x9C, 0x00, 0x43, + 0x00, 0x00, 0x44, 0x9C, 0x00, 0x57, 0x00, 0x00, 0x5A, 0x38, 0x00, 0x41, + 0x38, 0x00, 0x42, 0x38, 0x00, 0x43, 0x38, 0x00, 0x44, 0x38, 0x00, 0x45, + 0x38, 0x00, 0x46, 0x38, 0x00, 0x47, 0x38, 0x00, 0x48, 0x38, 0x00, 0x49, + 0x38, 0x00, 0x4A, 0x38, 0x00, 0x4B, 0x38, 0x00, 0x4C, 0x38, 0x00, 0x4D, + 0x38, 0x00, 0x4E, 0x38, 0x00, 0x4F, 0x38, 0x00, 0x50, 0x38, 0x00, 0x51, + 0x38, 0x00, 0x52, 0x38, 0x00, 0x53, 0x38, 0x00, 0x54, 0x38, 0x00, 0x55, + 0x38, 0x00, 0x56, 0x38, 0x00, 0x57, 0x38, 0x00, 0x58, 0x38, 0x00, 0x59, + 0x38, 0x00, 0x5A, 0xB8, 0x00, 0x48, 0x00, 0x00, 0x56, 0xB8, 0x00, 0x4D, + 0x00, 0x00, 0x56, 0xB8, 0x00, 0x53, 0x00, 0x00, 0x44, 0xB8, 0x00, 0x53, + 0x00, 0x00, 0x53, 0xB8, 0x00, 0x50, 0x80, 0x00, 0x50, 0x00, 0x00, 0x56, + 0xB8, 0x00, 0x57, 0x00, 0x00, 0x43, 0xB8, 0x00, 0x44, 0x00, 0x00, 0x4A, + 0xB8, 0x30, 0x7B, 0x00, 0x30, 0x4B, 0xB8, 0x30, 0xB3, 0x00, 0x30, 0xB3, + 0x38, 0x30, 0xB5, 0x38, 0x62, 0x4B, 0x38, 0x5B, 0x57, 0x38, 0x53, 0xCC, + 0x38, 0x30, 0xC7, 0x38, 0x4E, 0x8C, 0x38, 0x59, 0x1A, 0x38, 0x89, 0xE3, + 0x38, 0x59, 0x29, 0x38, 0x4E, 0xA4, 0x38, 0x66, 0x20, 0x38, 0x71, 0x21, + 0x38, 0x65, 0x99, 0x38, 0x52, 0x4D, 0x38, 0x5F, 0x8C, 0x38, 0x51, 0x8D, + 0x38, 0x65, 0xB0, 0x38, 0x52, 0x1D, 0x38, 0x7D, 0x42, 0x38, 0x75, 0x1F, + 0x38, 0x8C, 0xA9, 0x38, 0x58, 0xF0, 0x38, 0x54, 0x39, 0x38, 0x6F, 0x14, + 0x38, 0x62, 0x95, 0x38, 0x63, 0x55, 0x38, 0x4E, 0x00, 0x38, 0x4E, 0x09, + 0x38, 0x90, 0x4A, 0x38, 0x5D, 0xE6, 0x38, 0x4E, 0x2D, 0x38, 0x53, 0xF3, + 0x38, 0x63, 0x07, 0x38, 0x8D, 0x70, 0x38, 0x62, 0x53, 0x38, 0x79, 0x81, + 0x38, 0x7A, 0x7A, 0x38, 0x54, 0x08, 0x38, 0x6E, 0x80, 0x38, 0x67, 0x09, + 0x38, 0x67, 0x08, 0x38, 0x75, 0x33, 0x38, 0x52, 0x72, 0x38, 0x55, 0xB6, + 0xC0, 0x30, 0x14, 0x80, 0x67, 0x2C, 0x00, 0x30, 0x15, 0xC0, 0x30, 0x14, + 0x80, 0x4E, 0x09, 0x00, 0x30, 0x15, 0xC0, 0x30, 0x14, 0x80, 0x4E, 0x8C, + 0x00, 0x30, 0x15, 0xC0, 0x30, 0x14, 0x80, 0x5B, 0x89, 0x00, 0x30, 0x15, + 0xC0, 0x30, 0x14, 0x80, 0x70, 0xB9, 0x00, 0x30, 0x15, 0xC0, 0x30, 0x14, + 0x80, 0x62, 0x53, 0x00, 0x30, 0x15, 0xC0, 0x30, 0x14, 0x80, 0x76, 0xD7, + 0x00, 0x30, 0x15, 0xC0, 0x30, 0x14, 0x80, 0x52, 0xDD, 0x00, 0x30, 0x15, + 0xC0, 0x30, 0x14, 0x80, 0x65, 0x57, 0x00, 0x30, 0x15, 0x1C, 0x5F, 0x97, + 0x1C, 0x53, 0xEF, 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, 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, 512, 544, -1, -1, + -1, -1, -1, -1, 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, 608 + }, + { + -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, 6432, 6464, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 6496, 6528, -1, 6560, 6592, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 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, + -1, -1, -1, -1, -1, -1, -1, -1, + 7648, 7680, 7712, -1, 7744, -1, -1, -1, + 7776, 7808, 7840, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 7872, 7904, 7936, 7968, 8000, 8032, 8064, 8096, + 8128, 8160, 8192, 8224, 8256, 8288, 8320, 8352, + 8384, -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, 34832, 34833, 34834, + 34835, 34836, 34837, 34838, 34839, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 34840, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 34842, 34845, 34848, 34849, -1, 34851, 34854, 34857, + -1, 34858, 34860, 34861, 34862, 34863, 34864, 34865, + 34866, 34867, 34868, 34869, -1, 34870, 34871, -1, + -1, 34873, 34874, 34875, 34876, 34877, -1, -1, + 34878, 34880, 34883, -1, 34885, -1, 2118, -1, + 34887, -1, 2120, 2121, 34890, 34891, -1, 34892, + 34893, 34894, -1, 34895, 34896, 34897, 34898, 34899, + 34900, 34901, -1, 34902, 34905, 34906, 34907, 34908, + 34909, -1, -1, -1, -1, 34910, 34911, 34912, + 34913, 34914, -1, -1, -1, -1, -1, -1, + 34915, 34918, 34921, 34925, 34928, 34931, 34934, 34937, + 34940, 34943, 34946, 34949, 34952, 34955, 34958, 34961, + 34963, 34964, 34966, 34969, 34971, 34972, 34974, 34977, + 34981, 34983, 34984, 34986, 34989, 34990, 34991, 34992, + 34993, 34994, 34996, 34999, 35001, 35002, 35004, 35007, + 35011, 35013, 35014, 35016, 35019, 35020, 35021, 35022, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 35023, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 2258, 2260, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 2262, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 2264, 2266, 2268, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 2270, -1, -1, -1, + -1, 2272, -1, -1, 2274, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 2276, -1, 2278, -1, + -1, -1, -1, -1, 35048, 35050, -1, 35053, + 35055, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 2290, -1, -1, 2292, -1, -1, 2294, + -1, 2296, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 2298, -1, 2300, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 2302, 2304, 2306, + 2308, 2310, -1, -1, 2312, 2314, -1, -1, + 2316, 2318, -1, -1, -1, -1, -1, -1, + 2320, 2322, -1, -1, 2324, 2326, -1, -1, + 2328, 2330, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 2332, 2334, 2336, 2338, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 2340, 2342, 2344, 2346, -1, -1, -1, -1, + -1, -1, 2348, 2350, 2352, 2354, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 2356, 2357, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 35126, 35127, 35128, 35129, 35130, 35131, 35132, 35133, + 35134, 35135, 35137, 35139, 35141, 35143, 35145, 35147, + 35149, 35151, 35153, 35155, 35157, 35160, 35163, 35166, + 35169, 35172, 35175, 35178, 35181, 35184, 35188, 35192, + 35196, 35200, 35204, 35208, 35212, 35216, 35220, 35224, + 35228, 35230, 35232, 35234, 35236, 35238, 35240, 35242, + 35244, 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, + 35339, 35342, 35345, 35348, 35351, 35354, 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, 35389, 35390, + 35391, 35392, 35393, 35394, 35395, 35396, 35397, 35398, + 35399, 35400, 35401, 35402, 35403, 35404, 35405, 35406, + 35407, 35408, 35409, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 35410, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 35414, 35417, 35419, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 2654, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 35424, 35425, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 35426, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 35427, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 35428, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 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, 35622, 35623, 35624, 35625, 35626, 35627, 35628, + 35629, 35630, 35631, 35632, 35633, 35634, 35635, 35636, + 35637, 35638, 35639, 35640, 35641, 35642, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 35643, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 35644, -1, + 35645, 35646, 35647, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 2880, -1, 2882, -1, + 2884, -1, 2886, -1, 2888, -1, 2890, -1, + 2892, -1, 2894, -1, 2896, -1, 2898, -1, + 2900, -1, 2902, -1, -1, 2904, -1, 2906, + -1, 2908, -1, -1, -1, -1, -1, -1, + 2910, 2912, -1, 2914, 2916, -1, 2918, 2920, + -1, 2922, 2924, -1, 2926, 2928, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 2930, -1, -1, -1, + -1, -1, -1, 35700, 35702, -1, 2936, 35706, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 2940, -1, 2942, -1, + 2944, -1, 2946, -1, 2948, -1, 2950, -1, + 2952, -1, 2954, -1, 2956, -1, 2958, -1, + 2960, -1, 2962, -1, -1, 2964, -1, 2966, + -1, 2968, -1, -1, -1, -1, -1, -1, + 2970, 2972, -1, 2974, 2976, -1, 2978, 2980, + -1, 2982, 2984, -1, 2986, 2988, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 2990, -1, -1, 2992, + 2994, 2996, 2998, -1, -1, -1, 3000, 35770, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 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, 35845, 35846, 35847, 35848, 35849, 35850, + 35851, 35852, 35853, 35854, 35855, 35856, 35857, 35858, + 35859, 35860, 35861, 35862, 35863, 35864, 35865, -1, + -1, -1, 35866, 35867, 35868, 35869, 35870, 35871, + 35872, 35873, 35874, 35875, 35876, 35877, 35878, 35879, + 35880, 35883, 35886, 35889, 35892, 35895, 35898, 35901, + 35904, 35907, 35910, 35913, 35916, 35919, 35922, 35926, + 35930, 35934, 35938, 35942, 35946, 35950, 35954, 35958, + 35962, 35966, 35970, 35974, 35978, 35982, 35989, -1, + 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, 36082, 36085, 36088, + 36091, 36094, 36097, 36100, 36103, 36104, 36105, 36106, + -1, -1, -1, -1, -1, -1, -1, -1, + 36107, 36110, 36112, 36114, 36116, 36118, 36120, 36122, + 36124, 36126, 36128, 36130, 36132, 36134, 36136, 36138, + 36140, 36141, 36142, 36143, 36144, 36145, 36146, 36147, + 36148, 36149, 36150, 36151, 36152, 36153, 36154, 36156, + 36158, 36160, 36162, 36164, 36166, 36168, 36170, 36172, + 36174, 36176, 36178, 36180, 36182, 36187, 36191, -1, + 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, 36218, 36219, 36220, 36221, 36222, 36223, 36224, + 36225, 36226, 36227, 36228, 36229, 36230, 36231, 36232, + 36233, 36234, 36235, 36236, 36237, 36238, 36239, 36240, + 36241, 36242, 36244, 36246, 36248, 36250, 36252, 36254, + 36256, 36258, 36260, 36262, 36264, 36266, 36268, 36270, + 36272, 36274, 36276, 36278, 36280, 36282, 36284, 36286, + 36288, 36290, 36293, 36296, 36299, 36301, 36304, 36306, + 36309, 36310, 36311, 36312, 36313, 36314, 36315, 36316, + 36317, 36318, 36319, 36320, 36321, 36322, 36323, 36324, + 36325, 36326, 36327, 36328, 36329, 36330, 36331, 36332, + 36333, 36334, 36335, 36336, 36337, 36338, 36339, 36340, + 36341, 36342, 36343, 36344, 36345, 36346, 36347, 36348, + 36349, 36350, 36351, 36352, 36353, 36354, 36355, -1, + 36356, 36360, 36364, 36368, 36371, 36375, 36378, 36381, + 36386, 36390, 36393, 36396, 36399, 36403, 36407, 36410, + 36413, 36415, 36418, 36422, 36426, 36428, 36433, 36439, + 36444, 36447, 36452, 36457, 36461, 36464, 36467, 36470, + 36474, 36479, 36483, 36486, 36489, 36492, 36494, 36496, + 36498, 36500, 36503, 36506, 36511, 36514, 36518, 36523, + 36526, 36528, 36530, 36535, 36539, 36544, 36547, 36552, + 36554, 36557, 36560, 36563, 36566, 36569, 36573, 36576, + 36578, 36581, 36584, 36587, 36591, 36594, 36597, 36600, + 36605, 36609, 36611, 36616, 36618, 36622, 36626, 36629, + 36632, 36635, 36639, 36641, 36644, 36648, 36650, 36655, + 36658, 36660, 36662, 36664, 36666, 36668, 36670, 36672, + 36674, 36676, 36678, 36681, 36684, 36687, 36690, 36693, + 36696, 36699, 36702, 36705, 36708, 36711, 36714, 36717, + 36720, 36723, 36726, 36728, 36730, 36733, 36735, 36737, + 36739, 36742, 36745, 36747, 36749, 36751, 36753, 36755, + 36759, 36761, 36763, 36765, 36767, 36769, 36771, 36773, + 36775, 36778, 36782, 36784, 36786, 36788, 36790, 36792, + 36794, 36796, 36799, 36802, 36805, 36808, 36810, 36812, + 36814, 36816, 36818, 36820, 36822, 36824, 36826, 36828, + 36831, 36834, 36836, 36839, 36842, 36845, 36847, 36850, + 36853, 36857, 36859, 36862, 36865, 36868, 36871, 36876, + 36882, 36884, 36886, 36888, 36890, 36892, 36894, 36896, + 36898, 36900, 36902, 36904, 36906, 36908, 36910, 36912, + 36914, 36916, 36918, 36922, 36924, 36926, 36928, 36932, + 36935, 36937, 36939, 36941, 36943, 36945, 36947, 36949, + 36951, 36953, 36955, 36958, 36960, 36962, 36965, 36968, + 36970, 36974, 36977, 36979, 36981, 36983, 36985, 36988, + 36991, 36993, 36995, 36997, 36999, 37001, 37003, 37005, + 37007, 37009, 37012, 37015, 37018, 37021, 37024, 37027, + 37030, 37033, 37036, 37039, 37042, 37045, 37048, 37051, + 37054, 37057, 37060, 37063, 37066, 37069, 37072, 37075, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 37078, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 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, 4556, 4557, 4558, + 4559, 4560, 4561, 4562, 4563, 4564, 4565, 4566, + 4567, 4568, 4569, 4570, 4571, 4572, 4573, 4574, + 4575, 4576, 4577, 4578, 4579, 4580, -1, -1, + 4581, -1, 4582, -1, -1, 4583, 4584, 4585, + 4586, 4587, 4588, 4589, 4590, 4591, 4592, -1, + 4593, -1, 4594, -1, -1, 4595, 4596, -1, + -1, -1, 4597, 4598, 4599, 4600, -1, -1, + 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, 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, -1, -1, + 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, 4741, 4742, + 4743, 4744, 4745, 4746, 4747, 4748, 4749, 4750, + 4751, 4752, 4753, 4754, 4755, 4756, 4757, 4758, + 4759, 4760, 4761, 4762, 4763, 4764, 4765, 4766, + 4767, 4768, -1, -1, -1, -1, -1, -1, + 37537, 37539, 37541, 37543, 37546, 37549, 37551, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 37553, 37555, 37557, 37559, 37561, + -1, -1, -1, -1, -1, 4795, -1, 4797, + 37567, 37568, 37569, 37570, 37571, 37572, 37573, 37574, + 37575, 37576, 4809, 4811, 4813, 4815, 4817, 4819, + 4821, 4823, 4825, 4827, 4829, 4831, 4833, -1, + 4835, 4837, 4839, 4841, 4843, -1, 4845, -1, + 4847, 4849, -1, 4851, 4853, -1, 4855, 4857, + 4859, 4861, 4863, 4865, 4867, 4869, 4871, 37641, + 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, 37713, 37714, + 37715, 37716, 37717, 37718, 37719, 37720, 37721, 37722, + 37723, 37724, 37725, 37726, 37727, 37728, 37729, 37730, + 37731, 37732, 37733, 37734, 37735, 37736, 37737, 37738, + 37739, 37740, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 37741, 37742, 37743, 37744, 37745, + 37746, 37747, 37748, 37749, 37750, 37751, 37752, 37753, + 37754, 37755, 37756, 37757, 37758, 37759, 37760, 37761, + 37762, 37763, 37764, 37766, 37768, 37770, 37772, 37774, + 37776, 37778, 37780, 37782, 37784, 37786, 37788, 37790, + 37792, 37794, 37796, 37798, 37800, 37801, 37802, 37803, + 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, 37966, 37968, 37970, 37972, 37974, 37976, 37978, + 37980, 37982, 37984, 37986, 37988, 37990, 37992, 37995, + 37998, 38001, 38004, 38007, 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, 38268, 38270, 38272, + 38274, 38276, 38278, 38280, 38282, 38284, 38286, 38288, + 38290, 38292, 38294, 38297, 38300, 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, + 38421, 38423, 38425, 38427, 38429, 38431, 38433, 38435, + 38437, 38439, 38441, 38443, 38445, 38447, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 38449, 38452, 38455, 38458, 38461, 38464, 38467, 38470, + 38473, 38476, 38479, 38482, 38485, 38488, 38491, 38494, + 38497, 38500, 38503, 38506, 38509, 38512, 38515, 38518, + 38521, 38524, 38527, 38530, 38533, 38536, 38539, 38542, + 38545, 38548, 38551, 38554, 38557, 38560, 38563, 38566, + 38569, 38572, 38575, 38578, 38581, 38584, 38587, 38590, + 38593, 38596, 38599, 38602, 38605, 38608, 38611, 38614, + 38617, 38620, 38623, 38626, 38629, 38632, 38635, 38638, + -1, -1, 38641, 38644, 38647, 38650, 38653, 38656, + 38659, 38662, 38665, 38668, 38671, 38674, 38677, 38680, + 38683, 38686, 38689, 38692, 38695, 38698, 38701, 38704, + 38707, 38710, 38713, 38716, 38719, 38722, 38725, 38728, + 38731, 38734, 38737, 38740, 38743, 38746, 38749, 38752, + 38755, 38758, 38761, 38764, 38767, 38770, 38773, 38776, + 38779, 38782, 38785, 38788, 38791, 38794, 38797, 38800, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 38803, 38806, 38809, 38813, 38817, 38821, 38825, 38829, + 38833, 38837, 38840, 38858, 38866, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 38870, 38871, 38872, 38873, 38874, 38875, 38876, 38877, + 38878, 38879, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 38880, 38881, 38882, 38883, 38884, 38885, 38886, 38887, + 38888, 38889, 38890, 38891, 38892, 38893, 38894, 38895, + 38896, 38897, 38898, 38899, 38900, -1, -1, 38901, + 38902, 38903, 38904, 38905, 38906, 38907, 38908, 38909, + 38910, 38911, 38912, -1, 38913, 38914, 38915, 38916, + 38917, 38918, 38919, 38920, 38921, 38922, 38923, 38924, + 38925, 38926, 38927, 38928, 38929, 38930, 38931, -1, + 38932, 38933, 38934, 38935, -1, -1, -1, -1, + 38936, 38938, 38940, -1, 38942, -1, 38944, 38946, + 38948, 38950, 38952, 38954, 38956, 38958, 38960, 38962, + 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, 39054, 39055, 39056, 39057, 39058, 39059, + 39060, 39061, 39062, 39063, 39064, 39065, 39066, 39067, + 39068, 39069, 39070, 39071, 39072, 39073, 39074, 39075, + 39076, 39077, 39078, 39079, 39080, 39081, 39083, 39085, + 39087, 39089, 39091, 39093, 39095, -1, -1, -1, + -1, 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, 39259, 39260, 39261, 39262, 39263, + 39264, 39265, 39266, 39267, 39268, 39269, 39270, 39271, + 39272, 39273, 39274, 39275, 39276, 39277, 39278, 39279, + 39280, 39281, 39282, 39283, 39284, 39285, 39286, -1, + -1, -1, 39287, 39288, 39289, 39290, 39291, 39292, + -1, -1, 39293, 39294, 39295, 39296, 39297, 39298, + -1, -1, 39299, 39300, 39301, 39302, 39303, 39304, + -1, -1, 39305, 39306, 39307, -1, -1, -1, + 39308, 39309, 39310, 39311, 39312, 39313, 39314, -1, + 39315, 39316, 39317, 39318, 39319, 39320, 39321, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 6554, -1, 6556, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 6558, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 6560, 6562, + 6564, 6566, 6568, 6570, 6572, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 6574, 6576, 6578, 6580, 6582, + 6584, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 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, 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, -1, 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, 39476, 39477, 39478, 39479, 39480, + 39481, 39482, 39483, 39484, 39485, 39486, 39487, 39488, + 39489, 39490, 39491, 39492, 39493, 39494, 39495, 39496, + 39497, 39498, 39499, 39500, 39501, 39502, 39503, 39504, + 39505, 39506, 39507, 39508, 39509, -1, 39510, 39511, + -1, -1, 39512, -1, -1, 39513, 39514, -1, + -1, 39515, 39516, 39517, 39518, -1, 39519, 39520, + 39521, 39522, 39523, 39524, 39525, 39526, 39527, 39528, + 39529, 39530, -1, 39531, -1, 39532, 39533, 39534, + 39535, 39536, 39537, 39538, -1, 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, 39570, 39571, 39572, 39573, + 39574, 39575, 39576, 39577, 39578, 39579, 39580, 39581, + 39582, 39583, 39584, 39585, 39586, 39587, 39588, 39589, + 39590, 39591, 39592, 39593, 39594, 39595, 39596, 39597, + 39598, 39599, 39600, 39601, 39602, 39603, -1, 39604, + 39605, 39606, 39607, -1, -1, 39608, 39609, 39610, + 39611, 39612, 39613, 39614, 39615, -1, 39616, 39617, + 39618, 39619, 39620, 39621, 39622, -1, 39623, 39624, + 39625, 39626, 39627, 39628, 39629, 39630, 39631, 39632, + 39633, 39634, 39635, 39636, 39637, 39638, 39639, 39640, + 39641, 39642, 39643, 39644, 39645, 39646, 39647, 39648, + 39649, 39650, -1, 39651, 39652, 39653, 39654, -1, + 39655, 39656, 39657, 39658, 39659, -1, 39660, -1, + -1, -1, 39661, 39662, 39663, 39664, 39665, 39666, + 39667, -1, 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, 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, -1, -1, + 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, 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, -1, -1, 40300, 40301, + 40302, 40303, 40304, 40305, 40306, 40307, 40308, 40309, + 40310, 40311, 40312, 40313, 40314, 40315, 40316, 40317, + 40318, 40319, 40320, 40321, 40322, 40323, 40324, 40325, + 40326, 40327, 40328, 40329, 40330, 40331, 40332, 40333, + 40334, 40335, 40336, 40337, 40338, 40339, 40340, 40341, + 40342, 40343, 40344, 40345, 40346, 40347, 40348, 40349, + 40350, 40352, 40354, 40356, 40358, 40360, 40362, 40364, + 40366, 40368, 40370, -1, -1, -1, -1, -1, + 40372, 40375, 40378, 40381, 40384, 40387, 40390, 40393, + 40396, 40399, 40402, 40405, 40408, 40411, 40414, 40417, + 40420, 40423, 40426, 40429, 40432, 40435, 40438, 40441, + 40444, 40447, 40450, 40453, 40454, 40455, 40457, -1, + 40459, 40460, 40461, 40462, 40463, 40464, 40465, 40466, + 40467, 40468, 40469, 40470, 40471, 40472, 40473, 40474, + 40475, 40476, 40477, 40478, 40479, 40480, 40481, 40482, + 40483, 40484, 40485, 40487, 40489, 40491, 40493, 40496, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 40498, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 40500, 40502, 40504, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 40505, 40506, 40507, 40508, 40509, 40510, 40511, 40512, + 40513, 40514, 40515, 40516, 40517, 40518, 40519, 40520, + 40521, 40522, 40523, 40524, 40525, 40526, 40527, 40528, + 40529, 40530, 40531, 40532, 40533, 40534, 40535, 40536, + 40537, 40538, 40539, 40540, 40541, 40542, 40543, 40544, + 40545, 40546, 40547, -1, -1, -1, -1, -1, + 40548, 40551, 40554, 40557, 40560, 40563, 40566, 40569, + 40572, -1, -1, -1, -1, -1, -1, -1, + 40575, 40576, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 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, 8090, 8091, 8092, 8093, 8094, 8095, 8096, + 8097, 8098, 8099, 8100, 8101, 8102, 8103, 8104, + 8105, 8106, 8107, 8108, 8109, 8110, 8111, 8112, + 8113, 8114, 8115, 8116, 8117, 8118, 8119, 8120, + 8121, 8122, 8123, 8124, 8125, 8126, 8127, 8128, + 8129, 8130, 8131, 8132, 8133, 8134, 8135, 8136, + 8137, 8138, 8139, 8140, 8141, 8142, 8143, 8144, + 8145, 8146, 8147, 8148, 8149, 8150, 8151, 8152, + 8153, 8154, 8155, 8156, 8157, 8158, 8159, 8160, + 8161, 8162, 8163, 8164, 8165, 8166, 8167, 8168, + 8169, 8170, 8171, 8172, 8173, 8174, 8175, 8176, + 8177, 8178, 8179, 8180, 8181, 8182, 8183, 8184, + 8185, 8186, 8187, 8188, 8189, 8190, 8191, 8192, + 8193, 8194, 8195, 8196, 8197, 8198, 8199, 8200, + 8201, 8202, 8203, 8204, 8205, 8206, 8207, 8208, + 8209, 8210, 8211, 8212, 8213, 8214, 8215, 8216, + 8217, 8218, 8219, 8220, 8221, 8222, 8223, 8224, + 8225, 8226, 8227, 8228, 8229, 8230, 8231, 8232, + 8233, 8234, 8235, 8236, 8237, 8238, 8239, 8240, + 8241, 8242, 8243, 8244, 8245, 8246, 8247, 8248, + 8249, 8250, 8251, 8252, 8253, 8254, 8255, 8256, + 8257, 8258, 8259, 8260, 8261, 8262, 8263, 8264, + 8265, 8266, 8267, 8268, 8269, 8270, 8271, 8272, + 8273, 8274, 8275, 8276, 8277, 8278, 8279, 8280, + 8281, 8282, 8283, 8284, 8285, 8286, 8287, 8288, + 8289, 8290, 8291, 8292, 8293, 8294, 8295, 8296, + 8297, 8298, 8299, 8300, 8301, 8302, 8303, 8304, + 8305, 8306, 8307, 8308, 8309, 8310, 8311, 8312, + 8313, 8314, 8315, 8316, 8317, 8318, 8319, 8320, + 8321, 8322, 8323, 8324, 8325, 8326, 8327, 8328, + 8329, 8330, 8331, 8332, 8333, 8334, 8335, 8336, + 8337, 8338, 8339, 8340, 8341, 8342, 8343, 8344, + 8345, 8346, 8347, 8348, 8349, 8350, -1, -1 + } +}; diff --git a/gnulib/lib/uninorm/decomposition.c b/gnulib/lib/uninorm/decomposition.c new file mode 100644 index 0000000..af7b049 --- /dev/null +++ b/gnulib/lib/uninorm/decomposition.c @@ -0,0 +1,102 @@ +/* Decomposition of Unicode characters. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 + , 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 0000000..cd9590b --- /dev/null +++ b/gnulib/lib/uninorm/nfc.c @@ -0,0 +1,31 @@ +/* Unicode Normalization Form C. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..875883e --- /dev/null +++ b/gnulib/lib/uninorm/nfd.c @@ -0,0 +1,31 @@ +/* Unicode Normalization Form D. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..738b6be --- /dev/null +++ b/gnulib/lib/uninorm/nfkc.c @@ -0,0 +1,32 @@ +/* Unicode Normalization Form KC. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..c28bb13 --- /dev/null +++ b/gnulib/lib/uninorm/nfkd.c @@ -0,0 +1,32 @@ +/* Unicode Normalization Form KD. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..9b209c5 --- /dev/null +++ b/gnulib/lib/uninorm/normalize-internal.h @@ -0,0 +1,35 @@ +/* Normalization of Unicode strings. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#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 0000000..3b135c7 --- /dev/null +++ b/gnulib/lib/uninorm/u-normalize-internal.h @@ -0,0 +1,375 @@ +/* Decomposition and composition of Unicode strings. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +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 0000000..62f48ca --- /dev/null +++ b/gnulib/lib/uninorm/u-normcmp.h @@ -0,0 +1,64 @@ +/* Normalization insensitive comparison of Unicode strings. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +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 0000000..fa21549 --- /dev/null +++ b/gnulib/lib/uninorm/u-normcoll.h @@ -0,0 +1,65 @@ +/* Locale dependent, normalization insensitive comparison of Unicode strings. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +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 0000000..eb6920a --- /dev/null +++ b/gnulib/lib/uninorm/u-normxfrm.h @@ -0,0 +1,87 @@ +/* Locale dependent transformation for comparison of Unicode strings. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +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 = amemxfrm (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 0000000..db2ed8b --- /dev/null +++ b/gnulib/lib/uninorm/u16-normalize.c @@ -0,0 +1,38 @@ +/* Normalization of UTF-16 strings. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "uninorm.h" + +#include +#include +#include +#include + +#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 0000000..8ce3666 --- /dev/null +++ b/gnulib/lib/uninorm/u16-normcmp.c @@ -0,0 +1,33 @@ +/* Normalization insensitive comparison of UTF-16 strings. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "uninorm.h" + +#include +#include + +#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 0000000..fc806c7 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "uninorm.h" + +#include +#include + +#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 0000000..3d22cf6 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "uninorm.h" + +#include +#include + +#include "localcharset.h" +#include "uniconv.h" +#include "amemxfrm.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 0000000..4745fb9 --- /dev/null +++ b/gnulib/lib/uninorm/u32-normalize.c @@ -0,0 +1,38 @@ +/* Normalization of UTF-32 strings. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "uninorm.h" + +#include +#include +#include +#include + +#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 0000000..3a751ee --- /dev/null +++ b/gnulib/lib/uninorm/u32-normcmp.c @@ -0,0 +1,33 @@ +/* Normalization insensitive comparison of UTF-32 strings. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "uninorm.h" + +#include +#include + +#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 0000000..7d8719e --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "uninorm.h" + +#include +#include + +#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 0000000..0f29116 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "uninorm.h" + +#include +#include + +#include "localcharset.h" +#include "uniconv.h" +#include "amemxfrm.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 0000000..9bb52c8 --- /dev/null +++ b/gnulib/lib/uninorm/u8-normalize.c @@ -0,0 +1,38 @@ +/* Normalization of UTF-8 strings. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "uninorm.h" + +#include +#include +#include +#include + +#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 0000000..6ae77a2 --- /dev/null +++ b/gnulib/lib/uninorm/u8-normcmp.c @@ -0,0 +1,33 @@ +/* Normalization insensitive comparison of UTF-8 strings. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "uninorm.h" + +#include +#include + +#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 0000000..8184b21 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "uninorm.h" + +#include +#include + +#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 0000000..3236444 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "uninorm.h" + +#include +#include + +#include "localcharset.h" +#include "uniconv.h" +#include "amemxfrm.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 0000000..6d7e86f --- /dev/null +++ b/gnulib/lib/uninorm/uninorm-filter.c @@ -0,0 +1,367 @@ +/* Stream-based normalization of Unicode strings. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "uninorm.h" + +#include +#include +#include +#include + +#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 0000000..27307c8 --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +#include +#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 0000000..14f537f --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* 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 0000000..617eb79 --- /dev/null +++ b/gnulib/lib/unistd.in.h @@ -0,0 +1,1498 @@ +/* Substitute for and wrapper around . + Copyright (C) 2003-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 +@PRAGMA_COLUMNS@ + +/* Special invocation convention: + - On mingw, several headers, including , include , + but we need to ensure that both the system and + are completely included before we replace gethostname. */ +#if @GNULIB_GETHOSTNAME@ && @UNISTD_H_HAVE_WINSOCK2_H@ \ + && !defined _GL_WINSOCK2_H_WITNESS && defined _WINSOCK2_H +/* is being indirectly included for the first time from + ; avoid declaring any overrides. */ +# if @HAVE_UNISTD_H@ +# @INCLUDE_NEXT@ @NEXT_UNISTD_H@ +# else +# error unexpected; report this to bug-gnulib@gnu.org +# endif +# define _GL_WINSOCK2_H_WITNESS + +/* Normal invocation. */ +#elif !defined _@GUARD_PREFIX@_UNISTD_H + +/* The include_next requires a split double-inclusion guard. */ +#if @HAVE_UNISTD_H@ +# @INCLUDE_NEXT@ @NEXT_UNISTD_H@ +#endif + +/* Get all possible declarations of gethostname(). */ +#if @GNULIB_GETHOSTNAME@ && @UNISTD_H_HAVE_WINSOCK2_H@ \ + && !defined _GL_INCLUDING_WINSOCK2_H +# define _GL_INCLUDING_WINSOCK2_H +# include +# undef _GL_INCLUDING_WINSOCK2_H +#endif + +#if !defined _@GUARD_PREFIX@_UNISTD_H && !defined _GL_INCLUDING_WINSOCK2_H +#define _@GUARD_PREFIX@_UNISTD_H + +/* NetBSD 5.0 mis-defines NULL. Also get size_t. */ +#include + +/* mingw doesn't define the SEEK_* or *_FILENO macros in . */ +/* Cygwin 1.7.1 declares symlinkat in , not in . */ +/* But avoid namespace pollution on glibc systems. */ +#if (!(defined SEEK_CUR && defined SEEK_END && defined SEEK_SET) \ + || ((@GNULIB_SYMLINKAT@ || defined GNULIB_POSIXCHECK) \ + && defined __CYGWIN__)) \ + && ! defined __GLIBC__ +# include +#endif + +/* Cygwin 1.7.1 declares unlinkat in , not in . */ +/* But avoid namespace pollution on glibc systems. */ +#if (@GNULIB_UNLINKAT@ || defined GNULIB_POSIXCHECK) && defined __CYGWIN__ \ + && ! defined __GLIBC__ +# include +#endif + +/* mingw fails to declare _exit in . */ +/* mingw, MSVC, BeOS, Haiku declare environ in , not in + . */ +/* Solaris declares getcwd not only in but also in . */ +/* But avoid namespace pollution on glibc systems. */ +#ifndef __GLIBC__ +# include +#endif + +/* Native Windows platforms declare chdir, getcwd, rmdir in + and/or , not in . */ +#if ((@GNULIB_CHDIR@ || @GNULIB_GETCWD@ || @GNULIB_RMDIR@ \ + || defined GNULIB_POSIXCHECK) \ + && ((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__)) +# include /* mingw32, mingw64 */ +# include /* mingw64, MSVC 9 */ +#endif + +/* AIX and OSF/1 5.1 declare getdomainname in , not in . + NonStop Kernel declares gethostname in , not in . */ +/* But avoid namespace pollution on glibc systems. */ +#if ((@GNULIB_GETDOMAINNAME@ && (defined _AIX || defined __osf__)) \ + || (@GNULIB_GETHOSTNAME@ && defined __TANDEM)) \ + && !defined __GLIBC__ +# include +#endif + +/* MSVC defines off_t in . */ +#if !@HAVE_UNISTD_H@ +/* Get off_t. */ +# include +#endif + +#if (@GNULIB_READ@ || @GNULIB_WRITE@ \ + || @GNULIB_READLINK@ || @GNULIB_READLINKAT@ \ + || @GNULIB_PREAD@ || @GNULIB_PWRITE@ || defined GNULIB_POSIXCHECK) +/* Get ssize_t. */ +# include +#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 +#endif + +/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ + +/* The definition of _GL_ARG_NONNULL is copied here. */ + +/* The definition of _GL_WARN_ON_USE is copied here. */ + + +/* Hide some function declarations from . */ + +#if @GNULIB_GETHOSTNAME@ && @UNISTD_H_HAVE_WINSOCK2_H@ +# if !defined _@GUARD_PREFIX@_SYS_SOCKET_H +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# 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 +# else + _GL_WARN_ON_USE (socket, + "socket() used without including "); + _GL_WARN_ON_USE (connect, + "connect() used without including "); + _GL_WARN_ON_USE (accept, + "accept() used without including "); + _GL_WARN_ON_USE (bind, + "bind() used without including "); + _GL_WARN_ON_USE (getpeername, + "getpeername() used without including "); + _GL_WARN_ON_USE (getsockname, + "getsockname() used without including "); + _GL_WARN_ON_USE (getsockopt, + "getsockopt() used without including "); + _GL_WARN_ON_USE (listen, + "listen() used without including "); + _GL_WARN_ON_USE (recv, + "recv() used without including "); + _GL_WARN_ON_USE (send, + "send() used without including "); + _GL_WARN_ON_USE (recvfrom, + "recvfrom() used without including "); + _GL_WARN_ON_USE (sendto, + "sendto() used without including "); + _GL_WARN_ON_USE (setsockopt, + "setsockopt() used without including "); + _GL_WARN_ON_USE (shutdown, + "shutdown() used without including "); +# endif +# endif +# if !defined _@GUARD_PREFIX@_SYS_SELECT_H +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef select +# define select select_used_without_including_sys_select_h +# else + _GL_WARN_ON_USE (select, + "select() used without including "); +# endif +# endif +#endif + + +/* 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. */ + + +#if defined GNULIB_POSIXCHECK +/* The access() function is a security risk. */ +_GL_WARN_ON_USE (access, "the access function is a security risk - " + "use the gnulib module faccessat instead"); +#endif + + +#if @GNULIB_CHDIR@ +_GL_CXXALIAS_SYS (chdir, int, (const char *file) _GL_ARG_NONNULL ((1))); +_GL_CXXALIASWARN (chdir); +#elif defined GNULIB_POSIXCHECK +# undef chdir +# if HAVE_RAW_DECL_CHDIR +_GL_WARN_ON_USE (chown, "chdir is not always in - " + "use gnulib module chdir for portability"); +# endif +#endif + + +#if @GNULIB_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:2008 specification + . */ +# if @REPLACE_DUP2@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define dup2 rpl_dup2 +# endif +_GL_FUNCDECL_RPL (dup2, int, (int oldfd, int newfd)); +_GL_CXXALIAS_RPL (dup2, int, (int oldfd, int newfd)); +# else +# if !@HAVE_DUP2@ +_GL_FUNCDECL_SYS (dup2, int, (int oldfd, int newfd)); +# endif +_GL_CXXALIAS_SYS (dup2, int, (int oldfd, int newfd)); +# endif +_GL_CXXALIASWARN (dup2); +#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 ) + 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 + . */ +# if @HAVE_DUP3@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define dup3 rpl_dup3 +# endif +_GL_FUNCDECL_RPL (dup3, int, (int oldfd, int newfd, int flags)); +_GL_CXXALIAS_RPL (dup3, int, (int oldfd, int newfd, int flags)); +# else +_GL_FUNCDECL_SYS (dup3, int, (int oldfd, int newfd, int flags)); +_GL_CXXALIAS_SYS (dup3, int, (int oldfd, int newfd, int flags)); +# endif +_GL_CXXALIASWARN (dup3); +#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 +# define environ (*_NSGetEnviron ()) +# else +# ifdef __cplusplus +extern "C" { +# endif +extern char **environ; +# ifdef __cplusplus +} +# endif +# 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@ +/* Like access(), except that it uses the effective user id and group id of + the current process. */ +# if !@HAVE_EUIDACCESS@ +_GL_FUNCDECL_SYS (euidaccess, int, (const char *filename, int mode) + _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (euidaccess, int, (const char *filename, int mode)); +_GL_CXXALIASWARN (euidaccess); +# if defined GNULIB_POSIXCHECK +/* Like access(), this function is a security risk. */ +_GL_WARN_ON_USE (euidaccess, "the euidaccess function is a security risk - " + "use the gnulib module faccessat instead"); +# 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@ +_GL_FUNCDECL_SYS (faccessat, int, + (int fd, char const *file, int mode, int flag) + _GL_ARG_NONNULL ((2))); +# endif +_GL_CXXALIAS_SYS (faccessat, int, + (int fd, char const *file, int mode, int flag)); +_GL_CXXALIASWARN (faccessat); +#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@ +/* 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:2008 specification + . */ +# if ! @HAVE_FCHDIR@ +_GL_FUNCDECL_SYS (fchdir, int, (int /*fd*/)); + +/* Gnulib internal hooks needed to maintain the fchdir metadata. */ +_GL_EXTERN_C int _gl_register_fd (int fd, const char *filename) + _GL_ARG_NONNULL ((2)); +_GL_EXTERN_C void _gl_unregister_fd (int fd); +_GL_EXTERN_C int _gl_register_dup (int oldfd, int newfd); +_GL_EXTERN_C const char *_gl_directory_name (int fd); + +# else +# if !@HAVE_DECL_FCHDIR@ +_GL_FUNCDECL_SYS (fchdir, int, (int /*fd*/)); +# endif +# endif +_GL_CXXALIAS_SYS (fchdir, int, (int /*fd*/)); +_GL_CXXALIASWARN (fchdir); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef fchownat +# define fchownat rpl_fchownat +# endif +_GL_FUNCDECL_RPL (fchownat, int, (int fd, char const *file, + uid_t owner, gid_t group, int flag) + _GL_ARG_NONNULL ((2))); +_GL_CXXALIAS_RPL (fchownat, int, (int fd, char const *file, + uid_t owner, gid_t group, int flag)); +# else +# if !@HAVE_FCHOWNAT@ +_GL_FUNCDECL_SYS (fchownat, int, (int fd, char const *file, + uid_t owner, gid_t group, int flag) + _GL_ARG_NONNULL ((2))); +# endif +_GL_CXXALIAS_SYS (fchownat, int, (int fd, char const *file, + uid_t owner, gid_t group, int flag)); +# endif +_GL_CXXALIASWARN (fchownat); +#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_FDATASYNC@ +/* Synchronize changes to a file. + Return 0 if successful, otherwise -1 and errno set. + See POSIX:2008 specification + . */ +# if !@HAVE_FDATASYNC@ || !@HAVE_DECL_FDATASYNC@ +_GL_FUNCDECL_SYS (fdatasync, int, (int fd)); +# endif +_GL_CXXALIAS_SYS (fdatasync, int, (int fd)); +_GL_CXXALIASWARN (fdatasync); +#elif defined GNULIB_POSIXCHECK +# undef fdatasync +# if HAVE_RAW_DECL_FDATASYNC +_GL_WARN_ON_USE (fdatasync, "fdatasync is unportable - " + "use gnulib module fdatasync for portability"); +# endif +#endif + + +#if @GNULIB_FSYNC@ +/* Synchronize changes, including metadata, to a file. + Return 0 if successful, otherwise -1 and errno set. + See POSIX:2008 specification + . */ +# if !@HAVE_FSYNC@ +_GL_FUNCDECL_SYS (fsync, int, (int fd)); +# endif +_GL_CXXALIAS_SYS (fsync, int, (int fd)); +_GL_CXXALIASWARN (fsync); +#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@ +/* 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:2008 specification + . */ +# if !@HAVE_FTRUNCATE@ +_GL_FUNCDECL_SYS (ftruncate, int, (int fd, off_t length)); +# endif +_GL_CXXALIAS_SYS (ftruncate, int, (int fd, off_t length)); +_GL_CXXALIASWARN (ftruncate); +#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@ +/* 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:2008 specification + . + 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. */ +# if @REPLACE_GETCWD@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define getcwd rpl_getcwd +# endif +_GL_FUNCDECL_RPL (getcwd, char *, (char *buf, size_t size)); +_GL_CXXALIAS_RPL (getcwd, char *, (char *buf, size_t size)); +# else +/* Need to cast, because on mingw, the second parameter is + int size. */ +_GL_CXXALIAS_SYS_CAST (getcwd, char *, (char *buf, size_t size)); +# endif +_GL_CXXALIASWARN (getcwd); +#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 @REPLACE_GETDOMAINNAME@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef getdomainname +# define getdomainname rpl_getdomainname +# endif +_GL_FUNCDECL_RPL (getdomainname, int, (char *name, size_t len) + _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (getdomainname, int, (char *name, size_t len)); +# else +# if !@HAVE_DECL_GETDOMAINNAME@ +_GL_FUNCDECL_SYS (getdomainname, int, (char *name, size_t len) + _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (getdomainname, int, (char *name, size_t len)); +# endif +_GL_CXXALIASWARN (getdomainname); +#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@ +/* Return the maximum number of file descriptors in the current process. + In POSIX, this is same as sysconf (_SC_OPEN_MAX). */ +# if !@HAVE_GETDTABLESIZE@ +_GL_FUNCDECL_SYS (getdtablesize, int, (void)); +# endif +_GL_CXXALIAS_SYS (getdtablesize, int, (void)); +_GL_CXXALIASWARN (getdtablesize); +#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@ +/* 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. */ +# if @REPLACE_GETGROUPS@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef getgroups +# define getgroups rpl_getgroups +# endif +_GL_FUNCDECL_RPL (getgroups, int, (int n, gid_t *groups)); +_GL_CXXALIAS_RPL (getgroups, int, (int n, gid_t *groups)); +# else +# if !@HAVE_GETGROUPS@ +_GL_FUNCDECL_SYS (getgroups, int, (int n, gid_t *groups)); +# endif +_GL_CXXALIAS_SYS (getgroups, int, (int n, gid_t *groups)); +# endif +_GL_CXXALIASWARN (getgroups); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef gethostname +# define gethostname rpl_gethostname +# endif +_GL_FUNCDECL_RPL (gethostname, int, (char *name, size_t len) + _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (gethostname, int, (char *name, size_t len)); +# else +# if !@HAVE_GETHOSTNAME@ +_GL_FUNCDECL_SYS (gethostname, int, (char *name, size_t len) + _GL_ARG_NONNULL ((1))); +# endif +/* Need to cast, because on Solaris 10 and OSF/1 5.1 systems, the second + parameter is + int len. */ +_GL_CXXALIAS_SYS_CAST (gethostname, int, (char *name, size_t len)); +# endif +_GL_CXXALIASWARN (gethostname); +#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 . + + 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@ +_GL_FUNCDECL_SYS (getlogin, char *, (void)); +# endif +_GL_CXXALIAS_SYS (getlogin, char *, (void)); +_GL_CXXALIASWARN (getlogin); +#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 . + + 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 @REPLACE_GETLOGIN_R@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define getlogin_r rpl_getlogin_r +# endif +_GL_FUNCDECL_RPL (getlogin_r, int, (char *name, size_t size) + _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (getlogin_r, int, (char *name, size_t size)); +# else +# if !@HAVE_DECL_GETLOGIN_R@ +_GL_FUNCDECL_SYS (getlogin_r, int, (char *name, size_t size) + _GL_ARG_NONNULL ((1))); +# endif +/* Need to cast, because on Solaris 10 systems, the second argument is + int size. */ +_GL_CXXALIAS_SYS_CAST (getlogin_r, int, (char *name, size_t size)); +# endif +_GL_CXXALIASWARN (getlogin_r); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define getpagesize rpl_getpagesize +# endif +_GL_FUNCDECL_RPL (getpagesize, int, (void)); +_GL_CXXALIAS_RPL (getpagesize, int, (void)); +# else +# if !@HAVE_GETPAGESIZE@ +# if !defined getpagesize +/* This is for POSIX systems. */ +# if !defined _gl_getpagesize && defined _SC_PAGESIZE +# if ! (defined __VMS && __VMS_VER < 70000000) +# define _gl_getpagesize() sysconf (_SC_PAGESIZE) +# endif +# endif +/* This is for older VMS. */ +# if !defined _gl_getpagesize && defined __VMS +# ifdef __ALPHA +# define _gl_getpagesize() 8192 +# else +# define _gl_getpagesize() 512 +# endif +# endif +/* This is for BeOS. */ +# if !defined _gl_getpagesize && @HAVE_OS_H@ +# include +# if defined B_PAGE_SIZE +# define _gl_getpagesize() B_PAGE_SIZE +# endif +# endif +/* This is for AmigaOS4.0. */ +# if !defined _gl_getpagesize && defined __amigaos4__ +# define _gl_getpagesize() 2048 +# endif +/* This is for older Unix systems. */ +# if !defined _gl_getpagesize && @HAVE_SYS_PARAM_H@ +# include +# ifdef EXEC_PAGESIZE +# define _gl_getpagesize() EXEC_PAGESIZE +# else +# ifdef NBPG +# ifndef CLSIZE +# define CLSIZE 1 +# endif +# define _gl_getpagesize() (NBPG * CLSIZE) +# else +# ifdef NBPC +# define _gl_getpagesize() NBPC +# endif +# endif +# endif +# endif +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define getpagesize() _gl_getpagesize () +# else +# if !GNULIB_defined_getpagesize_function +static inline int +getpagesize () +{ + return _gl_getpagesize (); +} +# define GNULIB_defined_getpagesize_function 1 +# endif +# endif +# endif +# endif +/* Need to cast, because on Cygwin 1.5.x systems, the return type is size_t. */ +_GL_CXXALIAS_SYS_CAST (getpagesize, int, (void)); +# endif +# if @HAVE_DECL_GETPAGESIZE@ +_GL_CXXALIASWARN (getpagesize); +# 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@ +/* Return the next valid login shell on the system, or NULL when the end of + the list has been reached. */ +# if !@HAVE_DECL_GETUSERSHELL@ +_GL_FUNCDECL_SYS (getusershell, char *, (void)); +# endif +_GL_CXXALIAS_SYS (getusershell, char *, (void)); +_GL_CXXALIASWARN (getusershell); +#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 +#endif + +#if @GNULIB_GETUSERSHELL@ +/* Rewind to pointer that is advanced at each getusershell() call. */ +# if !@HAVE_DECL_GETUSERSHELL@ +_GL_FUNCDECL_SYS (setusershell, void, (void)); +# endif +_GL_CXXALIAS_SYS (setusershell, void, (void)); +_GL_CXXALIASWARN (setusershell); +#elif defined GNULIB_POSIXCHECK +# undef setusershell +# if HAVE_RAW_DECL_SETUSERSHELL +_GL_WARN_ON_USE (setusershell, "setusershell is unportable - " + "use gnulib module getusershell for portability"); +# endif +#endif + +#if @GNULIB_GETUSERSHELL@ +/* Free the pointer that is advanced at each getusershell() call and + associated resources. */ +# if !@HAVE_DECL_GETUSERSHELL@ +_GL_FUNCDECL_SYS (endusershell, void, (void)); +# endif +_GL_CXXALIAS_SYS (endusershell, void, (void)); +_GL_CXXALIASWARN (endusershell); +#elif defined GNULIB_POSIXCHECK +# 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_GROUP_MEMBER@ +/* Determine whether group id is in calling user's group list. */ +# if !@HAVE_GROUP_MEMBER@ +_GL_FUNCDECL_SYS (group_member, int, (gid_t gid)); +# endif +_GL_CXXALIAS_SYS (group_member, int, (gid_t gid)); +_GL_CXXALIASWARN (group_member); +#elif defined GNULIB_POSIXCHECK +# undef group_member +# if HAVE_RAW_DECL_GROUP_MEMBER +_GL_WARN_ON_USE (group_member, "group_member is unportable - " + "use gnulib module group-member for portability"); +# endif +#endif + + +#if @GNULIB_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:2008 specification + . */ +# if @REPLACE_LCHOWN@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef lchown +# define lchown rpl_lchown +# endif +_GL_FUNCDECL_RPL (lchown, int, (char const *file, uid_t owner, gid_t group) + _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (lchown, int, (char const *file, uid_t owner, gid_t group)); +# else +# if !@HAVE_LCHOWN@ +_GL_FUNCDECL_SYS (lchown, int, (char const *file, uid_t owner, gid_t group) + _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (lchown, int, (char const *file, uid_t owner, gid_t group)); +# endif +_GL_CXXALIASWARN (lchown); +#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@ +/* Create a new hard link for an existing file. + Return 0 if successful, otherwise -1 and errno set. + See POSIX:2008 specification + . */ +# if @REPLACE_LINK@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define link rpl_link +# endif +_GL_FUNCDECL_RPL (link, int, (const char *path1, const char *path2) + _GL_ARG_NONNULL ((1, 2))); +_GL_CXXALIAS_RPL (link, int, (const char *path1, const char *path2)); +# else +# if !@HAVE_LINK@ +_GL_FUNCDECL_SYS (link, int, (const char *path1, const char *path2) + _GL_ARG_NONNULL ((1, 2))); +# endif +_GL_CXXALIAS_SYS (link, int, (const char *path1, const char *path2)); +# endif +_GL_CXXALIASWARN (link); +#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@ +/* 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 @REPLACE_LINKAT@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef linkat +# define linkat rpl_linkat +# endif +_GL_FUNCDECL_RPL (linkat, int, + (int fd1, const char *path1, int fd2, const char *path2, + int flag) + _GL_ARG_NONNULL ((2, 4))); +_GL_CXXALIAS_RPL (linkat, int, + (int fd1, const char *path1, int fd2, const char *path2, + int flag)); +# else +# if !@HAVE_LINKAT@ +_GL_FUNCDECL_SYS (linkat, int, + (int fd1, const char *path1, int fd2, const char *path2, + int flag) + _GL_ARG_NONNULL ((2, 4))); +# endif +_GL_CXXALIAS_SYS (linkat, int, + (int fd1, const char *path1, int fd2, const char *path2, + int flag)); +# endif +_GL_CXXALIASWARN (linkat); +#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@ +/* 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:2008 specification + . */ +# if @REPLACE_LSEEK@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define lseek rpl_lseek +# endif +_GL_FUNCDECL_RPL (lseek, off_t, (int fd, off_t offset, int whence)); +_GL_CXXALIAS_RPL (lseek, off_t, (int fd, off_t offset, int whence)); +# else +_GL_CXXALIAS_SYS (lseek, off_t, (int fd, off_t offset, int whence)); +# endif +_GL_CXXALIASWARN (lseek); +#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_PIPE@ +/* Create a pipe, defaulting to O_BINARY mode. + 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. */ +# if !@HAVE_PIPE@ +_GL_FUNCDECL_SYS (pipe, int, (int fd[2]) _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (pipe, int, (int fd[2])); +_GL_CXXALIASWARN (pipe); +#elif defined GNULIB_POSIXCHECK +# undef pipe +# if HAVE_RAW_DECL_PIPE +_GL_WARN_ON_USE (pipe, "pipe is unportable - " + "use gnulib module pipe-posix 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 ) + 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 + . */ +# if @HAVE_PIPE2@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define pipe2 rpl_pipe2 +# endif +_GL_FUNCDECL_RPL (pipe2, int, (int fd[2], int flags) _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (pipe2, int, (int fd[2], int flags)); +# else +_GL_FUNCDECL_SYS (pipe2, int, (int fd[2], int flags) _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_SYS (pipe2, int, (int fd[2], int flags)); +# endif +_GL_CXXALIASWARN (pipe2); +#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@ +/* 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:2008 specification + . */ +# if @REPLACE_PREAD@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef pread +# define pread rpl_pread +# endif +_GL_FUNCDECL_RPL (pread, ssize_t, + (int fd, void *buf, size_t bufsize, off_t offset) + _GL_ARG_NONNULL ((2))); +_GL_CXXALIAS_RPL (pread, ssize_t, + (int fd, void *buf, size_t bufsize, off_t offset)); +# else +# if !@HAVE_PREAD@ +_GL_FUNCDECL_SYS (pread, ssize_t, + (int fd, void *buf, size_t bufsize, off_t offset) + _GL_ARG_NONNULL ((2))); +# endif +_GL_CXXALIAS_SYS (pread, ssize_t, + (int fd, void *buf, size_t bufsize, off_t offset)); +# endif +_GL_CXXALIASWARN (pread); +#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_PWRITE@ +/* Write at most BUFSIZE bytes from BUF into FD, starting at OFFSET. + Return the number of bytes written if successful, otherwise + set errno and return -1. 0 indicates nothing written. See the + POSIX:2008 specification + . */ +# if @REPLACE_PWRITE@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef pwrite +# define pwrite rpl_pwrite +# endif +_GL_FUNCDECL_RPL (pwrite, ssize_t, + (int fd, const void *buf, size_t bufsize, off_t offset) + _GL_ARG_NONNULL ((2))); +_GL_CXXALIAS_RPL (pwrite, ssize_t, + (int fd, const void *buf, size_t bufsize, off_t offset)); +# else +# if !@HAVE_PWRITE@ +_GL_FUNCDECL_SYS (pwrite, ssize_t, + (int fd, const void *buf, size_t bufsize, off_t offset) + _GL_ARG_NONNULL ((2))); +# endif +_GL_CXXALIAS_SYS (pwrite, ssize_t, + (int fd, const void *buf, size_t bufsize, off_t offset)); +# endif +_GL_CXXALIASWARN (pwrite); +#elif defined GNULIB_POSIXCHECK +# undef pwrite +# if HAVE_RAW_DECL_PWRITE +_GL_WARN_ON_USE (pwrite, "pwrite is unportable - " + "use gnulib module pwrite for portability"); +# endif +#endif + + +#if @GNULIB_READ@ +/* Read up to COUNT bytes from file descriptor FD into the buffer starting + at BUF. See the POSIX:2008 specification + . */ +# if @REPLACE_READ@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef read +# define read rpl_read +# endif +_GL_FUNCDECL_RPL (read, ssize_t, (int fd, void *buf, size_t count) + _GL_ARG_NONNULL ((2))); +_GL_CXXALIAS_RPL (read, ssize_t, (int fd, void *buf, size_t count)); +# else +/* Need to cast, because on mingw, the third parameter is + unsigned int count + and the return type is 'int'. */ +_GL_CXXALIAS_SYS_CAST (read, ssize_t, (int fd, void *buf, size_t count)); +# endif +_GL_CXXALIASWARN (read); +#endif + + +#if @GNULIB_READLINK@ +/* 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:2008 specification + . */ +# if @REPLACE_READLINK@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define readlink rpl_readlink +# endif +_GL_FUNCDECL_RPL (readlink, ssize_t, + (const char *file, char *buf, size_t bufsize) + _GL_ARG_NONNULL ((1, 2))); +_GL_CXXALIAS_RPL (readlink, ssize_t, + (const char *file, char *buf, size_t bufsize)); +# else +# if !@HAVE_READLINK@ +_GL_FUNCDECL_SYS (readlink, ssize_t, + (const char *file, char *buf, size_t bufsize) + _GL_ARG_NONNULL ((1, 2))); +# endif +_GL_CXXALIAS_SYS (readlink, ssize_t, + (const char *file, char *buf, size_t bufsize)); +# endif +_GL_CXXALIASWARN (readlink); +#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@ +_GL_FUNCDECL_SYS (readlinkat, ssize_t, + (int fd, char const *file, char *buf, size_t len) + _GL_ARG_NONNULL ((2, 3))); +# endif +_GL_CXXALIAS_SYS (readlinkat, ssize_t, + (int fd, char const *file, char *buf, size_t len)); +_GL_CXXALIASWARN (readlinkat); +#elif defined GNULIB_POSIXCHECK +# undef readlinkat +# if HAVE_RAW_DECL_READLINKAT +_GL_WARN_ON_USE (readlinkat, "readlinkat is not portable - " + "use gnulib module readlinkat for portability"); +# endif +#endif + + +#if @GNULIB_RMDIR@ +/* Remove the directory DIR. */ +# if @REPLACE_RMDIR@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define rmdir rpl_rmdir +# endif +_GL_FUNCDECL_RPL (rmdir, int, (char const *name) _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (rmdir, int, (char const *name)); +# else +_GL_CXXALIAS_SYS (rmdir, int, (char const *name)); +# endif +_GL_CXXALIASWARN (rmdir); +#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_SETHOSTNAME@ +/* Set the host name of the machine. + The host name may or may not be fully qualified. + + Put LEN bytes of NAME into the host name. + Return 0 if successful, otherwise, set errno and return -1. + + Platforms with no ability to set the hostname return -1 and set + errno = ENOSYS. */ +# if !@HAVE_SETHOSTNAME@ || !@HAVE_DECL_SETHOSTNAME@ +_GL_FUNCDECL_SYS (sethostname, int, (const char *name, size_t len) + _GL_ARG_NONNULL ((1))); +# endif +/* Need to cast, because on Solaris 11 2011-10, MacOS X 10.5, IRIX 6.5 + and FreeBSD 6.4 the second parameter is int. On Solaris 11 + 2011-10, the first parameter is not const. */ +_GL_CXXALIAS_SYS_CAST (sethostname, int, (const char *name, size_t len)); +_GL_CXXALIASWARN (sethostname); +#elif defined GNULIB_POSIXCHECK +# undef sethostname +# if HAVE_RAW_DECL_SETHOSTNAME +_GL_WARN_ON_USE (sethostname, "sethostname is unportable - " + "use gnulib module sethostname for portability"); +# endif +#endif + + +#if @GNULIB_SLEEP@ +/* Pause the execution of the current thread for N seconds. + Returns the number of seconds left to sleep. + See the POSIX:2008 specification + . */ +# if @REPLACE_SLEEP@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef sleep +# define sleep rpl_sleep +# endif +_GL_FUNCDECL_RPL (sleep, unsigned int, (unsigned int n)); +_GL_CXXALIAS_RPL (sleep, unsigned int, (unsigned int n)); +# else +# if !@HAVE_SLEEP@ +_GL_FUNCDECL_SYS (sleep, unsigned int, (unsigned int n)); +# endif +_GL_CXXALIAS_SYS (sleep, unsigned int, (unsigned int n)); +# endif +_GL_CXXALIASWARN (sleep); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef symlink +# define symlink rpl_symlink +# endif +_GL_FUNCDECL_RPL (symlink, int, (char const *contents, char const *file) + _GL_ARG_NONNULL ((1, 2))); +_GL_CXXALIAS_RPL (symlink, int, (char const *contents, char const *file)); +# else +# if !@HAVE_SYMLINK@ +_GL_FUNCDECL_SYS (symlink, int, (char const *contents, char const *file) + _GL_ARG_NONNULL ((1, 2))); +# endif +_GL_CXXALIAS_SYS (symlink, int, (char const *contents, char const *file)); +# endif +_GL_CXXALIASWARN (symlink); +#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@ +_GL_FUNCDECL_SYS (symlinkat, int, + (char const *contents, int fd, char const *file) + _GL_ARG_NONNULL ((1, 3))); +# endif +_GL_CXXALIAS_SYS (symlinkat, int, + (char const *contents, int fd, char const *file)); +_GL_CXXALIASWARN (symlinkat); +#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_TTYNAME_R@ +/* Store at most BUFLEN characters of the pathname of the terminal FD is + open on in BUF. Return 0 on success, otherwise an error number. */ +# if @REPLACE_TTYNAME_R@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef ttyname_r +# define ttyname_r rpl_ttyname_r +# endif +_GL_FUNCDECL_RPL (ttyname_r, int, + (int fd, char *buf, size_t buflen) _GL_ARG_NONNULL ((2))); +_GL_CXXALIAS_RPL (ttyname_r, int, + (int fd, char *buf, size_t buflen)); +# else +# if !@HAVE_DECL_TTYNAME_R@ +_GL_FUNCDECL_SYS (ttyname_r, int, + (int fd, char *buf, size_t buflen) _GL_ARG_NONNULL ((2))); +# endif +_GL_CXXALIAS_SYS (ttyname_r, int, + (int fd, char *buf, size_t buflen)); +# endif +_GL_CXXALIASWARN (ttyname_r); +#elif defined GNULIB_POSIXCHECK +# undef ttyname_r +# if HAVE_RAW_DECL_TTYNAME_R +_GL_WARN_ON_USE (ttyname_r, "ttyname_r is not portable - " + "use gnulib module ttyname_r for portability"); +# endif +#endif + + +#if @GNULIB_UNLINK@ +# if @REPLACE_UNLINK@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef unlink +# define unlink rpl_unlink +# endif +_GL_FUNCDECL_RPL (unlink, int, (char const *file) _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (unlink, int, (char const *file)); +# else +_GL_CXXALIAS_SYS (unlink, int, (char const *file)); +# endif +_GL_CXXALIASWARN (unlink); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef unlinkat +# define unlinkat rpl_unlinkat +# endif +_GL_FUNCDECL_RPL (unlinkat, int, (int fd, char const *file, int flag) + _GL_ARG_NONNULL ((2))); +_GL_CXXALIAS_RPL (unlinkat, int, (int fd, char const *file, int flag)); +# else +# if !@HAVE_UNLINKAT@ +_GL_FUNCDECL_SYS (unlinkat, int, (int fd, char const *file, int flag) + _GL_ARG_NONNULL ((2))); +# endif +_GL_CXXALIAS_SYS (unlinkat, int, (int fd, char const *file, int flag)); +# endif +_GL_CXXALIASWARN (unlinkat); +#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@ +/* Pause the execution of the current thread for N microseconds. + Returns 0 on completion, or -1 on range error. + See the POSIX:2001 specification + . */ +# if @REPLACE_USLEEP@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef usleep +# define usleep rpl_usleep +# endif +_GL_FUNCDECL_RPL (usleep, int, (useconds_t n)); +_GL_CXXALIAS_RPL (usleep, int, (useconds_t n)); +# else +# if !@HAVE_USLEEP@ +_GL_FUNCDECL_SYS (usleep, int, (useconds_t n)); +# endif +_GL_CXXALIAS_SYS (usleep, int, (useconds_t n)); +# endif +_GL_CXXALIASWARN (usleep); +#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@ +/* Write up to COUNT bytes starting at BUF to file descriptor FD. + See the POSIX:2008 specification + . */ +# if @REPLACE_WRITE@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef write +# define write rpl_write +# endif +_GL_FUNCDECL_RPL (write, ssize_t, (int fd, const void *buf, size_t count) + _GL_ARG_NONNULL ((2))); +_GL_CXXALIAS_RPL (write, ssize_t, (int fd, const void *buf, size_t count)); +# else +/* Need to cast, because on mingw, the third parameter is + unsigned int count + and the return type is 'int'. */ +_GL_CXXALIAS_SYS_CAST (write, ssize_t, (int fd, const void *buf, size_t count)); +# endif +_GL_CXXALIASWARN (write); +#endif + + +#endif /* _@GUARD_PREFIX@_UNISTD_H */ +#endif /* _@GUARD_PREFIX@_UNISTD_H */ diff --git a/gnulib/lib/unistdio.in.h b/gnulib/lib/unistdio.in.h new file mode 100644 index 0000000..8d9cc6f --- /dev/null +++ b/gnulib/lib/unistdio.in.h @@ -0,0 +1,256 @@ +/* Elementary Unicode string functions. + Copyright (C) 2002, 2005-2007, 2009-2011 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 . */ + +#ifndef _UNISTDIO_H +#define _UNISTDIO_H + +#include "unitypes.h" + +/* Get size_t. */ +#include + +/* Get FILE. */ +#include + +/* Get va_list. */ +#include + +#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 0000000..7efc4e4 --- /dev/null +++ b/gnulib/lib/unistdio/u-asnprintf.h @@ -0,0 +1,28 @@ +/* Formatted output to strings. + Copyright (C) 1999, 2002, 2005-2007, 2009-2011 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 . */ + +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 0000000..38d9829 --- /dev/null +++ b/gnulib/lib/unistdio/u-asprintf.h @@ -0,0 +1,28 @@ +/* Formatted output to strings. + Copyright (C) 1999, 2002, 2005-2007, 2009-2011 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 . */ + +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 0000000..a32991d --- /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-2011 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 . */ + +#include + +/* 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 0000000..feb3f56 --- /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-2011 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 . */ + +#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 0000000..651c7fe --- /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-2011 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 . */ + +#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 0000000..8094f49 --- /dev/null +++ b/gnulib/lib/unistdio/u-snprintf.h @@ -0,0 +1,28 @@ +/* Formatted output to strings. + Copyright (C) 1999, 2002, 2005-2007, 2009-2011 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 . */ + +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 0000000..eb3119d --- /dev/null +++ b/gnulib/lib/unistdio/u-sprintf.h @@ -0,0 +1,28 @@ +/* Formatted output to strings. + Copyright (C) 1999, 2002, 2005-2007, 2009-2011 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 . */ + +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 0000000..68bc9b5 --- /dev/null +++ b/gnulib/lib/unistdio/u-vasprintf.h @@ -0,0 +1,35 @@ +/* Formatted output to strings. + Copyright (C) 1999, 2002, 2006-2011 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 . */ + +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 0000000..977a123 --- /dev/null +++ b/gnulib/lib/unistdio/u-vsnprintf.h @@ -0,0 +1,52 @@ +/* Formatted output to strings. + Copyright (C) 1999, 2002, 2006-2011 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 . */ + +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 0000000..28a0c9b --- /dev/null +++ b/gnulib/lib/unistdio/u-vsprintf.h @@ -0,0 +1,58 @@ +/* Formatted output to strings. + Copyright (C) 1999, 2002, 2006-2011 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 . */ + +#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 0000000..a589f25 --- /dev/null +++ b/gnulib/lib/unistdio/u16-asnprintf.c @@ -0,0 +1,29 @@ +/* Formatted output to strings. + Copyright (C) 1999, 2002, 2005-2007, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include "unistdio.h" + +#include + +#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 0000000..d26f5cb --- /dev/null +++ b/gnulib/lib/unistdio/u16-asprintf.c @@ -0,0 +1,29 @@ +/* Formatted output to strings. + Copyright (C) 1999, 2002, 2005-2007, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include "unistdio.h" + +#include + +#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 0000000..815e2e2 --- /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-2011 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 . */ + +#include + +/* 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 0000000..0ef7c6d --- /dev/null +++ b/gnulib/lib/unistdio/u16-snprintf.c @@ -0,0 +1,29 @@ +/* Formatted output to strings. + Copyright (C) 1999, 2002, 2005-2007, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include "unistdio.h" + +#include + +#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 0000000..fbacdd4 --- /dev/null +++ b/gnulib/lib/unistdio/u16-sprintf.c @@ -0,0 +1,29 @@ +/* Formatted output to strings. + Copyright (C) 1999, 2002, 2005-2007, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include "unistdio.h" + +#include + +#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 0000000..56a86cc --- /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-2011 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 . */ + +#include + +/* Specification. */ +#include "unistdio.h" + +#include + +#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 0000000..4efeefd --- /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-2011 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 . */ + +#include + +/* Specification. */ +#include "unistdio.h" + +#include + +#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 0000000..bf74511 --- /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-2011 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 . */ + +#include + +/* Specification. */ +#include "unistdio.h" + +#include + +#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 0000000..3876b0e --- /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-2011 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 . */ + +#include + +/* Specification. */ +#include "unistdio.h" + +#include + +#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 0000000..146e55c --- /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-2011 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 . */ + +/* Tell glibc's to provide a prototype for snprintf(). + This must come before because may include + , and once has been included, it's too late. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif + +#include +#include + +/* 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 0000000..8fd47bc --- /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-2011 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 . */ + +#include + +/* Specification. */ +#include "unistdio.h" + +#include +#include +#include + +#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 0000000..7b5443b --- /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-2011 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 . */ + +#include + +/* Specification. */ +#include "unistdio.h" + +#include +#include +#include +#include +#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 0000000..c6b69a9 --- /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-2011 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 . */ + +#include + +/* Specification. */ +#include "unistdio.h" + +#include +#include +#include +#include +#include + +#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 0000000..3c20d6e --- /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-2011 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 . */ + +/* Tell glibc's to provide a prototype for snprintf(). + This must come before because may include + , and once has been included, it's too late. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif + +#include +#include + +/* 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 0000000..5bb1bdb --- /dev/null +++ b/gnulib/lib/unistdio/u16-vasprintf.c @@ -0,0 +1,31 @@ +/* Formatted output to strings. + Copyright (C) 1999, 2002, 2006-2007, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include "unistdio.h" + +#include +#include +#include + +#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 0000000..0add114 --- /dev/null +++ b/gnulib/lib/unistdio/u16-vsnprintf.c @@ -0,0 +1,34 @@ +/* Formatted output to strings. + Copyright (C) 1999, 2002, 2006-2007, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include "unistdio.h" + +#include +#include +#include +#include +#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 0000000..eee0be7 --- /dev/null +++ b/gnulib/lib/unistdio/u16-vsprintf.c @@ -0,0 +1,33 @@ +/* Formatted output to strings. + Copyright (C) 1999, 2002, 2006-2007, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include "unistdio.h" + +#include +#include +#include +#include +#include + +#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 0000000..588b9d8 --- /dev/null +++ b/gnulib/lib/unistdio/u32-asnprintf.c @@ -0,0 +1,29 @@ +/* Formatted output to strings. + Copyright (C) 1999, 2002, 2005-2007, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include "unistdio.h" + +#include + +#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 0000000..fffd751 --- /dev/null +++ b/gnulib/lib/unistdio/u32-asprintf.c @@ -0,0 +1,29 @@ +/* Formatted output to strings. + Copyright (C) 1999, 2002, 2005-2007, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include "unistdio.h" + +#include + +#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 0000000..972f273 --- /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-2011 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 . */ + +#include + +/* 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 0000000..bcd4485 --- /dev/null +++ b/gnulib/lib/unistdio/u32-snprintf.c @@ -0,0 +1,29 @@ +/* Formatted output to strings. + Copyright (C) 1999, 2002, 2005-2007, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include "unistdio.h" + +#include + +#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 0000000..a45c0bb --- /dev/null +++ b/gnulib/lib/unistdio/u32-sprintf.c @@ -0,0 +1,29 @@ +/* Formatted output to strings. + Copyright (C) 1999, 2002, 2005-2007, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include "unistdio.h" + +#include + +#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 0000000..b389424 --- /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-2011 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 . */ + +#include + +/* Specification. */ +#include "unistdio.h" + +#include + +#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 0000000..a9869e3 --- /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-2011 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 . */ + +#include + +/* Specification. */ +#include "unistdio.h" + +#include + +#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 0000000..7991ad6 --- /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-2011 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 . */ + +#include + +/* Specification. */ +#include "unistdio.h" + +#include + +#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 0000000..769aa88 --- /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-2011 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 . */ + +#include + +/* Specification. */ +#include "unistdio.h" + +#include + +#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 0000000..084549e --- /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-2011 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 . */ + +/* Tell glibc's to provide a prototype for snprintf(). + This must come before because may include + , and once has been included, it's too late. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif + +#include +#include + +/* 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 0000000..3c11874 --- /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-2011 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 . */ + +#include + +/* Specification. */ +#include "unistdio.h" + +#include +#include +#include + +#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 0000000..21ba48d --- /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-2011 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 . */ + +#include + +/* Specification. */ +#include "unistdio.h" + +#include +#include +#include +#include +#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 0000000..4f0b4a7 --- /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-2011 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 . */ + +#include + +/* Specification. */ +#include "unistdio.h" + +#include +#include +#include +#include +#include + +#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 0000000..7705cdc --- /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-2011 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 . */ + +/* Tell glibc's to provide a prototype for snprintf(). + This must come before because may include + , and once has been included, it's too late. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif + +#include +#include + +/* 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 0000000..32b3979 --- /dev/null +++ b/gnulib/lib/unistdio/u32-vasprintf.c @@ -0,0 +1,31 @@ +/* Formatted output to strings. + Copyright (C) 1999, 2002, 2006-2007, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include "unistdio.h" + +#include +#include +#include + +#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 0000000..5d5b159 --- /dev/null +++ b/gnulib/lib/unistdio/u32-vsnprintf.c @@ -0,0 +1,34 @@ +/* Formatted output to strings. + Copyright (C) 1999, 2002, 2006-2007, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include "unistdio.h" + +#include +#include +#include +#include +#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 0000000..fd0eff9 --- /dev/null +++ b/gnulib/lib/unistdio/u32-vsprintf.c @@ -0,0 +1,33 @@ +/* Formatted output to strings. + Copyright (C) 1999, 2002, 2006-2007, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include "unistdio.h" + +#include +#include +#include +#include +#include + +#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 0000000..a51fb44 --- /dev/null +++ b/gnulib/lib/unistdio/u8-asnprintf.c @@ -0,0 +1,29 @@ +/* Formatted output to strings. + Copyright (C) 1999, 2002, 2005-2007, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include "unistdio.h" + +#include + +#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 0000000..8f20526 --- /dev/null +++ b/gnulib/lib/unistdio/u8-asprintf.c @@ -0,0 +1,29 @@ +/* Formatted output to strings. + Copyright (C) 1999, 2002, 2005-2007, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include "unistdio.h" + +#include + +#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 0000000..deaf1bf --- /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-2011 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 . */ + +#include + +/* 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 0000000..dd7257e --- /dev/null +++ b/gnulib/lib/unistdio/u8-snprintf.c @@ -0,0 +1,29 @@ +/* Formatted output to strings. + Copyright (C) 1999, 2002, 2005-2007, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include "unistdio.h" + +#include + +#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 0000000..670c047 --- /dev/null +++ b/gnulib/lib/unistdio/u8-sprintf.c @@ -0,0 +1,29 @@ +/* Formatted output to strings. + Copyright (C) 1999, 2002, 2005-2007, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include "unistdio.h" + +#include + +#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 0000000..264edd1 --- /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-2011 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 . */ + +#include + +/* Specification. */ +#include "unistdio.h" + +#include + +#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 0000000..a80fd1c --- /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-2011 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 . */ + +#include + +/* Specification. */ +#include "unistdio.h" + +#include + +#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 0000000..bbe7d8b --- /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-2011 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 . */ + +#include + +/* Specification. */ +#include "unistdio.h" + +#include + +#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 0000000..fa3c5c9 --- /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-2011 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 . */ + +#include + +/* Specification. */ +#include "unistdio.h" + +#include + +#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 0000000..4e0af81 --- /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-2011 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 . */ + +/* Tell glibc's to provide a prototype for snprintf(). + This must come before because may include + , and once has been included, it's too late. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif + +#include +#include + +/* 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 0000000..2fa8d60 --- /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-2011 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 . */ + +#include + +/* Specification. */ +#include "unistdio.h" + +#include +#include +#include + +#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 0000000..c5195f6 --- /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-2011 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 . */ + +#include + +/* Specification. */ +#include "unistdio.h" + +#include +#include +#include +#include +#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 0000000..8964dea --- /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-2011 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 . */ + +#include + +/* Specification. */ +#include "unistdio.h" + +#include +#include +#include +#include +#include + +#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 0000000..0076cd3 --- /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-2011 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 . */ + +/* Tell glibc's to provide a prototype for snprintf(). + This must come before because may include + , and once has been included, it's too late. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif + +#include +#include + +/* 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 0000000..27b35bb --- /dev/null +++ b/gnulib/lib/unistdio/u8-vasprintf.c @@ -0,0 +1,31 @@ +/* Formatted output to strings. + Copyright (C) 1999, 2002, 2006-2007, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include "unistdio.h" + +#include +#include +#include + +#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 0000000..625d9d4 --- /dev/null +++ b/gnulib/lib/unistdio/u8-vsnprintf.c @@ -0,0 +1,34 @@ +/* Formatted output to strings. + Copyright (C) 1999, 2002, 2006-2007, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include "unistdio.h" + +#include +#include +#include +#include +#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 0000000..184703d --- /dev/null +++ b/gnulib/lib/unistdio/u8-vsprintf.c @@ -0,0 +1,33 @@ +/* Formatted output to strings. + Copyright (C) 1999, 2002, 2006-2007, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include "unistdio.h" + +#include +#include +#include +#include +#include + +#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 0000000..73c0175 --- /dev/null +++ b/gnulib/lib/unistdio/ulc-asnprintf.c @@ -0,0 +1,29 @@ +/* Formatted output to strings. + Copyright (C) 1999, 2002, 2005-2007, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include "unistdio.h" + +#include + +#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 0000000..64e21d7 --- /dev/null +++ b/gnulib/lib/unistdio/ulc-asprintf.c @@ -0,0 +1,29 @@ +/* Formatted output to strings. + Copyright (C) 1999, 2002, 2006-2007, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include "unistdio.h" + +#include + +#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 0000000..b6d5192 --- /dev/null +++ b/gnulib/lib/unistdio/ulc-fprintf.c @@ -0,0 +1,74 @@ +/* Formatted output to a stream. + Copyright (C) 2004, 2006-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +/* Specification. */ +#include "unistdio.h" + +#include +#include +#include +#include +#include + +#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 0000000..b690198 --- /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-2011 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 . */ + +#include + +/* 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 0000000..573ca89 --- /dev/null +++ b/gnulib/lib/unistdio/ulc-snprintf.c @@ -0,0 +1,29 @@ +/* Formatted output to strings. + Copyright (C) 1999, 2002, 2005-2007, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include "unistdio.h" + +#include + +#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 0000000..e3cf9fa --- /dev/null +++ b/gnulib/lib/unistdio/ulc-sprintf.c @@ -0,0 +1,29 @@ +/* Formatted output to strings. + Copyright (C) 1999, 2002, 2005-2007, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include "unistdio.h" + +#include + +#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 0000000..2520acb --- /dev/null +++ b/gnulib/lib/unistdio/ulc-vasnprintf.c @@ -0,0 +1,47 @@ +/* Formatted output to strings. + Copyright (C) 1999, 2002, 2006-2007, 2009-2011 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 . */ + +/* Tell glibc's to provide a prototype for snprintf(). + This must come before because may include + , and once has been included, it's too late. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif + +#include +#include + +/* 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 0000000..eeaf507 --- /dev/null +++ b/gnulib/lib/unistdio/ulc-vasprintf.c @@ -0,0 +1,31 @@ +/* Formatted output to strings. + Copyright (C) 1999, 2002, 2006-2007, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include "unistdio.h" + +#include +#include +#include + +#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 0000000..2ce0835 --- /dev/null +++ b/gnulib/lib/unistdio/ulc-vfprintf.c @@ -0,0 +1,71 @@ +/* Formatted output to a stream. + Copyright (C) 2004, 2006-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +/* Specification. */ +#include "unistdio.h" + +#include +#include +#include +#include +#include + +#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 0000000..e2a4b15 --- /dev/null +++ b/gnulib/lib/unistdio/ulc-vsnprintf.c @@ -0,0 +1,34 @@ +/* Formatted output to strings. + Copyright (C) 1999, 2002, 2006-2007, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include "unistdio.h" + +#include +#include +#include +#include +#include + +#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 0000000..1aacb26 --- /dev/null +++ b/gnulib/lib/unistdio/ulc-vsprintf.c @@ -0,0 +1,33 @@ +/* Formatted output to strings. + Copyright (C) 1999, 2002, 2006-2007, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include "unistdio.h" + +#include +#include +#include +#include +#include + +#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.in.h b/gnulib/lib/unistr.in.h new file mode 100644 index 0000000..c665aa8 --- /dev/null +++ b/gnulib/lib/unistr.in.h @@ -0,0 +1,692 @@ +/* Elementary Unicode string functions. + Copyright (C) 2001-2002, 2005-2011 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 . */ + +#ifndef _UNISTR_H +#define _UNISTR_H + +#include "unitypes.h" + +/* Get common macros for C. */ +#include "unused-parameter.h" + +/* Get bool. */ +#include + +/* Get size_t. */ +#include + +#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. */ + +#if GNULIB_UNISTR_U8_MBTOUC_UNSAFE || HAVE_LIBUNISTRING +# 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 + +#if GNULIB_UNISTR_U16_MBTOUC_UNSAFE || HAVE_LIBUNISTRING +# 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 + +#if GNULIB_UNISTR_U32_MBTOUC_UNSAFE || HAVE_LIBUNISTRING +# 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 + +#if GNULIB_UNISTR_U8_MBTOUC || HAVE_LIBUNISTRING +# 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 + +#if GNULIB_UNISTR_U16_MBTOUC || HAVE_LIBUNISTRING +# 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 + +#if GNULIB_UNISTR_U32_MBTOUC || HAVE_LIBUNISTRING +# 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(). */ + +#if GNULIB_UNISTR_U8_MBTOUCR || HAVE_LIBUNISTRING +extern int + u8_mbtoucr (ucs4_t *puc, const uint8_t *s, size_t n); +#endif + +#if GNULIB_UNISTR_U16_MBTOUCR || HAVE_LIBUNISTRING +extern int + u16_mbtoucr (ucs4_t *puc, const uint16_t *s, size_t n); +#endif + +#if GNULIB_UNISTR_U32_MBTOUCR || HAVE_LIBUNISTRING +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. */ + +#if GNULIB_UNISTR_U8_UCTOMB || HAVE_LIBUNISTRING +/* 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 + +#if GNULIB_UNISTR_U16_UCTOMB || HAVE_LIBUNISTRING +/* 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 + +#if GNULIB_UNISTR_U32_UCTOMB || HAVE_LIBUNISTRING +# 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(). */ +#ifdef __sun +/* Avoid a collision with the u8_strcmp() function in Solaris 11 libc. */ +extern int + u8_strcmp_gnu (const uint8_t *s1, const uint8_t *s2); +# define u8_strcmp u8_strcmp_gnu +#else +extern int + u8_strcmp (const uint8_t *s1, const uint8_t *s2); +#endif +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 0000000..27ace69 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +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 0000000..07b74ff --- /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-2011 Free Software Foundation, + Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include +#include + +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 0000000..0c2bb10 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +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 0000000..5a6d53f --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +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 0000000..ff0eee6 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +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 0000000..42cf01d --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +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 0000000..6f77a04 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +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 0000000..1755f4c --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +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 0000000..408a5dc --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +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 0000000..a993110 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +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 0000000..2a1b553 --- /dev/null +++ b/gnulib/lib/unistr/u-strcoll.h @@ -0,0 +1,92 @@ +/* Compare UTF-8/UTF-16/UTF-32 strings using the collation rules of the current + locale. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +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; + const char *encoding = locale_charset (); + char *sl1; + char *sl2; + int result; + + /* Pass iconveh_error here, not iconveh_question_mark. Otherwise the + conversion to locale encoding can do transliteration or map some + characters to question marks, leading to results that depend on the + iconv() implementation and are not obvious. */ + sl1 = U_STRCONV_TO_ENCODING (s1, encoding, iconveh_error); + if (sl1 != NULL) + { + sl2 = U_STRCONV_TO_ENCODING (s2, encoding, iconveh_error); + 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 drop Unicode TAG + characters. 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_ENCODING (s2, encoding, iconveh_error); + 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 0000000..493fcdb --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +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 0000000..d55294a --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +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 0000000..ecfcc7b --- /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-2011 Free Software Foundation, + Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include +#include + +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 0000000..69ed336 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +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 0000000..2b876db --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +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 0000000..8e49f04 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +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 0000000..c042750 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +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 0000000..5582b3a --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +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 0000000..c414576 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +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 0000000..336ce8b --- /dev/null +++ b/gnulib/lib/unistr/u-strstr.h @@ -0,0 +1,131 @@ +/* Substring test for UTF-8/UTF-16/UTF-32 strings. + Copyright (C) 1999, 2002, 2006, 2010-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002, 2005. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +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 (only one unit)? */ + if (needle[1] == 0) + return U_STRCHR (haystack, first); + +#ifdef U_STRMBTOUC + /* Is needle nearly empty (only one character)? */ + { + ucs4_t first_uc; + int count = U_STRMBTOUC (&first_uc, needle); + if (count > 0 && needle[count] == 0) + return U_STRCHR (haystack, first_uc); + } +#endif + +#if UNIT_IS_UINT8_T + return (uint8_t *) strstr ((const char *) haystack, (const char *) needle); +#else + { + /* Minimizing the worst-case complexity: + Let n = U_STRLEN(haystack), m = U_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 UNIT *needle_last_ccount = needle; /* = needle + last_ccount */ + + /* Speed up the following searches of needle by caching its first + character. */ + UNIT 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 += + U_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 UNIT *result; + bool success = + knuth_morris_pratt (haystack, + needle - 1, U_STRLEN (needle - 1), + &result); + if (success) + return (UNIT *) result; + try_kmp = false; + } + } + + outer_loop_count++; + comparison_count++; + if (*haystack == b) + /* The first character matches. */ + { + const UNIT *rhaystack = haystack + 1; + const UNIT *rneedle = needle; + + for (;; rhaystack++, rneedle++) + { + if (*rneedle == 0) + /* Found a match. */ + return (UNIT *) haystack; + if (*rhaystack == 0) + /* No match. */ + return NULL; + comparison_count++; + if (*rhaystack != *rneedle) + /* Nothing in this round. */ + break; + } + } + } + } +#endif +} diff --git a/gnulib/lib/unistr/u-strtok.h b/gnulib/lib/unistr/u-strtok.h new file mode 100644 index 0000000..763dcca --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +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 0000000..79c9c49 --- /dev/null +++ b/gnulib/lib/unistr/u16-check.c @@ -0,0 +1,51 @@ +/* Check UTF-16 string. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..dab4ce3 --- /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-2011 Free Software Foundation, + Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..4e3e136 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..f990c5c --- /dev/null +++ b/gnulib/lib/unistr/u16-cmp2.c @@ -0,0 +1,28 @@ +/* Compare pieces of UTF-16 strings. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..930fffc --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..dff750e --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..9e0c019 --- /dev/null +++ b/gnulib/lib/unistr/u16-endswith.c @@ -0,0 +1,27 @@ +/* Substring test for UTF-16 strings. + Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..60f7a69 --- /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-2011 Free Software + Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..fb0df36 --- /dev/null +++ b/gnulib/lib/unistr/u16-mbsnlen.c @@ -0,0 +1,42 @@ +/* Count characters in UTF-16 string. + Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..e8e9c92 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..b0abe51 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..b393397 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +#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 0000000..9941e9b --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +#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 0000000..53014a3 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..03c6486 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..c948710 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..40304d9 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..22b9370 --- /dev/null +++ b/gnulib/lib/unistr/u16-set.c @@ -0,0 +1,26 @@ +/* Fill UTF-16 string. + Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..a7eff4f --- /dev/null +++ b/gnulib/lib/unistr/u16-startswith.c @@ -0,0 +1,25 @@ +/* Substring test for UTF-16 strings. + Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..8085a43 --- /dev/null +++ b/gnulib/lib/unistr/u16-stpcpy.c @@ -0,0 +1,26 @@ +/* Copy UTF-16 string. + Copyright (C) 1999, 2002, 2006-2007, 2009-2011 Free Software Foundation, + Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..825326d --- /dev/null +++ b/gnulib/lib/unistr/u16-stpncpy.c @@ -0,0 +1,25 @@ +/* Copy UTF-16 string. + Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..c7819bb --- /dev/null +++ b/gnulib/lib/unistr/u16-strcat.c @@ -0,0 +1,26 @@ +/* Concatenate UTF-16 strings. + Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..028a94d --- /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-2011 Free Software Foundation, + Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..df27535 --- /dev/null +++ b/gnulib/lib/unistr/u16-strcmp.c @@ -0,0 +1,50 @@ +/* Compare UTF-16 strings. + Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..1867e88 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unistr.h" + +#include +#include +#include + +#include "uniconv.h" + +#define FUNC u16_strcoll +#define UNIT uint16_t +#define U_STRCMP u16_strcmp +#define U_STRCONV_TO_ENCODING u16_strconv_to_encoding +#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 0000000..bc0fb9c --- /dev/null +++ b/gnulib/lib/unistr/u16-strcpy.c @@ -0,0 +1,25 @@ +/* Copy UTF-16 string. + Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..7a29f21 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..22c4c18 --- /dev/null +++ b/gnulib/lib/unistr/u16-strdup.c @@ -0,0 +1,26 @@ +/* Copy UTF-16 string. + Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..6e4f52c --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..4e997b5 --- /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-2011 Free Software + Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..f4eeb49 --- /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-2011 Free Software + Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..601cd8d --- /dev/null +++ b/gnulib/lib/unistr/u16-strncat.c @@ -0,0 +1,26 @@ +/* Concatenate UTF-16 strings. + Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..55863b1 --- /dev/null +++ b/gnulib/lib/unistr/u16-strncmp.c @@ -0,0 +1,54 @@ +/* Compare UTF-16 strings. + Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..6f0d638 --- /dev/null +++ b/gnulib/lib/unistr/u16-strncpy.c @@ -0,0 +1,25 @@ +/* Copy UTF-16 string. + Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..8c2a80e --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..150ceea --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..1ee2d7f --- /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-2011 Free Software Foundation, + Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..c39bb71 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..934a4fc --- /dev/null +++ b/gnulib/lib/unistr/u16-strstr.c @@ -0,0 +1,37 @@ +/* Substring test for UTF-16 strings. + Copyright (C) 1999, 2002, 2006, 2010-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unistr.h" + +#include "malloca.h" + +/* FIXME: Maybe walking the string via u16_mblen is a win? */ + +#define UNIT uint16_t + +#define CANON_ELEMENT(c) c +#include "str-kmp.h" + +#define FUNC u16_strstr +#define U_STRCHR u16_strchr +#define U_STRMBTOUC u16_strmbtouc +#define U_STRLEN u16_strlen +#define U_STRNLEN u16_strnlen +#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 0000000..50f30a3 --- /dev/null +++ b/gnulib/lib/unistr/u16-strtok.c @@ -0,0 +1,27 @@ +/* Tokenize UTF-16 string. + Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..bcf2e63 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unistr.h" + +#define FUNC u16_to_u32 +#define SRC_UNIT uint16_t +#define DST_UNIT uint32_t + +#include +#include +#include + +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 0000000..02eee97 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unistr.h" + +#define FUNC u16_to_u8 +#define SRC_UNIT uint16_t +#define DST_UNIT uint8_t + +#include +#include +#include + +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 0000000..9ec1e7b --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..1bc66fd --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +#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 0000000..9476a1c --- /dev/null +++ b/gnulib/lib/unistr/u32-check.c @@ -0,0 +1,39 @@ +/* Check UTF-32 string. + Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..5dba257 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..73c6dc9 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..cfe00a6 --- /dev/null +++ b/gnulib/lib/unistr/u32-cmp2.c @@ -0,0 +1,28 @@ +/* Compare pieces of UTF-32 strings. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..892d235 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..5d8b01a --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..bb7a2ce --- /dev/null +++ b/gnulib/lib/unistr/u32-endswith.c @@ -0,0 +1,27 @@ +/* Substring test for UTF-32 strings. + Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..b4ae146 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..d9ca6ea --- /dev/null +++ b/gnulib/lib/unistr/u32-mbsnlen.c @@ -0,0 +1,27 @@ +/* Count characters in UTF-32 string. + Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..6130fce --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +#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 0000000..2146b47 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +#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 0000000..80f5194 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..c3f1161 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..d087630 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..c77f50c --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..21cda1a --- /dev/null +++ b/gnulib/lib/unistr/u32-set.c @@ -0,0 +1,26 @@ +/* Fill UTF-32 string. + Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..b884ff6 --- /dev/null +++ b/gnulib/lib/unistr/u32-startswith.c @@ -0,0 +1,25 @@ +/* Substring test for UTF-32 strings. + Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..134a574 --- /dev/null +++ b/gnulib/lib/unistr/u32-stpcpy.c @@ -0,0 +1,25 @@ +/* Copy UTF-32 string. + Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..8b3fe52 --- /dev/null +++ b/gnulib/lib/unistr/u32-stpncpy.c @@ -0,0 +1,25 @@ +/* Copy UTF-32 string. + Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..8ca8feb --- /dev/null +++ b/gnulib/lib/unistr/u32-strcat.c @@ -0,0 +1,26 @@ +/* Concatenate UTF-32 strings. + Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..baa661a --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..70bfc1a --- /dev/null +++ b/gnulib/lib/unistr/u32-strcmp.c @@ -0,0 +1,36 @@ +/* Compare UTF-32 strings. + Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..52cee48 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unistr.h" + +#include +#include +#include + +#include "uniconv.h" + +#define FUNC u32_strcoll +#define UNIT uint32_t +#define U_STRCMP u32_strcmp +#define U_STRCONV_TO_ENCODING u32_strconv_to_encoding +#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 0000000..c2801ec --- /dev/null +++ b/gnulib/lib/unistr/u32-strcpy.c @@ -0,0 +1,25 @@ +/* Copy UTF-32 string. + Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..b53a417 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..e8853d9 --- /dev/null +++ b/gnulib/lib/unistr/u32-strdup.c @@ -0,0 +1,26 @@ +/* Copy UTF-32 string. + Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..e173a1b --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..722c434 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..7f02599 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..7f1f277 --- /dev/null +++ b/gnulib/lib/unistr/u32-strncat.c @@ -0,0 +1,26 @@ +/* Concatenate UTF-32 strings. + Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..27a1113 --- /dev/null +++ b/gnulib/lib/unistr/u32-strncmp.c @@ -0,0 +1,40 @@ +/* Compare UTF-32 strings. + Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..aa43115 --- /dev/null +++ b/gnulib/lib/unistr/u32-strncpy.c @@ -0,0 +1,25 @@ +/* Copy UTF-32 string. + Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..c2da0ed --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..df7571d --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..436e351 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..56f5456 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..00a7f3e --- /dev/null +++ b/gnulib/lib/unistr/u32-strstr.c @@ -0,0 +1,34 @@ +/* Substring test for UTF-32 strings. + Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unistr.h" + +#include "malloca.h" + +#define UNIT uint32_t + +#define CANON_ELEMENT(c) c +#include "str-kmp.h" + +#define FUNC u32_strstr +#define U_STRCHR u32_strchr +#define U_STRLEN u32_strlen +#define U_STRNLEN u32_strnlen +#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 0000000..54c9fed --- /dev/null +++ b/gnulib/lib/unistr/u32-strtok.c @@ -0,0 +1,27 @@ +/* Tokenize UTF-32 string. + Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..131807b --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unistr.h" + +#define FUNC u32_to_u16 +#define SRC_UNIT uint32_t +#define DST_UNIT uint16_t + +#include +#include +#include + +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 0000000..3b2e1d2 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unistr.h" + +#define FUNC u32_to_u8 +#define SRC_UNIT uint32_t +#define DST_UNIT uint8_t + +#include +#include +#include + +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 0000000..9342806 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +#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 0000000..29dc463 --- /dev/null +++ b/gnulib/lib/unistr/u8-check.c @@ -0,0 +1,105 @@ +/* Check UTF-8 string. + Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 u8-mbtouc-aux.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 0000000..0776d91 --- /dev/null +++ b/gnulib/lib/unistr/u8-chr.c @@ -0,0 +1,201 @@ +/* Search character in piece of UTF-8 string. + Copyright (C) 1999, 2002, 2006-2007, 2009-2011 Free Software Foundation, + Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unistr.h" + +#include + +uint8_t * +u8_chr (const uint8_t *s, size_t n, ucs4_t uc) +{ + if (uc < 0x80) + { + uint8_t c0 = uc; + + return (uint8_t *) memchr ((const char *) s, c0, n); + } + + { + uint8_t c[6]; + size_t uc_size; + uc_size = u8_uctomb_aux (c, uc, 6); + + if (n < uc_size) + return NULL; + + /* For multibyte character matching we use a Boyer-Moore like + algorithm that searches for the last byte, skipping multi-byte + jumps, and matches back from there. + + Instead of using a table as is usual for Boyer-Moore, we compare + the candidate last byte s[UC_SIZE-1] with each of the possible + bytes in the UTF-8 representation of UC. If the final byte does + not match, we will perform up to UC_SIZE comparisons per memory + load---but each comparison lets us skip one byte in the input! + + If the final byte matches, the "real" Boyer-Moore algorithm + is approximated. Instead, u8_chr just looks for other cN that + are equal to the final byte and uses those to try realigning to + another possible match. For example, when searching for 0xF0 + 0xAA 0xBB 0xAA it will always skip forward by two bytes, even if + the character in the string was for example 0xF1 0xAA 0xBB 0xAA. + The advantage of this scheme is that the skip count after a failed + match can be computed outside the loop, and that it keeps the + complexity low for a pretty rare case. In particular, since c[0] + is never between 0x80 and 0xBF, c[0] is never equal to c[UC_SIZE-1] + and this is optimal for two-byte UTF-8 characters. */ + switch (uc_size) + { + case 2: + { + uint8_t c0 = c[0]; + uint8_t c1 = c[1]; + const uint8_t *end = s + n - 1; + + do + { + /* Here s < end. + Test whether s[0..1] == { c0, c1 }. */ + uint8_t s1 = s[1]; + if (s1 == c1) + { + if (*s == c0) + return (uint8_t *) s; + else + /* Skip the search at s + 1, because s[1] = c1 < c0. */ + s += 2; + } + else + { + if (s1 == c0) + s++; + else + /* Skip the search at s + 1, because s[1] != c0. */ + s += 2; + } + } + while (s < end); + break; + } + + case 3: + { + uint8_t c0 = c[0]; + uint8_t c1 = c[1]; + uint8_t c2 = c[2]; + const uint8_t *end = s + n - 2; + size_t skip; + + if (c2 == c1) + skip = 1; + else + skip = 3; + + do + { + /* Here s < end. + Test whether s[0..2] == { c0, c1, c2 }. */ + uint8_t s2 = s[2]; + if (s2 == c2) + { + if (s[1] == c1 && *s == c0) + return (uint8_t *) s; + else + /* If c2 != c1: + Skip the search at s + 1, because s[2] == c2 != c1. + Skip the search at s + 2, because s[2] == c2 < c0. */ + s += skip; + } + else + { + if (s2 == c1) + s++; + else if (s2 == c0) + /* Skip the search at s + 1, because s[2] != c1. */ + s += 2; + else + /* Skip the search at s + 1, because s[2] != c1. + Skip the search at s + 2, because s[2] != c0. */ + s += 3; + } + } + while (s < end); + break; + } + + case 4: + { + uint8_t c0 = c[0]; + uint8_t c1 = c[1]; + uint8_t c2 = c[2]; + uint8_t c3 = c[3]; + const uint8_t *end = s + n - 3; + size_t skip; + + if (c3 == c2) + skip = 1; + else if (c3 == c1) + skip = 2; + else + skip = 4; + + do + { + /* Here s < end. + Test whether s[0..3] == { c0, c1, c2, c3 }. */ + uint8_t s3 = s[3]; + if (s3 == c3) + { + if (s[2] == c2 && s[1] == c1 && *s == c0) + return (uint8_t *) s; + else + /* If c3 != c2: + Skip the search at s + 1, because s[3] == c3 != c2. + If c3 != c1: + Skip the search at s + 2, because s[3] == c3 != c1. + Skip the search at s + 3, because s[3] == c3 < c0. */ + s += skip; + } + else + { + if (s3 == c2) + s++; + else if (s3 == c1) + /* Skip the search at s + 1, because s[3] != c2. */ + s += 2; + else if (s3 == c0) + /* Skip the search at s + 1, because s[3] != c2. + Skip the search at s + 2, because s[3] != c1. */ + s += 3; + else + /* Skip the search at s + 1, because s[3] != c2. + Skip the search at s + 2, because s[3] != c1. + Skip the search at s + 3, because s[3] != c0. */ + s += 4; + } + } + while (s < end); + break; + } + } + return NULL; + } +} diff --git a/gnulib/lib/unistr/u8-cmp.c b/gnulib/lib/unistr/u8-cmp.c new file mode 100644 index 0000000..364e2c1 --- /dev/null +++ b/gnulib/lib/unistr/u8-cmp.c @@ -0,0 +1,30 @@ +/* Compare pieces of UTF-8 strings. + Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unistr.h" + +#include + +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 0000000..0b640f4 --- /dev/null +++ b/gnulib/lib/unistr/u8-cmp2.c @@ -0,0 +1,28 @@ +/* Compare pieces of UTF-8 strings. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..2b67fdb --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..ba56565 --- /dev/null +++ b/gnulib/lib/unistr/u8-cpy.c @@ -0,0 +1,25 @@ +/* Copy piece of UTF-8 string. + Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..eca82e2 --- /dev/null +++ b/gnulib/lib/unistr/u8-endswith.c @@ -0,0 +1,27 @@ +/* Substring test for UTF-8 strings. + Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..0652b41 --- /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-2011 Free Software + Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unistr.h" + +int +u8_mblen (const uint8_t *s, size_t n) +{ + if (n > 0) + { + /* Keep in sync with unistr.h and u8-mbtouc-aux.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 0000000..4d086a4 --- /dev/null +++ b/gnulib/lib/unistr/u8-mbsnlen.c @@ -0,0 +1,44 @@ +/* Count characters in UTF-8 string. + Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 = u8_mbtouc (&uc, s, n); + else 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 0000000..1ac2957 --- /dev/null +++ b/gnulib/lib/unistr/u8-mbtouc-aux.c @@ -0,0 +1,240 @@ +/* Conversion UTF-8 to UCS-4. + Copyright (C) 2001-2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 1; + } + } + else if (c < 0xf0) + { + if (n >= 3) + { + if ((s[1] ^ 0x80) < 0x40) + { + if ((s[2] ^ 0x80) < 0x40) + { + if ((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 */ + *puc = 0xfffd; + return 3; + } + /* invalid multibyte character */ + *puc = 0xfffd; + return 2; + } + /* invalid multibyte character */ + } + else + { + /* incomplete multibyte character */ + *puc = 0xfffd; + if (n == 1 || (s[1] ^ 0x80) >= 0x40) + return 1; + else + return 2; + } + } + else if (c < 0xf8) + { + if (n >= 4) + { + if ((s[1] ^ 0x80) < 0x40) + { + if ((s[2] ^ 0x80) < 0x40) + { + if ((s[3] ^ 0x80) < 0x40) + { + if ((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 */ + *puc = 0xfffd; + return 4; + } + /* invalid multibyte character */ + *puc = 0xfffd; + return 3; + } + /* invalid multibyte character */ + *puc = 0xfffd; + return 2; + } + /* invalid multibyte character */ + } + else + { + /* incomplete multibyte character */ + *puc = 0xfffd; + if (n == 1 || (s[1] ^ 0x80) >= 0x40) + return 1; + else if (n == 2 || (s[2] ^ 0x80) >= 0x40) + return 2; + else + return 3; + } + } +#if 0 + else if (c < 0xfc) + { + if (n >= 5) + { + if ((s[1] ^ 0x80) < 0x40) + { + if ((s[2] ^ 0x80) < 0x40) + { + if ((s[3] ^ 0x80) < 0x40) + { + if ((s[4] ^ 0x80) < 0x40) + { + if (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 */ + *puc = 0xfffd; + return 5; + } + /* invalid multibyte character */ + *puc = 0xfffd; + return 4; + } + /* invalid multibyte character */ + *puc = 0xfffd; + return 3; + } + /* invalid multibyte character */ + return 2; + } + /* invalid multibyte character */ + } + else + { + /* incomplete multibyte character */ + *puc = 0xfffd; + return n; + } + } + else if (c < 0xfe) + { + if (n >= 6) + { + if ((s[1] ^ 0x80) < 0x40) + { + if ((s[2] ^ 0x80) < 0x40) + { + if ((s[3] ^ 0x80) < 0x40) + { + if ((s[4] ^ 0x80) < 0x40) + { + if ((s[5] ^ 0x80) < 0x40) + { + if (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 */ + *puc = 0xfffd; + return 6; + } + /* invalid multibyte character */ + *puc = 0xfffd; + return 5; + } + /* invalid multibyte character */ + *puc = 0xfffd; + return 4; + } + /* invalid multibyte character */ + *puc = 0xfffd; + return 3; + } + /* invalid multibyte character */ + return 2; + } + /* 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 0000000..deea151 --- /dev/null +++ b/gnulib/lib/unistr/u8-mbtouc-unsafe-aux.c @@ -0,0 +1,260 @@ +/* Conversion UTF-8 to UCS-4. + Copyright (C) 2001-2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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; + } +#if CONFIG_UNICODE_SAFETY + /* invalid multibyte character */ +#endif + } + else + { + /* incomplete multibyte character */ + *puc = 0xfffd; + return 1; + } + } + else if (c < 0xf0) + { + if (n >= 3) + { +#if CONFIG_UNICODE_SAFETY + if ((s[1] ^ 0x80) < 0x40) + { + if ((s[2] ^ 0x80) < 0x40) + { + if ((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; + } +#if CONFIG_UNICODE_SAFETY + /* invalid multibyte character */ + *puc = 0xfffd; + return 3; + } + /* invalid multibyte character */ + *puc = 0xfffd; + return 2; + } + /* invalid multibyte character */ +#endif + } + else + { + /* incomplete multibyte character */ + *puc = 0xfffd; + if (n == 1 || (s[1] ^ 0x80) >= 0x40) + return 1; + else + return 2; + } + } + else if (c < 0xf8) + { + if (n >= 4) + { +#if CONFIG_UNICODE_SAFETY + if ((s[1] ^ 0x80) < 0x40) + { + if ((s[2] ^ 0x80) < 0x40) + { + if ((s[3] ^ 0x80) < 0x40) + { + if ((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; + } +#if CONFIG_UNICODE_SAFETY + /* invalid multibyte character */ + *puc = 0xfffd; + return 4; + } + /* invalid multibyte character */ + *puc = 0xfffd; + return 3; + } + /* invalid multibyte character */ + *puc = 0xfffd; + return 2; + } + /* invalid multibyte character */ +#endif + } + else + { + /* incomplete multibyte character */ + *puc = 0xfffd; + if (n == 1 || (s[1] ^ 0x80) >= 0x40) + return 1; + else if (n == 2 || (s[2] ^ 0x80) >= 0x40) + return 2; + else + return 3; + } + } +#if 0 + else if (c < 0xfc) + { + if (n >= 5) + { +#if CONFIG_UNICODE_SAFETY + if ((s[1] ^ 0x80) < 0x40) + { + if ((s[2] ^ 0x80) < 0x40) + { + if ((s[3] ^ 0x80) < 0x40) + { + if ((s[4] ^ 0x80) < 0x40) + { + if (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; + } +#if CONFIG_UNICODE_SAFETY + /* invalid multibyte character */ + *puc = 0xfffd; + return 5; + } + /* invalid multibyte character */ + *puc = 0xfffd; + return 4; + } + /* invalid multibyte character */ + *puc = 0xfffd; + return 3; + } + /* invalid multibyte character */ + return 2; + } + /* invalid multibyte character */ +#endif + } + else + { + /* incomplete multibyte character */ + *puc = 0xfffd; + return n; + } + } + else if (c < 0xfe) + { + if (n >= 6) + { +#if CONFIG_UNICODE_SAFETY + if ((s[1] ^ 0x80) < 0x40) + { + if ((s[2] ^ 0x80) < 0x40) + { + if ((s[3] ^ 0x80) < 0x40) + { + if ((s[4] ^ 0x80) < 0x40) + { + if ((s[5] ^ 0x80) < 0x40) + { + if (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; + } +#if CONFIG_UNICODE_SAFETY + /* invalid multibyte character */ + *puc = 0xfffd; + return 6; + } + /* invalid multibyte character */ + *puc = 0xfffd; + return 5; + } + /* invalid multibyte character */ + *puc = 0xfffd; + return 4; + } + /* invalid multibyte character */ + *puc = 0xfffd; + return 3; + } + /* invalid multibyte character */ + return 2; + } + /* invalid multibyte character */ +#endif + } + 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 0000000..b298925 --- /dev/null +++ b/gnulib/lib/unistr/u8-mbtouc-unsafe.c @@ -0,0 +1,271 @@ +/* Look at first character in UTF-8 string. + Copyright (C) 1999-2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +#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; + } +#if CONFIG_UNICODE_SAFETY + /* invalid multibyte character */ +#endif + } + else + { + /* incomplete multibyte character */ + *puc = 0xfffd; + return 1; + } + } + else if (c < 0xf0) + { + if (n >= 3) + { +#if CONFIG_UNICODE_SAFETY + if ((s[1] ^ 0x80) < 0x40) + { + if ((s[2] ^ 0x80) < 0x40) + { + if ((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; + } +#if CONFIG_UNICODE_SAFETY + /* invalid multibyte character */ + *puc = 0xfffd; + return 3; + } + /* invalid multibyte character */ + *puc = 0xfffd; + return 2; + } + /* invalid multibyte character */ +#endif + } + else + { + /* incomplete multibyte character */ + *puc = 0xfffd; + if (n == 1 || (s[1] ^ 0x80) >= 0x40) + return 1; + else + return 2; + } + } + else if (c < 0xf8) + { + if (n >= 4) + { +#if CONFIG_UNICODE_SAFETY + if ((s[1] ^ 0x80) < 0x40) + { + if ((s[2] ^ 0x80) < 0x40) + { + if ((s[3] ^ 0x80) < 0x40) + { + if ((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; + } +#if CONFIG_UNICODE_SAFETY + /* invalid multibyte character */ + *puc = 0xfffd; + return 4; + } + /* invalid multibyte character */ + *puc = 0xfffd; + return 3; + } + /* invalid multibyte character */ + *puc = 0xfffd; + return 2; + } + /* invalid multibyte character */ +#endif + } + else + { + /* incomplete multibyte character */ + *puc = 0xfffd; + if (n == 1 || (s[1] ^ 0x80) >= 0x40) + return 1; + else if (n == 2 || (s[2] ^ 0x80) >= 0x40) + return 2; + else + return 3; + } + } +#if 0 + else if (c < 0xfc) + { + if (n >= 5) + { +#if CONFIG_UNICODE_SAFETY + if ((s[1] ^ 0x80) < 0x40) + { + if ((s[2] ^ 0x80) < 0x40) + { + if ((s[3] ^ 0x80) < 0x40) + { + if ((s[4] ^ 0x80) < 0x40) + { + if (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; + } +#if CONFIG_UNICODE_SAFETY + /* invalid multibyte character */ + *puc = 0xfffd; + return 5; + } + /* invalid multibyte character */ + *puc = 0xfffd; + return 4; + } + /* invalid multibyte character */ + *puc = 0xfffd; + return 3; + } + /* invalid multibyte character */ + return 2; + } + /* invalid multibyte character */ +#endif + } + else + { + /* incomplete multibyte character */ + *puc = 0xfffd; + return n; + } + } + else if (c < 0xfe) + { + if (n >= 6) + { +#if CONFIG_UNICODE_SAFETY + if ((s[1] ^ 0x80) < 0x40) + { + if ((s[2] ^ 0x80) < 0x40) + { + if ((s[3] ^ 0x80) < 0x40) + { + if ((s[4] ^ 0x80) < 0x40) + { + if ((s[5] ^ 0x80) < 0x40) + { + if (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; + } +#if CONFIG_UNICODE_SAFETY + /* invalid multibyte character */ + *puc = 0xfffd; + return 6; + } + /* invalid multibyte character */ + *puc = 0xfffd; + return 5; + } + /* invalid multibyte character */ + *puc = 0xfffd; + return 4; + } + /* invalid multibyte character */ + *puc = 0xfffd; + return 3; + } + /* invalid multibyte character */ + return 2; + } + /* invalid multibyte character */ +#endif + } + 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 0000000..a62539e --- /dev/null +++ b/gnulib/lib/unistr/u8-mbtouc.c @@ -0,0 +1,250 @@ +/* Look at first character in UTF-8 string. + Copyright (C) 1999-2002, 2006-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +#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 1; + } + } + else if (c < 0xf0) + { + if (n >= 3) + { + if ((s[1] ^ 0x80) < 0x40) + { + if ((s[2] ^ 0x80) < 0x40) + { + if ((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 */ + *puc = 0xfffd; + return 3; + } + /* invalid multibyte character */ + *puc = 0xfffd; + return 2; + } + /* invalid multibyte character */ + } + else + { + /* incomplete multibyte character */ + *puc = 0xfffd; + if (n == 1 || (s[1] ^ 0x80) >= 0x40) + return 1; + else + return 2; + } + } + else if (c < 0xf8) + { + if (n >= 4) + { + if ((s[1] ^ 0x80) < 0x40) + { + if ((s[2] ^ 0x80) < 0x40) + { + if ((s[3] ^ 0x80) < 0x40) + { + if ((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 */ + *puc = 0xfffd; + return 4; + } + /* invalid multibyte character */ + *puc = 0xfffd; + return 3; + } + /* invalid multibyte character */ + *puc = 0xfffd; + return 2; + } + /* invalid multibyte character */ + } + else + { + /* incomplete multibyte character */ + *puc = 0xfffd; + if (n == 1 || (s[1] ^ 0x80) >= 0x40) + return 1; + else if (n == 2 || (s[2] ^ 0x80) >= 0x40) + return 2; + else + return 3; + } + } +#if 0 + else if (c < 0xfc) + { + if (n >= 5) + { + if ((s[1] ^ 0x80) < 0x40) + { + if ((s[2] ^ 0x80) < 0x40) + { + if ((s[3] ^ 0x80) < 0x40) + { + if ((s[4] ^ 0x80) < 0x40) + { + if (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 */ + *puc = 0xfffd; + return 5; + } + /* invalid multibyte character */ + *puc = 0xfffd; + return 4; + } + /* invalid multibyte character */ + *puc = 0xfffd; + return 3; + } + /* invalid multibyte character */ + return 2; + } + /* invalid multibyte character */ + } + else + { + /* incomplete multibyte character */ + *puc = 0xfffd; + return n; + } + } + else if (c < 0xfe) + { + if (n >= 6) + { + if ((s[1] ^ 0x80) < 0x40) + { + if ((s[2] ^ 0x80) < 0x40) + { + if ((s[3] ^ 0x80) < 0x40) + { + if ((s[4] ^ 0x80) < 0x40) + { + if ((s[5] ^ 0x80) < 0x40) + { + if (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 */ + *puc = 0xfffd; + return 6; + } + /* invalid multibyte character */ + *puc = 0xfffd; + return 5; + } + /* invalid multibyte character */ + *puc = 0xfffd; + return 4; + } + /* invalid multibyte character */ + *puc = 0xfffd; + return 3; + } + /* invalid multibyte character */ + return 2; + } + /* 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 0000000..ffcc134 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..cdf5f59 --- /dev/null +++ b/gnulib/lib/unistr/u8-move.c @@ -0,0 +1,25 @@ +/* Copy piece of UTF-8 string. + Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..f6911f9 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..29118d6 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 u8-mbtouc-aux.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 0000000..2b7cbb5 --- /dev/null +++ b/gnulib/lib/unistr/u8-set.c @@ -0,0 +1,44 @@ +/* Fill UTF-8 string. + Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unistr.h" + +#define FUNC u8_set +#define UNIT uint8_t +#define IS_SINGLE_UNIT(uc) (uc < 0x80) + +#include +#include + +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 0000000..2190cb1 --- /dev/null +++ b/gnulib/lib/unistr/u8-startswith.c @@ -0,0 +1,25 @@ +/* Substring test for UTF-8 strings. + Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..97386e8 --- /dev/null +++ b/gnulib/lib/unistr/u8-stpcpy.c @@ -0,0 +1,44 @@ +/* Copy UTF-8 string. + Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +/* Ensure stpcpy() gets declared. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif + +#include + +/* Specification. */ +#include "unistr.h" + +#if HAVE_STPCPY + +# include + +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 0000000..21698b1 --- /dev/null +++ b/gnulib/lib/unistr/u8-stpncpy.c @@ -0,0 +1,44 @@ +/* Copy UTF-8 string. + Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +/* Ensure stpncpy() gets declared. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif + +#include + +/* Specification. */ +#include "unistr.h" + +#if __GLIBC__ >= 2 && !defined __UCLIBC__ + +# include + +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 0000000..f569426 --- /dev/null +++ b/gnulib/lib/unistr/u8-strcat.c @@ -0,0 +1,29 @@ +/* Concatenate UTF-8 strings. + Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unistr.h" + +#include + +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 0000000..0bfbc10 --- /dev/null +++ b/gnulib/lib/unistr/u8-strchr.c @@ -0,0 +1,240 @@ +/* Search character in UTF-8 string. + Copyright (C) 1999, 2002, 2006-2007, 2009-2011 Free Software Foundation, + Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unistr.h" + +#include + +uint8_t * +u8_strchr (const uint8_t *s, ucs4_t uc) +{ + uint8_t c[6]; + + if (uc < 0x80) + { + uint8_t c0 = uc; + + if (false) + { + /* Unoptimized code. */ + for (;;) + { + uint8_t s0 = *s; + if (s0 == c0) + return (uint8_t *) s; + s++; + if (s0 == 0) + break; + } + } + else + { + /* Optimized code. + strchr() is often so well optimized, that it's worth the + added function call. */ + return (uint8_t *) strchr ((const char *) s, c0); + } + } + else + /* Loops equivalent to strstr, optimized for a specific length (2, 3, 4) + of the needle. We use an algorithm similar to Boyer-Moore which + is documented in lib/unistr/u8-chr.c. There is additional + complication because we need to check after every byte for + a NUL byte, but the idea is the same. */ + switch (u8_uctomb_aux (c, uc, 6)) + { + case 2: + if (*s == 0 || s[1] == 0) + break; + { + uint8_t c0 = c[0]; + uint8_t c1 = c[1]; + /* Search for { c0, c1 }. */ + uint8_t s1 = s[1]; + + for (;;) + { + /* Here s[0] != 0, s[1] != 0. + Test whether s[0..1] == { c0, c1 }. */ + if (s1 == c1) + { + if (*s == c0) + return (uint8_t *) s; + else + /* Skip the search at s + 1, because s[1] = c1 < c0. */ + goto case2_skip2; + } + else + { + if (s1 == c0) + goto case2_skip1; + else + /* Skip the search at s + 1, because s[1] != c0. */ + goto case2_skip2; + } + case2_skip2: + s++; + s1 = s[1]; + if (s[1] == 0) + break; + case2_skip1: + s++; + s1 = s[1]; + if (s[1] == 0) + break; + } + } + break; + + case 3: + if (*s == 0 || s[1] == 0 || s[2] == 0) + break; + { + uint8_t c0 = c[0]; + uint8_t c1 = c[1]; + uint8_t c2 = c[2]; + /* Search for { c0, c1, c2 }. */ + uint8_t s2 = s[2]; + + for (;;) + { + /* Here s[0] != 0, s[1] != 0, s[2] != 0. + Test whether s[0..2] == { c0, c1, c2 }. */ + if (s2 == c2) + { + if (s[1] == c1 && *s == c0) + return (uint8_t *) s; + else + /* If c2 != c1: + Skip the search at s + 1, because s[2] == c2 != c1. + Skip the search at s + 2, because s[2] == c2 < c0. */ + if (c2 == c1) + goto case3_skip1; + else + goto case3_skip3; + } + else + { + if (s2 == c1) + goto case3_skip1; + else if (s2 == c0) + /* Skip the search at s + 1, because s[2] != c1. */ + goto case3_skip2; + else + /* Skip the search at s + 1, because s[2] != c1. + Skip the search at s + 2, because s[2] != c0. */ + goto case3_skip3; + } + case3_skip3: + s++; + s2 = s[2]; + if (s[2] == 0) + break; + case3_skip2: + s++; + s2 = s[2]; + if (s[2] == 0) + break; + case3_skip1: + s++; + s2 = s[2]; + if (s[2] == 0) + break; + } + } + break; + + case 4: + if (*s == 0 || s[1] == 0 || s[2] == 0 || s[3] == 0) + break; + { + uint8_t c0 = c[0]; + uint8_t c1 = c[1]; + uint8_t c2 = c[2]; + uint8_t c3 = c[3]; + /* Search for { c0, c1, c2, c3 }. */ + uint8_t s3 = s[3]; + + for (;;) + { + /* Here s[0] != 0, s[1] != 0, s[2] != 0, s[3] != 0. + Test whether s[0..3] == { c0, c1, c2, c3 }. */ + if (s3 == c3) + { + if (s[2] == c2 && s[1] == c1 && *s == c0) + return (uint8_t *) s; + else + /* If c3 != c2: + Skip the search at s + 1, because s[3] == c3 != c2. + If c3 != c1: + Skip the search at s + 2, because s[3] == c3 != c1. + Skip the search at s + 3, because s[3] == c3 < c0. */ + if (c3 == c2) + goto case4_skip1; + else if (c3 == c1) + goto case4_skip2; + else + goto case4_skip4; + } + else + { + if (s3 == c2) + goto case4_skip1; + else if (s3 == c1) + /* Skip the search at s + 1, because s[3] != c2. */ + goto case4_skip2; + else if (s3 == c0) + /* Skip the search at s + 1, because s[3] != c2. + Skip the search at s + 2, because s[3] != c1. */ + goto case4_skip3; + else + /* Skip the search at s + 1, because s[3] != c2. + Skip the search at s + 2, because s[3] != c1. + Skip the search at s + 3, because s[3] != c0. */ + goto case4_skip4; + } + case4_skip4: + s++; + s3 = s[3]; + if (s[3] == 0) + break; + case4_skip3: + s++; + s3 = s[3]; + if (s[3] == 0) + break; + case4_skip2: + s++; + s3 = s[3]; + if (s[3] == 0) + break; + case4_skip1: + s++; + s3 = s[3]; + if (s[3] == 0) + break; + } + } + break; + } + + return NULL; +} diff --git a/gnulib/lib/unistr/u8-strcmp.c b/gnulib/lib/unistr/u8-strcmp.c new file mode 100644 index 0000000..c4968b7 --- /dev/null +++ b/gnulib/lib/unistr/u8-strcmp.c @@ -0,0 +1,30 @@ +/* Compare UTF-8 strings. + Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unistr.h" + +#include + +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 0000000..6918aa6 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "unistr.h" + +#include +#include +#include + +#include "uniconv.h" + +#define FUNC u8_strcoll +#define UNIT uint8_t +#define U_STRCMP u8_strcmp +#define U_STRCONV_TO_ENCODING u8_strconv_to_encoding +#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 0000000..39fcb99 --- /dev/null +++ b/gnulib/lib/unistr/u8-strcpy.c @@ -0,0 +1,29 @@ +/* Copy UTF-8 string. + Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unistr.h" + +#include + +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 0000000..96d18e7 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..7db00ba --- /dev/null +++ b/gnulib/lib/unistr/u8-strdup.c @@ -0,0 +1,40 @@ +/* Copy UTF-8 string. + Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unistr.h" + +#if HAVE_STRDUP + +# include + +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 0000000..158213f --- /dev/null +++ b/gnulib/lib/unistr/u8-strlen.c @@ -0,0 +1,29 @@ +/* Determine length of UTF-8 string. + Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unistr.h" + +#include + +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 0000000..ecf5d96 --- /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-2011 Free Software + Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unistr.h" + +int +u8_strmblen (const uint8_t *s) +{ + /* Keep in sync with unistr.h and u8-mbtouc-aux.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 0000000..e15a7a1 --- /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-2011 Free Software + Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unistr.h" + +int +u8_strmbtouc (ucs4_t *puc, const uint8_t *s) +{ + /* Keep in sync with unistr.h and u8-mbtouc-aux.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 0000000..90ac4e0 --- /dev/null +++ b/gnulib/lib/unistr/u8-strncat.c @@ -0,0 +1,29 @@ +/* Concatenate UTF-8 strings. + Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unistr.h" + +#include + +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 0000000..036d899 --- /dev/null +++ b/gnulib/lib/unistr/u8-strncmp.c @@ -0,0 +1,30 @@ +/* Compare UTF-8 strings. + Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unistr.h" + +#include + +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 0000000..040d3a0 --- /dev/null +++ b/gnulib/lib/unistr/u8-strncpy.c @@ -0,0 +1,29 @@ +/* Copy UTF-8 string. + Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unistr.h" + +#include + +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 0000000..b82af62 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +/* Ensure strnlen() gets declared. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif + +#include + +/* Specification. */ +#include "unistr.h" + +#if __GLIBC__ >= 2 || defined __UCLIBC__ + +# include + +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 0000000..b7d38f7 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..38beebe --- /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-2011 Free Software Foundation, + Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..8842557 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..3f725cb --- /dev/null +++ b/gnulib/lib/unistr/u8-strstr.c @@ -0,0 +1,32 @@ +/* Substring test for UTF-8 strings. + Copyright (C) 1999, 2002, 2006, 2010-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unistr.h" + +#include + +/* FIXME: Maybe walking the string via u8_mblen is a win? */ + +#define FUNC u8_strstr +#define UNIT uint8_t +#define U_STRCHR u8_strchr +#define U_STRMBTOUC u8_strmbtouc +#define UNIT_IS_UINT8_T 1 +#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 0000000..7f6c1ec --- /dev/null +++ b/gnulib/lib/unistr/u8-strtok.c @@ -0,0 +1,27 @@ +/* Tokenize UTF-8 string. + Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..00426e6 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unistr.h" + +#define FUNC u8_to_u16 +#define SRC_UNIT uint8_t +#define DST_UNIT uint16_t + +#include +#include +#include + +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 0000000..f208975 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "unistr.h" + +#define FUNC u8_to_u32 +#define SRC_UNIT uint8_t +#define DST_UNIT uint32_t + +#include +#include +#include + +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 0000000..2014c8c --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..65a4053 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +#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.in.h b/gnulib/lib/unitypes.in.h new file mode 100644 index 0000000..e78c97d --- /dev/null +++ b/gnulib/lib/unitypes.in.h @@ -0,0 +1,26 @@ +/* Elementary types for the GNU UniString library. + Copyright (C) 2002, 2005-2006, 2009-2011 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 . */ + +#ifndef _UNITYPES_H +#define _UNITYPES_H + +/* Get uint8_t, uint16_t, uint32_t. */ +#include + +/* Type representing a Unicode character. */ +typedef uint32_t ucs4_t; + +#endif /* _UNITYPES_H */ diff --git a/gnulib/lib/uniwbrk.in.h b/gnulib/lib/uniwbrk.in.h new file mode 100644 index 0000000..19cdb13 --- /dev/null +++ b/gnulib/lib/uniwbrk.in.h @@ -0,0 +1,83 @@ +/* Word breaks in Unicode strings. + Copyright (C) 2001-2003, 2005-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#ifndef _UNIWBRK_H +#define _UNIWBRK_H + +/* Get size_t. */ +#include + +#include "unitypes.h" + + +#ifdef __cplusplus +extern "C" { +#endif + +/* ========================================================================= */ + +/* Property defined in Unicode Standard Annex #29, section "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 0000000..ae0cddd --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +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 0000000..e01bb64 --- /dev/null +++ b/gnulib/lib/uniwbrk/u16-wordbreaks.c @@ -0,0 +1,31 @@ +/* Word breaks in UTF-16 strings. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "uniwbrk.h" + +#include + +#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 0000000..bdbb7ab --- /dev/null +++ b/gnulib/lib/uniwbrk/u32-wordbreaks.c @@ -0,0 +1,31 @@ +/* Word breaks in UTF-32 strings. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "uniwbrk.h" + +#include + +#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 0000000..85efc3f --- /dev/null +++ b/gnulib/lib/uniwbrk/u8-wordbreaks.c @@ -0,0 +1,124 @@ +/* Word breaks in UTF-8 strings. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "uniwbrk.h" + +#include + +#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 +#include + +/* 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 0000000..21a79b0 --- /dev/null +++ b/gnulib/lib/uniwbrk/ulc-wordbreaks.c @@ -0,0 +1,201 @@ +/* Word breaks in strings. + Copyright (C) 2001-2003, 2006-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include "uniwbrk.h" + +#include +#include + +#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 +#include +#include + +/* 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 0000000..6e411fc --- /dev/null +++ b/gnulib/lib/uniwbrk/wbrkprop.h @@ -0,0 +1,4139 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Line breaking properties of Unicode characters. */ +/* Generated automatically by gen-uni-tables for Unicode 6.0.0. */ + +/* Copyright (C) 2000-2002, 2004, 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 . */ + +#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[122 << 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, + 1664, -1, 1792, 1920, 2048, 2176, 2304, 2432, + 2560, 2688, 2816, 2944, 3072, 3200, 3328, 3456, + 3584, 3712, 256, 256, 3840, 3968, 4096, 4224, + 4352, 256, 256, 256, 4480, 4608, 4736, 4864, + 4992, 5120, 5248, 5376, 5504, 5632, 5760, 5888, + 6016, 6144, 256, 6272, 256, 256, 6400, 6528, + 6656, 6784, 6912, 7040, -1, -1, -1, -1, + -1, 7168, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 7296, 7424, 7552, 7680, 7808, -1, -1, -1, + 7936, 8064, 8192, 8320, -1, 8448, 8576, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -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, 8704, 256, 256, 8832, 8960, 9088, 9216, + 9344, 9472, 9600, 9728, 9856, 9984, 10112, 10240, + 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, 10368, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 10496, 10624, + 256, 256, 10752, 10880, 11008, 11136, 11264, 11392, + 11520, 11648, 11776, 11904, -1, 12032, 12160, 12288, + 256, 12416, -1, -1, -1, -1, -1, -1, + 12544, -1, 12672, -1, 12800, -1, 12928, -1, + 13056, -1, -1, -1, -1, -1, -1, -1, + 13184, 13312, -1, -1, -1, -1, -1, -1, + -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, 13440, -1, + 13568, -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, + 13696, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -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, 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, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 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, 14080, 14208, 14336, -1, -1, -1, + 14464, 14592, 14720, 256, 256, 14848, 14976, 15104, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 15232, -1, 15360, 15488, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -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_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_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_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_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_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_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_OTHER, 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_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_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_ALETTER, WBP_EXTEND, + WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, + WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, + WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, + 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_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_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_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_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_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_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_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_ALETTER, 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_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_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_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_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_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_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_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_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_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_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_ALETTER, 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_EXTEND, + WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, + WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, + WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, + WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, + WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, + WBP_EXTEND, WBP_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_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_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_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_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_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_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_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_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_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_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_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_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_EXTEND, WBP_EXTEND, + WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, + WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, + WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, + WBP_EXTEND, WBP_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_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_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_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_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_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_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_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_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_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, + WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, + WBP_EXTEND, WBP_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_EXTEND, WBP_ALETTER, 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_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_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_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_OTHER, + 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_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_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, + WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, + WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, + WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, + WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, + WBP_EXTEND, WBP_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_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_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_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_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_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_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_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_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_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_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_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_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_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_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_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_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_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_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_ALETTER, WBP_ALETTER, 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_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_ALETTER, 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_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, + WBP_EXTEND, WBP_EXTEND, WBP_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_OTHER, WBP_OTHER, WBP_OTHER, 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_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_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_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_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_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_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_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, 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_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_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_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_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND, + WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_EXTEND, + WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, 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_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_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_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_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_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_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_EXTEND, + WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, + WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER, + 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_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_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_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_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_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_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_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_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_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_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_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_OTHER, + WBP_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_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_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_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_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_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_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_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_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_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_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_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_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_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_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, + WBP_ALETTER, WBP_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_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_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER, + WBP_OTHER, WBP_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 0000000..6c75c1b --- /dev/null +++ b/gnulib/lib/uniwbrk/wbrktable.c @@ -0,0 +1,52 @@ +/* Word break auxiliary table. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..72e5a85 --- /dev/null +++ b/gnulib/lib/uniwbrk/wbrktable.h @@ -0,0 +1,18 @@ +/* Word break auxiliary table. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +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 0000000..cbc82be --- /dev/null +++ b/gnulib/lib/uniwbrk/wordbreak-property.c @@ -0,0 +1,44 @@ +/* Word break property. + Copyright (C) 2001-2003, 2006-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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.in.h b/gnulib/lib/uniwidth.in.h new file mode 100644 index 0000000..e806744 --- /dev/null +++ b/gnulib/lib/uniwidth.in.h @@ -0,0 +1,69 @@ +/* Display width functions. + Copyright (C) 2001-2002, 2005, 2007, 2009-2011 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 . */ + +#ifndef _UNIWIDTH_H +#define _UNIWIDTH_H + +#include "unitypes.h" + +/* Get size_t. */ +#include + +/* 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) +#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) + __attribute__ ((__pure__)) +#endif + ; + +/* 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 0000000..a8d9c19 --- /dev/null +++ b/gnulib/lib/uniwidth/cjk.h @@ -0,0 +1,37 @@ +/* Test for CJK encoding. + Copyright (C) 2001-2002, 2005-2007, 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#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 0000000..0216b5f --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..f8008f2 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..7674691 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..60b5a35 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..6c10951 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..96e5ea4 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..a314e71 --- /dev/null +++ b/gnulib/lib/uniwidth/width.c @@ -0,0 +1,368 @@ +/* Determine display width of Unicode character. + Copyright (C) 2001-2002, 2006-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* 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[27*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, 0xff, 0x00, 0x00, 0x01, 0x00, /* 0x0640-0x067f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0680-0x06bf */ + 0x00, 0x00, 0xc0, 0xbf, 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, 0xc0, 0xfb, 0xef, 0x3e, 0x00, 0x00, /* 0x0800-0x083f */ + 0x00, 0x00, 0x00, 0x0e, 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 */ + 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, /* 0x0900-0x093f */ + 0xfe, 0x21, 0xfe, 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, 0xe0, 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, 0x20, 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, 0xe0, 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, 0x40, 0x7f, 0xe5, 0x1f, 0xf8, 0x9f, /* 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, 0x40, 0xa3, 0x03, 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, 0xf7, 0xff, 0xfd, 0x21, 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, 0xf0, /* 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, 0x80, 0x03, 0x00, /* 0x2cc0-0x2cff */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2d00-0x2d3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, /* 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, 0x03, 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, 0xff, 0xff, 0x03, 0x00, /* 0xa8c0-0xa8ff */ + 0x00, 0x00, 0x00, 0x00, 0xc0, 0x3f, 0x00, 0x00, /* 0xa900-0xa93f */ + 0x80, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa940-0xa97f */ + 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x13, /* 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, 0x9d, 0xc1, /* 0xaa80-0xaabf */ + 0x02, 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, 0x20, 0x21, 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 */ + /* 0x11000-0x111ff */ + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, /* 0x11000-0x1103f */ + 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11040-0x1107f */ + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x26, /* 0x11080-0x110bf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x110c0-0x110ff */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11100-0x1113f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11140-0x1117f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11180-0x111bf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x111c0-0x111ff */ + /* 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, 0xf8, 0xff, /* 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 */ + 24, -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 */ + 25, 26, -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 '^[^;]\{4,5\};[WF]' EastAsianWidth.txt" + * and "grep '^[^;]\{4,5\};[^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 <= 0x2ffff) /* Supplementary Ideographic Plane */ + || (uc >= 0x30000 && uc <= 0x3ffff) /* Tertiary Ideographic Plane */ + ) ) + 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 0000000..677d584 --- /dev/null +++ b/gnulib/lib/unlink.c @@ -0,0 +1,97 @@ +/* Work around unlink bugs. + + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#include + +#include +#include +#include +#include + +#include "dosname.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) + { +#if UNLINK_PARENT_BUG + if (len >= 2 && name[len - 1] == '.' && name[len - 2] == '.' + && (len == 2 || ISSLASH (name[len - 3]))) + { + errno = EISDIR; /* could also use EPERM */ + return -1; + } +#endif + result = unlink (name); + } + return result; +} diff --git a/gnulib/lib/unlinkat.c b/gnulib/lib/unlinkat.c new file mode 100644 index 0000000..bae6642 --- /dev/null +++ b/gnulib/lib/unlinkat.c @@ -0,0 +1,109 @@ +/* Work around unlinkat bugs on Solaris 9 and Hurd. + + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Eric Blake. */ + +#include + +#include + +#include +#include +#include +#include + +#include + +#include "dosname.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. Hurd has the same + issue. */ + +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. + + 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 0000000..b3f6285 --- /dev/null +++ b/gnulib/lib/unlinkdir.c @@ -0,0 +1,54 @@ +/* unlinkdir.c - determine whether we can unlink directories + + Copyright (C) 2005-2006, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert, Jim Meyering, and David Bartley. */ + +#include + +#include "unlinkdir.h" +#include "priv-set.h" +#include + +#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 0000000..0df9140 --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert and Jim Meyering. */ + +#include + +#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 0000000..901cbdd --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* 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 + +# 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/unlockpt.c b/gnulib/lib/unlockpt.c new file mode 100644 index 0000000..6785487 --- /dev/null +++ b/gnulib/lib/unlockpt.c @@ -0,0 +1,44 @@ +/* Unlock the slave side of a pseudo-terminal from its master side. + Copyright (C) 1998, 2010-2011 Free Software Foundation, Inc. + Contributed by Zack Weinberg , 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 . */ + +#include + +#include + +#include +#include + +int +unlockpt (int fd) +{ + /* Platforms which have the TIOCSPTLCK ioctl (Linux) already have the + unlockpt function. */ +#if HAVE_REVOKE + /* MacOS X 10.3, OpenBSD 3.8 do not have the unlockpt function, but they + have revoke(). */ + char *name = ptsname (fd); + if (name == NULL) + return -1; + return revoke (name); +#else + /* Assume that the slave side of a pseudo-terminal is already unlocked + by default. */ + if (fcntl (fd, F_GETFD) < 0) + return -1; + return 0; +#endif +} diff --git a/gnulib/lib/unsetenv.c b/gnulib/lib/unsetenv.c new file mode 100644 index 0000000..16b50d1 --- /dev/null +++ b/gnulib/lib/unsetenv.c @@ -0,0 +1,127 @@ +/* Copyright (C) 1992, 1995-2002, 2005-2011 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 . */ + +#include + +/* 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 + +#include +#if !_LIBC +# define __set_errno(ev) ((errno) = (ev)) +#endif + +#include +#include + +#if !_LIBC +# define __environ environ +#endif + +#if _LIBC +/* This lock protects against simultaneous modifications of `environ'. */ +# include +__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 +# if !HAVE_DECL_UNSETENV +# if VOID_UNSETENV +extern void unsetenv (const char *); +# else +extern int unsetenv (const char *); +# endif +# endif + +/* 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 0000000..a96b63a --- /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-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by David MacKenzie . */ + +#include + +/* Specification. */ +#include "userspec.h" + +#include +#include +#include +#include +#include + +#if HAVE_SYS_PARAM_H +# include +#endif + +#include +#include +#include + +#include + +#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 an 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 0000000..67af845 --- /dev/null +++ b/gnulib/lib/userspec.h @@ -0,0 +1,10 @@ +#ifndef USERSPEC_H +# define USERSPEC_H 1 + +# include + +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 0000000..4ebefe0 --- /dev/null +++ b/gnulib/lib/usleep.c @@ -0,0 +1,58 @@ +/* Pausing execution of the current thread. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Eric Blake , 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 . */ + +/* 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 + +/* Specification. */ +#include + +#include + +#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/utimecmp.c b/gnulib/lib/utimecmp.c new file mode 100644 index 0000000..c0f6713 --- /dev/null +++ b/gnulib/lib/utimecmp.c @@ -0,0 +1,380 @@ +/* utimecmp.c -- compare file time stamps + + Copyright (C) 2004-2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +#include + +#include "utimecmp.h" + +#include +#include +#include +#include +#include +#include + +#include "hash.h" +#include "intprops.h" +#include "stat-time.h" +#include "utimens.h" +#include "verify.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. However, memory pressure + that prevents use of the hash table is not fatal - we just fall back + to redoing the computations on every call in that case. + + 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 caching information learned about devices. */ + static Hash_table *ht; + + /* Information about the destination file system. */ + static struct fs_res *new_dst_res; + struct fs_res *dst_res = NULL; + struct fs_res tmp_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; + + /* Try to do a hash lookup, but fall back to stack variables and + recomputation on low memory situations. */ + if (! ht) + ht = hash_initialize (16, NULL, dev_info_hash, dev_info_compare, free); + if (ht) + { + if (! new_dst_res) + { + new_dst_res = malloc (sizeof *new_dst_res); + if (!new_dst_res) + goto low_memory; + 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) + goto low_memory; + + 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; + } + } + else + { + low_memory: + if (ht) + { + tmp_dst_res.dev = dst_stat->st_dev; + dst_res = hash_lookup (ht, &tmp_dst_res); + } + if (!dst_res) + { + dst_res = &tmp_dst_res; + dst_res->resolution = 2 * BILLION; + dst_res->exact = false; + } + } + + 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 0000000..684d10f --- /dev/null +++ b/gnulib/lib/utimecmp.h @@ -0,0 +1,37 @@ +/* utimecmp.h -- compare file time stamps + + Copyright (C) 2004, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +#ifndef UTIMECMP_H +#define UTIMECMP_H 1 + +#include +#include + +/* 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 0000000..f7cb8de --- /dev/null +++ b/gnulib/lib/utimens.c @@ -0,0 +1,533 @@ +/* Set file access and modification times. + + Copyright (C) 2003-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify 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 . */ + +/* Written by Paul Eggert. */ + +/* derived from a function in touch.c */ + +#include + +#include "utimens.h" + +#include +#include +#include +#include +#include +#include +#include + +#include "stat-time.h" +#include "timespec.h" + +#if HAVE_UTIME_H +# include +#endif + +/* Some systems (even some that do have ) 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 (×pec[0]); + + if (timespec[1].tv_nsec == UTIME_OMIT) + timespec[1] = get_stat_mtime (statbuf); + else if (timespec[1].tv_nsec == UTIME_NOW) + gettime (×pec[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 (int fd, 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; + + /* Require that at least one of FD or FILE are potentially valid, to avoid + a Linux bug where futimens (AT_FDCWD, NULL) changes "." rather + than failing. */ + if (fd < 0 && !file) + { + errno = EBADF; + 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 + 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 *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) || HAVE_FUTIMES +# if HAVE_FUTIMESAT && !FUTIMESAT_NULL_BUG +# undef futimes +# define futimes(fd, t) futimesat (fd, NULL, t) +# endif + if (futimes (fd, t) == 0) + { +# if __linux__ && __GLIBC__ + /* Work around a longstanding glibc bug, still present as + of 2010-12-27. On older Linux kernels that lack both + utimensat and utimes, glibc's futimes rounds instead of + truncating when falling back on utime. The same bug + occurs in futimesat with a null 2nd arg. */ + if (t) + { + bool abig = 500000 <= t[0].tv_usec; + bool mbig = 500000 <= t[1].tv_usec; + if ((abig | mbig) && fstat (fd, &st) == 0) + { + /* If these two subtractions overflow, they'll + track the overflows inside the buggy glibc. */ + time_t adiff = st.st_atime - t[0].tv_sec; + time_t mdiff = st.st_mtime - t[1].tv_sec; + + struct timeval *tt = NULL; + struct timeval truncated_timeval[2]; + truncated_timeval[0] = t[0]; + truncated_timeval[1] = t[1]; + if (abig && adiff == 1 && get_stat_atime_ns (&st) == 0) + { + tt = truncated_timeval; + tt[0].tv_usec = 0; + } + if (mbig && mdiff == 1 && get_stat_mtime_ns (&st) == 0) + { + tt = truncated_timeval; + tt[1].tv_usec = 0; + } + if (tt) + futimes (fd, tt); + } + } +# endif + + 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 FILE to be + TIMESPEC[0] and TIMESPEC[1], respectively. */ +int +utimens (char const *file, struct timespec const timespec[2]) +{ + return fdutimens (-1, file, 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 + fdutimens' 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 *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 (-1, file, ts); + errno = ENOSYS; + return -1; +} diff --git a/gnulib/lib/utimens.h b/gnulib/lib/utimens.h new file mode 100644 index 0000000..8c47cf9 --- /dev/null +++ b/gnulib/lib/utimens.h @@ -0,0 +1,19 @@ +#include +int fdutimens (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 +# include + +int fdutimensat (int fd, int dir, char const *name, struct timespec const [2], + int atflag); + +/* Using this function makes application code slightly more readable. */ +static inline int +lutimensat (int dir, char const *file, struct timespec const times[2]) +{ + return utimensat (dir, file, times, AT_SYMLINK_NOFOLLOW); +} +#endif diff --git a/gnulib/lib/utimensat.c b/gnulib/lib/utimensat.c new file mode 100644 index 0000000..37f0ea8 --- /dev/null +++ b/gnulib/lib/utimensat.c @@ -0,0 +1,154 @@ +/* Set the access and modification time of a file relative to directory fd. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Eric Blake */ + +#include + +#include + +#include +#include + +#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) +{ +# ifdef __linux__ + struct timespec ts[2]; +# endif + + /* 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; + /* 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; + } +# ifdef __hppa__ + /* Linux kernel 2.6.22.19 on hppa does not reject invalid tv_nsec + values. */ + else if (times + && ((times[0].tv_nsec != UTIME_NOW + && (times[0].tv_nsec < 0 + || times[0].tv_nsec >= 1000000000)) + || (times[1].tv_nsec != UTIME_NOW + && (times[1].tv_nsec < 0 + || times[1].tv_nsec >= 1000000000)))) + { + errno = EINVAL; + return -1; + } +# endif +# 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 0000000..40789f9 --- /dev/null +++ b/gnulib/lib/vasnprintf.c @@ -0,0 +1,5607 @@ +/* vsprintf with automatic memory allocation. + Copyright (C) 1999, 2002-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 to provide a prototype for snprintf(). + This must come before because may include + , and once has been included, it's too late. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif + +#ifndef VASNPRINTF +# include +#endif +#ifndef IN_LIBINTL +# include +#endif + +/* Specification. */ +#ifndef VASNPRINTF +# if WIDE_CHAR_VERSION +# include "vasnwprintf.h" +# else +# include "vasnprintf.h" +# endif +#endif + +#include /* localeconv() */ +#include /* snprintf(), sprintf() */ +#include /* abort(), malloc(), realloc(), free() */ +#include /* memcpy(), strlen() */ +#include /* errno */ +#include /* CHAR_BIT */ +#include /* DBL_MAX_EXP, LDBL_MAX_EXP */ +#if HAVE_NL_LANGINFO +# include +#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" + +#include "verify.h" + +#if (NEED_PRINTF_DOUBLE || NEED_PRINTF_LONG_DOUBLE) && !defined IN_LIBINTL +# include +# include "float+.h" +#endif + +#if (NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE) && !defined IN_LIBINTL +# include +# include "isnand-nolibm.h" +#endif + +#if (NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE) && !defined IN_LIBINTL +# include +# include "isnanl-nolibm.h" +# include "fpucw.h" +#endif + +#if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_DOUBLE) && !defined IN_LIBINTL +# include +# include "isnand-nolibm.h" +# include "printf-frexp.h" +#endif + +#if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE) && !defined IN_LIBINTL +# include +# 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 function _snwprintf() or - on mingw - snwprintf() + instead. The mingw function snwprintf() has fewer bugs than the + MSVCRT function _snwprintf(), so prefer that. */ +# if defined __MINGW32__ +# define SNPRINTF snwprintf +# else +# define SNPRINTF _snwprintf +# endif +# 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. The mingw function snprintf() has fewer bugs than the MSVCRT + function _snprintf(), so prefer that. */ +# if defined __MINGW32__ +# define SNPRINTF snprintf + /* Here we need to call the native snprintf, not rpl_snprintf. */ +# undef snprintf +# else +# define SNPRINTF _snprintf +# endif +# 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 || !HAVE_SNPRINTF_RETVAL_C99) && !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 || !HAVE_SNPRINTF_RETVAL_C99) && WIDE_CHAR_VERSION) || ((!USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || (NEED_PRINTF_DIRECTIVE_LS && !defined IN_LIBINTL)) && !WIDE_CHAR_VERSION && DCHAR_IS_TCHAR)) && HAVE_WCHAR_T +# 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_SNPRINTF_RETVAL_C99) && 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 __UCLIBC__ || (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 +verify (sizeof (mp_limb_t) * CHAR_BIT == GMP_LIMB_BITS); + +typedef unsigned long long mp_twolimb_t; +# define GMP_TWOLIMB_BITS 64 +verify (sizeof (mp_twolimb_t) * CHAR_BIT == GMP_TWOLIMB_BITS); + +/* 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=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=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=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 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 */ + /* Determine s = GMP_LIMB_BITS - integer_length (msd). + Code copied from gnulib's integer_length.c. */ +# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) + s = __builtin_clz (msd); +# else +# if defined DBL_EXPBIT0_WORD && defined DBL_EXPBIT0_BIT + if (GMP_LIMB_BITS <= DBL_MANT_BIT) + { + /* Use 'double' operations. + Assumes an IEEE 754 'double' implementation. */ +# define DBL_EXP_MASK ((DBL_MAX_EXP - DBL_MIN_EXP) | 7) +# define DBL_EXP_BIAS (DBL_EXP_MASK / 2 - 1) +# define NWORDS \ + ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) + union { double value; unsigned int word[NWORDS]; } m; + + /* Use a single integer to floating-point conversion. */ + m.value = msd; + + s = GMP_LIMB_BITS + - (((m.word[DBL_EXPBIT0_WORD] >> DBL_EXPBIT0_BIT) & DBL_EXP_MASK) + - DBL_EXP_BIAS); + } + else +# undef NWORDS +# endif + { + 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; + } + } +# endif + } + /* 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, 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 * 2^LDBL_MANT_BIT), and the + latter is an integer. */ + /* Convert the mantissa (y * 2^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 * 2^DBL_MANT_BIT), and the + latter is an integer. */ + /* Convert the mantissa (y * 2^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 + +#if !USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 + +/* Use a different function name, to make it possible that the 'wchar_t' + parametrization and the 'char' parametrization get compiled in the same + translation unit. */ +# if WIDE_CHAR_VERSION +# define MAX_ROOM_NEEDED wmax_room_needed +# else +# define MAX_ROOM_NEEDED max_room_needed +# endif + +/* Returns the number of TCHAR_T units needed as temporary space for the result + of sprintf or SNPRINTF of a single conversion directive. */ +static inline size_t +MAX_ROOM_NEEDED (const arguments *ap, size_t arg_index, FCHAR_T conversion, + arg_type type, int flags, size_t width, int has_precision, + size_t precision, int pad_ourselves) +{ + size_t tmp_length; + + switch (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 = ap->arg[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 separately in VASNPRINTF. */ + 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 separately in VASNPRINTF. */ + 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 = ap->arg[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 */ + + return tmp_length; +} + +#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() \ + if (d.dir != d.direct_alloc_dir) \ + free (d.dir); \ + if (a.arg != a.direct_alloc_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 || !HAVE_SNPRINTF_RETVAL_C99 || (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'. */ + verify (sizeof (TCHAR_T) == 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) + { + /* Cannot convert. */ + if (!(result == resultbuf || result == NULL)) + free (result); + if (buf_malloced != NULL) + free (buf_malloced); + CLEANUP (); + errno = EILSEQ; + return NULL; + } + 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 || !HAVE_SNPRINTF_RETVAL_C99 || !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 || !HAVE_SNPRINTF_RETVAL_C99 || 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 }); + int orig_errno; +#if !USE_SNPRINTF + size_t tmp_length; + TCHAR_T tmpbuf[700]; + TCHAR_T *tmp; +#endif + +#if !USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || !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 || !HAVE_SNPRINTF_RETVAL_C99 || 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. */ + tmp_length = + MAX_ROOM_NEEDED (&a, dp->arg_index, dp->conversion, type, + flags, width, has_precision, precision, + pad_ourselves); + + 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 __GLIBC__ >= 2 && !defined __UCLIBC__ + if (flags & FLAG_LOCALIZED) + *fbp++ = 'I'; +#endif + 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 __UCLIBC__) || ((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 return value conforms to + ISO C 99: the tests gl_SNPRINTF_RETVAL_C99 and + gl_SNPRINTF_TRUNCATION_C99 pass. + 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 + and + + 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 + + orig_errno = errno; + + 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 + + errno = 0; + 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) + { +# if !HAVE_SNPRINTF_RETVAL_C99 + /* 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. + But a failure at this point can also come + from other reasons than a too small buffer, + such as an invalid wide string argument to + the %ls directive, or possibly an invalid + floating-point argument. */ + size_t tmp_length = + MAX_ROOM_NEEDED (&a, dp->arg_index, + dp->conversion, type, flags, + width, has_precision, + precision, pad_ourselves); + + if (maxlen < tmp_length) + { + /* Make more room. But try to do through + this reallocation only once. */ + size_t bigger_need = + xsum (length, + xsum (tmp_length, + TCHARS_PER_DCHAR - 1) + / TCHARS_PER_DCHAR); + /* And always grow proportionally. + (There may be several arguments, each + needing a little more room than the + previous one.) */ + size_t bigger_need2 = + xsum (xtimes (allocated, 2), 12); + if (bigger_need < bigger_need2) + bigger_need = bigger_need2; + ENSURE_ALLOCATION (bigger_need); + continue; + } +# endif + } + else + count = retcount; + } + } +#endif + + /* Attempt to handle failure. */ + if (count < 0) + { + /* SNPRINTF or sprintf failed. Save and use the errno + that it has set, if any. */ + int saved_errno = errno; + + if (!(result == resultbuf || result == NULL)) + free (result); + if (buf_malloced != NULL) + free (buf_malloced); + CLEANUP (); + errno = + (saved_errno != 0 + ? saved_errno + : (dp->conversion == 'c' || dp->conversion == 's' + ? EILSEQ + : 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'. */ + verify (sizeof (TCHAR_T) == 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; + } + errno = orig_errno; +#undef pad_ourselves +#undef prec_ourselves + } + } + } + + /* 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 MAX_ROOM_NEEDED +#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 0000000..0ab7d19 --- /dev/null +++ b/gnulib/lib/vasnprintf.h @@ -0,0 +1,80 @@ +/* vsprintf with automatic memory allocation. + Copyright (C) 2002-2004, 2007-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 + +/* Get size_t. */ +#include + +/* 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 _GL_ATTRIBUTE_FORMAT 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 _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec)) +#else +# define _GL_ATTRIBUTE_FORMAT(spec) /* empty */ +#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, ...) + _GL_ATTRIBUTE_FORMAT ((__printf__, 3, 4)); +extern char * vasnprintf (char *resultbuf, size_t *lengthp, const char *format, va_list args) + _GL_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 0000000..c45e7c6 --- /dev/null +++ b/gnulib/lib/vasprintf.c @@ -0,0 +1,51 @@ +/* Formatted output to strings. + Copyright (C) 1999, 2002, 2006-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 + +/* Specification. */ +#ifdef IN_LIBASPRINTF +# include "vasprintf.h" +#else +# include +#endif + +#include +#include +#include + +#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 0000000..c408e9a --- /dev/null +++ b/gnulib/lib/vdprintf.c @@ -0,0 +1,67 @@ +/* Formatted output to a file descriptor. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +/* Specification. */ +#include + +#include +#include +#include +#include + +#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 0000000..9a8caad --- /dev/null +++ b/gnulib/lib/verify.h @@ -0,0 +1,243 @@ +/* Compile-time assert-like macros. + + Copyright (C) 2005-2006, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert, Bruno Haible, and Jim Meyering. */ + +#ifndef _GL_VERIFY_H +# define _GL_VERIFY_H + + +/* Define _GL_HAVE__STATIC_ASSERT to 1 if _Static_assert works as per the + C1X draft N1548 section 6.7.10. This is supported by GCC 4.6.0 and + later, in C mode, and its use here generates easier-to-read diagnostics + when verify (R) fails. + + Define _GL_HAVE_STATIC_ASSERT to 1 if static_assert works as per the + C++0X draft N3242 section 7.(4). + This will likely be supported by future GCC versions, in C++ mode. + + Use this only with GCC. If we were willing to slow 'configure' + down we could also use it with other compilers, but since this + affects only the quality of diagnostics, why bother? */ +# if (4 < __GNUC__ || (__GNUC__ == 4 && 6 <= __GNUC_MINOR__)) && !defined __cplusplus +# define _GL_HAVE__STATIC_ASSERT 1 +# endif +/* The condition (99 < __GNUC__) is temporary, until we know about the + first G++ release that supports static_assert. */ +# if (99 < __GNUC__) && defined __cplusplus +# define _GL_HAVE_STATIC_ASSERT 1 +# endif + +/* 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. + + If _Static_assert works, verify (R) uses it directly. Similarly, + _GL_VERIFY_TRUE works by packaging a _Static_assert inside a struct + that is an operand of sizeof. + + The code below uses several ideas for C++ compilers, and for C + compilers that do not support _Static_assert: + + * 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 _gl_verify_type { + unsigned int _gl_verify_error_if_negative: 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 _gl_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. (The GCC __COUNTER__ + macro solves this problem, but is not portable.) + + 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 _gl_verify_type {...})]; + extern void dummy (int [sizeof (struct {...})]); + extern void dummy (int [sizeof (struct _gl_verify_type {...})]); + extern int (*dummy (void)) [sizeof (struct {...})]; + extern int (*dummy (void)) [sizeof (struct _gl_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 {...})]; + + * GCC warns about duplicate declarations of the dummy function if + -Wredundant_decls is used. GCC 4.3 and later have a builtin + __COUNTER__ macro that can let us generate unique identifiers for + each dummy function, to suppress this warning. + + * This implementation exploits the fact that older versions of GCC, + which do not support _Static_assert, also do not warn about the + last declaration mentioned above. + + * In C++, any struct definition inside sizeof is invalid. + Use a template type to work around the problem. */ + +/* Concatenate two preprocessor tokens. */ +# define _GL_CONCAT(x, y) _GL_CONCAT0 (x, y) +# define _GL_CONCAT0(x, y) x##y + +/* _GL_COUNTER is an integer, preferably one that changes each time we + use it. Use __COUNTER__ if it works, falling back on __LINE__ + otherwise. __LINE__ isn't perfect, but it's better than a + constant. */ +# if defined __COUNTER__ && __COUNTER__ != __COUNTER__ +# define _GL_COUNTER __COUNTER__ +# else +# define _GL_COUNTER __LINE__ +# endif + +/* Generate a symbol with the given prefix, making it unique if + possible. */ +# define _GL_GENSYM(prefix) _GL_CONCAT (prefix, _GL_COUNTER) + +/* Verify requirement R at compile-time, as an integer constant expression + that returns 1. If R is false, fail at compile-time, preferably + with a diagnostic that includes the string-literal DIAGNOSTIC. */ + +# define _GL_VERIFY_TRUE(R, DIAGNOSTIC) \ + (!!sizeof (_GL_VERIFY_TYPE (R, DIAGNOSTIC))) + +# ifdef __cplusplus +# if !GNULIB_defined_struct__gl_verify_type +template + struct _gl_verify_type { + unsigned int _gl_verify_error_if_negative: w; + }; +# define GNULIB_defined_struct__gl_verify_type 1 +# endif +# define _GL_VERIFY_TYPE(R, DIAGNOSTIC) \ + _gl_verify_type<(R) ? 1 : -1> +# elif defined _GL_HAVE__STATIC_ASSERT +# define _GL_VERIFY_TYPE(R, DIAGNOSTIC) \ + struct { \ + _Static_assert (R, DIAGNOSTIC); \ + int _gl_dummy; \ + } +# else +# define _GL_VERIFY_TYPE(R, DIAGNOSTIC) \ + struct { unsigned int _gl_verify_error_if_negative: (R) ? 1 : -1; } +# endif + +/* Verify requirement R at compile-time, as a declaration without a + trailing ';'. If R is false, fail at compile-time, preferably + with a diagnostic that includes the string-literal DIAGNOSTIC. + + Unfortunately, unlike C1X, this implementation must appear as an + ordinary declaration, and cannot appear inside struct { ... }. */ + +# ifdef _GL_HAVE__STATIC_ASSERT +# define _GL_VERIFY _Static_assert +# else +# define _GL_VERIFY(R, DIAGNOSTIC) \ + extern int (*_GL_GENSYM (_gl_verify_function) (void)) \ + [_GL_VERIFY_TRUE (R, DIAGNOSTIC)] +# endif + +/* _GL_STATIC_ASSERT_H is defined if this code is copied into assert.h. */ +# ifdef _GL_STATIC_ASSERT_H +# if !defined _GL_HAVE__STATIC_ASSERT && !defined _Static_assert +# define _Static_assert(R, DIAGNOSTIC) _GL_VERIFY (R, DIAGNOSTIC) +# endif +# if !defined _GL_HAVE_STATIC_ASSERT && !defined static_assert +# define static_assert _Static_assert /* Draft C1X requires this #define. */ +# endif +# endif + +/* @assert.h omit start@ */ + +/* 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. */ + +/* Verify requirement R at compile-time, as an integer constant expression. + Return 1. This is equivalent to verify_expr (R, 1). + + verify_true is obsolescent; please use verify_expr instead. */ + +# define verify_true(R) _GL_VERIFY_TRUE (R, "verify_true (" #R ")") + +/* Verify requirement R at compile-time. Return the value of the + expression E. */ + +# define verify_expr(R, E) \ + (_GL_VERIFY_TRUE (R, "verify_expr (" #R ", " #E ")") ? (E) : (E)) + +/* Verify requirement R at compile-time, as a declaration without a + trailing ';'. */ + +# define verify(R) _GL_VERIFY (R, "verify (" #R ")") + +/* @assert.h omit end@ */ + +#endif diff --git a/gnulib/lib/verror.c b/gnulib/lib/verror.c new file mode 100644 index 0000000..bc90ef3 --- /dev/null +++ b/gnulib/lib/verror.c @@ -0,0 +1,77 @@ +/* va_list error handler for noninteractive utilities + Copyright (C) 2006-2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Eric Blake. */ + +#include + +#include "verror.h" +#include "xvasprintf.h" + +#include +#include +#include + +#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 0000000..ec4ff1d --- /dev/null +++ b/gnulib/lib/verror.h @@ -0,0 +1,54 @@ +/* Declaration for va_list error-reporting function + Copyright (C) 2006-2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef _VERROR_H +#define _VERROR_H 1 + +#include + +#include "error.h" /* for _GL_ATTRIBUTE_FORMAT */ + +#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) + _GL_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) + _GL_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 0000000..c821583 --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Jim Meyering. */ + +#include + +/* 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 0000000..b8d4724 --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Jim Meyering. */ + +#include + +/* Specification. */ +#include "version-etc.h" + +#include +#include +#include + +#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 = 2011 }; + +/* 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 .\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: \n"), + PACKAGE_NAME, PACKAGE); +#endif + fputs (_("General help using GNU software: \n"), + stdout); +} diff --git a/gnulib/lib/version-etc.h b/gnulib/lib/version-etc.h new file mode 100644 index 0000000..a9b313d --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Jim Meyering. */ + +#ifndef VERSION_ETC_H +# define VERSION_ETC_H 1 + +# include +# include + +/* The `sentinel' attribute was added in gcc 4.0. */ +#ifndef _GL_ATTRIBUTE_SENTINEL +# if 4 <= __GNUC__ +# define _GL_ATTRIBUTE_SENTINEL __attribute__ ((__sentinel__)) +# else +# define _GL_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 */ ...) + _GL_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 0000000..55486d6 --- /dev/null +++ b/gnulib/lib/vfprintf.c @@ -0,0 +1,74 @@ +/* Formatted output to a stream. + Copyright (C) 2004, 2006-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +/* Specification. */ +#include + +#include +#include +#include +#include + +#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/vma-iter.c b/gnulib/lib/vma-iter.c new file mode 100644 index 0000000..1de69d8 --- /dev/null +++ b/gnulib/lib/vma-iter.c @@ -0,0 +1,625 @@ +/* Iteration over virtual memory areas. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "vma-iter.h" + +#include /* errno */ +#include /* size_t */ +#include /* open, O_RDONLY */ +#include /* getpagesize, read, close */ + +#if defined __sgi || defined __osf__ /* IRIX, OSF/1 */ +# include /* memcpy */ +# include +# include /* mmap, munmap */ +# include /* PIOC*, prmap_t */ +#endif + +#if defined __APPLE__ && defined __MACH__ /* MacOS X */ +# include +#endif + +#if (defined _WIN32 || defined __WIN32__) || defined __CYGWIN__ /* Windows */ +# include +#endif + +#if defined __BEOS__ || defined __HAIKU__ /* BeOS, Haiku */ +# include +#endif + +#if HAVE_MQUERY /* OpenBSD */ +# include +# include /* mquery */ +#endif + + +/* Support for reading text files in the /proc file system. */ + +#if defined __linux__ || defined __FreeBSD__ || defined __NetBSD__ /* || defined __CYGWIN__ */ + +/* Buffered read-only streams. + We cannot use here, because fopen() calls malloc(), and a malloc() + call may call mmap() and thus pre-allocate available memory. */ + +struct rofile + { + int fd; + size_t position; + size_t filled; + int eof_seen; + char buffer[1024]; + }; + +/* Open a read-only file stream. */ +static int +rof_open (struct rofile *rof, const char *filename) +{ + int fd = open (filename, O_RDONLY); + if (fd < 0) + return -1; + rof->fd = fd; + rof->position = 0; + rof->filled = 0; + rof->eof_seen = 0; + return 0; +} + +/* Return the next byte from a read-only file stream without consuming it, + or -1 at EOF. */ +static int +rof_peekchar (struct rofile *rof) +{ + if (rof->position == rof->filled) + { + if (rof->eof_seen) + return -1; + else + for (;;) + { + int n = read (rof->fd, rof->buffer, sizeof (rof->buffer)); +# ifdef EINTR + if (n < 0 && errno == EINTR) + continue; +# endif + if (n <= 0) + { + rof->eof_seen = 1; + return -1; + } + rof->filled = n; + rof->position = 0; + break; + } + } + return (unsigned char) rof->buffer[rof->position]; +} + +/* Return the next byte from a read-only file stream, or -1 at EOF. */ +static int +rof_getchar (struct rofile *rof) +{ + int c = rof_peekchar (rof); + if (c >= 0) + rof->position++; + return c; +} + +/* Parse an unsigned hexadecimal number from a read-only file stream. */ +static int +rof_scanf_lx (struct rofile *rof, unsigned long *valuep) +{ + unsigned long value = 0; + unsigned int numdigits = 0; + for (;;) + { + int c = rof_peekchar (rof); + if (c >= '0' && c <= '9') + value = (value << 4) + (c - '0'); + else if (c >= 'A' && c <= 'F') + value = (value << 4) + (c - 'A' + 10); + else if (c >= 'a' && c <= 'f') + value = (value << 4) + (c - 'a' + 10); + else + break; + rof_getchar (rof); + numdigits++; + } + if (numdigits == 0) + return -1; + *valuep = value; + return 0; +} + +/* Close a read-only file stream. */ +static void +rof_close (struct rofile *rof) +{ + close (rof->fd); +} + +#endif + + +void +vma_iterate (vma_iterate_callback_fn callback, void *data) +{ +#if defined __linux__ /* || defined __CYGWIN__ */ + + struct rofile rof; + int c; + + /* Open the current process' maps file. It describes one VMA per line. */ + if (rof_open (&rof, "/proc/self/maps") < 0) + return; + + for (;;) + { + unsigned long start, end; + unsigned int flags; + + /* Parse one line. First start and end. */ + if (!(rof_scanf_lx (&rof, &start) >= 0 + && rof_getchar (&rof) == '-' + && rof_scanf_lx (&rof, &end) >= 0)) + break; + /* Then the flags. */ + do + c = rof_getchar (&rof); + while (c == ' '); + flags = 0; + if (c == 'r') + flags |= VMA_PROT_READ; + c = rof_getchar (&rof); + if (c == 'w') + flags |= VMA_PROT_WRITE; + c = rof_getchar (&rof); + if (c == 'x') + flags |= VMA_PROT_EXECUTE; + while (c = rof_getchar (&rof), c != -1 && c != '\n') + ; + + if (callback (data, start, end, flags)) + break; + } + rof_close (&rof); + +#elif defined __FreeBSD__ || defined __NetBSD__ + + struct rofile rof; + int c; + + /* Open the current process' maps file. It describes one VMA per line. */ + if (rof_open (&rof, "/proc/curproc/map") < 0) + return; + + for (;;) + { + unsigned long start, end; + unsigned int flags; + + /* Parse one line. First start. */ + if (!(rof_getchar (&rof) == '0' + && rof_getchar (&rof) == 'x' + && rof_scanf_lx (&rof, &start) >= 0)) + break; + while (c = rof_peekchar (&rof), c == ' ' || c == '\t') + rof_getchar (&rof); + /* Then end. */ + if (!(rof_getchar (&rof) == '0' + && rof_getchar (&rof) == 'x' + && rof_scanf_lx (&rof, &end) >= 0)) + break; + /* Then the flags. */ + do + c = rof_getchar (&rof); + while (c == ' '); + flags = 0; + if (c == 'r') + flags |= VMA_PROT_READ; + c = rof_getchar (&rof); + if (c == 'w') + flags |= VMA_PROT_WRITE; + c = rof_getchar (&rof); + if (c == 'x') + flags |= VMA_PROT_EXECUTE; + while (c = rof_getchar (&rof), c != -1 && c != '\n') + ; + + if (callback (data, start, end, flags)) + break; + } + rof_close (&rof); + +#elif defined __sgi || defined __osf__ /* IRIX, OSF/1 */ + + size_t pagesize; + char fnamebuf[6+10+1]; + char *fname; + int fd; + int nmaps; + size_t memneed; +# if HAVE_MAP_ANONYMOUS +# define zero_fd -1 +# define map_flags MAP_ANONYMOUS +# else + int zero_fd; +# define map_flags 0 +# endif + void *auxmap; + unsigned long auxmap_start; + unsigned long auxmap_end; + prmap_t* maps; + prmap_t* mp; + + pagesize = getpagesize (); + + /* Construct fname = sprintf (fnamebuf+i, "/proc/%u", getpid ()). */ + fname = fnamebuf + sizeof (fnamebuf) - 1; + *fname = '\0'; + { + unsigned int value = getpid (); + do + *--fname = (value % 10) + '0'; + while ((value = value / 10) > 0); + } + fname -= 6; + memcpy (fname, "/proc/", 6); + + fd = open (fname, O_RDONLY); + if (fd < 0) + return; + + if (ioctl (fd, PIOCNMAP, &nmaps) < 0) + goto fail2; + + memneed = (nmaps + 10) * sizeof (prmap_t); + /* Allocate memneed bytes of memory. + We cannot use alloca here, because not much stack space is guaranteed. + We also cannot use malloc here, because a malloc() call may call mmap() + and thus pre-allocate available memory. + So use mmap(), and ignore the resulting VMA. */ + memneed = ((memneed - 1) / pagesize + 1) * pagesize; +# if !HAVE_MAP_ANONYMOUS + zero_fd = open ("/dev/zero", O_RDONLY, 0644); + if (zero_fd < 0) + goto fail2; +# endif + auxmap = (void *) mmap ((void *) 0, memneed, PROT_READ | PROT_WRITE, + map_flags | MAP_PRIVATE, zero_fd, 0); +# if !HAVE_MAP_ANONYMOUS + close (zero_fd); +# endif + if (auxmap == (void *) -1) + goto fail2; + auxmap_start = (unsigned long) auxmap; + auxmap_end = auxmap_start + memneed; + maps = (prmap_t *) auxmap; + + if (ioctl (fd, PIOCMAP, maps) < 0) + goto fail1; + + for (mp = maps;;) + { + unsigned long start, end; + unsigned int flags; + + start = (unsigned long) mp->pr_vaddr; + end = start + mp->pr_size; + if (start == 0 && end == 0) + break; + flags = 0; + if (mp->pr_mflags & MA_READ) + flags |= VMA_PROT_READ; + if (mp->pr_mflags & MA_WRITE) + flags |= VMA_PROT_WRITE; + if (mp->pr_mflags & MA_EXEC) + flags |= VMA_PROT_EXECUTE; + mp++; + if (start <= auxmap_start && auxmap_end - 1 <= end - 1) + { + /* Consider [start,end-1] \ [auxmap_start,auxmap_end-1] + = [start,auxmap_start-1] u [auxmap_end,end-1]. */ + if (start < auxmap_start) + if (callback (data, start, auxmap_start, flags)) + break; + if (auxmap_end - 1 < end - 1) + if (callback (data, auxmap_end, end, flags)) + break; + } + else + { + if (callback (data, start, end, flags)) + break; + } + } + munmap (auxmap, memneed); + close (fd); + return; + + fail1: + munmap (auxmap, memneed); + fail2: + close (fd); + return; + +#elif defined __APPLE__ && defined __MACH__ /* MacOS X */ + + task_t task = mach_task_self (); + vm_address_t address; + vm_size_t size; + + for (address = VM_MIN_ADDRESS;; address += size) + { + int more; + mach_port_t object_name; + unsigned int flags; + /* In MacOS X 10.5, the types vm_address_t, vm_offset_t, vm_size_t have + 32 bits in 32-bit processes and 64 bits in 64-bit processes. Whereas + mach_vm_address_t and mach_vm_size_t are always 64 bits large. + MacOS X 10.5 has three vm_region like methods: + - vm_region. It has arguments that depend on whether the current + process is 32-bit or 64-bit. When linking dynamically, this + function exists only in 32-bit processes. Therefore we use it only + in 32-bit processes. + - vm_region_64. It has arguments that depend on whether the current + process is 32-bit or 64-bit. It interprets a flavor + VM_REGION_BASIC_INFO as VM_REGION_BASIC_INFO_64, which is + dangerous since 'struct vm_region_basic_info_64' is larger than + 'struct vm_region_basic_info'; therefore let's write + VM_REGION_BASIC_INFO_64 explicitly. + - mach_vm_region. It has arguments that are 64-bit always. This + function is useful when you want to access the VM of a process + other than the current process. + In 64-bit processes, we could use vm_region_64 or mach_vm_region. + I choose vm_region_64 because it uses the same types as vm_region, + resulting in less conditional code. */ +# if defined __ppc64__ || defined __x86_64__ + struct vm_region_basic_info_64 info; + mach_msg_type_number_t info_count = VM_REGION_BASIC_INFO_COUNT_64; + + more = (vm_region_64 (task, &address, &size, VM_REGION_BASIC_INFO_64, + (vm_region_info_t)&info, &info_count, &object_name) + == KERN_SUCCESS); +# else + struct vm_region_basic_info info; + mach_msg_type_number_t info_count = VM_REGION_BASIC_INFO_COUNT; + + more = (vm_region (task, &address, &size, VM_REGION_BASIC_INFO, + (vm_region_info_t)&info, &info_count, &object_name) + == KERN_SUCCESS); +# endif + if (object_name != MACH_PORT_NULL) + mach_port_deallocate (mach_task_self (), object_name); + if (!more) + break; + flags = 0; + if (info.protection & VM_PROT_READ) + flags |= VMA_PROT_READ; + if (info.protection & VM_PROT_WRITE) + flags |= VMA_PROT_WRITE; + if (info.protection & VM_PROT_EXECUTE) + flags |= VMA_PROT_EXECUTE; + if (callback (data, address, address + size, flags)) + break; + } + +#elif (defined _WIN32 || defined __WIN32__) || defined __CYGWIN__ + /* Windows platform. Use the native Windows API. */ + + MEMORY_BASIC_INFORMATION info; + unsigned long address = 0; + + while (VirtualQuery ((void*)address, &info, sizeof(info)) == sizeof(info)) + { + if (info.State != MEM_FREE) + /* Ignore areas where info.State has the value MEM_RESERVE or, + equivalently, info.Protect has the undocumented value 0. + This is needed, so that on Cygwin, areas used by malloc() are + distinguished from areas reserved for future malloc(). */ + if (info.State != MEM_RESERVE) + { + unsigned long start, end; + unsigned int flags; + + start = (unsigned long)info.BaseAddress; + end = start + info.RegionSize; + switch (info.Protect & ~(PAGE_GUARD|PAGE_NOCACHE)) + { + case PAGE_READONLY: + flags = VMA_PROT_READ; + break; + case PAGE_READWRITE: + case PAGE_WRITECOPY: + flags = VMA_PROT_READ | VMA_PROT_WRITE; + break; + case PAGE_EXECUTE: + flags = VMA_PROT_EXECUTE; + break; + case PAGE_EXECUTE_READ: + flags = VMA_PROT_READ | VMA_PROT_EXECUTE; + break; + case PAGE_EXECUTE_READWRITE: + case PAGE_EXECUTE_WRITECOPY: + flags = VMA_PROT_READ | VMA_PROT_WRITE | VMA_PROT_EXECUTE; + break; + case PAGE_NOACCESS: + default: + flags = 0; + break; + } + + if (callback (data, start, end, flags)) + break; + } + address = (unsigned long)info.BaseAddress + info.RegionSize; + } + +#elif defined __BEOS__ || defined __HAIKU__ + /* Use the BeOS specific API. */ + + area_info info; + int32 cookie; + + cookie = 0; + while (get_next_area_info (0, &cookie, &info) == B_OK) + { + unsigned long start, end; + unsigned int flags; + + start = (unsigned long) info.address; + end = start + info.size; + flags = 0; + if (info.protection & B_READ_AREA) + flags |= VMA_PROT_READ | VMA_PROT_EXECUTE; + if (info.protection & B_WRITE_AREA) + flags |= VMA_PROT_WRITE; + + if (callback (data, start, end, flags)) + break; + } + +#elif HAVE_MQUERY /* OpenBSD */ + + uintptr_t pagesize; + uintptr_t address; + int /*bool*/ address_known_mapped; + + pagesize = getpagesize (); + /* Avoid calling mquery with a NULL first argument, because this argument + value has a specific meaning. We know the NULL page is unmapped. */ + address = pagesize; + address_known_mapped = 0; + for (;;) + { + /* Test whether the page at address is mapped. */ + if (address_known_mapped + || mquery ((void *) address, pagesize, 0, MAP_FIXED, -1, 0) + == (void *) -1) + { + /* The page at address is mapped. + This is the start of an interval. */ + uintptr_t start = address; + uintptr_t end; + + /* Find the end of the interval. */ + end = (uintptr_t) mquery ((void *) address, pagesize, 0, 0, -1, 0); + if (end == (uintptr_t) (void *) -1) + end = 0; /* wrap around */ + address = end; + + /* It's too complicated to find out about the flags. Just pass 0. */ + if (callback (data, start, end, 0)) + break; + + if (address < pagesize) /* wrap around? */ + break; + } + /* Here we know that the page at address is unmapped. */ + { + uintptr_t query_size = pagesize; + + address += pagesize; + + /* Query larger and larger blocks, to get through the unmapped address + range with few mquery() calls. */ + for (;;) + { + if (2 * query_size > query_size) + query_size = 2 * query_size; + if (address + query_size - 1 < query_size) /* wrap around? */ + { + address_known_mapped = 0; + break; + } + if (mquery ((void *) address, query_size, 0, MAP_FIXED, -1, 0) + == (void *) -1) + { + /* Not all the interval [address .. address + query_size - 1] + is unmapped. */ + address_known_mapped = (query_size == pagesize); + break; + } + /* The interval [address .. address + query_size - 1] is + unmapped. */ + address += query_size; + } + /* Reduce the query size again, to determine the precise size of the + unmapped interval that starts at address. */ + while (query_size > pagesize) + { + query_size = query_size / 2; + if (address + query_size - 1 >= query_size) + { + if (mquery ((void *) address, query_size, 0, MAP_FIXED, -1, 0) + != (void *) -1) + { + /* The interval [address .. address + query_size - 1] is + unmapped. */ + address += query_size; + address_known_mapped = 0; + } + else + address_known_mapped = (query_size == pagesize); + } + } + /* Here again query_size = pagesize, and + either address + pagesize - 1 < pagesize, or + mquery ((void *) address, pagesize, 0, MAP_FIXED, -1, 0) fails. + So, the unmapped area ends at address. */ + } + if (address + pagesize - 1 < pagesize) /* wrap around? */ + break; + } + +#endif +} + + +#ifdef TEST + +#include + +/* Output the VMAs of the current process in a format similar to the Linux + /proc/$pid/maps file. */ + +static int +vma_iterate_callback (void *data, uintptr_t start, uintptr_t end, + unsigned int flags) +{ + printf ("%08lx-%08lx %c%c%c\n", + (unsigned long) start, (unsigned long) end, + flags & VMA_PROT_READ ? 'r' : '-', + flags & VMA_PROT_WRITE ? 'w' : '-', + flags & VMA_PROT_EXECUTE ? 'x' : '-'); + return 0; +} + +int +main () +{ + vma_iterate (vma_iterate_callback, NULL); + + /* Let the user interactively look at the /proc file system. */ + sleep (10); + + return 0; +} + +#endif /* TEST */ diff --git a/gnulib/lib/vma-iter.h b/gnulib/lib/vma-iter.h new file mode 100644 index 0000000..e24de65 --- /dev/null +++ b/gnulib/lib/vma-iter.h @@ -0,0 +1,63 @@ +/* Iteration over virtual memory areas. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef _VMA_ITER_H +#define _VMA_ITER_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +/* Bit mask for the FLAGS parameter of a vma_iterate callback function. */ +#define VMA_PROT_READ (1<<0) +#define VMA_PROT_WRITE (1<<1) +#define VMA_PROT_EXECUTE (1<<2) + +typedef int (*vma_iterate_callback_fn) (void *data, + uintptr_t start, uintptr_t end, + unsigned int flags); + +/* Iterate over the virtual memory areas of the current process. + If such iteration is supported, the callback is called once for every + virtual memory area, in ascending order, with the following arguments: + - DATA is the same argument as passed to vma_iterate. + - START is the address of the first byte in the area, page-aligned. + - END is the address of the last byte in the area plus 1, page-aligned. + Note that it may be 0 for the last area in the address space. + - FLAGS is a combination of the VMA_* bits. + If the callback returns 0, the iteration continues. If it returns 1, + the iteration terminates prematurely. + This function may open file descriptors, but does not call malloc(). */ +extern void vma_iterate (vma_iterate_callback_fn callback, void *data); + +/* The macro VMA_ITERATE_SUPPORTED indicates that vma_iterate is supported on + this platform. + Note that even when this macro is defined, vma_iterate() may still fail to + find any virtual memory area, for example if /proc is not mounted. */ +#if defined __linux__ || defined __FreeBSD__ || defined __NetBSD__ || defined __sgi || defined __osf__ || (defined __APPLE__ && defined __MACH__) || (defined _WIN32 || defined __WIN32__) || defined __CYGWIN__ || defined __BEOS__ || defined __HAIKU__ || HAVE_MQUERY +# define VMA_ITERATE_SUPPORTED 1 +#endif + + +#ifdef __cplusplus +} +#endif + +#endif /* _VMA_ITER_H */ diff --git a/gnulib/lib/vprintf.c b/gnulib/lib/vprintf.c new file mode 100644 index 0000000..0388713 --- /dev/null +++ b/gnulib/lib/vprintf.c @@ -0,0 +1,33 @@ +/* Formatted output to a stream. + Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +/* Specification. */ +#include + +#include + +/* 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 0000000..ff5a807 --- /dev/null +++ b/gnulib/lib/vsnprintf.c @@ -0,0 +1,71 @@ +/* Formatted output to strings. + Copyright (C) 2004, 2006-2011 Free Software Foundation, Inc. + Written by Simon Josefsson and Yoann Vandoorselaere . + + This program is free software; you can 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 +#endif + +/* Specification. */ +#include + +#include +#include +#include +#include +#include + +#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 0000000..3cbfa26 --- /dev/null +++ b/gnulib/lib/vsprintf.c @@ -0,0 +1,77 @@ +/* Formatted output to strings. + Copyright (C) 2004, 2006-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +/* Specification. */ +#include + +#include +#include +#include +#include +#include + +#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 0000000..0b8334e --- /dev/null +++ b/gnulib/lib/w32sock.h @@ -0,0 +1,136 @@ +/* w32sock.h --- internal auxilliary functions for Windows socket functions + + Copyright (C) 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paolo Bonzini */ + +#include + +/* Get O_RDWR and O_BINARY. */ +#include + +/* Get _open_osfhandle(). */ +#include + +/* Get _get_osfhandle(). */ +#include "msvc-nothrow.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 WSAENAMETOOLONG: + errno = ENAMETOOLONG; + break; + case WSAENOTEMPTY: + errno = ENOTEMPTY; + break; + case WSAEWOULDBLOCK: + errno = EWOULDBLOCK; + break; + case WSAEINPROGRESS: + errno = EINPROGRESS; + break; + case WSAEALREADY: + errno = EALREADY; + break; + case WSAENOTSOCK: + errno = ENOTSOCK; + break; + case WSAEDESTADDRREQ: + errno = EDESTADDRREQ; + break; + case WSAEMSGSIZE: + errno = EMSGSIZE; + break; + case WSAEPROTOTYPE: + errno = EPROTOTYPE; + break; + case WSAENOPROTOOPT: + errno = ENOPROTOOPT; + break; + case WSAEPROTONOSUPPORT: + errno = EPROTONOSUPPORT; + break; + case WSAEOPNOTSUPP: + errno = EOPNOTSUPP; + break; + case WSAEAFNOSUPPORT: + errno = EAFNOSUPPORT; + break; + case WSAEADDRINUSE: + errno = EADDRINUSE; + break; + case WSAEADDRNOTAVAIL: + errno = EADDRNOTAVAIL; + break; + case WSAENETDOWN: + errno = ENETDOWN; + break; + case WSAENETUNREACH: + errno = ENETUNREACH; + break; + case WSAENETRESET: + errno = ENETRESET; + break; + case WSAECONNABORTED: + errno = ECONNABORTED; + break; + case WSAECONNRESET: + errno = ECONNRESET; + break; + case WSAENOBUFS: + errno = ENOBUFS; + break; + case WSAEISCONN: + errno = EISCONN; + break; + case WSAENOTCONN: + errno = ENOTCONN; + break; + case WSAETIMEDOUT: + errno = ETIMEDOUT; + break; + case WSAECONNREFUSED: + errno = ECONNREFUSED; + break; + case WSAELOOP: + errno = ELOOP; + break; + case WSAEHOSTUNREACH: + errno = EHOSTUNREACH; + 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 0000000..1667370 --- /dev/null +++ b/gnulib/lib/w32spawn.h @@ -0,0 +1,215 @@ +/* Auxiliary functions for the creation of subprocesses. Native Woe32 API. + Copyright (C) 2001, 2003-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +/* Get declarations of the Win32 API functions. */ +#define WIN32_LEAN_AND_MEAN +#include + +/* Get _open_osfhandle(). */ +#include + +#include +#include +#include +#include + +/* Get _get_osfhandle(). */ +#include "msvc-nothrow.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 0000000..37ca7b9 --- /dev/null +++ b/gnulib/lib/wait-process.c @@ -0,0 +1,361 @@ +/* Waiting for a subprocess to finish. + Copyright (C) 2001-2003, 2005-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + + +#include + +/* Specification. */ +#include "wait-process.h" + +#include +#include +#include +#include + +#include +#include + +#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 + +/* 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 0000000..3c178c1 --- /dev/null +++ b/gnulib/lib/wait-process.h @@ -0,0 +1,74 @@ +/* Waiting for a subprocess to finish. + Copyright (C) 2001-2003, 2006, 2008-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#ifndef _WAIT_PROCESS_H +#define _WAIT_PROCESS_H + +/* Get pid_t. */ +#include +#include +#include + +#include + + +#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/waitpid.c b/gnulib/lib/waitpid.c new file mode 100644 index 0000000..fe5dee8 --- /dev/null +++ b/gnulib/lib/waitpid.c @@ -0,0 +1,31 @@ +/* Wait for process state change. + Copyright (C) 2001-2003, 2005-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 + +/* Specification. */ +#include + +/* Implementation for native Win32 systems. */ + +#include /* for _cwait, WAIT_CHILD */ + +pid_t +waitpid (pid_t pid, int *statusp, int options) +{ + return _cwait (statusp, pid, WAIT_CHILD); +} diff --git a/gnulib/lib/wchar.in.h b/gnulib/lib/wchar.in.h new file mode 100644 index 0000000..8534acb --- /dev/null +++ b/gnulib/lib/wchar.in.h @@ -0,0 +1,1006 @@ +/* A substitute for ISO C99 , for platforms that have issues. + + Copyright (C) 2007-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 for platforms that have issues. + * + * + * For now, this just ensures proper prerequisite inclusion order and + * the declaration of wcwidth(). + */ + +#if __GNUC__ >= 3 +@PRAGMA_SYSTEM_HEADER@ +#endif +@PRAGMA_COLUMNS@ + +#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 + -> -> , and the latter includes , + once indirectly -> -> -> + 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 . + - On IRIX 6.5, similarly, we have an include -> , and + the latter includes . But here, we have no way to detect whether + is completely included or is still being included. */ + +#@INCLUDE_NEXT@ @NEXT_WCHAR_H@ + +#else +/* Normal invocation convention. */ + +#ifndef _@GUARD_PREFIX@_WCHAR_H + +#define _GL_ALREADY_INCLUDING_WCHAR_H + +#if @HAVE_FEATURES_H@ +# include /* for __GLIBC__ */ +#endif + +/* Tru64 with Desktop Toolkit C has a bug: must be included before + . + BSD/OS 4.0.1 has a bug: , and must be + included before . + In some builds of uClibc, is nonexistent and wchar_t is defined + by . + But avoid namespace pollution on glibc systems. */ +#if !(defined __GLIBC__ && !defined __UCLIBC__) +# include +#endif +#ifndef __GLIBC__ +# include +# include +#endif + +/* Include the original 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 _@GUARD_PREFIX@_WCHAR_H +#define _@GUARD_PREFIX@_WCHAR_H + +/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ + +/* The definition of _GL_ARG_NONNULL is copied here. */ + +/* The definition of _GL_WARN_ON_USE is copied here. */ + + +/* Define wint_t and WEOF. (Also done in wctype.in.h.) */ +#if !@HAVE_WINT_T@ && !defined wint_t +# define wint_t int +# ifndef WEOF +# define WEOF -1 +# endif +#else +/* MSVC defines wint_t as 'unsigned short' in . + This is too small: ISO C 99 section 7.24.1.(2) says that wint_t must be + "unchanged by default argument promotions". Override it. */ +# if defined _MSC_VER +# if !GNULIB_defined_wint_t +# include +typedef unsigned int rpl_wint_t; +# undef wint_t +# define wint_t rpl_wint_t +# define GNULIB_defined_wint_t 1 +# endif +# endif +# ifndef WEOF +# define WEOF ((wint_t) -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@ +# if !GNULIB_defined_mbstate_t +typedef int rpl_mbstate_t; +# undef mbstate_t +# define mbstate_t rpl_mbstate_t +# define GNULIB_defined_mbstate_t 1 +# endif +#endif + + +/* Convert a single-byte character to a wide character. */ +#if @GNULIB_BTOWC@ +# if @REPLACE_BTOWC@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef btowc +# define btowc rpl_btowc +# endif +_GL_FUNCDECL_RPL (btowc, wint_t, (int c)); +_GL_CXXALIAS_RPL (btowc, wint_t, (int c)); +# else +# if !@HAVE_BTOWC@ +_GL_FUNCDECL_SYS (btowc, wint_t, (int c)); +# endif +_GL_CXXALIAS_SYS (btowc, wint_t, (int c)); +# endif +_GL_CXXALIASWARN (btowc); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef wctob +# define wctob rpl_wctob +# endif +_GL_FUNCDECL_RPL (wctob, int, (wint_t wc)); +_GL_CXXALIAS_RPL (wctob, int, (wint_t wc)); +# else +# if !defined wctob && !@HAVE_DECL_WCTOB@ +/* wctob is provided by gnulib, or wctob exists but is not declared. */ +_GL_FUNCDECL_SYS (wctob, int, (wint_t wc)); +# endif +_GL_CXXALIAS_SYS (wctob, int, (wint_t wc)); +# endif +_GL_CXXALIASWARN (wctob); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef mbsinit +# define mbsinit rpl_mbsinit +# endif +_GL_FUNCDECL_RPL (mbsinit, int, (const mbstate_t *ps)); +_GL_CXXALIAS_RPL (mbsinit, int, (const mbstate_t *ps)); +# else +# if !@HAVE_MBSINIT@ +_GL_FUNCDECL_SYS (mbsinit, int, (const mbstate_t *ps)); +# endif +_GL_CXXALIAS_SYS (mbsinit, int, (const mbstate_t *ps)); +# endif +_GL_CXXALIASWARN (mbsinit); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef mbrtowc +# define mbrtowc rpl_mbrtowc +# endif +_GL_FUNCDECL_RPL (mbrtowc, size_t, + (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)); +_GL_CXXALIAS_RPL (mbrtowc, size_t, + (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)); +# else +# if !@HAVE_MBRTOWC@ +_GL_FUNCDECL_SYS (mbrtowc, size_t, + (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)); +# endif +_GL_CXXALIAS_SYS (mbrtowc, size_t, + (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)); +# endif +_GL_CXXALIASWARN (mbrtowc); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef mbrlen +# define mbrlen rpl_mbrlen +# endif +_GL_FUNCDECL_RPL (mbrlen, size_t, (const char *s, size_t n, mbstate_t *ps)); +_GL_CXXALIAS_RPL (mbrlen, size_t, (const char *s, size_t n, mbstate_t *ps)); +# else +# if !@HAVE_MBRLEN@ +_GL_FUNCDECL_SYS (mbrlen, size_t, (const char *s, size_t n, mbstate_t *ps)); +# endif +_GL_CXXALIAS_SYS (mbrlen, size_t, (const char *s, size_t n, mbstate_t *ps)); +# endif +_GL_CXXALIASWARN (mbrlen); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef mbsrtowcs +# define mbsrtowcs rpl_mbsrtowcs +# endif +_GL_FUNCDECL_RPL (mbsrtowcs, size_t, + (wchar_t *dest, const char **srcp, size_t len, mbstate_t *ps) + _GL_ARG_NONNULL ((2))); +_GL_CXXALIAS_RPL (mbsrtowcs, size_t, + (wchar_t *dest, const char **srcp, size_t len, + mbstate_t *ps)); +# else +# if !@HAVE_MBSRTOWCS@ +_GL_FUNCDECL_SYS (mbsrtowcs, size_t, + (wchar_t *dest, const char **srcp, size_t len, mbstate_t *ps) + _GL_ARG_NONNULL ((2))); +# endif +_GL_CXXALIAS_SYS (mbsrtowcs, size_t, + (wchar_t *dest, const char **srcp, size_t len, + mbstate_t *ps)); +# endif +_GL_CXXALIASWARN (mbsrtowcs); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef mbsnrtowcs +# define mbsnrtowcs rpl_mbsnrtowcs +# endif +_GL_FUNCDECL_RPL (mbsnrtowcs, size_t, + (wchar_t *dest, const char **srcp, size_t srclen, size_t len, + mbstate_t *ps) + _GL_ARG_NONNULL ((2))); +_GL_CXXALIAS_RPL (mbsnrtowcs, size_t, + (wchar_t *dest, const char **srcp, size_t srclen, size_t len, + mbstate_t *ps)); +# else +# if !@HAVE_MBSNRTOWCS@ +_GL_FUNCDECL_SYS (mbsnrtowcs, size_t, + (wchar_t *dest, const char **srcp, size_t srclen, size_t len, + mbstate_t *ps) + _GL_ARG_NONNULL ((2))); +# endif +_GL_CXXALIAS_SYS (mbsnrtowcs, size_t, + (wchar_t *dest, const char **srcp, size_t srclen, size_t len, + mbstate_t *ps)); +# endif +_GL_CXXALIASWARN (mbsnrtowcs); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef wcrtomb +# define wcrtomb rpl_wcrtomb +# endif +_GL_FUNCDECL_RPL (wcrtomb, size_t, (char *s, wchar_t wc, mbstate_t *ps)); +_GL_CXXALIAS_RPL (wcrtomb, size_t, (char *s, wchar_t wc, mbstate_t *ps)); +# else +# if !@HAVE_WCRTOMB@ +_GL_FUNCDECL_SYS (wcrtomb, size_t, (char *s, wchar_t wc, mbstate_t *ps)); +# endif +_GL_CXXALIAS_SYS (wcrtomb, size_t, (char *s, wchar_t wc, mbstate_t *ps)); +# endif +_GL_CXXALIASWARN (wcrtomb); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef wcsrtombs +# define wcsrtombs rpl_wcsrtombs +# endif +_GL_FUNCDECL_RPL (wcsrtombs, size_t, + (char *dest, const wchar_t **srcp, size_t len, mbstate_t *ps) + _GL_ARG_NONNULL ((2))); +_GL_CXXALIAS_RPL (wcsrtombs, size_t, + (char *dest, const wchar_t **srcp, size_t len, + mbstate_t *ps)); +# else +# if !@HAVE_WCSRTOMBS@ +_GL_FUNCDECL_SYS (wcsrtombs, size_t, + (char *dest, const wchar_t **srcp, size_t len, mbstate_t *ps) + _GL_ARG_NONNULL ((2))); +# endif +_GL_CXXALIAS_SYS (wcsrtombs, size_t, + (char *dest, const wchar_t **srcp, size_t len, + mbstate_t *ps)); +# endif +_GL_CXXALIASWARN (wcsrtombs); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef wcsnrtombs +# define wcsnrtombs rpl_wcsnrtombs +# endif +_GL_FUNCDECL_RPL (wcsnrtombs, size_t, + (char *dest, const wchar_t **srcp, size_t srclen, size_t len, + mbstate_t *ps) + _GL_ARG_NONNULL ((2))); +_GL_CXXALIAS_RPL (wcsnrtombs, size_t, + (char *dest, const wchar_t **srcp, size_t srclen, size_t len, + mbstate_t *ps)); +# else +# if !@HAVE_WCSNRTOMBS@ +_GL_FUNCDECL_SYS (wcsnrtombs, size_t, + (char *dest, const wchar_t **srcp, size_t srclen, size_t len, + mbstate_t *ps) + _GL_ARG_NONNULL ((2))); +# endif +_GL_CXXALIAS_SYS (wcsnrtombs, size_t, + (char *dest, const wchar_t **srcp, size_t srclen, size_t len, + mbstate_t *ps)); +# endif +_GL_CXXALIASWARN (wcsnrtombs); +#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@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef wcwidth +# define wcwidth rpl_wcwidth +# endif +_GL_FUNCDECL_RPL (wcwidth, int, (wchar_t)); +_GL_CXXALIAS_RPL (wcwidth, int, (wchar_t)); +# else +# if !@HAVE_DECL_WCWIDTH@ +/* wcwidth exists but is not declared. */ +_GL_FUNCDECL_SYS (wcwidth, int, (wchar_t)); +# endif +_GL_CXXALIAS_SYS (wcwidth, int, (wchar_t)); +# endif +_GL_CXXALIASWARN (wcwidth); +#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 + + +/* Search N wide characters of S for C. */ +#if @GNULIB_WMEMCHR@ +# if !@HAVE_WMEMCHR@ +_GL_FUNCDECL_SYS (wmemchr, wchar_t *, (const wchar_t *s, wchar_t c, size_t n)); +# endif + /* On some systems, this function is defined as an overloaded function: + extern "C++" { + const wchar_t * std::wmemchr (const wchar_t *, wchar_t, size_t); + wchar_t * std::wmemchr (wchar_t *, wchar_t, size_t); + } */ +_GL_CXXALIAS_SYS_CAST2 (wmemchr, + wchar_t *, (const wchar_t *, wchar_t, size_t), + const wchar_t *, (const wchar_t *, wchar_t, size_t)); +# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \ + && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) +_GL_CXXALIASWARN1 (wmemchr, wchar_t *, (wchar_t *s, wchar_t c, size_t n)); +_GL_CXXALIASWARN1 (wmemchr, const wchar_t *, + (const wchar_t *s, wchar_t c, size_t n)); +# else +_GL_CXXALIASWARN (wmemchr); +# endif +#elif defined GNULIB_POSIXCHECK +# undef wmemchr +# if HAVE_RAW_DECL_WMEMCHR +_GL_WARN_ON_USE (wmemchr, "wmemchr is unportable - " + "use gnulib module wmemchr for portability"); +# endif +#endif + + +/* Compare N wide characters of S1 and S2. */ +#if @GNULIB_WMEMCMP@ +# if !@HAVE_WMEMCMP@ +_GL_FUNCDECL_SYS (wmemcmp, int, + (const wchar_t *s1, const wchar_t *s2, size_t n)); +# endif +_GL_CXXALIAS_SYS (wmemcmp, int, + (const wchar_t *s1, const wchar_t *s2, size_t n)); +_GL_CXXALIASWARN (wmemcmp); +#elif defined GNULIB_POSIXCHECK +# undef wmemcmp +# if HAVE_RAW_DECL_WMEMCMP +_GL_WARN_ON_USE (wmemcmp, "wmemcmp is unportable - " + "use gnulib module wmemcmp for portability"); +# endif +#endif + + +/* Copy N wide characters of SRC to DEST. */ +#if @GNULIB_WMEMCPY@ +# if !@HAVE_WMEMCPY@ +_GL_FUNCDECL_SYS (wmemcpy, wchar_t *, + (wchar_t *dest, const wchar_t *src, size_t n)); +# endif +_GL_CXXALIAS_SYS (wmemcpy, wchar_t *, + (wchar_t *dest, const wchar_t *src, size_t n)); +_GL_CXXALIASWARN (wmemcpy); +#elif defined GNULIB_POSIXCHECK +# undef wmemcpy +# if HAVE_RAW_DECL_WMEMCPY +_GL_WARN_ON_USE (wmemcpy, "wmemcpy is unportable - " + "use gnulib module wmemcpy for portability"); +# endif +#endif + + +/* Copy N wide characters of SRC to DEST, guaranteeing correct behavior for + overlapping memory areas. */ +#if @GNULIB_WMEMMOVE@ +# if !@HAVE_WMEMMOVE@ +_GL_FUNCDECL_SYS (wmemmove, wchar_t *, + (wchar_t *dest, const wchar_t *src, size_t n)); +# endif +_GL_CXXALIAS_SYS (wmemmove, wchar_t *, + (wchar_t *dest, const wchar_t *src, size_t n)); +_GL_CXXALIASWARN (wmemmove); +#elif defined GNULIB_POSIXCHECK +# undef wmemmove +# if HAVE_RAW_DECL_WMEMMOVE +_GL_WARN_ON_USE (wmemmove, "wmemmove is unportable - " + "use gnulib module wmemmove for portability"); +# endif +#endif + + +/* Set N wide characters of S to C. */ +#if @GNULIB_WMEMSET@ +# if !@HAVE_WMEMSET@ +_GL_FUNCDECL_SYS (wmemset, wchar_t *, (wchar_t *s, wchar_t c, size_t n)); +# endif +_GL_CXXALIAS_SYS (wmemset, wchar_t *, (wchar_t *s, wchar_t c, size_t n)); +_GL_CXXALIASWARN (wmemset); +#elif defined GNULIB_POSIXCHECK +# undef wmemset +# if HAVE_RAW_DECL_WMEMSET +_GL_WARN_ON_USE (wmemset, "wmemset is unportable - " + "use gnulib module wmemset for portability"); +# endif +#endif + + +/* Return the number of wide characters in S. */ +#if @GNULIB_WCSLEN@ +# if !@HAVE_WCSLEN@ +_GL_FUNCDECL_SYS (wcslen, size_t, (const wchar_t *s)); +# endif +_GL_CXXALIAS_SYS (wcslen, size_t, (const wchar_t *s)); +_GL_CXXALIASWARN (wcslen); +#elif defined GNULIB_POSIXCHECK +# undef wcslen +# if HAVE_RAW_DECL_WCSLEN +_GL_WARN_ON_USE (wcslen, "wcslen is unportable - " + "use gnulib module wcslen for portability"); +# endif +#endif + + +/* Return the number of wide characters in S, but at most MAXLEN. */ +#if @GNULIB_WCSNLEN@ +# if !@HAVE_WCSNLEN@ +_GL_FUNCDECL_SYS (wcsnlen, size_t, (const wchar_t *s, size_t maxlen)); +# endif +_GL_CXXALIAS_SYS (wcsnlen, size_t, (const wchar_t *s, size_t maxlen)); +_GL_CXXALIASWARN (wcsnlen); +#elif defined GNULIB_POSIXCHECK +# undef wcsnlen +# if HAVE_RAW_DECL_WCSNLEN +_GL_WARN_ON_USE (wcsnlen, "wcsnlen is unportable - " + "use gnulib module wcsnlen for portability"); +# endif +#endif + + +/* Copy SRC to DEST. */ +#if @GNULIB_WCSCPY@ +# if !@HAVE_WCSCPY@ +_GL_FUNCDECL_SYS (wcscpy, wchar_t *, (wchar_t *dest, const wchar_t *src)); +# endif +_GL_CXXALIAS_SYS (wcscpy, wchar_t *, (wchar_t *dest, const wchar_t *src)); +_GL_CXXALIASWARN (wcscpy); +#elif defined GNULIB_POSIXCHECK +# undef wcscpy +# if HAVE_RAW_DECL_WCSCPY +_GL_WARN_ON_USE (wcscpy, "wcscpy is unportable - " + "use gnulib module wcscpy for portability"); +# endif +#endif + + +/* Copy SRC to DEST, returning the address of the terminating L'\0' in DEST. */ +#if @GNULIB_WCPCPY@ +# if !@HAVE_WCPCPY@ +_GL_FUNCDECL_SYS (wcpcpy, wchar_t *, (wchar_t *dest, const wchar_t *src)); +# endif +_GL_CXXALIAS_SYS (wcpcpy, wchar_t *, (wchar_t *dest, const wchar_t *src)); +_GL_CXXALIASWARN (wcpcpy); +#elif defined GNULIB_POSIXCHECK +# undef wcpcpy +# if HAVE_RAW_DECL_WCPCPY +_GL_WARN_ON_USE (wcpcpy, "wcpcpy is unportable - " + "use gnulib module wcpcpy for portability"); +# endif +#endif + + +/* Copy no more than N wide characters of SRC to DEST. */ +#if @GNULIB_WCSNCPY@ +# if !@HAVE_WCSNCPY@ +_GL_FUNCDECL_SYS (wcsncpy, wchar_t *, + (wchar_t *dest, const wchar_t *src, size_t n)); +# endif +_GL_CXXALIAS_SYS (wcsncpy, wchar_t *, + (wchar_t *dest, const wchar_t *src, size_t n)); +_GL_CXXALIASWARN (wcsncpy); +#elif defined GNULIB_POSIXCHECK +# undef wcsncpy +# if HAVE_RAW_DECL_WCSNCPY +_GL_WARN_ON_USE (wcsncpy, "wcsncpy is unportable - " + "use gnulib module wcsncpy for portability"); +# endif +#endif + + +/* Copy no more than N characters of SRC to DEST, returning the address of + the last character written into DEST. */ +#if @GNULIB_WCPNCPY@ +# if !@HAVE_WCPNCPY@ +_GL_FUNCDECL_SYS (wcpncpy, wchar_t *, + (wchar_t *dest, const wchar_t *src, size_t n)); +# endif +_GL_CXXALIAS_SYS (wcpncpy, wchar_t *, + (wchar_t *dest, const wchar_t *src, size_t n)); +_GL_CXXALIASWARN (wcpncpy); +#elif defined GNULIB_POSIXCHECK +# undef wcpncpy +# if HAVE_RAW_DECL_WCPNCPY +_GL_WARN_ON_USE (wcpncpy, "wcpncpy is unportable - " + "use gnulib module wcpncpy for portability"); +# endif +#endif + + +/* Append SRC onto DEST. */ +#if @GNULIB_WCSCAT@ +# if !@HAVE_WCSCAT@ +_GL_FUNCDECL_SYS (wcscat, wchar_t *, (wchar_t *dest, const wchar_t *src)); +# endif +_GL_CXXALIAS_SYS (wcscat, wchar_t *, (wchar_t *dest, const wchar_t *src)); +_GL_CXXALIASWARN (wcscat); +#elif defined GNULIB_POSIXCHECK +# undef wcscat +# if HAVE_RAW_DECL_WCSCAT +_GL_WARN_ON_USE (wcscat, "wcscat is unportable - " + "use gnulib module wcscat for portability"); +# endif +#endif + + +/* Append no more than N wide characters of SRC onto DEST. */ +#if @GNULIB_WCSNCAT@ +# if !@HAVE_WCSNCAT@ +_GL_FUNCDECL_SYS (wcsncat, wchar_t *, + (wchar_t *dest, const wchar_t *src, size_t n)); +# endif +_GL_CXXALIAS_SYS (wcsncat, wchar_t *, + (wchar_t *dest, const wchar_t *src, size_t n)); +_GL_CXXALIASWARN (wcsncat); +#elif defined GNULIB_POSIXCHECK +# undef wcsncat +# if HAVE_RAW_DECL_WCSNCAT +_GL_WARN_ON_USE (wcsncat, "wcsncat is unportable - " + "use gnulib module wcsncat for portability"); +# endif +#endif + + +/* Compare S1 and S2. */ +#if @GNULIB_WCSCMP@ +# if !@HAVE_WCSCMP@ +_GL_FUNCDECL_SYS (wcscmp, int, (const wchar_t *s1, const wchar_t *s2)); +# endif +_GL_CXXALIAS_SYS (wcscmp, int, (const wchar_t *s1, const wchar_t *s2)); +_GL_CXXALIASWARN (wcscmp); +#elif defined GNULIB_POSIXCHECK +# undef wcscmp +# if HAVE_RAW_DECL_WCSCMP +_GL_WARN_ON_USE (wcscmp, "wcscmp is unportable - " + "use gnulib module wcscmp for portability"); +# endif +#endif + + +/* Compare no more than N wide characters of S1 and S2. */ +#if @GNULIB_WCSNCMP@ +# if !@HAVE_WCSNCMP@ +_GL_FUNCDECL_SYS (wcsncmp, int, + (const wchar_t *s1, const wchar_t *s2, size_t n)); +# endif +_GL_CXXALIAS_SYS (wcsncmp, int, + (const wchar_t *s1, const wchar_t *s2, size_t n)); +_GL_CXXALIASWARN (wcsncmp); +#elif defined GNULIB_POSIXCHECK +# undef wcsncmp +# if HAVE_RAW_DECL_WCSNCMP +_GL_WARN_ON_USE (wcsncmp, "wcsncmp is unportable - " + "use gnulib module wcsncmp for portability"); +# endif +#endif + + +/* Compare S1 and S2, ignoring case. */ +#if @GNULIB_WCSCASECMP@ +# if !@HAVE_WCSCASECMP@ +_GL_FUNCDECL_SYS (wcscasecmp, int, (const wchar_t *s1, const wchar_t *s2)); +# endif +_GL_CXXALIAS_SYS (wcscasecmp, int, (const wchar_t *s1, const wchar_t *s2)); +_GL_CXXALIASWARN (wcscasecmp); +#elif defined GNULIB_POSIXCHECK +# undef wcscasecmp +# if HAVE_RAW_DECL_WCSCASECMP +_GL_WARN_ON_USE (wcscasecmp, "wcscasecmp is unportable - " + "use gnulib module wcscasecmp for portability"); +# endif +#endif + + +/* Compare no more than N chars of S1 and S2, ignoring case. */ +#if @GNULIB_WCSNCASECMP@ +# if !@HAVE_WCSNCASECMP@ +_GL_FUNCDECL_SYS (wcsncasecmp, int, + (const wchar_t *s1, const wchar_t *s2, size_t n)); +# endif +_GL_CXXALIAS_SYS (wcsncasecmp, int, + (const wchar_t *s1, const wchar_t *s2, size_t n)); +_GL_CXXALIASWARN (wcsncasecmp); +#elif defined GNULIB_POSIXCHECK +# undef wcsncasecmp +# if HAVE_RAW_DECL_WCSNCASECMP +_GL_WARN_ON_USE (wcsncasecmp, "wcsncasecmp is unportable - " + "use gnulib module wcsncasecmp for portability"); +# endif +#endif + + +/* Compare S1 and S2, both interpreted as appropriate to the LC_COLLATE + category of the current locale. */ +#if @GNULIB_WCSCOLL@ +# if !@HAVE_WCSCOLL@ +_GL_FUNCDECL_SYS (wcscoll, int, (const wchar_t *s1, const wchar_t *s2)); +# endif +_GL_CXXALIAS_SYS (wcscoll, int, (const wchar_t *s1, const wchar_t *s2)); +_GL_CXXALIASWARN (wcscoll); +#elif defined GNULIB_POSIXCHECK +# undef wcscoll +# if HAVE_RAW_DECL_WCSCOLL +_GL_WARN_ON_USE (wcscoll, "wcscoll is unportable - " + "use gnulib module wcscoll for portability"); +# endif +#endif + + +/* Transform S2 into array pointed to by S1 such that if wcscmp is applied + to two transformed strings the result is the as applying 'wcscoll' to the + original strings. */ +#if @GNULIB_WCSXFRM@ +# if !@HAVE_WCSXFRM@ +_GL_FUNCDECL_SYS (wcsxfrm, size_t, (wchar_t *s1, const wchar_t *s2, size_t n)); +# endif +_GL_CXXALIAS_SYS (wcsxfrm, size_t, (wchar_t *s1, const wchar_t *s2, size_t n)); +_GL_CXXALIASWARN (wcsxfrm); +#elif defined GNULIB_POSIXCHECK +# undef wcsxfrm +# if HAVE_RAW_DECL_WCSXFRM +_GL_WARN_ON_USE (wcsxfrm, "wcsxfrm is unportable - " + "use gnulib module wcsxfrm for portability"); +# endif +#endif + + +/* Duplicate S, returning an identical malloc'd string. */ +#if @GNULIB_WCSDUP@ +# if !@HAVE_WCSDUP@ +_GL_FUNCDECL_SYS (wcsdup, wchar_t *, (const wchar_t *s)); +# endif +_GL_CXXALIAS_SYS (wcsdup, wchar_t *, (const wchar_t *s)); +_GL_CXXALIASWARN (wcsdup); +#elif defined GNULIB_POSIXCHECK +# undef wcsdup +# if HAVE_RAW_DECL_WCSDUP +_GL_WARN_ON_USE (wcsdup, "wcsdup is unportable - " + "use gnulib module wcsdup for portability"); +# endif +#endif + + +/* Find the first occurrence of WC in WCS. */ +#if @GNULIB_WCSCHR@ +# if !@HAVE_WCSCHR@ +_GL_FUNCDECL_SYS (wcschr, wchar_t *, (const wchar_t *wcs, wchar_t wc)); +# endif + /* On some systems, this function is defined as an overloaded function: + extern "C++" { + const wchar_t * std::wcschr (const wchar_t *, wchar_t); + wchar_t * std::wcschr (wchar_t *, wchar_t); + } */ +_GL_CXXALIAS_SYS_CAST2 (wcschr, + wchar_t *, (const wchar_t *, wchar_t), + const wchar_t *, (const wchar_t *, wchar_t)); +# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \ + && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) +_GL_CXXALIASWARN1 (wcschr, wchar_t *, (wchar_t *wcs, wchar_t wc)); +_GL_CXXALIASWARN1 (wcschr, const wchar_t *, (const wchar_t *wcs, wchar_t wc)); +# else +_GL_CXXALIASWARN (wcschr); +# endif +#elif defined GNULIB_POSIXCHECK +# undef wcschr +# if HAVE_RAW_DECL_WCSCHR +_GL_WARN_ON_USE (wcschr, "wcschr is unportable - " + "use gnulib module wcschr for portability"); +# endif +#endif + + +/* Find the last occurrence of WC in WCS. */ +#if @GNULIB_WCSRCHR@ +# if !@HAVE_WCSRCHR@ +_GL_FUNCDECL_SYS (wcsrchr, wchar_t *, (const wchar_t *wcs, wchar_t wc)); +# endif + /* On some systems, this function is defined as an overloaded function: + extern "C++" { + const wchar_t * std::wcsrchr (const wchar_t *, wchar_t); + wchar_t * std::wcsrchr (wchar_t *, wchar_t); + } */ +_GL_CXXALIAS_SYS_CAST2 (wcsrchr, + wchar_t *, (const wchar_t *, wchar_t), + const wchar_t *, (const wchar_t *, wchar_t)); +# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \ + && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) +_GL_CXXALIASWARN1 (wcsrchr, wchar_t *, (wchar_t *wcs, wchar_t wc)); +_GL_CXXALIASWARN1 (wcsrchr, const wchar_t *, (const wchar_t *wcs, wchar_t wc)); +# else +_GL_CXXALIASWARN (wcsrchr); +# endif +#elif defined GNULIB_POSIXCHECK +# undef wcsrchr +# if HAVE_RAW_DECL_WCSRCHR +_GL_WARN_ON_USE (wcsrchr, "wcsrchr is unportable - " + "use gnulib module wcsrchr for portability"); +# endif +#endif + + +/* Return the length of the initial segmet of WCS which consists entirely + of wide characters not in REJECT. */ +#if @GNULIB_WCSCSPN@ +# if !@HAVE_WCSCSPN@ +_GL_FUNCDECL_SYS (wcscspn, size_t, (const wchar_t *wcs, const wchar_t *reject)); +# endif +_GL_CXXALIAS_SYS (wcscspn, size_t, (const wchar_t *wcs, const wchar_t *reject)); +_GL_CXXALIASWARN (wcscspn); +#elif defined GNULIB_POSIXCHECK +# undef wcscspn +# if HAVE_RAW_DECL_WCSCSPN +_GL_WARN_ON_USE (wcscspn, "wcscspn is unportable - " + "use gnulib module wcscspn for portability"); +# endif +#endif + + +/* Return the length of the initial segmet of WCS which consists entirely + of wide characters in ACCEPT. */ +#if @GNULIB_WCSSPN@ +# if !@HAVE_WCSSPN@ +_GL_FUNCDECL_SYS (wcsspn, size_t, (const wchar_t *wcs, const wchar_t *accept)); +# endif +_GL_CXXALIAS_SYS (wcsspn, size_t, (const wchar_t *wcs, const wchar_t *accept)); +_GL_CXXALIASWARN (wcsspn); +#elif defined GNULIB_POSIXCHECK +# undef wcsspn +# if HAVE_RAW_DECL_WCSSPN +_GL_WARN_ON_USE (wcsspn, "wcsspn is unportable - " + "use gnulib module wcsspn for portability"); +# endif +#endif + + +/* Find the first occurrence in WCS of any character in ACCEPT. */ +#if @GNULIB_WCSPBRK@ +# if !@HAVE_WCSPBRK@ +_GL_FUNCDECL_SYS (wcspbrk, wchar_t *, + (const wchar_t *wcs, const wchar_t *accept)); +# endif + /* On some systems, this function is defined as an overloaded function: + extern "C++" { + const wchar_t * std::wcspbrk (const wchar_t *, const wchar_t *); + wchar_t * std::wcspbrk (wchar_t *, const wchar_t *); + } */ +_GL_CXXALIAS_SYS_CAST2 (wcspbrk, + wchar_t *, (const wchar_t *, const wchar_t *), + const wchar_t *, (const wchar_t *, const wchar_t *)); +# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \ + && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) +_GL_CXXALIASWARN1 (wcspbrk, wchar_t *, + (wchar_t *wcs, const wchar_t *accept)); +_GL_CXXALIASWARN1 (wcspbrk, const wchar_t *, + (const wchar_t *wcs, const wchar_t *accept)); +# else +_GL_CXXALIASWARN (wcspbrk); +# endif +#elif defined GNULIB_POSIXCHECK +# undef wcspbrk +# if HAVE_RAW_DECL_WCSPBRK +_GL_WARN_ON_USE (wcspbrk, "wcspbrk is unportable - " + "use gnulib module wcspbrk for portability"); +# endif +#endif + + +/* Find the first occurrence of NEEDLE in HAYSTACK. */ +#if @GNULIB_WCSSTR@ +# if !@HAVE_WCSSTR@ +_GL_FUNCDECL_SYS (wcsstr, wchar_t *, + (const wchar_t *haystack, const wchar_t *needle)); +# endif + /* On some systems, this function is defined as an overloaded function: + extern "C++" { + const wchar_t * std::wcsstr (const wchar_t *, const wchar_t *); + wchar_t * std::wcsstr (wchar_t *, const wchar_t *); + } */ +_GL_CXXALIAS_SYS_CAST2 (wcsstr, + wchar_t *, (const wchar_t *, const wchar_t *), + const wchar_t *, (const wchar_t *, const wchar_t *)); +# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \ + && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) +_GL_CXXALIASWARN1 (wcsstr, wchar_t *, + (wchar_t *haystack, const wchar_t *needle)); +_GL_CXXALIASWARN1 (wcsstr, const wchar_t *, + (const wchar_t *haystack, const wchar_t *needle)); +# else +_GL_CXXALIASWARN (wcsstr); +# endif +#elif defined GNULIB_POSIXCHECK +# undef wcsstr +# if HAVE_RAW_DECL_WCSSTR +_GL_WARN_ON_USE (wcsstr, "wcsstr is unportable - " + "use gnulib module wcsstr for portability"); +# endif +#endif + + +/* Divide WCS into tokens separated by characters in DELIM. */ +#if @GNULIB_WCSTOK@ +# if !@HAVE_WCSTOK@ +_GL_FUNCDECL_SYS (wcstok, wchar_t *, + (wchar_t *wcs, const wchar_t *delim, wchar_t **ptr)); +# endif +_GL_CXXALIAS_SYS (wcstok, wchar_t *, + (wchar_t *wcs, const wchar_t *delim, wchar_t **ptr)); +_GL_CXXALIASWARN (wcstok); +#elif defined GNULIB_POSIXCHECK +# undef wcstok +# if HAVE_RAW_DECL_WCSTOK +_GL_WARN_ON_USE (wcstok, "wcstok is unportable - " + "use gnulib module wcstok for portability"); +# endif +#endif + + +/* Determine number of column positions required for first N wide + characters (or fewer if S ends before this) in S. */ +#if @GNULIB_WCSWIDTH@ +# if @REPLACE_WCSWIDTH@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef wcswidth +# define wcswidth rpl_wcswidth +# endif +_GL_FUNCDECL_RPL (wcswidth, int, (const wchar_t *s, size_t n)); +_GL_CXXALIAS_RPL (wcswidth, int, (const wchar_t *s, size_t n)); +# else +# if !@HAVE_WCSWIDTH@ +_GL_FUNCDECL_SYS (wcswidth, int, (const wchar_t *s, size_t n)); +# endif +_GL_CXXALIAS_SYS (wcswidth, int, (const wchar_t *s, size_t n)); +# endif +_GL_CXXALIASWARN (wcswidth); +#elif defined GNULIB_POSIXCHECK +# undef wcswidth +# if HAVE_RAW_DECL_WCSWIDTH +_GL_WARN_ON_USE (wcswidth, "wcswidth is unportable - " + "use gnulib module wcswidth for portability"); +# endif +#endif + + +#endif /* _@GUARD_PREFIX@_WCHAR_H */ +#endif /* _@GUARD_PREFIX@_WCHAR_H */ +#endif diff --git a/gnulib/lib/wcpcpy-impl.h b/gnulib/lib/wcpcpy-impl.h new file mode 100644 index 0000000..f7f0f7d --- /dev/null +++ b/gnulib/lib/wcpcpy-impl.h @@ -0,0 +1,24 @@ +/* Copy a wide string. + Copyright (C) 1999, 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 1999. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +wchar_t * +wcpcpy (wchar_t *dest, const wchar_t *src) +{ + for (; (*dest = *src) != (wchar_t)'\0'; src++, dest++) + ; + return dest; +} diff --git a/gnulib/lib/wcpcpy.c b/gnulib/lib/wcpcpy.c new file mode 100644 index 0000000..fdc29fc --- /dev/null +++ b/gnulib/lib/wcpcpy.c @@ -0,0 +1,23 @@ +/* Copy a wide string. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include "wcpcpy-impl.h" diff --git a/gnulib/lib/wcpncpy-impl.h b/gnulib/lib/wcpncpy-impl.h new file mode 100644 index 0000000..bdb290f --- /dev/null +++ b/gnulib/lib/wcpncpy-impl.h @@ -0,0 +1,30 @@ +/* Copy a size-bounded wide string. + Copyright (C) 1999, 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 1999. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +wchar_t * +wcpncpy (wchar_t *dest, const wchar_t *src, size_t n) +{ + for (; n > 0 && (*dest = *src) != (wchar_t)'\0'; src++, dest++, n--) + ; + + /* This behavior is rarely useful, but it is here for consistency with + wcsncpy. */ + for (; n > 0; n--) + *dest++ = (wchar_t)'\0'; + + return dest-1; +} diff --git a/gnulib/lib/wcpncpy.c b/gnulib/lib/wcpncpy.c new file mode 100644 index 0000000..287eec7 --- /dev/null +++ b/gnulib/lib/wcpncpy.c @@ -0,0 +1,23 @@ +/* Copy a size-bounded wide string. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include "wcpncpy-impl.h" diff --git a/gnulib/lib/wcrtomb.c b/gnulib/lib/wcrtomb.c new file mode 100644 index 0000000..6632589 --- /dev/null +++ b/gnulib/lib/wcrtomb.c @@ -0,0 +1,53 @@ +/* Convert wide character to multibyte character. + Copyright (C) 2008-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include + +#include +#include + + +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/wcscasecmp-impl.h b/gnulib/lib/wcscasecmp-impl.h new file mode 100644 index 0000000..8c716fa --- /dev/null +++ b/gnulib/lib/wcscasecmp-impl.h @@ -0,0 +1,32 @@ +/* Compare two wide strings ignoring case. + Copyright (C) 1999, 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +int +wcscasecmp (const wchar_t *s1, const wchar_t *s2) +{ + for (;;) + { + wchar_t wc1 = towlower (*s1++); + wchar_t wc2 = towlower (*s2++); + if (wc1 != (wchar_t)'\0' && wc1 == wc2) + continue; + /* Note that wc1 and wc2 each have at most 31 bits. */ + return (int)wc1 - (int)wc2; + /* > 0 if wc1 > wc2, < 0 if wc1 < wc2, + = 0 if wc1 and wc2 are both '\0'. */ + } +} diff --git a/gnulib/lib/wcscasecmp.c b/gnulib/lib/wcscasecmp.c new file mode 100644 index 0000000..f3796e0 --- /dev/null +++ b/gnulib/lib/wcscasecmp.c @@ -0,0 +1,25 @@ +/* Compare two wide strings ignoring case. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include + +#include "wcscasecmp-impl.h" diff --git a/gnulib/lib/wcscat-impl.h b/gnulib/lib/wcscat-impl.h new file mode 100644 index 0000000..7f92c56 --- /dev/null +++ b/gnulib/lib/wcscat-impl.h @@ -0,0 +1,26 @@ +/* Concatenate two wide strings. + Copyright (C) 1999, 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 1999. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +wchar_t * +wcscat (wchar_t *dest, const wchar_t *src) +{ + wchar_t *destptr = dest + wcslen (dest); + + for (; (*destptr = *src) != (wchar_t)'\0'; src++, destptr++) + ; + return dest; +} diff --git a/gnulib/lib/wcscat.c b/gnulib/lib/wcscat.c new file mode 100644 index 0000000..f0894f7 --- /dev/null +++ b/gnulib/lib/wcscat.c @@ -0,0 +1,23 @@ +/* Concatenate two wide strings. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include "wcscat-impl.h" diff --git a/gnulib/lib/wcschr-impl.h b/gnulib/lib/wcschr-impl.h new file mode 100644 index 0000000..2d146d3 --- /dev/null +++ b/gnulib/lib/wcschr-impl.h @@ -0,0 +1,32 @@ +/* Search wide string for a wide character. + Copyright (C) 1999, 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 1999. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +wchar_t * +wcschr (const wchar_t *wcs, wchar_t wc) +{ + for (;; wcs++) + { + if (*wcs == wc) + break; + if (*wcs == (wchar_t)'\0') + goto notfound; + } + return (wchar_t *) wcs; + + notfound: + return NULL; +} diff --git a/gnulib/lib/wcschr.c b/gnulib/lib/wcschr.c new file mode 100644 index 0000000..988b897 --- /dev/null +++ b/gnulib/lib/wcschr.c @@ -0,0 +1,23 @@ +/* Search wide string for a wide character. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include "wcschr-impl.h" diff --git a/gnulib/lib/wcscmp-impl.h b/gnulib/lib/wcscmp-impl.h new file mode 100644 index 0000000..1c384c6 --- /dev/null +++ b/gnulib/lib/wcscmp-impl.h @@ -0,0 +1,32 @@ +/* Compare two wide strings. + Copyright (C) 1999, 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 1999. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +int +wcscmp (const wchar_t *s1, const wchar_t *s2) +{ + for (;;) + { + wchar_t wc1 = *s1++; + wchar_t wc2 = *s2++; + if (wc1 != (wchar_t)'\0' && wc1 == wc2) + continue; + /* Note that wc1 and wc2 each have at most 31 bits. */ + return (int)wc1 - (int)wc2; + /* > 0 if wc1 > wc2, < 0 if wc1 < wc2, + = 0 if wc1 and wc2 are both '\0'. */ + } +} diff --git a/gnulib/lib/wcscmp.c b/gnulib/lib/wcscmp.c new file mode 100644 index 0000000..9a73a25 --- /dev/null +++ b/gnulib/lib/wcscmp.c @@ -0,0 +1,23 @@ +/* Compare two wide strings. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include "wcscmp-impl.h" diff --git a/gnulib/lib/wcscoll-impl.h b/gnulib/lib/wcscoll-impl.h new file mode 100644 index 0000000..01adcc3 --- /dev/null +++ b/gnulib/lib/wcscoll-impl.h @@ -0,0 +1,111 @@ +/* Compare two wide strings using the current locale. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +int +wcscoll (const wchar_t *s1, const wchar_t *s2) +{ + char mbbuf1[1024]; + char mbbuf2[1024]; + char *mbs1; + char *mbs2; + + { + int saved_errno = errno; + + /* Convert s1 to a multibyte string, trying to avoid malloc(). */ + { + size_t ret; + + ret = wcstombs (mbbuf1, s1, sizeof (mbbuf1)); + if (ret == (size_t)-1) + goto failed1; + if (ret < sizeof (mbbuf1)) + mbs1 = mbbuf1; + else + { + size_t need = wcstombs (NULL, s1, 0); + if (need == (size_t)-1) + goto failed1; + mbs1 = (char *) malloc (need + 1); + if (mbs1 == NULL) + goto out_of_memory1; + ret = wcstombs (mbs1, s1, need + 1); + if (ret != need) + abort (); + } + } + + /* Convert s2 to a multibyte string, trying to avoid malloc(). */ + { + size_t ret; + + ret = wcstombs (mbbuf2, s2, sizeof (mbbuf2)); + if (ret == (size_t)-1) + goto failed2; + if (ret < sizeof (mbbuf2)) + mbs2 = mbbuf2; + else + { + size_t need = wcstombs (NULL, s2, 0); + if (need == (size_t)-1) + goto failed2; + mbs2 = (char *) malloc (need + 1); + if (mbs2 == NULL) + goto out_of_memory2; + ret = wcstombs (mbs2, s2, need + 1); + if (ret != need) + abort (); + } + } + + /* No error so far. */ + errno = saved_errno; + } + + /* Compare the two multibyte strings. */ + { + int result = strcoll (mbs1, mbs2); + + if (mbs1 != mbbuf1) + { + int saved_errno = errno; + free (mbs1); + errno = saved_errno; + } + if (mbs2 != mbbuf2) + { + int saved_errno = errno; + free (mbs2); + errno = saved_errno; + } + return result; + } + + out_of_memory2: + if (mbs1 != mbbuf1) + free (mbs1); + out_of_memory1: + errno = ENOMEM; + return 0; + + failed2: + if (mbs1 != mbbuf1) + free (mbs1); + failed1: + errno = EILSEQ; + return 0; +} diff --git a/gnulib/lib/wcscoll.c b/gnulib/lib/wcscoll.c new file mode 100644 index 0000000..4605c5b --- /dev/null +++ b/gnulib/lib/wcscoll.c @@ -0,0 +1,27 @@ +/* Compare two wide strings using the current locale. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include +#include +#include + +#include "wcscoll-impl.h" diff --git a/gnulib/lib/wcscpy-impl.h b/gnulib/lib/wcscpy-impl.h new file mode 100644 index 0000000..cdc4bcc --- /dev/null +++ b/gnulib/lib/wcscpy-impl.h @@ -0,0 +1,26 @@ +/* Copy a wide string. + Copyright (C) 1999, 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 1999. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +wchar_t * +wcscpy (wchar_t *dest, const wchar_t *src) +{ + wchar_t *destptr = dest; + + for (; (*destptr = *src) != (wchar_t)'\0'; src++, destptr++) + ; + return dest; +} diff --git a/gnulib/lib/wcscpy.c b/gnulib/lib/wcscpy.c new file mode 100644 index 0000000..136a493 --- /dev/null +++ b/gnulib/lib/wcscpy.c @@ -0,0 +1,23 @@ +/* Copy a wide string. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include "wcscpy-impl.h" diff --git a/gnulib/lib/wcscspn-impl.h b/gnulib/lib/wcscspn-impl.h new file mode 100644 index 0000000..0c6452f --- /dev/null +++ b/gnulib/lib/wcscspn-impl.h @@ -0,0 +1,47 @@ +/* Search a wide string for any of a set of wide characters. + Copyright (C) 1999, 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 1999. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +size_t +wcscspn (const wchar_t *wcs, const wchar_t *reject) +{ + /* Optimize two cases. */ + if (reject[0] == (wchar_t)'\0') + return wcslen (wcs); + + if (reject[1] == (wchar_t)'\0') + { + wchar_t wc = reject[0]; + const wchar_t *ptr = wcs; + for (; *ptr != (wchar_t)'\0'; ptr++) + { + if (*ptr == wc) + break; + } + return ptr - wcs; + } + + /* General case. */ + { + const wchar_t *ptr = wcs; + for (; *ptr != (wchar_t)'\0'; ptr++) + { + if (wcschr (reject, *ptr)) + break; + } + return ptr - wcs; + } +} diff --git a/gnulib/lib/wcscspn.c b/gnulib/lib/wcscspn.c new file mode 100644 index 0000000..3a2f33a --- /dev/null +++ b/gnulib/lib/wcscspn.c @@ -0,0 +1,23 @@ +/* Search a wide string for any of a set of wide characters. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include "wcscspn-impl.h" diff --git a/gnulib/lib/wcsdup-impl.h b/gnulib/lib/wcsdup-impl.h new file mode 100644 index 0000000..f721ca1 --- /dev/null +++ b/gnulib/lib/wcsdup-impl.h @@ -0,0 +1,29 @@ +/* Duplicate a wide string. + Copyright (C) 1999, 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 1999. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +wchar_t * +wcsdup (const wchar_t *s) +{ + size_t n = wcslen (s) + 1; + wchar_t *copy = (wchar_t *) malloc (n * sizeof (wchar_t)); + if (copy != NULL) + return wmemcpy (copy, s, n); + else + /* The glibc documentation does not say that errno should be set to ENOMEM + here. */ + return NULL; +} diff --git a/gnulib/lib/wcsdup.c b/gnulib/lib/wcsdup.c new file mode 100644 index 0000000..b55e630 --- /dev/null +++ b/gnulib/lib/wcsdup.c @@ -0,0 +1,25 @@ +/* Duplicate a wide string. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include + +#include "wcsdup-impl.h" diff --git a/gnulib/lib/wcslen-impl.h b/gnulib/lib/wcslen-impl.h new file mode 100644 index 0000000..6dbe927 --- /dev/null +++ b/gnulib/lib/wcslen-impl.h @@ -0,0 +1,26 @@ +/* Determine the length of a wide string. + Copyright (C) 1999, 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 1999. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +size_t +wcslen (const wchar_t *s) +{ + const wchar_t *ptr; + + for (ptr = s; *ptr != (wchar_t)'\0'; ptr++) + ; + return ptr - s; +} diff --git a/gnulib/lib/wcslen.c b/gnulib/lib/wcslen.c new file mode 100644 index 0000000..23132dd --- /dev/null +++ b/gnulib/lib/wcslen.c @@ -0,0 +1,23 @@ +/* Determine the length of a wide string. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include "wcslen-impl.h" diff --git a/gnulib/lib/wcsncasecmp-impl.h b/gnulib/lib/wcsncasecmp-impl.h new file mode 100644 index 0000000..234f27a --- /dev/null +++ b/gnulib/lib/wcsncasecmp-impl.h @@ -0,0 +1,36 @@ +/* Compare two wide strings ignoring case. + Copyright (C) 1999, 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +int +wcsncasecmp (const wchar_t *s1, const wchar_t *s2, size_t n) +{ + for (; n > 0;) + { + wchar_t wc1 = towlower (*s1++); + wchar_t wc2 = towlower (*s2++); + if (wc1 != (wchar_t)'\0' && wc1 == wc2) + { + n--; + continue; + } + /* Note that wc1 and wc2 each have at most 31 bits. */ + return (int)wc1 - (int)wc2; + /* > 0 if wc1 > wc2, < 0 if wc1 < wc2, + = 0 if wc1 and wc2 are both '\0'. */ + } + return 0; +} diff --git a/gnulib/lib/wcsncasecmp.c b/gnulib/lib/wcsncasecmp.c new file mode 100644 index 0000000..d2fafdd --- /dev/null +++ b/gnulib/lib/wcsncasecmp.c @@ -0,0 +1,25 @@ +/* Compare two wide strings ignoring case. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include + +#include "wcsncasecmp-impl.h" diff --git a/gnulib/lib/wcsncat-impl.h b/gnulib/lib/wcsncat-impl.h new file mode 100644 index 0000000..23b7c83 --- /dev/null +++ b/gnulib/lib/wcsncat-impl.h @@ -0,0 +1,28 @@ +/* Append part of a wide string to a wide string. + Copyright (C) 1999, 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 1999. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +wchar_t * +wcsncat (wchar_t *dest, const wchar_t *src, size_t n) +{ + wchar_t *destptr = dest + wcslen (dest); + + for (; n > 0 && (*destptr = *src) != (wchar_t)'\0'; src++, destptr++, n--) + ; + if (n == 0) + *destptr = (wchar_t)'\0'; + return dest; +} diff --git a/gnulib/lib/wcsncat.c b/gnulib/lib/wcsncat.c new file mode 100644 index 0000000..855fbee --- /dev/null +++ b/gnulib/lib/wcsncat.c @@ -0,0 +1,23 @@ +/* Append part of a wide string to a wide string. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include "wcsncat-impl.h" diff --git a/gnulib/lib/wcsncmp-impl.h b/gnulib/lib/wcsncmp-impl.h new file mode 100644 index 0000000..72f8c63 --- /dev/null +++ b/gnulib/lib/wcsncmp-impl.h @@ -0,0 +1,36 @@ +/* Compare two wide strings. + Copyright (C) 1999, 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 1999. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +int +wcsncmp (const wchar_t *s1, const wchar_t *s2, size_t n) +{ + for (; n > 0;) + { + wchar_t wc1 = *s1++; + wchar_t wc2 = *s2++; + if (wc1 != (wchar_t)'\0' && wc1 == wc2) + { + n--; + continue; + } + /* Note that wc1 and wc2 each have at most 31 bits. */ + return (int)wc1 - (int)wc2; + /* > 0 if wc1 > wc2, < 0 if wc1 < wc2, + = 0 if wc1 and wc2 are both '\0'. */ + } + return 0; +} diff --git a/gnulib/lib/wcsncmp.c b/gnulib/lib/wcsncmp.c new file mode 100644 index 0000000..b2bfa8e --- /dev/null +++ b/gnulib/lib/wcsncmp.c @@ -0,0 +1,23 @@ +/* Compare two wide strings. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include "wcsncmp-impl.h" diff --git a/gnulib/lib/wcsncpy-impl.h b/gnulib/lib/wcsncpy-impl.h new file mode 100644 index 0000000..63925bb --- /dev/null +++ b/gnulib/lib/wcsncpy-impl.h @@ -0,0 +1,32 @@ +/* Copy a size-bounded wide string. + Copyright (C) 1999, 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 1999. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +wchar_t * +wcsncpy (wchar_t *dest, const wchar_t *src, size_t n) +{ + wchar_t *destptr = dest; + + for (; n > 0 && (*destptr = *src) != (wchar_t)'\0'; src++, destptr++, n--) + ; + + /* This behavior is rarely useful, but it is specified by the ISO C + standard. */ + for (; n > 0; n--) + *destptr++ = (wchar_t)'\0'; + + return dest; +} diff --git a/gnulib/lib/wcsncpy.c b/gnulib/lib/wcsncpy.c new file mode 100644 index 0000000..e97e40b --- /dev/null +++ b/gnulib/lib/wcsncpy.c @@ -0,0 +1,23 @@ +/* Copy a size-bounded wide string. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include "wcsncpy-impl.h" diff --git a/gnulib/lib/wcsnlen-impl.h b/gnulib/lib/wcsnlen-impl.h new file mode 100644 index 0000000..6cf4d07 --- /dev/null +++ b/gnulib/lib/wcsnlen-impl.h @@ -0,0 +1,26 @@ +/* Determine the length of a size-bounded wide string. + Copyright (C) 1999, 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 1999. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +size_t +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; +} diff --git a/gnulib/lib/wcsnlen.c b/gnulib/lib/wcsnlen.c new file mode 100644 index 0000000..1232c1f --- /dev/null +++ b/gnulib/lib/wcsnlen.c @@ -0,0 +1,23 @@ +/* Determine the length of a size-bounded wide string. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include "wcsnlen-impl.h" diff --git a/gnulib/lib/wcsnrtombs-impl.h b/gnulib/lib/wcsnrtombs-impl.h new file mode 100644 index 0000000..5ba63cc --- /dev/null +++ b/gnulib/lib/wcsnrtombs-impl.h @@ -0,0 +1,90 @@ +/* Convert wide string to string. + Copyright (C) 2008-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +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/wcsnrtombs.c b/gnulib/lib/wcsnrtombs.c new file mode 100644 index 0000000..a92207c --- /dev/null +++ b/gnulib/lib/wcsnrtombs.c @@ -0,0 +1,30 @@ +/* Convert wide string to string. + Copyright (C) 2008-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include + +#include +#include +#include + + +extern mbstate_t _gl_wcsrtombs_state; + +#include "wcsnrtombs-impl.h" diff --git a/gnulib/lib/wcspbrk-impl.h b/gnulib/lib/wcspbrk-impl.h new file mode 100644 index 0000000..3862e7a --- /dev/null +++ b/gnulib/lib/wcspbrk-impl.h @@ -0,0 +1,47 @@ +/* Search a wide string for any of a set of wide characters. + Copyright (C) 1999, 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 1999. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +wchar_t * +wcspbrk (const wchar_t *wcs, const wchar_t *accept) +{ + /* Optimize two cases. */ + if (accept[0] == (wchar_t)'\0') + return NULL; + + if (accept[1] == (wchar_t)'\0') + { + wchar_t wc = accept[0]; + const wchar_t *ptr = wcs; + for (; *ptr != (wchar_t)'\0'; ptr++) + { + if (*ptr == wc) + return (wchar_t *) ptr; + } + return NULL; + } + + /* General case. */ + { + const wchar_t *ptr = wcs; + for (; *ptr != (wchar_t)'\0'; ptr++) + { + if (wcschr (accept, *ptr)) + return (wchar_t *) ptr; + } + return NULL; + } +} diff --git a/gnulib/lib/wcspbrk.c b/gnulib/lib/wcspbrk.c new file mode 100644 index 0000000..2ed7602 --- /dev/null +++ b/gnulib/lib/wcspbrk.c @@ -0,0 +1,23 @@ +/* Search a wide string for any of a set of wide characters. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include "wcspbrk-impl.h" diff --git a/gnulib/lib/wcsrchr-impl.h b/gnulib/lib/wcsrchr-impl.h new file mode 100644 index 0000000..db3ba06 --- /dev/null +++ b/gnulib/lib/wcsrchr-impl.h @@ -0,0 +1,33 @@ +/* Search wide string for a wide character. + Copyright (C) 1999, 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 1999. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +wchar_t * +wcsrchr (const wchar_t *wcs, wchar_t wc) +{ + /* Calling wcslen and then searching from the other end would cause more + memory accesses. Avoid that, at the cost of a few more comparisons. */ + wchar_t *result = NULL; + + for (;; wcs++) + { + if (*wcs == wc) + result = (wchar_t *) wcs; + if (*wcs == (wchar_t)'\0') + break; + } + return result; +} diff --git a/gnulib/lib/wcsrchr.c b/gnulib/lib/wcsrchr.c new file mode 100644 index 0000000..a717801 --- /dev/null +++ b/gnulib/lib/wcsrchr.c @@ -0,0 +1,23 @@ +/* Search wide string for a wide character. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include "wcsrchr-impl.h" diff --git a/gnulib/lib/wcsrtombs-impl.h b/gnulib/lib/wcsrtombs-impl.h new file mode 100644 index 0000000..a0a522e --- /dev/null +++ b/gnulib/lib/wcsrtombs-impl.h @@ -0,0 +1,90 @@ +/* Convert wide string to string. + Copyright (C) 2008, 2010-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +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); + } +} diff --git a/gnulib/lib/wcsrtombs-state.c b/gnulib/lib/wcsrtombs-state.c new file mode 100644 index 0000000..e0e3e85 --- /dev/null +++ b/gnulib/lib/wcsrtombs-state.c @@ -0,0 +1,37 @@ +/* Convert wide string to string. + Copyright (C) 2008-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +#include + +/* 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 . + 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 0000000..ebbca78 --- /dev/null +++ b/gnulib/lib/wcsrtombs.c @@ -0,0 +1,56 @@ +/* Convert wide string to string. + Copyright (C) 2008, 2010-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include + +extern mbstate_t _gl_wcsrtombs_state; + +#if HAVE_WCSRTOMBS && !WCSRTOMBS_TERMINATION_BUG && !defined GNULIB_defined_mbstate_t +/* 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, (size_t)-1, ps); + } + else +# endif + return wcsrtombs (dest, srcp, len, ps); +} + +#else +/* Implement wcsrtombs on top of wcrtomb(). */ + +# include +# include +# include + +# include "wcsrtombs-impl.h" + +#endif diff --git a/gnulib/lib/wcsspn-impl.h b/gnulib/lib/wcsspn-impl.h new file mode 100644 index 0000000..5d13b92 --- /dev/null +++ b/gnulib/lib/wcsspn-impl.h @@ -0,0 +1,47 @@ +/* Advance in a wide string, skipping any of a set of wide characters. + Copyright (C) 1999, 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 1999. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +size_t +wcsspn (const wchar_t *wcs, const wchar_t *accept) +{ + /* Optimize two cases. */ + if (accept[0] == (wchar_t)'\0') + return 0; + + if (accept[1] == (wchar_t)'\0') + { + wchar_t wc = accept[0]; + const wchar_t *ptr = wcs; + for (; *ptr != (wchar_t)'\0'; ptr++) + { + if (*ptr != wc) + break; + } + return ptr - wcs; + } + + /* General case. */ + { + const wchar_t *ptr = wcs; + for (; *ptr != (wchar_t)'\0'; ptr++) + { + if (!wcschr (accept, *ptr)) + break; + } + return ptr - wcs; + } +} diff --git a/gnulib/lib/wcsspn.c b/gnulib/lib/wcsspn.c new file mode 100644 index 0000000..1cabf8d --- /dev/null +++ b/gnulib/lib/wcsspn.c @@ -0,0 +1,23 @@ +/* Advance in a wide string, skipping any of a set of wide characters. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include "wcsspn-impl.h" diff --git a/gnulib/lib/wcsstr-impl.h b/gnulib/lib/wcsstr-impl.h new file mode 100644 index 0000000..f3fb3fb --- /dev/null +++ b/gnulib/lib/wcsstr-impl.h @@ -0,0 +1,51 @@ +/* Locate a substring in a wide string. + Copyright (C) 1999, 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 1999. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +wchar_t * +wcsstr (const wchar_t *haystack, const wchar_t *needle) +{ + wchar_t n = needle[0]; + + /* Is needle empty? */ + if (n == (wchar_t)'\0') + return (wchar_t *) haystack; + + /* Is needle nearly empty? */ + if (needle[1] == (wchar_t)'\0') + return wcschr (haystack, n); + + /* Search for needle's first character. */ + for (; *haystack != (wchar_t)'\0'; haystack++) + { + if (*haystack == n) + { + /* Compare with needle's remaining characters. */ + const wchar_t *hptr = haystack + 1; + const wchar_t *nptr = needle + 1; + for (;;) + { + if (*hptr != *nptr) + break; + hptr++; nptr++; + if (*nptr == (wchar_t)'\0') + return (wchar_t *) haystack; + } + } + } + + return NULL; +} diff --git a/gnulib/lib/wcsstr.c b/gnulib/lib/wcsstr.c new file mode 100644 index 0000000..3a63447 --- /dev/null +++ b/gnulib/lib/wcsstr.c @@ -0,0 +1,23 @@ +/* Locate a substring in a wide string. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include "wcsstr-impl.h" diff --git a/gnulib/lib/wcstok-impl.h b/gnulib/lib/wcstok-impl.h new file mode 100644 index 0000000..afb9046 --- /dev/null +++ b/gnulib/lib/wcstok-impl.h @@ -0,0 +1,50 @@ +/* Split a wide string into tokens. + Copyright (C) 1999, 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 1999. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +wchar_t * +wcstok (wchar_t *wcs, const wchar_t *delim, wchar_t **ptr) +{ + if (wcs == NULL) + { + wcs = *ptr; + if (wcs == NULL) + return NULL; /* reminder that end of token sequence has been reached */ + } + + /* Skip leading delimiters. */ + wcs += wcsspn (wcs, delim); + + /* Found a token? */ + if (*wcs == (wchar_t)'\0') + { + *ptr = NULL; + return NULL; + } + /* Move past the token. */ + { + wchar_t *token_end = wcspbrk (wcs, delim); + if (token_end) + { + /* NUL-terminate the token. */ + *token_end = (wchar_t)'\0'; + *ptr = token_end + 1; + } + else + *ptr = NULL; + } + return wcs; +} diff --git a/gnulib/lib/wcstok.c b/gnulib/lib/wcstok.c new file mode 100644 index 0000000..e61a3ff --- /dev/null +++ b/gnulib/lib/wcstok.c @@ -0,0 +1,23 @@ +/* Split a wide string into tokens. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include "wcstok-impl.h" diff --git a/gnulib/lib/wcswidth-impl.h b/gnulib/lib/wcswidth-impl.h new file mode 100644 index 0000000..865390c --- /dev/null +++ b/gnulib/lib/wcswidth-impl.h @@ -0,0 +1,43 @@ +/* Determine number of screen columns needed for a size-bounded wide string. + Copyright (C) 1999, 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 1999. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +int +wcswidth (const wchar_t *s, size_t n) +{ + int count = 0; + for (; n > 0; s++, n--) + { + wchar_t c = *s; + if (c == (wchar_t)'\0') + break; + { + int width = wcwidth (c); + if (width < 0) + goto found_nonprinting; + if (width > INT_MAX - count) + goto overflow; + count += width; + } + } + return count; + + found_nonprinting: + return -1; + + overflow: + return INT_MAX; +} diff --git a/gnulib/lib/wcswidth.c b/gnulib/lib/wcswidth.c new file mode 100644 index 0000000..cdedf73 --- /dev/null +++ b/gnulib/lib/wcswidth.c @@ -0,0 +1,25 @@ +/* Determine number of screen columns needed for a size-bounded wide string. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include + +#include "wcswidth-impl.h" diff --git a/gnulib/lib/wcsxfrm-impl.h b/gnulib/lib/wcsxfrm-impl.h new file mode 100644 index 0000000..ba91402 --- /dev/null +++ b/gnulib/lib/wcsxfrm-impl.h @@ -0,0 +1,96 @@ +/* Transform wide string for comparison using the current locale. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +size_t +wcsxfrm (wchar_t *s1, const wchar_t *s2, size_t n) +{ + char mbbuf2[1024]; + char *mbs2; + + { + int saved_errno = errno; + size_t result; + + /* Convert s2 to a multibyte string, trying to avoid malloc(). */ + { + size_t ret; + + ret = wcstombs (mbbuf2, s2, sizeof (mbbuf2)); + if (ret == (size_t)-1) + goto failed; + if (ret < sizeof (mbbuf2)) + mbs2 = mbbuf2; + else + { + size_t need = wcstombs (NULL, s2, 0); + if (need == (size_t)-1) + goto failed; + mbs2 = (char *) malloc (need + 1); + if (mbs2 == NULL) + goto out_of_memory; + ret = wcstombs (mbs2, s2, need + 1); + if (ret != need) + abort (); + } + } + + /* Transform the multibyte string. */ + errno = 0; + result = strxfrm ((char *)s1, mbs2, n); + if (errno != 0) + { + /* An error occurred. */ + if (mbs2 != mbbuf2) + { + saved_errno = errno; + free (mbs2); + errno = saved_errno; + } + return 0; + } + + if (result < n) + { + /* Convert the result by mapping char[] -> wchar_t[]. + Since strcmp() compares the elements as 'unsigned char' values, + whereas wcscmp() compares the elements as 'wchar_t' values, we need + to map 1 'unsigned char' to 1 'wchar_t'. (We could also map 2 + consecutive 'unsigned char' values to 1 'wchar_t' value, but this is + not needed. */ + wchar_t *wcp = s1 + n; + char *cp = (char *)s1 + n; + + while (wcp > s1) + *--wcp = (wchar_t) (unsigned char) *--cp; + } + + if (mbs2 != mbbuf2) + free (mbs2); + + /* No error. */ + errno = saved_errno; + return result; + } + + out_of_memory: + errno = ENOMEM; + return 0; + + failed: + errno = EILSEQ; + return 0; +} diff --git a/gnulib/lib/wcsxfrm.c b/gnulib/lib/wcsxfrm.c new file mode 100644 index 0000000..7815a0f --- /dev/null +++ b/gnulib/lib/wcsxfrm.c @@ -0,0 +1,27 @@ +/* Transform wide string for comparison using the current locale. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include +#include +#include + +#include "wcsxfrm-impl.h" diff --git a/gnulib/lib/wctob.c b/gnulib/lib/wctob.c new file mode 100644 index 0000000..cc26afc --- /dev/null +++ b/gnulib/lib/wctob.c @@ -0,0 +1,38 @@ +/* Convert wide character to unibyte character. + Copyright (C) 2008, 2010-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include + +#include +#include + +int +wctob (wint_t wc) +{ + char buf[64]; + + if (!(MB_CUR_MAX <= sizeof (buf))) + abort (); + /* Handle the case where WEOF is a value that does not fit in a wchar_t. */ + if (wc == (wchar_t)wc) + if (wctomb (buf, (wchar_t)wc) == 1) + return (unsigned char) buf[0]; + return EOF; +} diff --git a/gnulib/lib/wctomb-impl.h b/gnulib/lib/wctomb-impl.h new file mode 100644 index 0000000..4e95de6 --- /dev/null +++ b/gnulib/lib/wctomb-impl.h @@ -0,0 +1,34 @@ +/* Convert wide character to multibyte character. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +int +wctomb (char *s, wchar_t wc) +{ + if (s == NULL) + return 0; + else + { + mbstate_t state; + size_t result; + + memset (&state, 0, sizeof (mbstate_t)); + result = wcrtomb (s, wc, &state); + if (result == (size_t)-1) + return -1; + return result; + } +} diff --git a/gnulib/lib/wctomb.c b/gnulib/lib/wctomb.c new file mode 100644 index 0000000..889a3c6 --- /dev/null +++ b/gnulib/lib/wctomb.c @@ -0,0 +1,25 @@ +/* Convert wide character to multibyte character. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#include + +#include +#include + +#include "wctomb-impl.h" diff --git a/gnulib/lib/wctrans-impl.h b/gnulib/lib/wctrans-impl.h new file mode 100644 index 0000000..d099f8b --- /dev/null +++ b/gnulib/lib/wctrans-impl.h @@ -0,0 +1,37 @@ +/* Get descriptor for a wide character case conversion. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +wctrans_t +wctrans (const char *name) +{ + if (name[0] == 't' + && name[1] == 'o') + switch (name[2]) + { + case 'l': + if (strcmp (name + 3, "ower") == 0) + return (wctrans_t) towlower; + break; + case 'u': + if (strcmp (name + 3, "pper") == 0) + return (wctrans_t) towupper; + break; + default: + break; + } + return NULL; +} diff --git a/gnulib/lib/wctrans.c b/gnulib/lib/wctrans.c new file mode 100644 index 0000000..1ce6d6f --- /dev/null +++ b/gnulib/lib/wctrans.c @@ -0,0 +1,25 @@ +/* Get descriptor for a wide character case conversion. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include + +#include "wctrans-impl.h" diff --git a/gnulib/lib/wctype-impl.h b/gnulib/lib/wctype-impl.h new file mode 100644 index 0000000..e2c3222 --- /dev/null +++ b/gnulib/lib/wctype-impl.h @@ -0,0 +1,96 @@ +/* Get descriptor for a wide character property. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +wctype_t +wctype (const char* name) +{ + switch (name[0]) + { + case 'a': + switch (name[1]) + { + case 'l': + switch (name[2]) + { + case 'n': + if (strcmp (name + 3, "um") == 0) + return (wctype_t) iswalnum; + break; + case 'p': + if (strcmp (name + 3, "ha") == 0) + return (wctype_t) iswalpha; + break; + default: + break; + } + break; + default: + break; + } + break; + case 'b': + if (strcmp (name + 1, "lank") == 0) + return (wctype_t) iswblank; + break; + case 'c': + if (strcmp (name + 1, "ntrl") == 0) + return (wctype_t) iswcntrl; + break; + case 'd': + if (strcmp (name + 1, "igit") == 0) + return (wctype_t) iswdigit; + break; + case 'g': + if (strcmp (name + 1, "raph") == 0) + return (wctype_t) iswgraph; + break; + case 'l': + if (strcmp (name + 1, "ower") == 0) + return (wctype_t) iswlower; + break; + case 'p': + switch (name[1]) + { + case 'r': + if (strcmp (name + 2, "int") == 0) + return (wctype_t) iswprint; + break; + case 'u': + if (strcmp (name + 2, "nct") == 0) + return (wctype_t) iswpunct; + break; + default: + break; + } + break; + case 's': + if (strcmp (name + 1, "pace") == 0) + return (wctype_t) iswspace; + break; + case 'u': + if (strcmp (name + 1, "pper") == 0) + return (wctype_t) iswupper; + break; + case 'x': + if (strcmp (name + 1, "digit") == 0) + return (wctype_t) iswxdigit; + break; + default: + break; + } + return NULL; +} diff --git a/gnulib/lib/wctype.c b/gnulib/lib/wctype.c new file mode 100644 index 0000000..968b36f --- /dev/null +++ b/gnulib/lib/wctype.c @@ -0,0 +1,25 @@ +/* Get descriptor for a wide character property. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include + +#include "wctype-impl.h" diff --git a/gnulib/lib/wctype.in.h b/gnulib/lib/wctype.in.h new file mode 100644 index 0000000..641e991 --- /dev/null +++ b/gnulib/lib/wctype.in.h @@ -0,0 +1,499 @@ +/* A substitute for ISO C99 , for platforms that lack it. + + Copyright (C) 2006-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 for platforms that lack it. + * + * + * iswctype, towctrans, towlower, towupper, wctrans, wctype, + * wctrans_t, and wctype_t are not yet implemented. + */ + +#ifndef _@GUARD_PREFIX@_WCTYPE_H + +#if __GNUC__ >= 3 +@PRAGMA_SYSTEM_HEADER@ +#endif +@PRAGMA_COLUMNS@ + +#if @HAVE_WINT_T@ +/* Solaris 2.5 has a bug: must be included before . + Tru64 with Desktop Toolkit C has a bug: must be included before + . + BSD/OS 4.0.1 has a bug: , and must be + included before . */ +# include +# include +# include +# include +#endif + +/* Include the original if it exists. + BeOS 5 has the functions but no . */ +/* The include_next requires a split double-inclusion guard. */ +#if @HAVE_WCTYPE_H@ +# @INCLUDE_NEXT@ @NEXT_WCTYPE_H@ +#endif + +#ifndef _@GUARD_PREFIX@_WCTYPE_H +#define _@GUARD_PREFIX@_WCTYPE_H + +/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ + +/* The definition of _GL_WARN_ON_USE is copied here. */ + +/* Solaris 2.6 includes which includes which + #defines a number of identifiers in the application namespace. Revert + these #defines. */ +#ifdef __sun +# undef multibyte +# undef eucw1 +# undef eucw2 +# undef eucw3 +# undef scrw1 +# undef scrw2 +# undef scrw3 +#endif + +/* Define wint_t and WEOF. (Also done in wchar.in.h.) */ +#if !@HAVE_WINT_T@ && !defined wint_t +# define wint_t int +# ifndef WEOF +# define WEOF -1 +# endif +#else +/* MSVC defines wint_t as 'unsigned short' in . + This is too small: ISO C 99 section 7.24.1.(2) says that wint_t must be + "unchanged by default argument promotions". Override it. */ +# if defined _MSC_VER +# if !GNULIB_defined_wint_t +# include +typedef unsigned int rpl_wint_t; +# undef wint_t +# define wint_t rpl_wint_t +# define GNULIB_defined_wint_t 1 +# endif +# endif +# ifndef WEOF +# define WEOF ((wint_t) -1) +# endif +#endif + + +#if !GNULIB_defined_wctype_functions + +/* FreeBSD 4.4 to 4.11 has but lacks the functions. + Linux libc5 has and the functions but they are broken. + Assume all 11 functions (all isw* except iswblank) 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 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 and the functions but they are broken. */ +# if @REPLACE_ISWCNTRL@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# 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 +# endif +# endif +# if @REPLACE_TOWLOWER@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define towlower rpl_towlower +# define towupper rpl_towupper +# endif +# endif + +static inline int +# if @REPLACE_ISWCNTRL@ +rpl_iswalnum +# else +iswalnum +# endif + (wint_t wc) +{ + return ((wc >= '0' && wc <= '9') + || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z')); +} + +static inline int +# if @REPLACE_ISWCNTRL@ +rpl_iswalpha +# else +iswalpha +# endif + (wint_t wc) +{ + return (wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z'; +} + +static inline int +# if @REPLACE_ISWCNTRL@ +rpl_iswblank +# else +iswblank +# endif + (wint_t wc) +{ + return wc == ' ' || wc == '\t'; +} + +static inline int +# if @REPLACE_ISWCNTRL@ +rpl_iswcntrl +# else +iswcntrl +# endif + (wint_t wc) +{ + return (wc & ~0x1f) == 0 || wc == 0x7f; +} + +static inline int +# if @REPLACE_ISWCNTRL@ +rpl_iswdigit +# else +iswdigit +# endif + (wint_t wc) +{ + return wc >= '0' && wc <= '9'; +} + +static inline int +# if @REPLACE_ISWCNTRL@ +rpl_iswgraph +# else +iswgraph +# endif + (wint_t wc) +{ + return wc >= '!' && wc <= '~'; +} + +static inline int +# if @REPLACE_ISWCNTRL@ +rpl_iswlower +# else +iswlower +# endif + (wint_t wc) +{ + return wc >= 'a' && wc <= 'z'; +} + +static inline int +# if @REPLACE_ISWCNTRL@ +rpl_iswprint +# else +iswprint +# endif + (wint_t wc) +{ + return wc >= ' ' && wc <= '~'; +} + +static inline int +# if @REPLACE_ISWCNTRL@ +rpl_iswpunct +# else +iswpunct +# endif + (wint_t wc) +{ + return (wc >= '!' && wc <= '~' + && !((wc >= '0' && wc <= '9') + || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z'))); +} + +static inline int +# if @REPLACE_ISWCNTRL@ +rpl_iswspace +# else +iswspace +# endif + (wint_t wc) +{ + return (wc == ' ' || wc == '\t' + || wc == '\n' || wc == '\v' || wc == '\f' || wc == '\r'); +} + +static inline int +# if @REPLACE_ISWCNTRL@ +rpl_iswupper +# else +iswupper +# endif + (wint_t wc) +{ + return wc >= 'A' && wc <= 'Z'; +} + +static inline int +# if @REPLACE_ISWCNTRL@ +rpl_iswxdigit +# else +iswxdigit +# endif + (wint_t wc) +{ + return ((wc >= '0' && wc <= '9') + || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'F')); +} + +static inline wint_t +# if @REPLACE_TOWLOWER@ +rpl_towlower +# else +towlower +# endif + (wint_t wc) +{ + return (wc >= 'A' && wc <= 'Z' ? wc - 'A' + 'a' : wc); +} + +static inline wint_t +# if @REPLACE_TOWLOWER@ +rpl_towupper +# else +towupper +# endif + (wint_t wc) +{ + return (wc >= 'a' && wc <= 'z' ? wc - 'a' + 'A' : wc); +} + +# elif @GNULIB_ISWBLANK@ && (! @HAVE_ISWBLANK@ || @REPLACE_ISWBLANK@) +/* Only the iswblank function is missing. */ + +# if @REPLACE_ISWBLANK@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define iswblank rpl_iswblank +# endif +_GL_FUNCDECL_RPL (iswblank, int, (wint_t wc)); +# else +_GL_FUNCDECL_SYS (iswblank, int, (wint_t wc)); +# endif + +# endif + +# 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); +} +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define towlower rpl_towlower +# endif + +static inline wint_t +rpl_towupper (wint_t wc) +{ + return (wint_t) (wchar_t) towupper (wc); +} +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define towupper rpl_towupper +# endif + +# endif /* __MINGW32__ */ + +# define GNULIB_defined_wctype_functions 1 +#endif + +#if @REPLACE_ISWCNTRL@ +_GL_CXXALIAS_RPL (iswalnum, int, (wint_t wc)); +_GL_CXXALIAS_RPL (iswalpha, int, (wint_t wc)); +_GL_CXXALIAS_RPL (iswcntrl, int, (wint_t wc)); +_GL_CXXALIAS_RPL (iswdigit, int, (wint_t wc)); +_GL_CXXALIAS_RPL (iswgraph, int, (wint_t wc)); +_GL_CXXALIAS_RPL (iswlower, int, (wint_t wc)); +_GL_CXXALIAS_RPL (iswprint, int, (wint_t wc)); +_GL_CXXALIAS_RPL (iswpunct, int, (wint_t wc)); +_GL_CXXALIAS_RPL (iswspace, int, (wint_t wc)); +_GL_CXXALIAS_RPL (iswupper, int, (wint_t wc)); +_GL_CXXALIAS_RPL (iswxdigit, int, (wint_t wc)); +#else +_GL_CXXALIAS_SYS (iswalnum, int, (wint_t wc)); +_GL_CXXALIAS_SYS (iswalpha, int, (wint_t wc)); +_GL_CXXALIAS_SYS (iswcntrl, int, (wint_t wc)); +_GL_CXXALIAS_SYS (iswdigit, int, (wint_t wc)); +_GL_CXXALIAS_SYS (iswgraph, int, (wint_t wc)); +_GL_CXXALIAS_SYS (iswlower, int, (wint_t wc)); +_GL_CXXALIAS_SYS (iswprint, int, (wint_t wc)); +_GL_CXXALIAS_SYS (iswpunct, int, (wint_t wc)); +_GL_CXXALIAS_SYS (iswspace, int, (wint_t wc)); +_GL_CXXALIAS_SYS (iswupper, int, (wint_t wc)); +_GL_CXXALIAS_SYS (iswxdigit, int, (wint_t wc)); +#endif +_GL_CXXALIASWARN (iswalnum); +_GL_CXXALIASWARN (iswalpha); +_GL_CXXALIASWARN (iswcntrl); +_GL_CXXALIASWARN (iswdigit); +_GL_CXXALIASWARN (iswgraph); +_GL_CXXALIASWARN (iswlower); +_GL_CXXALIASWARN (iswprint); +_GL_CXXALIASWARN (iswpunct); +_GL_CXXALIASWARN (iswspace); +_GL_CXXALIASWARN (iswupper); +_GL_CXXALIASWARN (iswxdigit); + +#if @GNULIB_ISWBLANK@ +# if @REPLACE_ISWCNTRL@ || @REPLACE_ISWBLANK@ +_GL_CXXALIAS_RPL (iswblank, int, (wint_t wc)); +# else +_GL_CXXALIAS_SYS (iswblank, int, (wint_t wc)); +# endif +_GL_CXXALIASWARN (iswblank); +#endif + +#if !@HAVE_WCTYPE_T@ +# if !GNULIB_defined_wctype_t +typedef void * wctype_t; +# define GNULIB_defined_wctype_t 1 +# endif +#endif + +/* Get a descriptor for a wide character property. */ +#if @GNULIB_WCTYPE@ +# if !@HAVE_WCTYPE_T@ +_GL_FUNCDECL_SYS (wctype, wctype_t, (const char *name)); +# endif +_GL_CXXALIAS_SYS (wctype, wctype_t, (const char *name)); +_GL_CXXALIASWARN (wctype); +#elif defined GNULIB_POSIXCHECK +# undef wctype +# if HAVE_RAW_DECL_WCTYPE +_GL_WARN_ON_USE (wctype, "wctype is unportable - " + "use gnulib module wctype for portability"); +# endif +#endif + +/* Test whether a wide character has a given property. + The argument WC must be either a wchar_t value or WEOF. + The argument DESC must have been returned by the wctype() function. */ +#if @GNULIB_ISWCTYPE@ +# if !@HAVE_WCTYPE_T@ +_GL_FUNCDECL_SYS (iswctype, int, (wint_t wc, wctype_t desc)); +# endif +_GL_CXXALIAS_SYS (iswctype, int, (wint_t wc, wctype_t desc)); +_GL_CXXALIASWARN (iswctype); +#elif defined GNULIB_POSIXCHECK +# undef iswctype +# if HAVE_RAW_DECL_ISWCTYPE +_GL_WARN_ON_USE (iswctype, "iswctype is unportable - " + "use gnulib module iswctype for portability"); +# endif +#endif + +#if @REPLACE_TOWLOWER@ || defined __MINGW32__ +_GL_CXXALIAS_RPL (towlower, wint_t, (wint_t wc)); +_GL_CXXALIAS_RPL (towupper, wint_t, (wint_t wc)); +#else +_GL_CXXALIAS_SYS (towlower, wint_t, (wint_t wc)); +_GL_CXXALIAS_SYS (towupper, wint_t, (wint_t wc)); +#endif +_GL_CXXALIASWARN (towlower); +_GL_CXXALIASWARN (towupper); + +#if !@HAVE_WCTRANS_T@ +# if !GNULIB_defined_wctrans_t +typedef void * wctrans_t; +# define GNULIB_defined_wctrans_t 1 +# endif +#endif + +/* Get a descriptor for a wide character case conversion. */ +#if @GNULIB_WCTRANS@ +# if !@HAVE_WCTRANS_T@ +_GL_FUNCDECL_SYS (wctrans, wctrans_t, (const char *name)); +# endif +_GL_CXXALIAS_SYS (wctrans, wctrans_t, (const char *name)); +_GL_CXXALIASWARN (wctrans); +#elif defined GNULIB_POSIXCHECK +# undef wctrans +# if HAVE_RAW_DECL_WCTRANS +_GL_WARN_ON_USE (wctrans, "wctrans is unportable - " + "use gnulib module wctrans for portability"); +# endif +#endif + +/* Perform a given case conversion on a wide character. + The argument WC must be either a wchar_t value or WEOF. + The argument DESC must have been returned by the wctrans() function. */ +#if @GNULIB_TOWCTRANS@ +# if !@HAVE_WCTRANS_T@ +_GL_FUNCDECL_SYS (towctrans, wint_t, (wint_t wc, wctrans_t desc)); +# endif +_GL_CXXALIAS_SYS (towctrans, wint_t, (wint_t wc, wctrans_t desc)); +_GL_CXXALIASWARN (towctrans); +#elif defined GNULIB_POSIXCHECK +# undef towctrans +# if HAVE_RAW_DECL_TOWCTRANS +_GL_WARN_ON_USE (towctrans, "towctrans is unportable - " + "use gnulib module towctrans for portability"); +# endif +#endif + + +#endif /* _@GUARD_PREFIX@_WCTYPE_H */ +#endif /* _@GUARD_PREFIX@_WCTYPE_H */ diff --git a/gnulib/lib/wcwidth.c b/gnulib/lib/wcwidth.c new file mode 100644 index 0000000..a006ca7 --- /dev/null +++ b/gnulib/lib/wcwidth.c @@ -0,0 +1,50 @@ +/* Determine the number of screen columns needed for a character. + Copyright (C) 2006-2007, 2010-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +/* Get iswprint. */ +#include + +#include "localcharset.h" +#include "streq.h" +#include "uniwidth.h" + +int +wcwidth (wchar_t wc) +#undef wcwidth +{ + /* 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/wmemchr-impl.h b/gnulib/lib/wmemchr-impl.h new file mode 100644 index 0000000..92fd7fd --- /dev/null +++ b/gnulib/lib/wmemchr-impl.h @@ -0,0 +1,27 @@ +/* Search wide character array for a wide character. + Copyright (C) 1999, 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 1999. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +wchar_t * +wmemchr (const wchar_t *s, wchar_t c, size_t n) +{ + for (; n > 0; s++, n--) + { + if (*s == c) + return (wchar_t *) s; + } + return NULL; +} diff --git a/gnulib/lib/wmemchr.c b/gnulib/lib/wmemchr.c new file mode 100644 index 0000000..53c891c --- /dev/null +++ b/gnulib/lib/wmemchr.c @@ -0,0 +1,23 @@ +/* Search wide character array for a wide character. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include "wmemchr-impl.h" diff --git a/gnulib/lib/wmemcmp-impl.h b/gnulib/lib/wmemcmp-impl.h new file mode 100644 index 0000000..b677771 --- /dev/null +++ b/gnulib/lib/wmemcmp-impl.h @@ -0,0 +1,35 @@ +/* Compare wide character arrays. + Copyright (C) 1999, 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 1999. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +int +wmemcmp (const wchar_t *s1, const wchar_t *s2, size_t n) +{ + for (; n > 0;) + { + wchar_t wc1 = *s1++; + wchar_t wc2 = *s2++; + if (wc1 == wc2) + { + n--; + continue; + } + /* Note that wc1 and wc2 each have at most 31 bits. */ + return (int)wc1 - (int)wc2; + /* > 0 if wc1 > wc2, < 0 if wc1 < wc2. */ + } + return 0; +} diff --git a/gnulib/lib/wmemcmp.c b/gnulib/lib/wmemcmp.c new file mode 100644 index 0000000..f5a30af --- /dev/null +++ b/gnulib/lib/wmemcmp.c @@ -0,0 +1,23 @@ +/* Compare wide character arrays. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include "wmemcmp-impl.h" diff --git a/gnulib/lib/wmemcpy-impl.h b/gnulib/lib/wmemcpy-impl.h new file mode 100644 index 0000000..6802e76 --- /dev/null +++ b/gnulib/lib/wmemcpy-impl.h @@ -0,0 +1,26 @@ +/* Copy wide character array. + Copyright (C) 1999, 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 1999. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +wchar_t * +wmemcpy (wchar_t *dest, const wchar_t *src, size_t n) +{ + wchar_t *destptr = dest; + + for (; n > 0; n--) + *destptr++ = *src++; + return dest; +} diff --git a/gnulib/lib/wmemcpy.c b/gnulib/lib/wmemcpy.c new file mode 100644 index 0000000..0142497 --- /dev/null +++ b/gnulib/lib/wmemcpy.c @@ -0,0 +1,23 @@ +/* Copy wide character array. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include "wmemcpy-impl.h" diff --git a/gnulib/lib/wmemmove-impl.h b/gnulib/lib/wmemmove-impl.h new file mode 100644 index 0000000..4ecdcbe --- /dev/null +++ b/gnulib/lib/wmemmove-impl.h @@ -0,0 +1,36 @@ +/* Copy wide character array. + Copyright (C) 1999, 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 1999. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +wchar_t * +wmemmove (wchar_t *dest, const wchar_t *src, size_t n) +{ + if (dest < src) + { + wchar_t *destptr = dest; + const wchar_t *srcptr = src; + for (; n > 0; n--) + *destptr++ = *srcptr++; + } + else if (dest > src) + { + wchar_t *destptr = dest + n - 1; + const wchar_t *srcptr = src + n - 1; + for (; n > 0; n--) + *destptr-- = *srcptr--; + } + return dest; +} diff --git a/gnulib/lib/wmemmove.c b/gnulib/lib/wmemmove.c new file mode 100644 index 0000000..3edaa0c --- /dev/null +++ b/gnulib/lib/wmemmove.c @@ -0,0 +1,23 @@ +/* Copy wide character array. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include "wmemmove-impl.h" diff --git a/gnulib/lib/wmemset-impl.h b/gnulib/lib/wmemset-impl.h new file mode 100644 index 0000000..30b586a --- /dev/null +++ b/gnulib/lib/wmemset-impl.h @@ -0,0 +1,26 @@ +/* Fill wide character array. + Copyright (C) 1999, 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 1999. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +wchar_t * +wmemset (wchar_t *s, wchar_t c, size_t n) +{ + wchar_t *ptr = s; + + for (; n > 0; n--) + *ptr++ = c; + return s; +} diff --git a/gnulib/lib/wmemset.c b/gnulib/lib/wmemset.c new file mode 100644 index 0000000..15450f5 --- /dev/null +++ b/gnulib/lib/wmemset.c @@ -0,0 +1,23 @@ +/* Fill wide character array. + Copyright (C) 2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2011. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include "wmemset-impl.h" diff --git a/gnulib/lib/write-any-file.c b/gnulib/lib/write-any-file.c new file mode 100644 index 0000000..74884e8 --- /dev/null +++ b/gnulib/lib/write-any-file.c @@ -0,0 +1,50 @@ +/* Determine whether we can write any file. + + Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +#include + +#include "write-any-file.h" +#include "priv-set.h" + +#include + +/* 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 0000000..3930d4d --- /dev/null +++ b/gnulib/lib/write-any-file.h @@ -0,0 +1,2 @@ +#include +bool can_write_any_file (void); diff --git a/gnulib/lib/write.c b/gnulib/lib/write.c new file mode 100644 index 0000000..c3537d5 --- /dev/null +++ b/gnulib/lib/write.c @@ -0,0 +1,145 @@ +/* POSIX compatible write() function. + Copyright (C) 2008-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* Specification. */ +#include + +/* 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 +# include +# include + +# define WIN32_LEAN_AND_MEAN /* avoid including junk */ +# include + +# include "msvc-inval.h" +# include "msvc-nothrow.h" + +# undef write + +# if HAVE_MSVC_INVALID_PARAMETER_HANDLER +static inline ssize_t +write_nothrow (int fd, const void *buf, size_t count) +{ + ssize_t result; + + TRY_MSVC_INVAL + { + result = write (fd, buf, count); + } + CATCH_MSVC_INVAL + { + result = -1; + errno = EBADF; + } + DONE_MSVC_INVAL; + + return result; +} +# else +# define write_nothrow write +# endif + +ssize_t +rpl_write (int fd, const void *buf, size_t count) +{ + for (;;) + { + ssize_t ret = write_nothrow (fd, buf, count); + + if (ret < 0) + { +# if GNULIB_NONBLOCKING + if (errno == ENOSPC) + { + HANDLE h = (HANDLE) _get_osfhandle (fd); + if (GetFileType (h) == FILE_TYPE_PIPE) + { + /* h is a pipe or socket. */ + DWORD state; + if (GetNamedPipeHandleState (h, &state, NULL, NULL, NULL, + NULL, 0) + && (state & PIPE_NOWAIT) != 0) + { + /* h is a pipe in non-blocking mode. + We can get here in four situations: + 1. When the pipe buffer is full. + 2. When count <= pipe_buf_size and the number of + free bytes in the pipe buffer is < count. + 3. When count > pipe_buf_size and the number of free + bytes in the pipe buffer is > 0, < pipe_buf_size. + 4. When count > pipe_buf_size and the pipe buffer is + entirely empty. + The cases 1 and 2 are POSIX compliant. In cases 3 and + 4 POSIX specifies that write() must split the request + and succeed with a partial write. We fix case 4. + We don't fix case 3 because it is not essential for + programs. */ + DWORD out_size; /* size of the buffer for outgoing data */ + DWORD in_size; /* size of the buffer for incoming data */ + if (GetNamedPipeInfo (h, NULL, &out_size, &in_size, NULL)) + { + size_t reduced_count = count; + /* In theory we need only one of out_size, in_size. + But I don't know which of the two. The description + is ambiguous. */ + if (out_size != 0 && out_size < reduced_count) + reduced_count = out_size; + if (in_size != 0 && in_size < reduced_count) + reduced_count = in_size; + if (reduced_count < count) + { + /* Attempt to write only the first part. */ + count = reduced_count; + continue; + } + } + /* Change errno from ENOSPC to EAGAIN. */ + errno = EAGAIN; + } + } + } + else +# endif + { +# if GNULIB_SIGPIPE + 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; + } +# endif + } + } + return ret; + } +} + +#endif diff --git a/gnulib/lib/xalloc-die.c b/gnulib/lib/xalloc-die.c new file mode 100644 index 0000000..80b4194 --- /dev/null +++ b/gnulib/lib/xalloc-die.c @@ -0,0 +1,41 @@ +/* Report a memory allocation failure and exit. + + Copyright (C) 1997-2000, 2002-2004, 2006, 2009-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#include "xalloc.h" + +#include + +#include "error.h" +#include "exitfail.h" + +#include "gettext.h" +#define _(msgid) gettext (msgid) + +void +xalloc_die (void) +{ + error (exit_failure, 0, "%s", _("memory exhausted")); + + /* _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-oversized.h b/gnulib/lib/xalloc-oversized.h new file mode 100644 index 0000000..ab19bcf --- /dev/null +++ b/gnulib/lib/xalloc-oversized.h @@ -0,0 +1,38 @@ +/* xalloc-oversized.h -- memory allocation size checking + + Copyright (C) 1990-2000, 2003-2004, 2006-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef XALLOC_OVERSIZED_H_ +# define XALLOC_OVERSIZED_H_ + +# include + +/* 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)) + +#endif /* !XALLOC_OVERSIZED_H_ */ diff --git a/gnulib/lib/xalloc.h b/gnulib/lib/xalloc.h new file mode 100644 index 0000000..987791b --- /dev/null +++ b/gnulib/lib/xalloc.h @@ -0,0 +1,271 @@ +/* xalloc.h -- malloc with out-of-memory checking + + Copyright (C) 1990-2000, 2003-2004, 2006-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef XALLOC_H_ +# define XALLOC_H_ + +# include + +# include "xalloc-oversized.h" + +# ifdef __cplusplus +extern "C" { +# endif + + +# if __GNUC__ >= 3 +# define _GL_ATTRIBUTE_MALLOC __attribute__ ((__malloc__)) +# else +# define _GL_ATTRIBUTE_MALLOC +# endif + +# if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) +# define _GL_ATTRIBUTE_ALLOC_SIZE(args) __attribute__ ((__alloc_size__ args)) +# else +# define _GL_ATTRIBUTE_ALLOC_SIZE(args) +# 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 _Noreturn void xalloc_die (void); + +void *xmalloc (size_t s) + _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1)); +void *xzalloc (size_t s) + _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1)); +void *xcalloc (size_t n, size_t s) + _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1, 2)); +void *xrealloc (void *p, size_t s) + _GL_ATTRIBUTE_ALLOC_SIZE ((2)); +void *x2realloc (void *p, size_t *pn); +void *xmemdup (void const *p, size_t s) + _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((2)); +char *xstrdup (char const *str) + _GL_ATTRIBUTE_MALLOC; + +/* 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) + _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1, 2)); +void *xnrealloc (void *p, size_t n, size_t s) + _GL_ATTRIBUTE_ALLOC_SIZE ((2, 3)); +void *x2nrealloc (void *p, size_t *pn, size_t s); +char *xcharalloc (size_t n) + _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1)); +# 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) + _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1, 2)); +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) + _GL_ATTRIBUTE_ALLOC_SIZE ((2, 3)); +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. This is the largest "small" request for the GNU C + library malloc. */ + enum { DEFAULT_MXFAST = 64 * sizeof (size_t) / 4 }; + + 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) + _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1)); +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 inline T * +xrealloc (T *p, size_t s) +{ + return (T *) xrealloc ((void *) p, s); +} + +template inline T * +xnrealloc (T *p, size_t n, size_t s) +{ + return (T *) xnrealloc ((void *) p, n, s); +} + +template inline T * +x2realloc (T *p, size_t *pn) +{ + return (T *) x2realloc ((void *) p, pn); +} + +template inline T * +x2nrealloc (T *p, size_t *pn, size_t s) +{ + return (T *) x2nrealloc ((void *) p, pn, s); +} + +template 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 0000000..05e6e7e --- /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-2011 Free Software Foundation, + Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..1a42c2c --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify 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 . */ + +/* Written by Bruno Haible . */ + +#include + +/* 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 0000000..33a2b57 --- /dev/null +++ b/gnulib/lib/xfreopen.c @@ -0,0 +1,42 @@ +/* a wrapper for frepoen + Copyright (C) 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include +#include "xfreopen.h" + +#include +#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 0000000..2ce49b5 --- /dev/null +++ b/gnulib/lib/xfreopen.h @@ -0,0 +1,2 @@ +#include +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 0000000..1cf8cf0 --- /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-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Jim Meyering. */ + +#include + +#include "xgetcwd.h" + +#include +#include + +#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 0000000..18685f6 --- /dev/null +++ b/gnulib/lib/xgetcwd.h @@ -0,0 +1,17 @@ +/* prototype for xgetcwd + Copyright (C) 1995, 2001, 2003, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +extern char *xgetcwd (void); diff --git a/gnulib/lib/xgetdomainname.c b/gnulib/lib/xgetdomainname.c new file mode 100644 index 0000000..54e4ddd --- /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-2011 Free + Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Based on xgethostname.c, written by Jim Meyering. */ + +#include + +/* Specification. */ +#include "xgetdomainname.h" + +/* Get getdomainname. */ +#include + +/* Get errno. */ +#include + +/* Get free. */ +#include + +#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 0000000..afa90f9 --- /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-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#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/xgetgroups.c b/gnulib/lib/xgetgroups.c new file mode 100644 index 0000000..41886c9 --- /dev/null +++ b/gnulib/lib/xgetgroups.c @@ -0,0 +1,37 @@ +/* xgetgroups.c -- return a list of the groups a user or current process is in + + Copyright (C) 2007-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Extracted from coreutils' src/id.c. */ + +#include + +#include "mgetgroups.h" + +#include + +#include "xalloc.h" + +/* 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/xgethostname.c b/gnulib/lib/xgethostname.c new file mode 100644 index 0000000..18b9873 --- /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-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Jim Meyering */ + +#include + +/* Specification. */ +#include "xgethostname.h" + +#include +#include +#include + +#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 0000000..0177a40 --- /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 0000000..08c30fb --- /dev/null +++ b/gnulib/lib/xmalloc.c @@ -0,0 +1,124 @@ +/* xmalloc.c -- malloc with out of memory checking + + Copyright (C) 1990-2000, 2002-2006, 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#if ! HAVE_INLINE +# define static_inline +#endif +#include "xalloc.h" +#undef static_inline + +#include +#include + +/* 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_GNU and supports the GNU API even on non-GNU platforms. */ +#if defined HAVE_CALLOC_GNU || (defined __GLIBC__ && !defined __UCLIBC__) +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) +{ + if (!n && p) + { + /* The GNU and C99 realloc behaviors disagree here. Act like + GNU, even if the underlying realloc is C99. */ + free (p); + return NULL; + } + + p = realloc (p, n); + if (!p && n) + 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 0000000..aec8459 --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#include + +/* 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 0000000..12f7e3d --- /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-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#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 0000000..56f1871 --- /dev/null +++ b/gnulib/lib/xmemcoll.c @@ -0,0 +1,76 @@ +/* Locale-specific memory comparison. + + Copyright (C) 2002-2004, 2006, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Contributed by Paul Eggert . */ + +#include + +#include +#include + +#include "gettext.h" +#define _(msgid) gettext (msgid) + +#include "error.h" +#include "exitfail.h" +#include "memcoll.h" +#include "quotearg.h" +#include "xmemcoll.h" + +static void +collate_error (int collation_errno, + char const *s1, size_t s1len, + char const *s2, size_t s2len) +{ + 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)); +} + +/* 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) + collate_error (collation_errno, s1, s1len, s2, s2len); + return diff; +} + +/* Compare S1 (a memory block of size S1SIZE, with a NUL as last byte) + and S2 (a memory block of size S2SIZE, with a NUL as last byte) + according to the LC_COLLATE locale. S1SIZE and S2SIZE must be > 0. + Report an error and exit if there is an error. */ + +int +xmemcoll0 (char const *s1, size_t s1size, char const *s2, size_t s2size) +{ + int diff = memcoll0 (s1, s1size, s2, s2size); + int collation_errno = errno; + if (collation_errno) + collate_error (collation_errno, s1, s1size - 1, s2, s2size - 1); + return diff; +} diff --git a/gnulib/lib/xmemcoll.h b/gnulib/lib/xmemcoll.h new file mode 100644 index 0000000..4170b9b --- /dev/null +++ b/gnulib/lib/xmemcoll.h @@ -0,0 +1,3 @@ +#include +int xmemcoll (char *, size_t, char *, size_t); +int xmemcoll0 (char const *, size_t, char const *, size_t); diff --git a/gnulib/lib/xmemdup0.c b/gnulib/lib/xmemdup0.c new file mode 100644 index 0000000..32ac0f8 --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#include "xmemdup0.h" +#include "xalloc.h" + +#include + +/* 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 0000000..fa1b2f0 --- /dev/null +++ b/gnulib/lib/xmemdup0.h @@ -0,0 +1,41 @@ +/* xmemdup0.h -- copy a block of arbitrary bytes, plus a trailing NUL + + Copyright (C) 2008-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef XMEMDUP_H_ +# define XMEMDUP_H_ + +# include + + +# ifdef __cplusplus +extern "C" { +# 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 _Noreturn void xalloc_die (void); + +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 0000000..442ddf5 --- /dev/null +++ b/gnulib/lib/xnanosleep.c @@ -0,0 +1,58 @@ +/* xnanosleep.c -- a more convenient interface to nanosleep + + Copyright (C) 2002-2007, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Mostly written (for sleep.c) by Paul Eggert. + Factored out (creating this file) by Jim Meyering. */ + +#include + +#include "xnanosleep.h" + +#include + +#include +#include + +/* 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) +{ + struct timespec ts_sleep = dtotimespec (seconds); + + for (;;) + { + /* 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 0000000..56232d5 --- /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 0000000..edb97eb --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#include "xprintf.h" + +#include + +#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 0000000..ca48ce7 --- /dev/null +++ b/gnulib/lib/xprintf.h @@ -0,0 +1,45 @@ +/* printf wrappers that fail immediately for non-file-related errors + Copyright (C) 2007-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef _XPRINTF_H +#define _XPRINTF_H + +#include +#include + +/* 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 _GL_ATTRIBUTE_FORMAT 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 _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec)) +#else +# define _GL_ATTRIBUTE_FORMAT(spec) /* empty */ +#endif + +extern int xprintf (char const *restrict format, ...) + _GL_ATTRIBUTE_FORMAT ((__printf__, 1, 2)); +extern int xvprintf (char const *restrict format, va_list args) + _GL_ATTRIBUTE_FORMAT ((__printf__, 1, 0)); +extern int xfprintf (FILE *restrict stream, char const *restrict format, ...) + _GL_ATTRIBUTE_FORMAT ((__printf__, 2, 3)); +extern int xvfprintf (FILE *restrict stream, char const *restrict format, + va_list args) + _GL_ATTRIBUTE_FORMAT ((__printf__, 2, 0)); + +#endif diff --git a/gnulib/lib/xreadlink.c b/gnulib/lib/xreadlink.c new file mode 100644 index 0000000..cbb9ea2 --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Jim Meyering + and Bruno Haible . */ + +#include + +/* Specification. */ +#include "xreadlink.h" + +#include + +#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 0000000..fe608a4 --- /dev/null +++ b/gnulib/lib/xreadlink.h @@ -0,0 +1,25 @@ +/* Reading symbolic links without size limitation. + + Copyright (C) 2001, 2003-2004, 2007, 2009-2011 Free Software Foundation, + Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Jim Meyering */ + +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 0000000..ca42634 --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Jim Meyering , + and Bruno Haible , + and Eric Blake . */ + +#include + +/* Specification. */ +#include "xreadlink.h" + +#include + +#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 0000000..48c9be5 --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "xsetenv.h" + +#include + +#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 0000000..75f3264 --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Get unsetenv(). It can be used without error checking. */ +#include + +#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 0000000..f75655a --- /dev/null +++ b/gnulib/lib/xsize.h @@ -0,0 +1,108 @@ +/* xsize.h -- Checked size_t computations. + + Copyright (C) 2003, 2008-2011 Free Software Foundation, Inc. + + This program is free software; you can 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 + +/* Get SIZE_MAX. */ +#include +#if HAVE_STDINT_H +# include +#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 0000000..9e4498f --- /dev/null +++ b/gnulib/lib/xstriconv.c @@ -0,0 +1,62 @@ +/* Charset conversion with out-of-memory checking. + Copyright (C) 2001-2004, 2006, 2009-2011 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 . */ + +#include + +/* Specification. */ +#include "xstriconv.h" + +#include + +#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 0000000..eba6b16 --- /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-2011 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 . */ + +#ifndef _XSTRICONV_H +#define _XSTRICONV_H + +#include +#if HAVE_ICONV +#include +#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 0000000..b13be06 --- /dev/null +++ b/gnulib/lib/xstriconveh.c @@ -0,0 +1,86 @@ +/* Charset conversion with out-of-memory checking. + Copyright (C) 2009-2011 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 . */ + +#include + +/* Specification. */ +#include "xstriconveh.h" + +#include + +#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 0000000..65781c4 --- /dev/null +++ b/gnulib/lib/xstriconveh.h @@ -0,0 +1,115 @@ +/* Charset conversion with out-of-memory checking. + Copyright (C) 2001-2007, 2009-2011 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 . */ + +#ifndef _XSTRICONVEH_H +#define _XSTRICONVEH_H + +#include + +/* 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 0000000..d58302a --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "xstrndup.h" + +#include +#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 0000000..f96a538 --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* 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 0000000..1ecb638 --- /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-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Jim Meyering. */ + +#include + +#include "xstrtod.h" + +#include +#include +#include + +#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 0000000..6865776 --- /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-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Jim Meyering. */ + +#ifndef XSTRTOD_H +# define XSTRTOD_H 1 + +# include + +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 0000000..b4baf5b --- /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 0000000..52e712c --- /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-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include +#include "xstrtol.h" + +#include + +#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 0000000..b1fdd49 --- /dev/null +++ b/gnulib/lib/xstrtol.c @@ -0,0 +1,241 @@ +/* A more useful interface to strtol. + + Copyright (C) 1995-1996, 1998-2001, 2003-2007, 2009-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* 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 + +#include "xstrtol.h" + +/* Some pre-ANSI implementations (e.g. SunOS 4) + need stderr defined if assertion checking is enabled. */ +#include + +#include +#include +#include +#include +#include +#include + +#include "intprops.h" + +/* xstrtoll.c and xstrtoull.c, which include this file, require that + ULLONG_MAX, LLONG_MAX, LLONG_MIN are defined, but does not + define them on all platforms. */ +#ifndef ULLONG_MAX +# define ULLONG_MAX TYPE_MAXIMUM (unsigned long long) +#endif +#ifndef LLONG_MAX +# define LLONG_MAX TYPE_MAXIMUM (long long int) +#endif +#ifndef LLONG_MIN +# define LLONG_MIN TYPE_MINIMUM (long long int) +#endif + +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 0000000..ad134ab --- /dev/null +++ b/gnulib/lib/xstrtol.h @@ -0,0 +1,73 @@ +/* A more useful interface to strtol. + + Copyright (C) 1995-1996, 1998-1999, 2001-2004, 2006-2011 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef XSTRTOL_H_ +# define XSTRTOL_H_ 1 + +# include +# include + +# 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 + +/* 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 _Noreturn xstrtol_fatal (enum strtol_error, + int, char, struct option const *, + char const *); + +#endif /* not XSTRTOL_H_ */ diff --git a/gnulib/lib/xstrtold.c b/gnulib/lib/xstrtold.c new file mode 100644 index 0000000..50dc6a4 --- /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 0000000..db26e87 --- /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 LLONG_MIN +#define STRTOL_T_MAXIMUM LLONG_MAX +#include "xstrtol.c" diff --git a/gnulib/lib/xstrtoul.c b/gnulib/lib/xstrtoul.c new file mode 100644 index 0000000..285f7b9 --- /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 0000000..10dda50 --- /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 ULLONG_MAX +#include "xstrtol.c" diff --git a/gnulib/lib/xstrtoumax.c b/gnulib/lib/xstrtoumax.c new file mode 100644 index 0000000..9a2349f --- /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 0000000..5ca0156 --- /dev/null +++ b/gnulib/lib/xtime.h @@ -0,0 +1,86 @@ +/* xtime -- extended-resolution integer time stamps + + Copyright (C) 2005-2006, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* 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 +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 0000000..4a089ae --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "xvasprintf.h" + +#include +#include +#include +#include + +#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 0000000..197c9ea --- /dev/null +++ b/gnulib/lib/xvasprintf.h @@ -0,0 +1,55 @@ +/* vasprintf and asprintf with out-of-memory checking. + Copyright (C) 2002-2004, 2006-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef _XVASPRINTF_H +#define _XVASPRINTF_H + +/* Get va_list. */ +#include + +/* 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 _GL_ATTRIBUTE_FORMAT 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 _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec)) +#else +# define _GL_ATTRIBUTE_FORMAT(spec) /* empty */ +#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, ...) + _GL_ATTRIBUTE_FORMAT ((__printf__, 1, 2)); +extern char *xvasprintf (const char *format, va_list args) + _GL_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 0000000..6502538 --- /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-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#include "yesno.h" + +#include +#include + +/* 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 0000000..36e624f --- /dev/null +++ b/gnulib/lib/yesno.h @@ -0,0 +1,24 @@ +/* declare yesno + Copyright (C) 2004, 2009-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef YESNO_H_ +# define YESNO_H_ + +# include + +bool yesno (void); + +#endif -- cgit v1.2.1