From a325969963ea570eaabd2863abe3eb7c944099a4 Mon Sep 17 00:00:00 2001 From: nattthebear Date: Sat, 20 May 2017 17:18:31 -0400 Subject: [PATCH] Work more on waterbox and convert GPGX64 to use the new PERunner. Doesn't work yet. --- .../Consoles/Sega/gpgx64/GPGX.cs | 5 +- BizHawk.Emulation.Cores/Waterbox/PeRunner.cs | 272 +- References/PeNet.dll | Bin 120832 -> 120832 bytes waterbox/emulibc/Makefile | 32 + waterbox/emulibc/emulibc.c | 7 + waterbox/{libc/includes => emulibc}/emulibc.h | 8 +- waterbox/gpgx/Makefile | 30 +- waterbox/gpgx/cinterface/cinterface.c | 5 + waterbox/gpgx/lscript | 228 - waterbox/libc/COPYING.CC0 | 121 - waterbox/libc/Makefile | 41 - waterbox/libc/Notes.txt | 110 - waterbox/libc/UNICODE DATA LICENSE.txt | 46 - waterbox/libc/compileincludes/libm.h | 188 - waterbox/libc/compileincludes/readme.txt | 1 - waterbox/libc/functions/_PDCLIB/Readme.txt | 11 - .../libc/functions/_PDCLIB/_PDCLIB_ascii.c | 139 - .../libc/functions/_PDCLIB/_PDCLIB_atomax.c | 44 - .../libc/functions/_PDCLIB/_PDCLIB_closeall.c | 36 - .../libc/functions/_PDCLIB/_PDCLIB_digits.c | 30 - .../libc/functions/_PDCLIB/_PDCLIB_fileops.c | 56 - .../functions/_PDCLIB/_PDCLIB_initclocale.c | 29 - .../libc/functions/_PDCLIB/_PDCLIB_latin1.c | 126 - .../libc/functions/_PDCLIB/_PDCLIB_open.c | 37 - .../libc/functions/_PDCLIB/_PDCLIB_seed.c | 18 - .../functions/_PDCLIB/_PDCLIB_strtox_main.c | 85 - .../functions/_PDCLIB/_PDCLIB_strtox_prelim.c | 90 - .../libc/functions/_PDCLIB/_PDCLIB_utf8.c | 338 - waterbox/libc/functions/_PDCLIB/assert.c | 67 - waterbox/libc/functions/_PDCLIB/emulibc.c | 39 - waterbox/libc/functions/_PDCLIB/rename.c | 31 - waterbox/libc/functions/_PDCLIB/stdarg.c | 113 - waterbox/libc/functions/_PDCLIB/stdinit.c | 522 - waterbox/libc/functions/_dlmalloc/dlmalloc.c | 6227 ---- waterbox/libc/functions/_dlmalloc/dlmalloc.h | 50 - waterbox/libc/functions/ctype/isalnum.c | 36 - waterbox/libc/functions/ctype/isalpha.c | 32 - waterbox/libc/functions/ctype/isascii.c | 6 - waterbox/libc/functions/ctype/isblank.c | 33 - waterbox/libc/functions/ctype/iscntrl.c | 31 - waterbox/libc/functions/ctype/isdigit.c | 32 - waterbox/libc/functions/ctype/isgraph.c | 35 - waterbox/libc/functions/ctype/islower.c | 33 - waterbox/libc/functions/ctype/isprint.c | 35 - waterbox/libc/functions/ctype/ispunct.c | 36 - waterbox/libc/functions/ctype/isspace.c | 34 - waterbox/libc/functions/ctype/isupper.c | 33 - waterbox/libc/functions/ctype/isxdigit.c | 37 - waterbox/libc/functions/ctype/tolower.c | 32 - waterbox/libc/functions/ctype/toupper.c | 32 - waterbox/libc/functions/errno/errno.c | 37 - waterbox/libc/functions/inttypes/imaxabs.c | 30 - waterbox/libc/functions/inttypes/imaxdiv.c | 38 - waterbox/libc/functions/inttypes/strtoimax.c | 146 - waterbox/libc/functions/inttypes/strtoumax.c | 109 - waterbox/libc/functions/locale/UnicodeData.py | 194 - .../functions/locale/_PDCLIB_mb_cur_max.c | 27 - .../functions/locale/_PDCLIB_unicodedata.c | 29890 ---------------- waterbox/libc/functions/locale/fakelocale.c | 3 - waterbox/libc/functions/locale/freelocale.c | 29 - waterbox/libc/functions/locale/localeconv.c | 26 - waterbox/libc/functions/locale/setlocale.c | 26 - waterbox/libc/functions/locale/uselocale.c | 36 - waterbox/libc/functions/math/__cos.c | 71 - waterbox/libc/functions/math/__cosdf.c | 35 - waterbox/libc/functions/math/__cosl.c | 96 - waterbox/libc/functions/math/__expo2.c | 16 - waterbox/libc/functions/math/__expo2f.c | 16 - waterbox/libc/functions/math/__fpclassify.c | 11 - waterbox/libc/functions/math/__fpclassifyf.c | 11 - waterbox/libc/functions/math/__fpclassifyl.c | 34 - waterbox/libc/functions/math/__invtrigl.c | 63 - waterbox/libc/functions/math/__invtrigl.h | 6 - waterbox/libc/functions/math/__polevll.c | 93 - waterbox/libc/functions/math/__rem_pio2.c | 177 - .../libc/functions/math/__rem_pio2_large.c | 442 - waterbox/libc/functions/math/__rem_pio2f.c | 75 - waterbox/libc/functions/math/__rem_pio2l.c | 141 - waterbox/libc/functions/math/__signbit.c | 13 - waterbox/libc/functions/math/__signbitf.c | 11 - waterbox/libc/functions/math/__signbitl.c | 14 - waterbox/libc/functions/math/__sin.c | 64 - waterbox/libc/functions/math/__sindf.c | 36 - waterbox/libc/functions/math/__sinl.c | 78 - waterbox/libc/functions/math/__tan.c | 110 - waterbox/libc/functions/math/__tandf.c | 54 - waterbox/libc/functions/math/__tanl.c | 143 - waterbox/libc/functions/math/acos.c | 101 - waterbox/libc/functions/math/acosf.c | 71 - waterbox/libc/functions/math/acosh.c | 24 - waterbox/libc/functions/math/acoshf.c | 26 - waterbox/libc/functions/math/acoshl.c | 29 - waterbox/libc/functions/math/acosl.c | 67 - waterbox/libc/functions/math/asin.c | 107 - waterbox/libc/functions/math/asinf.c | 61 - waterbox/libc/functions/math/asinh.c | 28 - waterbox/libc/functions/math/asinhf.c | 28 - waterbox/libc/functions/math/asinhl.c | 41 - waterbox/libc/functions/math/asinl.c | 71 - waterbox/libc/functions/math/atan.c | 116 - waterbox/libc/functions/math/atan2.c | 107 - waterbox/libc/functions/math/atan2f.c | 83 - waterbox/libc/functions/math/atan2l.c | 85 - waterbox/libc/functions/math/atanf.c | 94 - waterbox/libc/functions/math/atanh.c | 29 - waterbox/libc/functions/math/atanhf.c | 28 - waterbox/libc/functions/math/atanhl.c | 35 - waterbox/libc/functions/math/atanl.c | 184 - waterbox/libc/functions/math/cbrt.c | 103 - waterbox/libc/functions/math/cbrtf.c | 66 - waterbox/libc/functions/math/cbrtl.c | 124 - waterbox/libc/functions/math/ceil.c | 31 - waterbox/libc/functions/math/ceilf.c | 27 - waterbox/libc/functions/math/ceill.c | 34 - waterbox/libc/functions/math/copysign.c | 8 - waterbox/libc/functions/math/copysignf.c | 10 - waterbox/libc/functions/math/copysignl.c | 16 - waterbox/libc/functions/math/cos.c | 77 - waterbox/libc/functions/math/cosf.c | 78 - waterbox/libc/functions/math/cosh.c | 40 - waterbox/libc/functions/math/coshf.c | 33 - waterbox/libc/functions/math/coshl.c | 47 - waterbox/libc/functions/math/cosl.c | 39 - waterbox/libc/functions/math/erf.c | 273 - waterbox/libc/functions/math/erff.c | 183 - waterbox/libc/functions/math/erfl.c | 353 - waterbox/libc/functions/math/exp.c | 134 - waterbox/libc/functions/math/exp10.c | 25 - waterbox/libc/functions/math/exp10f.c | 23 - waterbox/libc/functions/math/exp10l.c | 33 - waterbox/libc/functions/math/exp2.c | 375 - waterbox/libc/functions/math/exp2f.c | 126 - waterbox/libc/functions/math/exp2l.c | 619 - waterbox/libc/functions/math/expf.c | 83 - waterbox/libc/functions/math/expl.c | 128 - waterbox/libc/functions/math/expm1.c | 201 - waterbox/libc/functions/math/expm1f.c | 111 - waterbox/libc/functions/math/expm1l.c | 123 - waterbox/libc/functions/math/fabs.c | 9 - waterbox/libc/functions/math/fabsf.c | 9 - waterbox/libc/functions/math/fabsl.c | 15 - waterbox/libc/functions/math/fdim.c | 10 - waterbox/libc/functions/math/fdimf.c | 10 - waterbox/libc/functions/math/fdiml.c | 18 - waterbox/libc/functions/math/finite.c | 7 - waterbox/libc/functions/math/finitef.c | 7 - waterbox/libc/functions/math/floor.c | 31 - waterbox/libc/functions/math/floorf.c | 27 - waterbox/libc/functions/math/floorl.c | 34 - waterbox/libc/functions/math/fma.c | 460 - waterbox/libc/functions/math/fmaf.c | 93 - waterbox/libc/functions/math/fmal.c | 293 - waterbox/libc/functions/math/fmax.c | 13 - waterbox/libc/functions/math/fmaxf.c | 13 - waterbox/libc/functions/math/fmaxl.c | 21 - waterbox/libc/functions/math/fmin.c | 13 - waterbox/libc/functions/math/fminf.c | 13 - waterbox/libc/functions/math/fminl.c | 21 - waterbox/libc/functions/math/fmod.c | 68 - waterbox/libc/functions/math/fmodf.c | 65 - waterbox/libc/functions/math/fmodl.c | 105 - waterbox/libc/functions/math/frexp.c | 23 - waterbox/libc/functions/math/frexpf.c | 23 - waterbox/libc/functions/math/frexpl.c | 29 - waterbox/libc/functions/math/hypot.c | 67 - waterbox/libc/functions/math/hypotf.c | 35 - waterbox/libc/functions/math/hypotl.c | 66 - waterbox/libc/functions/math/ilogb.c | 26 - waterbox/libc/functions/math/ilogbf.c | 26 - waterbox/libc/functions/math/ilogbl.c | 55 - waterbox/libc/functions/math/j0.c | 375 - waterbox/libc/functions/math/j0f.c | 314 - waterbox/libc/functions/math/j1.c | 362 - waterbox/libc/functions/math/j1f.c | 311 - waterbox/libc/functions/math/jn.c | 280 - waterbox/libc/functions/math/jnf.c | 202 - waterbox/libc/functions/math/ldexp.c | 6 - waterbox/libc/functions/math/ldexpf.c | 6 - waterbox/libc/functions/math/ldexpl.c | 6 - waterbox/libc/functions/math/lgamma.c | 9 - waterbox/libc/functions/math/lgamma_r.c | 284 - waterbox/libc/functions/math/lgammaf.c | 9 - waterbox/libc/functions/math/lgammaf_r.c | 219 - waterbox/libc/functions/math/lgammal.c | 360 - waterbox/libc/functions/math/llrint.c | 8 - waterbox/libc/functions/math/llrintf.c | 8 - waterbox/libc/functions/math/llrintl.c | 36 - waterbox/libc/functions/math/llround.c | 6 - waterbox/libc/functions/math/llroundf.c | 6 - waterbox/libc/functions/math/llroundl.c | 6 - waterbox/libc/functions/math/log.c | 118 - waterbox/libc/functions/math/log10.c | 101 - waterbox/libc/functions/math/log10f.c | 77 - waterbox/libc/functions/math/log10l.c | 191 - waterbox/libc/functions/math/log1p.c | 122 - waterbox/libc/functions/math/log1pf.c | 77 - waterbox/libc/functions/math/log1pl.c | 177 - waterbox/libc/functions/math/log2.c | 122 - waterbox/libc/functions/math/log2f.c | 74 - waterbox/libc/functions/math/log2l.c | 182 - waterbox/libc/functions/math/logb.c | 17 - waterbox/libc/functions/math/logbf.c | 10 - waterbox/libc/functions/math/logbl.c | 16 - waterbox/libc/functions/math/logf.c | 69 - waterbox/libc/functions/math/logl.c | 175 - waterbox/libc/functions/math/lrint.c | 46 - waterbox/libc/functions/math/lrintf.c | 8 - waterbox/libc/functions/math/lrintl.c | 36 - waterbox/libc/functions/math/lround.c | 6 - waterbox/libc/functions/math/lroundf.c | 6 - waterbox/libc/functions/math/lroundl.c | 6 - waterbox/libc/functions/math/modf.c | 34 - waterbox/libc/functions/math/modff.c | 34 - waterbox/libc/functions/math/modfl.c | 53 - waterbox/libc/functions/math/nan.c | 6 - waterbox/libc/functions/math/nanf.c | 6 - waterbox/libc/functions/math/nanl.c | 6 - waterbox/libc/functions/math/nearbyint.c | 20 - waterbox/libc/functions/math/nearbyintf.c | 18 - waterbox/libc/functions/math/nearbyintl.c | 26 - waterbox/libc/functions/math/nextafter.c | 31 - waterbox/libc/functions/math/nextafterf.c | 30 - waterbox/libc/functions/math/nextafterl.c | 75 - waterbox/libc/functions/math/nexttoward.c | 42 - waterbox/libc/functions/math/nexttowardf.c | 35 - waterbox/libc/functions/math/nexttowardl.c | 6 - waterbox/libc/functions/math/pow.c | 328 - waterbox/libc/functions/math/powf.c | 259 - waterbox/libc/functions/math/powl.c | 522 - waterbox/libc/functions/math/remainder.c | 10 - waterbox/libc/functions/math/remainderf.c | 10 - waterbox/libc/functions/math/remainderl.c | 15 - waterbox/libc/functions/math/remquo.c | 82 - waterbox/libc/functions/math/remquof.c | 82 - waterbox/libc/functions/math/remquol.c | 124 - waterbox/libc/functions/math/rint.c | 28 - waterbox/libc/functions/math/rintf.c | 30 - waterbox/libc/functions/math/rintl.c | 29 - waterbox/libc/functions/math/round.c | 35 - waterbox/libc/functions/math/roundf.c | 36 - waterbox/libc/functions/math/roundl.c | 37 - waterbox/libc/functions/math/scalb.c | 35 - waterbox/libc/functions/math/scalbf.c | 32 - waterbox/libc/functions/math/scalbln.c | 11 - waterbox/libc/functions/math/scalblnf.c | 11 - waterbox/libc/functions/math/scalblnl.c | 19 - waterbox/libc/functions/math/scalbn.c | 31 - waterbox/libc/functions/math/scalbnf.c | 31 - waterbox/libc/functions/math/scalbnl.c | 36 - waterbox/libc/functions/math/signgam.c | 6 - waterbox/libc/functions/math/significand.c | 7 - waterbox/libc/functions/math/significandf.c | 7 - waterbox/libc/functions/math/sin.c | 78 - waterbox/libc/functions/math/sincos.c | 69 - waterbox/libc/functions/math/sincosf.c | 117 - waterbox/libc/functions/math/sincosl.c | 60 - waterbox/libc/functions/math/sinf.c | 76 - waterbox/libc/functions/math/sinh.c | 39 - waterbox/libc/functions/math/sinhf.c | 31 - waterbox/libc/functions/math/sinhl.c | 43 - waterbox/libc/functions/math/sinl.c | 41 - waterbox/libc/functions/math/sqrt.c | 185 - waterbox/libc/functions/math/sqrtf.c | 84 - waterbox/libc/functions/math/sqrtl.c | 7 - waterbox/libc/functions/math/tan.c | 70 - waterbox/libc/functions/math/tanf.c | 64 - waterbox/libc/functions/math/tanh.c | 45 - waterbox/libc/functions/math/tanhf.c | 39 - waterbox/libc/functions/math/tanhl.c | 48 - waterbox/libc/functions/math/tanl.c | 29 - waterbox/libc/functions/math/tgamma.c | 222 - waterbox/libc/functions/math/tgammaf.c | 6 - waterbox/libc/functions/math/tgammal.c | 281 - waterbox/libc/functions/math/trunc.c | 19 - waterbox/libc/functions/math/truncf.c | 19 - waterbox/libc/functions/math/truncl.c | 34 - .../libc/functions/math/x86_64/__invtrigl.s | 0 waterbox/libc/functions/math/x86_64/acosl.s | 16 - waterbox/libc/functions/math/x86_64/asinl.s | 12 - waterbox/libc/functions/math/x86_64/atan2l.s | 7 - waterbox/libc/functions/math/x86_64/atanl.s | 7 - waterbox/libc/functions/math/x86_64/ceill.s | 1 - waterbox/libc/functions/math/x86_64/exp2l.s | 83 - waterbox/libc/functions/math/x86_64/expl.s | 101 - waterbox/libc/functions/math/x86_64/expm1l.s | 1 - waterbox/libc/functions/math/x86_64/fabs.s | 9 - waterbox/libc/functions/math/x86_64/fabsf.s | 7 - waterbox/libc/functions/math/x86_64/fabsl.s | 6 - waterbox/libc/functions/math/x86_64/floorl.s | 27 - waterbox/libc/functions/math/x86_64/fmodl.s | 11 - waterbox/libc/functions/math/x86_64/llrint.s | 5 - waterbox/libc/functions/math/x86_64/llrintf.s | 5 - waterbox/libc/functions/math/x86_64/llrintl.s | 7 - waterbox/libc/functions/math/x86_64/log10l.s | 7 - waterbox/libc/functions/math/x86_64/log1pl.s | 15 - waterbox/libc/functions/math/x86_64/log2l.s | 7 - waterbox/libc/functions/math/x86_64/logl.s | 7 - waterbox/libc/functions/math/x86_64/lrint.s | 5 - waterbox/libc/functions/math/x86_64/lrintf.s | 5 - waterbox/libc/functions/math/x86_64/lrintl.s | 7 - .../libc/functions/math/x86_64/remainderl.s | 11 - waterbox/libc/functions/math/x86_64/rintl.s | 6 - waterbox/libc/functions/math/x86_64/sqrt.s | 4 - waterbox/libc/functions/math/x86_64/sqrtf.s | 4 - waterbox/libc/functions/math/x86_64/sqrtl.s | 5 - waterbox/libc/functions/math/x86_64/truncl.s | 1 - waterbox/libc/functions/nothread/call_once.c | 40 - waterbox/libc/functions/nothread/cnd_init.c | 19 - waterbox/libc/functions/nothread/cnd_signal.c | 18 - waterbox/libc/functions/nothread/cnd_wait.c | 18 - .../libc/functions/nothread/mtx_destroy.c | 16 - waterbox/libc/functions/nothread/mtx_init.c | 19 - waterbox/libc/functions/nothread/mtx_lock.c | 19 - .../libc/functions/nothread/mtx_timedlock.c | 18 - .../libc/functions/nothread/mtx_trylock.c | 19 - waterbox/libc/functions/nothread/mtx_unlock.c | 20 - waterbox/libc/functions/nothread/thrd_yield.c | 18 - waterbox/libc/functions/nothread/tss_create.c | 21 - waterbox/libc/functions/nothread/tss_delete.c | 19 - waterbox/libc/functions/nothread/tss_get.c | 30 - waterbox/libc/functions/nothread/tss_set.c | 20 - waterbox/libc/functions/setjmp/setjmp.s | 53 - waterbox/libc/functions/signal/raise.c | 112 - waterbox/libc/functions/signal/signal.c | 69 - .../libc/functions/stdio/_PDCLIB_filemode.c | 90 - .../libc/functions/stdio/_PDCLIB_fillbuffer.c | 46 - .../functions/stdio/_PDCLIB_flushbuffer.c | 119 - .../libc/functions/stdio/_PDCLIB_ftell64.c | 62 - .../libc/functions/stdio/_PDCLIB_fvopen.c | 105 - .../libc/functions/stdio/_PDCLIB_prepread.c | 49 - .../libc/functions/stdio/_PDCLIB_prepwrite.c | 42 - waterbox/libc/functions/stdio/_PDCLIB_print.c | 641 - waterbox/libc/functions/stdio/_PDCLIB_scan.c | 632 - waterbox/libc/functions/stdio/_PDCLIB_seek.c | 41 - waterbox/libc/functions/stdio/_cbprintf.c | 56 - waterbox/libc/functions/stdio/_vcbprintf.c | 124 - waterbox/libc/functions/stdio/clearerr.c | 59 - waterbox/libc/functions/stdio/fclose.c | 110 - waterbox/libc/functions/stdio/feof.c | 37 - waterbox/libc/functions/stdio/ferror.c | 37 - waterbox/libc/functions/stdio/fflush.c | 60 - waterbox/libc/functions/stdio/fgetc.c | 45 - waterbox/libc/functions/stdio/fgetpos.c | 51 - waterbox/libc/functions/stdio/fgets.c | 84 - waterbox/libc/functions/stdio/flockfile.c | 33 - waterbox/libc/functions/stdio/fopen.c | 67 - waterbox/libc/functions/stdio/fprintf.c | 59 - waterbox/libc/functions/stdio/fputc.c | 53 - waterbox/libc/functions/stdio/fputs.c | 76 - waterbox/libc/functions/stdio/fread.c | 87 - waterbox/libc/functions/stdio/freopen.c | 120 - waterbox/libc/functions/stdio/fscanf.c | 54 - waterbox/libc/functions/stdio/fseek.c | 109 - waterbox/libc/functions/stdio/fsetpos.c | 51 - waterbox/libc/functions/stdio/ftell.c | 96 - waterbox/libc/functions/stdio/ftrylockfile.c | 40 - waterbox/libc/functions/stdio/funlockfile.c | 38 - waterbox/libc/functions/stdio/fwrite.c | 78 - waterbox/libc/functions/stdio/getc.c | 33 - waterbox/libc/functions/stdio/getchar.c | 34 - waterbox/libc/functions/stdio/gets.c | 71 - waterbox/libc/functions/stdio/perror.c | 56 - waterbox/libc/functions/stdio/printf.c | 55 - waterbox/libc/functions/stdio/putc.c | 34 - waterbox/libc/functions/stdio/putchar.c | 33 - waterbox/libc/functions/stdio/puts.c | 74 - waterbox/libc/functions/stdio/remove.c | 37 - waterbox/libc/functions/stdio/rename.c | 83 - waterbox/libc/functions/stdio/rewind.c | 36 - waterbox/libc/functions/stdio/scanf.c | 47 - waterbox/libc/functions/stdio/setbuf.c | 56 - waterbox/libc/functions/stdio/setvbuf.c | 115 - waterbox/libc/functions/stdio/snprintf.c | 43 - waterbox/libc/functions/stdio/sprintf.c | 41 - waterbox/libc/functions/stdio/sscanf.c | 40 - waterbox/libc/functions/stdio/testfile.txt | Bin 531 -> 0 bytes waterbox/libc/functions/stdio/tmpfile.c | 34 - waterbox/libc/functions/stdio/tmpnam.c | 41 - waterbox/libc/functions/stdio/ungetc.c | 67 - waterbox/libc/functions/stdio/vasprintf.c | 58 - waterbox/libc/functions/stdio/vfprintf.c | 64 - waterbox/libc/functions/stdio/vfscanf.c | 126 - waterbox/libc/functions/stdio/vprintf.c | 53 - waterbox/libc/functions/stdio/vscanf.c | 52 - waterbox/libc/functions/stdio/vsnprintf.c | 73 - waterbox/libc/functions/stdio/vsprintf.c | 46 - waterbox/libc/functions/stdio/vsscanf.c | 111 - waterbox/libc/functions/stdlib/_Exit.c | 34 - waterbox/libc/functions/stdlib/abort.c | 39 - waterbox/libc/functions/stdlib/abs.c | 30 - .../libc/functions/stdlib/at_quick_exit.c | 60 - waterbox/libc/functions/stdlib/atexit.c | 60 - waterbox/libc/functions/stdlib/atoi.c | 27 - waterbox/libc/functions/stdlib/atol.c | 27 - waterbox/libc/functions/stdlib/atoll.c | 27 - waterbox/libc/functions/stdlib/bsearch.c | 60 - waterbox/libc/functions/stdlib/div.c | 39 - waterbox/libc/functions/stdlib/exit.c | 44 - waterbox/libc/functions/stdlib/getenv.c | 30 - waterbox/libc/functions/stdlib/labs.c | 30 - waterbox/libc/functions/stdlib/ldiv.c | 39 - waterbox/libc/functions/stdlib/llabs.c | 30 - waterbox/libc/functions/stdlib/lldiv.c | 39 - waterbox/libc/functions/stdlib/qsort.c | 164 - waterbox/libc/functions/stdlib/quick_exit.c | 44 - waterbox/libc/functions/stdlib/rand.c | 33 - waterbox/libc/functions/stdlib/srand.c | 27 - waterbox/libc/functions/stdlib/strtol.c | 128 - waterbox/libc/functions/stdlib/strtoll.c | 122 - waterbox/libc/functions/stdlib/strtoul.c | 104 - waterbox/libc/functions/stdlib/strtoull.c | 99 - waterbox/libc/functions/stdlib/system.c | 25 - waterbox/libc/functions/string/memchr.c | 40 - waterbox/libc/functions/string/memcmp.c | 41 - waterbox/libc/functions/string/memcpy.c | 38 - waterbox/libc/functions/string/memmove.c | 50 - waterbox/libc/functions/string/memset.c | 38 - waterbox/libc/functions/string/strcat.c | 44 - waterbox/libc/functions/string/strchr.c | 38 - waterbox/libc/functions/string/strcmp.c | 39 - waterbox/libc/functions/string/strcoll.c | 41 - waterbox/libc/functions/string/strcpy.c | 35 - waterbox/libc/functions/string/strcspn.c | 48 - waterbox/libc/functions/string/strdup.c | 49 - waterbox/libc/functions/string/strerror.c | 39 - waterbox/libc/functions/string/strlcat.c | 57 - waterbox/libc/functions/string/strlcpy.c | 52 - waterbox/libc/functions/string/strlen.c | 32 - waterbox/libc/functions/string/strncat.c | 58 - waterbox/libc/functions/string/strncmp.c | 52 - waterbox/libc/functions/string/strncpy.c | 54 - waterbox/libc/functions/string/strndup.c | 63 - waterbox/libc/functions/string/strnlen.c | 36 - waterbox/libc/functions/string/strpbrk.c | 47 - waterbox/libc/functions/string/strrchr.c | 39 - waterbox/libc/functions/string/strspn.c | 47 - waterbox/libc/functions/string/strstr.c | 49 - waterbox/libc/functions/string/strtok.c | 105 - waterbox/libc/functions/string/strxfrm.c | 48 - waterbox/libc/functions/time/clock.c | 28 - waterbox/libc/functions/time/time.c | 19 - waterbox/libc/functions/time/timespec_get.c | 18 - .../libc/functions/uchar/_PDCLIB_c16slen.c | 28 - .../libc/functions/uchar/_PDCLIB_c32slen.c | 28 - .../libc/functions/uchar/_PDCLIB_c32srtombs.c | 57 - .../libc/functions/uchar/_PDCLIB_mbsrtoc32s.c | 56 - waterbox/libc/functions/uchar/c16rtomb.c | 104 - waterbox/libc/functions/uchar/c32rtomb.c | 59 - waterbox/libc/functions/uchar/mbrtoc16.c | 95 - waterbox/libc/functions/uchar/mbrtoc32.c | 72 - waterbox/libc/functions/wchar/mbrtowc.c | 92 - waterbox/libc/functions/wchar/mbsinit.c | 53 - waterbox/libc/functions/wchar/wcrtomb.c | 52 - waterbox/libc/functions/wchar/wcscat.c | 45 - waterbox/libc/functions/wchar/wcschr.c | 32 - waterbox/libc/functions/wchar/wcscmp.c | 39 - waterbox/libc/functions/wchar/wcscoll.c | 36 - waterbox/libc/functions/wchar/wcscpy.c | 33 - waterbox/libc/functions/wchar/wcscspn.c | 48 - waterbox/libc/functions/wchar/wcslen.c | 29 - waterbox/libc/functions/wchar/wcsncat.c | 60 - waterbox/libc/functions/wchar/wcsncmp.c | 52 - waterbox/libc/functions/wchar/wcsncpy.c | 43 - waterbox/libc/functions/wchar/wcspbrk.c | 47 - waterbox/libc/functions/wchar/wcsrchr.c | 33 - waterbox/libc/functions/wchar/wcsspn.c | 47 - waterbox/libc/functions/wchar/wcsstr.c | 49 - waterbox/libc/functions/wchar/wcstok.c | 113 - waterbox/libc/functions/wchar/wcsxfrm.c | 28 - waterbox/libc/functions/wchar/wmemchr.c | 39 - waterbox/libc/functions/wchar/wmemcmp.c | 39 - waterbox/libc/functions/wchar/wmemcpy.c | 39 - waterbox/libc/functions/wchar/wmemmove.c | 49 - waterbox/libc/functions/wctype/iswalnum.c | 30 - waterbox/libc/functions/wctype/iswalpha.c | 30 - waterbox/libc/functions/wctype/iswblank.c | 29 - waterbox/libc/functions/wctype/iswcntrl.c | 30 - waterbox/libc/functions/wctype/iswctype.c | 135 - waterbox/libc/functions/wctype/iswdigit.c | 52 - waterbox/libc/functions/wctype/iswgraph.c | 31 - waterbox/libc/functions/wctype/iswlower.c | 31 - waterbox/libc/functions/wctype/iswprint.c | 26 - waterbox/libc/functions/wctype/iswpunct.c | 31 - waterbox/libc/functions/wctype/iswspace.c | 28 - waterbox/libc/functions/wctype/iswupper.c | 31 - waterbox/libc/functions/wctype/iswxdigit.c | 52 - waterbox/libc/functions/wctype/towctrans.c | 42 - waterbox/libc/functions/wctype/towlower.c | 41 - waterbox/libc/functions/wctype/towupper.c | 41 - waterbox/libc/functions/wctype/wctrans.c | 38 - waterbox/libc/functions/wctype/wctype.c | 110 - waterbox/libc/includes/assert.h | 74 - waterbox/libc/includes/bits/alltypes.h | 5 - waterbox/libc/includes/bits/endian.h | 1 - waterbox/libc/includes/bits/fenv.h | 34 - waterbox/libc/includes/complex.h | 133 - waterbox/libc/includes/ctype.h | 103 - waterbox/libc/includes/endian.h | 82 - waterbox/libc/includes/errno.h | 105 - waterbox/libc/includes/features.h | 36 - waterbox/libc/includes/fenv.h | 28 - waterbox/libc/includes/float.h | 101 - waterbox/libc/includes/inttypes.h | 268 - waterbox/libc/includes/iso646.h | 24 - waterbox/libc/includes/limits.h | 39 - waterbox/libc/includes/locale.h | 147 - waterbox/libc/includes/math.h | 430 - waterbox/libc/includes/setjmp.h | 19 - waterbox/libc/includes/signal.h | 84 - waterbox/libc/includes/stdalign.h | 17 - waterbox/libc/includes/stdarg.h | 27 - waterbox/libc/includes/stdbool.h | 18 - waterbox/libc/includes/stddef.h | 41 - waterbox/libc/includes/stdint.h | 209 - waterbox/libc/includes/stdio.h | 913 - waterbox/libc/includes/stdlib.h | 351 - waterbox/libc/includes/stdnoreturn.h | 12 - waterbox/libc/includes/string.h | 216 - waterbox/libc/includes/threads.h | 116 - waterbox/libc/includes/time.h | 81 - waterbox/libc/includes/uchar.h | 68 - waterbox/libc/includes/wchar.h | 144 - waterbox/libc/includes/wctype.h | 65 - waterbox/libc/internals/_PDCLIB_aux.h | 381 - waterbox/libc/internals/_PDCLIB_clocale.h | 19 - waterbox/libc/internals/_PDCLIB_config.h | 466 - waterbox/libc/internals/_PDCLIB_encoding.h | 209 - waterbox/libc/internals/_PDCLIB_float.h | 95 - waterbox/libc/internals/_PDCLIB_glue.h | 63 - waterbox/libc/internals/_PDCLIB_int.h | 414 - waterbox/libc/internals/_PDCLIB_io.h | 296 - waterbox/libc/internals/_PDCLIB_locale.h | 193 - .../libc/internals/_PDCLIB_threadconfig.h | 28 - waterbox/libc/internals/_alias.h | 9 - 534 files changed, 319 insertions(+), 74088 deletions(-) create mode 100644 waterbox/emulibc/Makefile create mode 100644 waterbox/emulibc/emulibc.c rename waterbox/{libc/includes => emulibc}/emulibc.h (88%) delete mode 100644 waterbox/gpgx/lscript delete mode 100644 waterbox/libc/COPYING.CC0 delete mode 100644 waterbox/libc/Makefile delete mode 100644 waterbox/libc/Notes.txt delete mode 100644 waterbox/libc/UNICODE DATA LICENSE.txt delete mode 100644 waterbox/libc/compileincludes/libm.h delete mode 100644 waterbox/libc/compileincludes/readme.txt delete mode 100644 waterbox/libc/functions/_PDCLIB/Readme.txt delete mode 100644 waterbox/libc/functions/_PDCLIB/_PDCLIB_ascii.c delete mode 100644 waterbox/libc/functions/_PDCLIB/_PDCLIB_atomax.c delete mode 100644 waterbox/libc/functions/_PDCLIB/_PDCLIB_closeall.c delete mode 100644 waterbox/libc/functions/_PDCLIB/_PDCLIB_digits.c delete mode 100644 waterbox/libc/functions/_PDCLIB/_PDCLIB_fileops.c delete mode 100644 waterbox/libc/functions/_PDCLIB/_PDCLIB_initclocale.c delete mode 100644 waterbox/libc/functions/_PDCLIB/_PDCLIB_latin1.c delete mode 100644 waterbox/libc/functions/_PDCLIB/_PDCLIB_open.c delete mode 100644 waterbox/libc/functions/_PDCLIB/_PDCLIB_seed.c delete mode 100644 waterbox/libc/functions/_PDCLIB/_PDCLIB_strtox_main.c delete mode 100644 waterbox/libc/functions/_PDCLIB/_PDCLIB_strtox_prelim.c delete mode 100644 waterbox/libc/functions/_PDCLIB/_PDCLIB_utf8.c delete mode 100644 waterbox/libc/functions/_PDCLIB/assert.c delete mode 100644 waterbox/libc/functions/_PDCLIB/emulibc.c delete mode 100644 waterbox/libc/functions/_PDCLIB/rename.c delete mode 100644 waterbox/libc/functions/_PDCLIB/stdarg.c delete mode 100644 waterbox/libc/functions/_PDCLIB/stdinit.c delete mode 100644 waterbox/libc/functions/_dlmalloc/dlmalloc.c delete mode 100644 waterbox/libc/functions/_dlmalloc/dlmalloc.h delete mode 100644 waterbox/libc/functions/ctype/isalnum.c delete mode 100644 waterbox/libc/functions/ctype/isalpha.c delete mode 100644 waterbox/libc/functions/ctype/isascii.c delete mode 100644 waterbox/libc/functions/ctype/isblank.c delete mode 100644 waterbox/libc/functions/ctype/iscntrl.c delete mode 100644 waterbox/libc/functions/ctype/isdigit.c delete mode 100644 waterbox/libc/functions/ctype/isgraph.c delete mode 100644 waterbox/libc/functions/ctype/islower.c delete mode 100644 waterbox/libc/functions/ctype/isprint.c delete mode 100644 waterbox/libc/functions/ctype/ispunct.c delete mode 100644 waterbox/libc/functions/ctype/isspace.c delete mode 100644 waterbox/libc/functions/ctype/isupper.c delete mode 100644 waterbox/libc/functions/ctype/isxdigit.c delete mode 100644 waterbox/libc/functions/ctype/tolower.c delete mode 100644 waterbox/libc/functions/ctype/toupper.c delete mode 100644 waterbox/libc/functions/errno/errno.c delete mode 100644 waterbox/libc/functions/inttypes/imaxabs.c delete mode 100644 waterbox/libc/functions/inttypes/imaxdiv.c delete mode 100644 waterbox/libc/functions/inttypes/strtoimax.c delete mode 100644 waterbox/libc/functions/inttypes/strtoumax.c delete mode 100644 waterbox/libc/functions/locale/UnicodeData.py delete mode 100644 waterbox/libc/functions/locale/_PDCLIB_mb_cur_max.c delete mode 100644 waterbox/libc/functions/locale/_PDCLIB_unicodedata.c delete mode 100644 waterbox/libc/functions/locale/fakelocale.c delete mode 100644 waterbox/libc/functions/locale/freelocale.c delete mode 100644 waterbox/libc/functions/locale/localeconv.c delete mode 100644 waterbox/libc/functions/locale/setlocale.c delete mode 100644 waterbox/libc/functions/locale/uselocale.c delete mode 100644 waterbox/libc/functions/math/__cos.c delete mode 100644 waterbox/libc/functions/math/__cosdf.c delete mode 100644 waterbox/libc/functions/math/__cosl.c delete mode 100644 waterbox/libc/functions/math/__expo2.c delete mode 100644 waterbox/libc/functions/math/__expo2f.c delete mode 100644 waterbox/libc/functions/math/__fpclassify.c delete mode 100644 waterbox/libc/functions/math/__fpclassifyf.c delete mode 100644 waterbox/libc/functions/math/__fpclassifyl.c delete mode 100644 waterbox/libc/functions/math/__invtrigl.c delete mode 100644 waterbox/libc/functions/math/__invtrigl.h delete mode 100644 waterbox/libc/functions/math/__polevll.c delete mode 100644 waterbox/libc/functions/math/__rem_pio2.c delete mode 100644 waterbox/libc/functions/math/__rem_pio2_large.c delete mode 100644 waterbox/libc/functions/math/__rem_pio2f.c delete mode 100644 waterbox/libc/functions/math/__rem_pio2l.c delete mode 100644 waterbox/libc/functions/math/__signbit.c delete mode 100644 waterbox/libc/functions/math/__signbitf.c delete mode 100644 waterbox/libc/functions/math/__signbitl.c delete mode 100644 waterbox/libc/functions/math/__sin.c delete mode 100644 waterbox/libc/functions/math/__sindf.c delete mode 100644 waterbox/libc/functions/math/__sinl.c delete mode 100644 waterbox/libc/functions/math/__tan.c delete mode 100644 waterbox/libc/functions/math/__tandf.c delete mode 100644 waterbox/libc/functions/math/__tanl.c delete mode 100644 waterbox/libc/functions/math/acos.c delete mode 100644 waterbox/libc/functions/math/acosf.c delete mode 100644 waterbox/libc/functions/math/acosh.c delete mode 100644 waterbox/libc/functions/math/acoshf.c delete mode 100644 waterbox/libc/functions/math/acoshl.c delete mode 100644 waterbox/libc/functions/math/acosl.c delete mode 100644 waterbox/libc/functions/math/asin.c delete mode 100644 waterbox/libc/functions/math/asinf.c delete mode 100644 waterbox/libc/functions/math/asinh.c delete mode 100644 waterbox/libc/functions/math/asinhf.c delete mode 100644 waterbox/libc/functions/math/asinhl.c delete mode 100644 waterbox/libc/functions/math/asinl.c delete mode 100644 waterbox/libc/functions/math/atan.c delete mode 100644 waterbox/libc/functions/math/atan2.c delete mode 100644 waterbox/libc/functions/math/atan2f.c delete mode 100644 waterbox/libc/functions/math/atan2l.c delete mode 100644 waterbox/libc/functions/math/atanf.c delete mode 100644 waterbox/libc/functions/math/atanh.c delete mode 100644 waterbox/libc/functions/math/atanhf.c delete mode 100644 waterbox/libc/functions/math/atanhl.c delete mode 100644 waterbox/libc/functions/math/atanl.c delete mode 100644 waterbox/libc/functions/math/cbrt.c delete mode 100644 waterbox/libc/functions/math/cbrtf.c delete mode 100644 waterbox/libc/functions/math/cbrtl.c delete mode 100644 waterbox/libc/functions/math/ceil.c delete mode 100644 waterbox/libc/functions/math/ceilf.c delete mode 100644 waterbox/libc/functions/math/ceill.c delete mode 100644 waterbox/libc/functions/math/copysign.c delete mode 100644 waterbox/libc/functions/math/copysignf.c delete mode 100644 waterbox/libc/functions/math/copysignl.c delete mode 100644 waterbox/libc/functions/math/cos.c delete mode 100644 waterbox/libc/functions/math/cosf.c delete mode 100644 waterbox/libc/functions/math/cosh.c delete mode 100644 waterbox/libc/functions/math/coshf.c delete mode 100644 waterbox/libc/functions/math/coshl.c delete mode 100644 waterbox/libc/functions/math/cosl.c delete mode 100644 waterbox/libc/functions/math/erf.c delete mode 100644 waterbox/libc/functions/math/erff.c delete mode 100644 waterbox/libc/functions/math/erfl.c delete mode 100644 waterbox/libc/functions/math/exp.c delete mode 100644 waterbox/libc/functions/math/exp10.c delete mode 100644 waterbox/libc/functions/math/exp10f.c delete mode 100644 waterbox/libc/functions/math/exp10l.c delete mode 100644 waterbox/libc/functions/math/exp2.c delete mode 100644 waterbox/libc/functions/math/exp2f.c delete mode 100644 waterbox/libc/functions/math/exp2l.c delete mode 100644 waterbox/libc/functions/math/expf.c delete mode 100644 waterbox/libc/functions/math/expl.c delete mode 100644 waterbox/libc/functions/math/expm1.c delete mode 100644 waterbox/libc/functions/math/expm1f.c delete mode 100644 waterbox/libc/functions/math/expm1l.c delete mode 100644 waterbox/libc/functions/math/fabs.c delete mode 100644 waterbox/libc/functions/math/fabsf.c delete mode 100644 waterbox/libc/functions/math/fabsl.c delete mode 100644 waterbox/libc/functions/math/fdim.c delete mode 100644 waterbox/libc/functions/math/fdimf.c delete mode 100644 waterbox/libc/functions/math/fdiml.c delete mode 100644 waterbox/libc/functions/math/finite.c delete mode 100644 waterbox/libc/functions/math/finitef.c delete mode 100644 waterbox/libc/functions/math/floor.c delete mode 100644 waterbox/libc/functions/math/floorf.c delete mode 100644 waterbox/libc/functions/math/floorl.c delete mode 100644 waterbox/libc/functions/math/fma.c delete mode 100644 waterbox/libc/functions/math/fmaf.c delete mode 100644 waterbox/libc/functions/math/fmal.c delete mode 100644 waterbox/libc/functions/math/fmax.c delete mode 100644 waterbox/libc/functions/math/fmaxf.c delete mode 100644 waterbox/libc/functions/math/fmaxl.c delete mode 100644 waterbox/libc/functions/math/fmin.c delete mode 100644 waterbox/libc/functions/math/fminf.c delete mode 100644 waterbox/libc/functions/math/fminl.c delete mode 100644 waterbox/libc/functions/math/fmod.c delete mode 100644 waterbox/libc/functions/math/fmodf.c delete mode 100644 waterbox/libc/functions/math/fmodl.c delete mode 100644 waterbox/libc/functions/math/frexp.c delete mode 100644 waterbox/libc/functions/math/frexpf.c delete mode 100644 waterbox/libc/functions/math/frexpl.c delete mode 100644 waterbox/libc/functions/math/hypot.c delete mode 100644 waterbox/libc/functions/math/hypotf.c delete mode 100644 waterbox/libc/functions/math/hypotl.c delete mode 100644 waterbox/libc/functions/math/ilogb.c delete mode 100644 waterbox/libc/functions/math/ilogbf.c delete mode 100644 waterbox/libc/functions/math/ilogbl.c delete mode 100644 waterbox/libc/functions/math/j0.c delete mode 100644 waterbox/libc/functions/math/j0f.c delete mode 100644 waterbox/libc/functions/math/j1.c delete mode 100644 waterbox/libc/functions/math/j1f.c delete mode 100644 waterbox/libc/functions/math/jn.c delete mode 100644 waterbox/libc/functions/math/jnf.c delete mode 100644 waterbox/libc/functions/math/ldexp.c delete mode 100644 waterbox/libc/functions/math/ldexpf.c delete mode 100644 waterbox/libc/functions/math/ldexpl.c delete mode 100644 waterbox/libc/functions/math/lgamma.c delete mode 100644 waterbox/libc/functions/math/lgamma_r.c delete mode 100644 waterbox/libc/functions/math/lgammaf.c delete mode 100644 waterbox/libc/functions/math/lgammaf_r.c delete mode 100644 waterbox/libc/functions/math/lgammal.c delete mode 100644 waterbox/libc/functions/math/llrint.c delete mode 100644 waterbox/libc/functions/math/llrintf.c delete mode 100644 waterbox/libc/functions/math/llrintl.c delete mode 100644 waterbox/libc/functions/math/llround.c delete mode 100644 waterbox/libc/functions/math/llroundf.c delete mode 100644 waterbox/libc/functions/math/llroundl.c delete mode 100644 waterbox/libc/functions/math/log.c delete mode 100644 waterbox/libc/functions/math/log10.c delete mode 100644 waterbox/libc/functions/math/log10f.c delete mode 100644 waterbox/libc/functions/math/log10l.c delete mode 100644 waterbox/libc/functions/math/log1p.c delete mode 100644 waterbox/libc/functions/math/log1pf.c delete mode 100644 waterbox/libc/functions/math/log1pl.c delete mode 100644 waterbox/libc/functions/math/log2.c delete mode 100644 waterbox/libc/functions/math/log2f.c delete mode 100644 waterbox/libc/functions/math/log2l.c delete mode 100644 waterbox/libc/functions/math/logb.c delete mode 100644 waterbox/libc/functions/math/logbf.c delete mode 100644 waterbox/libc/functions/math/logbl.c delete mode 100644 waterbox/libc/functions/math/logf.c delete mode 100644 waterbox/libc/functions/math/logl.c delete mode 100644 waterbox/libc/functions/math/lrint.c delete mode 100644 waterbox/libc/functions/math/lrintf.c delete mode 100644 waterbox/libc/functions/math/lrintl.c delete mode 100644 waterbox/libc/functions/math/lround.c delete mode 100644 waterbox/libc/functions/math/lroundf.c delete mode 100644 waterbox/libc/functions/math/lroundl.c delete mode 100644 waterbox/libc/functions/math/modf.c delete mode 100644 waterbox/libc/functions/math/modff.c delete mode 100644 waterbox/libc/functions/math/modfl.c delete mode 100644 waterbox/libc/functions/math/nan.c delete mode 100644 waterbox/libc/functions/math/nanf.c delete mode 100644 waterbox/libc/functions/math/nanl.c delete mode 100644 waterbox/libc/functions/math/nearbyint.c delete mode 100644 waterbox/libc/functions/math/nearbyintf.c delete mode 100644 waterbox/libc/functions/math/nearbyintl.c delete mode 100644 waterbox/libc/functions/math/nextafter.c delete mode 100644 waterbox/libc/functions/math/nextafterf.c delete mode 100644 waterbox/libc/functions/math/nextafterl.c delete mode 100644 waterbox/libc/functions/math/nexttoward.c delete mode 100644 waterbox/libc/functions/math/nexttowardf.c delete mode 100644 waterbox/libc/functions/math/nexttowardl.c delete mode 100644 waterbox/libc/functions/math/pow.c delete mode 100644 waterbox/libc/functions/math/powf.c delete mode 100644 waterbox/libc/functions/math/powl.c delete mode 100644 waterbox/libc/functions/math/remainder.c delete mode 100644 waterbox/libc/functions/math/remainderf.c delete mode 100644 waterbox/libc/functions/math/remainderl.c delete mode 100644 waterbox/libc/functions/math/remquo.c delete mode 100644 waterbox/libc/functions/math/remquof.c delete mode 100644 waterbox/libc/functions/math/remquol.c delete mode 100644 waterbox/libc/functions/math/rint.c delete mode 100644 waterbox/libc/functions/math/rintf.c delete mode 100644 waterbox/libc/functions/math/rintl.c delete mode 100644 waterbox/libc/functions/math/round.c delete mode 100644 waterbox/libc/functions/math/roundf.c delete mode 100644 waterbox/libc/functions/math/roundl.c delete mode 100644 waterbox/libc/functions/math/scalb.c delete mode 100644 waterbox/libc/functions/math/scalbf.c delete mode 100644 waterbox/libc/functions/math/scalbln.c delete mode 100644 waterbox/libc/functions/math/scalblnf.c delete mode 100644 waterbox/libc/functions/math/scalblnl.c delete mode 100644 waterbox/libc/functions/math/scalbn.c delete mode 100644 waterbox/libc/functions/math/scalbnf.c delete mode 100644 waterbox/libc/functions/math/scalbnl.c delete mode 100644 waterbox/libc/functions/math/signgam.c delete mode 100644 waterbox/libc/functions/math/significand.c delete mode 100644 waterbox/libc/functions/math/significandf.c delete mode 100644 waterbox/libc/functions/math/sin.c delete mode 100644 waterbox/libc/functions/math/sincos.c delete mode 100644 waterbox/libc/functions/math/sincosf.c delete mode 100644 waterbox/libc/functions/math/sincosl.c delete mode 100644 waterbox/libc/functions/math/sinf.c delete mode 100644 waterbox/libc/functions/math/sinh.c delete mode 100644 waterbox/libc/functions/math/sinhf.c delete mode 100644 waterbox/libc/functions/math/sinhl.c delete mode 100644 waterbox/libc/functions/math/sinl.c delete mode 100644 waterbox/libc/functions/math/sqrt.c delete mode 100644 waterbox/libc/functions/math/sqrtf.c delete mode 100644 waterbox/libc/functions/math/sqrtl.c delete mode 100644 waterbox/libc/functions/math/tan.c delete mode 100644 waterbox/libc/functions/math/tanf.c delete mode 100644 waterbox/libc/functions/math/tanh.c delete mode 100644 waterbox/libc/functions/math/tanhf.c delete mode 100644 waterbox/libc/functions/math/tanhl.c delete mode 100644 waterbox/libc/functions/math/tanl.c delete mode 100644 waterbox/libc/functions/math/tgamma.c delete mode 100644 waterbox/libc/functions/math/tgammaf.c delete mode 100644 waterbox/libc/functions/math/tgammal.c delete mode 100644 waterbox/libc/functions/math/trunc.c delete mode 100644 waterbox/libc/functions/math/truncf.c delete mode 100644 waterbox/libc/functions/math/truncl.c delete mode 100644 waterbox/libc/functions/math/x86_64/__invtrigl.s delete mode 100644 waterbox/libc/functions/math/x86_64/acosl.s delete mode 100644 waterbox/libc/functions/math/x86_64/asinl.s delete mode 100644 waterbox/libc/functions/math/x86_64/atan2l.s delete mode 100644 waterbox/libc/functions/math/x86_64/atanl.s delete mode 100644 waterbox/libc/functions/math/x86_64/ceill.s delete mode 100644 waterbox/libc/functions/math/x86_64/exp2l.s delete mode 100644 waterbox/libc/functions/math/x86_64/expl.s delete mode 100644 waterbox/libc/functions/math/x86_64/expm1l.s delete mode 100644 waterbox/libc/functions/math/x86_64/fabs.s delete mode 100644 waterbox/libc/functions/math/x86_64/fabsf.s delete mode 100644 waterbox/libc/functions/math/x86_64/fabsl.s delete mode 100644 waterbox/libc/functions/math/x86_64/floorl.s delete mode 100644 waterbox/libc/functions/math/x86_64/fmodl.s delete mode 100644 waterbox/libc/functions/math/x86_64/llrint.s delete mode 100644 waterbox/libc/functions/math/x86_64/llrintf.s delete mode 100644 waterbox/libc/functions/math/x86_64/llrintl.s delete mode 100644 waterbox/libc/functions/math/x86_64/log10l.s delete mode 100644 waterbox/libc/functions/math/x86_64/log1pl.s delete mode 100644 waterbox/libc/functions/math/x86_64/log2l.s delete mode 100644 waterbox/libc/functions/math/x86_64/logl.s delete mode 100644 waterbox/libc/functions/math/x86_64/lrint.s delete mode 100644 waterbox/libc/functions/math/x86_64/lrintf.s delete mode 100644 waterbox/libc/functions/math/x86_64/lrintl.s delete mode 100644 waterbox/libc/functions/math/x86_64/remainderl.s delete mode 100644 waterbox/libc/functions/math/x86_64/rintl.s delete mode 100644 waterbox/libc/functions/math/x86_64/sqrt.s delete mode 100644 waterbox/libc/functions/math/x86_64/sqrtf.s delete mode 100644 waterbox/libc/functions/math/x86_64/sqrtl.s delete mode 100644 waterbox/libc/functions/math/x86_64/truncl.s delete mode 100644 waterbox/libc/functions/nothread/call_once.c delete mode 100644 waterbox/libc/functions/nothread/cnd_init.c delete mode 100644 waterbox/libc/functions/nothread/cnd_signal.c delete mode 100644 waterbox/libc/functions/nothread/cnd_wait.c delete mode 100644 waterbox/libc/functions/nothread/mtx_destroy.c delete mode 100644 waterbox/libc/functions/nothread/mtx_init.c delete mode 100644 waterbox/libc/functions/nothread/mtx_lock.c delete mode 100644 waterbox/libc/functions/nothread/mtx_timedlock.c delete mode 100644 waterbox/libc/functions/nothread/mtx_trylock.c delete mode 100644 waterbox/libc/functions/nothread/mtx_unlock.c delete mode 100644 waterbox/libc/functions/nothread/thrd_yield.c delete mode 100644 waterbox/libc/functions/nothread/tss_create.c delete mode 100644 waterbox/libc/functions/nothread/tss_delete.c delete mode 100644 waterbox/libc/functions/nothread/tss_get.c delete mode 100644 waterbox/libc/functions/nothread/tss_set.c delete mode 100644 waterbox/libc/functions/setjmp/setjmp.s delete mode 100644 waterbox/libc/functions/signal/raise.c delete mode 100644 waterbox/libc/functions/signal/signal.c delete mode 100644 waterbox/libc/functions/stdio/_PDCLIB_filemode.c delete mode 100644 waterbox/libc/functions/stdio/_PDCLIB_fillbuffer.c delete mode 100644 waterbox/libc/functions/stdio/_PDCLIB_flushbuffer.c delete mode 100644 waterbox/libc/functions/stdio/_PDCLIB_ftell64.c delete mode 100644 waterbox/libc/functions/stdio/_PDCLIB_fvopen.c delete mode 100644 waterbox/libc/functions/stdio/_PDCLIB_prepread.c delete mode 100644 waterbox/libc/functions/stdio/_PDCLIB_prepwrite.c delete mode 100644 waterbox/libc/functions/stdio/_PDCLIB_print.c delete mode 100644 waterbox/libc/functions/stdio/_PDCLIB_scan.c delete mode 100644 waterbox/libc/functions/stdio/_PDCLIB_seek.c delete mode 100644 waterbox/libc/functions/stdio/_cbprintf.c delete mode 100644 waterbox/libc/functions/stdio/_vcbprintf.c delete mode 100644 waterbox/libc/functions/stdio/clearerr.c delete mode 100644 waterbox/libc/functions/stdio/fclose.c delete mode 100644 waterbox/libc/functions/stdio/feof.c delete mode 100644 waterbox/libc/functions/stdio/ferror.c delete mode 100644 waterbox/libc/functions/stdio/fflush.c delete mode 100644 waterbox/libc/functions/stdio/fgetc.c delete mode 100644 waterbox/libc/functions/stdio/fgetpos.c delete mode 100644 waterbox/libc/functions/stdio/fgets.c delete mode 100644 waterbox/libc/functions/stdio/flockfile.c delete mode 100644 waterbox/libc/functions/stdio/fopen.c delete mode 100644 waterbox/libc/functions/stdio/fprintf.c delete mode 100644 waterbox/libc/functions/stdio/fputc.c delete mode 100644 waterbox/libc/functions/stdio/fputs.c delete mode 100644 waterbox/libc/functions/stdio/fread.c delete mode 100644 waterbox/libc/functions/stdio/freopen.c delete mode 100644 waterbox/libc/functions/stdio/fscanf.c delete mode 100644 waterbox/libc/functions/stdio/fseek.c delete mode 100644 waterbox/libc/functions/stdio/fsetpos.c delete mode 100644 waterbox/libc/functions/stdio/ftell.c delete mode 100644 waterbox/libc/functions/stdio/ftrylockfile.c delete mode 100644 waterbox/libc/functions/stdio/funlockfile.c delete mode 100644 waterbox/libc/functions/stdio/fwrite.c delete mode 100644 waterbox/libc/functions/stdio/getc.c delete mode 100644 waterbox/libc/functions/stdio/getchar.c delete mode 100644 waterbox/libc/functions/stdio/gets.c delete mode 100644 waterbox/libc/functions/stdio/perror.c delete mode 100644 waterbox/libc/functions/stdio/printf.c delete mode 100644 waterbox/libc/functions/stdio/putc.c delete mode 100644 waterbox/libc/functions/stdio/putchar.c delete mode 100644 waterbox/libc/functions/stdio/puts.c delete mode 100644 waterbox/libc/functions/stdio/remove.c delete mode 100644 waterbox/libc/functions/stdio/rename.c delete mode 100644 waterbox/libc/functions/stdio/rewind.c delete mode 100644 waterbox/libc/functions/stdio/scanf.c delete mode 100644 waterbox/libc/functions/stdio/setbuf.c delete mode 100644 waterbox/libc/functions/stdio/setvbuf.c delete mode 100644 waterbox/libc/functions/stdio/snprintf.c delete mode 100644 waterbox/libc/functions/stdio/sprintf.c delete mode 100644 waterbox/libc/functions/stdio/sscanf.c delete mode 100644 waterbox/libc/functions/stdio/testfile.txt delete mode 100644 waterbox/libc/functions/stdio/tmpfile.c delete mode 100644 waterbox/libc/functions/stdio/tmpnam.c delete mode 100644 waterbox/libc/functions/stdio/ungetc.c delete mode 100644 waterbox/libc/functions/stdio/vasprintf.c delete mode 100644 waterbox/libc/functions/stdio/vfprintf.c delete mode 100644 waterbox/libc/functions/stdio/vfscanf.c delete mode 100644 waterbox/libc/functions/stdio/vprintf.c delete mode 100644 waterbox/libc/functions/stdio/vscanf.c delete mode 100644 waterbox/libc/functions/stdio/vsnprintf.c delete mode 100644 waterbox/libc/functions/stdio/vsprintf.c delete mode 100644 waterbox/libc/functions/stdio/vsscanf.c delete mode 100644 waterbox/libc/functions/stdlib/_Exit.c delete mode 100644 waterbox/libc/functions/stdlib/abort.c delete mode 100644 waterbox/libc/functions/stdlib/abs.c delete mode 100644 waterbox/libc/functions/stdlib/at_quick_exit.c delete mode 100644 waterbox/libc/functions/stdlib/atexit.c delete mode 100644 waterbox/libc/functions/stdlib/atoi.c delete mode 100644 waterbox/libc/functions/stdlib/atol.c delete mode 100644 waterbox/libc/functions/stdlib/atoll.c delete mode 100644 waterbox/libc/functions/stdlib/bsearch.c delete mode 100644 waterbox/libc/functions/stdlib/div.c delete mode 100644 waterbox/libc/functions/stdlib/exit.c delete mode 100644 waterbox/libc/functions/stdlib/getenv.c delete mode 100644 waterbox/libc/functions/stdlib/labs.c delete mode 100644 waterbox/libc/functions/stdlib/ldiv.c delete mode 100644 waterbox/libc/functions/stdlib/llabs.c delete mode 100644 waterbox/libc/functions/stdlib/lldiv.c delete mode 100644 waterbox/libc/functions/stdlib/qsort.c delete mode 100644 waterbox/libc/functions/stdlib/quick_exit.c delete mode 100644 waterbox/libc/functions/stdlib/rand.c delete mode 100644 waterbox/libc/functions/stdlib/srand.c delete mode 100644 waterbox/libc/functions/stdlib/strtol.c delete mode 100644 waterbox/libc/functions/stdlib/strtoll.c delete mode 100644 waterbox/libc/functions/stdlib/strtoul.c delete mode 100644 waterbox/libc/functions/stdlib/strtoull.c delete mode 100644 waterbox/libc/functions/stdlib/system.c delete mode 100644 waterbox/libc/functions/string/memchr.c delete mode 100644 waterbox/libc/functions/string/memcmp.c delete mode 100644 waterbox/libc/functions/string/memcpy.c delete mode 100644 waterbox/libc/functions/string/memmove.c delete mode 100644 waterbox/libc/functions/string/memset.c delete mode 100644 waterbox/libc/functions/string/strcat.c delete mode 100644 waterbox/libc/functions/string/strchr.c delete mode 100644 waterbox/libc/functions/string/strcmp.c delete mode 100644 waterbox/libc/functions/string/strcoll.c delete mode 100644 waterbox/libc/functions/string/strcpy.c delete mode 100644 waterbox/libc/functions/string/strcspn.c delete mode 100644 waterbox/libc/functions/string/strdup.c delete mode 100644 waterbox/libc/functions/string/strerror.c delete mode 100644 waterbox/libc/functions/string/strlcat.c delete mode 100644 waterbox/libc/functions/string/strlcpy.c delete mode 100644 waterbox/libc/functions/string/strlen.c delete mode 100644 waterbox/libc/functions/string/strncat.c delete mode 100644 waterbox/libc/functions/string/strncmp.c delete mode 100644 waterbox/libc/functions/string/strncpy.c delete mode 100644 waterbox/libc/functions/string/strndup.c delete mode 100644 waterbox/libc/functions/string/strnlen.c delete mode 100644 waterbox/libc/functions/string/strpbrk.c delete mode 100644 waterbox/libc/functions/string/strrchr.c delete mode 100644 waterbox/libc/functions/string/strspn.c delete mode 100644 waterbox/libc/functions/string/strstr.c delete mode 100644 waterbox/libc/functions/string/strtok.c delete mode 100644 waterbox/libc/functions/string/strxfrm.c delete mode 100644 waterbox/libc/functions/time/clock.c delete mode 100644 waterbox/libc/functions/time/time.c delete mode 100644 waterbox/libc/functions/time/timespec_get.c delete mode 100644 waterbox/libc/functions/uchar/_PDCLIB_c16slen.c delete mode 100644 waterbox/libc/functions/uchar/_PDCLIB_c32slen.c delete mode 100644 waterbox/libc/functions/uchar/_PDCLIB_c32srtombs.c delete mode 100644 waterbox/libc/functions/uchar/_PDCLIB_mbsrtoc32s.c delete mode 100644 waterbox/libc/functions/uchar/c16rtomb.c delete mode 100644 waterbox/libc/functions/uchar/c32rtomb.c delete mode 100644 waterbox/libc/functions/uchar/mbrtoc16.c delete mode 100644 waterbox/libc/functions/uchar/mbrtoc32.c delete mode 100644 waterbox/libc/functions/wchar/mbrtowc.c delete mode 100644 waterbox/libc/functions/wchar/mbsinit.c delete mode 100644 waterbox/libc/functions/wchar/wcrtomb.c delete mode 100644 waterbox/libc/functions/wchar/wcscat.c delete mode 100644 waterbox/libc/functions/wchar/wcschr.c delete mode 100644 waterbox/libc/functions/wchar/wcscmp.c delete mode 100644 waterbox/libc/functions/wchar/wcscoll.c delete mode 100644 waterbox/libc/functions/wchar/wcscpy.c delete mode 100644 waterbox/libc/functions/wchar/wcscspn.c delete mode 100644 waterbox/libc/functions/wchar/wcslen.c delete mode 100644 waterbox/libc/functions/wchar/wcsncat.c delete mode 100644 waterbox/libc/functions/wchar/wcsncmp.c delete mode 100644 waterbox/libc/functions/wchar/wcsncpy.c delete mode 100644 waterbox/libc/functions/wchar/wcspbrk.c delete mode 100644 waterbox/libc/functions/wchar/wcsrchr.c delete mode 100644 waterbox/libc/functions/wchar/wcsspn.c delete mode 100644 waterbox/libc/functions/wchar/wcsstr.c delete mode 100644 waterbox/libc/functions/wchar/wcstok.c delete mode 100644 waterbox/libc/functions/wchar/wcsxfrm.c delete mode 100644 waterbox/libc/functions/wchar/wmemchr.c delete mode 100644 waterbox/libc/functions/wchar/wmemcmp.c delete mode 100644 waterbox/libc/functions/wchar/wmemcpy.c delete mode 100644 waterbox/libc/functions/wchar/wmemmove.c delete mode 100644 waterbox/libc/functions/wctype/iswalnum.c delete mode 100644 waterbox/libc/functions/wctype/iswalpha.c delete mode 100644 waterbox/libc/functions/wctype/iswblank.c delete mode 100644 waterbox/libc/functions/wctype/iswcntrl.c delete mode 100644 waterbox/libc/functions/wctype/iswctype.c delete mode 100644 waterbox/libc/functions/wctype/iswdigit.c delete mode 100644 waterbox/libc/functions/wctype/iswgraph.c delete mode 100644 waterbox/libc/functions/wctype/iswlower.c delete mode 100644 waterbox/libc/functions/wctype/iswprint.c delete mode 100644 waterbox/libc/functions/wctype/iswpunct.c delete mode 100644 waterbox/libc/functions/wctype/iswspace.c delete mode 100644 waterbox/libc/functions/wctype/iswupper.c delete mode 100644 waterbox/libc/functions/wctype/iswxdigit.c delete mode 100644 waterbox/libc/functions/wctype/towctrans.c delete mode 100644 waterbox/libc/functions/wctype/towlower.c delete mode 100644 waterbox/libc/functions/wctype/towupper.c delete mode 100644 waterbox/libc/functions/wctype/wctrans.c delete mode 100644 waterbox/libc/functions/wctype/wctype.c delete mode 100644 waterbox/libc/includes/assert.h delete mode 100644 waterbox/libc/includes/bits/alltypes.h delete mode 100644 waterbox/libc/includes/bits/endian.h delete mode 100644 waterbox/libc/includes/bits/fenv.h delete mode 100644 waterbox/libc/includes/complex.h delete mode 100644 waterbox/libc/includes/ctype.h delete mode 100644 waterbox/libc/includes/endian.h delete mode 100644 waterbox/libc/includes/errno.h delete mode 100644 waterbox/libc/includes/features.h delete mode 100644 waterbox/libc/includes/fenv.h delete mode 100644 waterbox/libc/includes/float.h delete mode 100644 waterbox/libc/includes/inttypes.h delete mode 100644 waterbox/libc/includes/iso646.h delete mode 100644 waterbox/libc/includes/limits.h delete mode 100644 waterbox/libc/includes/locale.h delete mode 100644 waterbox/libc/includes/math.h delete mode 100644 waterbox/libc/includes/setjmp.h delete mode 100644 waterbox/libc/includes/signal.h delete mode 100644 waterbox/libc/includes/stdalign.h delete mode 100644 waterbox/libc/includes/stdarg.h delete mode 100644 waterbox/libc/includes/stdbool.h delete mode 100644 waterbox/libc/includes/stddef.h delete mode 100644 waterbox/libc/includes/stdint.h delete mode 100644 waterbox/libc/includes/stdio.h delete mode 100644 waterbox/libc/includes/stdlib.h delete mode 100644 waterbox/libc/includes/stdnoreturn.h delete mode 100644 waterbox/libc/includes/string.h delete mode 100644 waterbox/libc/includes/threads.h delete mode 100644 waterbox/libc/includes/time.h delete mode 100644 waterbox/libc/includes/uchar.h delete mode 100644 waterbox/libc/includes/wchar.h delete mode 100644 waterbox/libc/includes/wctype.h delete mode 100644 waterbox/libc/internals/_PDCLIB_aux.h delete mode 100644 waterbox/libc/internals/_PDCLIB_clocale.h delete mode 100644 waterbox/libc/internals/_PDCLIB_config.h delete mode 100644 waterbox/libc/internals/_PDCLIB_encoding.h delete mode 100644 waterbox/libc/internals/_PDCLIB_float.h delete mode 100644 waterbox/libc/internals/_PDCLIB_glue.h delete mode 100644 waterbox/libc/internals/_PDCLIB_int.h delete mode 100644 waterbox/libc/internals/_PDCLIB_io.h delete mode 100644 waterbox/libc/internals/_PDCLIB_locale.h delete mode 100644 waterbox/libc/internals/_PDCLIB_threadconfig.h delete mode 100644 waterbox/libc/internals/_alias.h diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.cs b/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.cs index 6707e53448..7b55ea8200 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.cs @@ -42,7 +42,8 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx64 try { - Elf = new ElfRunner(Path.Combine(comm.CoreFileProvider.DllPath(), "gpgx.elf"), 8 * 1024 * 1024, 36 * 1024 * 1024, 4 * 1024 * 1024); + Elf = new PeRunner(comm.CoreFileProvider.DllPath(), "gpgx.exe", 8 * 1024 * 1024, 36 * 1024 * 1024, 4 * 1024 * 1024); + if (Elf.ShouldMonitor) Core = BizInvoker.GetInvoker(Elf, Elf); else @@ -152,7 +153,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx64 } LibGPGX Core; - ElfRunner Elf; + PeRunner Elf; DiscSystem.Disc CD; DiscSystem.DiscSectorReader DiscSectorReader; diff --git a/BizHawk.Emulation.Cores/Waterbox/PeRunner.cs b/BizHawk.Emulation.Cores/Waterbox/PeRunner.cs index 2e67aa8dd4..8dbab64546 100644 --- a/BizHawk.Emulation.Cores/Waterbox/PeRunner.cs +++ b/BizHawk.Emulation.Cores/Waterbox/PeRunner.cs @@ -1,4 +1,5 @@ using BizHawk.Common; +using BizHawk.Common.BizInvoke; using BizHawk.Emulation.Common; using PeNet; using System; @@ -12,7 +13,10 @@ namespace BizHawk.Emulation.Cores.Waterbox { public class PeRunner : Swappable, IImportResolver, IBinaryStateable { - public class PeWrapper : IImportResolver, IBinaryStateable, IDisposable + /// + /// manages one PE file within the the set of loaded PE files + /// + private class PeWrapper : IImportResolver, IBinaryStateable, IDisposable { public Dictionary ExportsByOrdinal { get; } = new Dictionary(); /// @@ -37,6 +41,22 @@ namespace BizHawk.Emulation.Cores.Waterbox public IntPtr EntryPoint { get; private set; } + [UnmanagedFunctionPointer(CallingConvention.Winapi)] + private delegate bool DllEntry(IntPtr instance, int reason, IntPtr reserved); + [UnmanagedFunctionPointer(CallingConvention.Winapi)] + private delegate void ExeEntry(); + + public bool RunDllEntry() + { + var entryThunk = (DllEntry)Marshal.GetDelegateForFunctionPointer(EntryPoint, typeof(DllEntry)); + return entryThunk(Z.US(Start), 1, IntPtr.Zero); // DLL_PROCESS_ATTACH + } + public void RunExeEntry() + { + var entryThunk = (ExeEntry)Marshal.GetDelegateForFunctionPointer(EntryPoint, typeof(ExeEntry)); + entryThunk(); + } + public PeWrapper(string moduleName, byte[] fileData) { ModuleName = moduleName; @@ -89,22 +109,20 @@ namespace BizHawk.Emulation.Cores.Waterbox LoadOffset = (long)Start - (long)_pe.ImageNtHeaders.OptionalHeader.ImageBase; Memory = new MemoryBlock(Start, Size); Memory.Activate(); + Memory.Protect(Start, Size, MemoryBlock.Protection.RW); // copy headers - { - ulong length = _pe.ImageNtHeaders.OptionalHeader.SizeOfHeaders; - Memory.Protect(Start, length, MemoryBlock.Protection.RW); - Marshal.Copy(_fileData, 0, Z.US(Start), (int)length); - } + Marshal.Copy(_fileData, 0, Z.US(Start), (int)_pe.ImageNtHeaders.OptionalHeader.SizeOfHeaders); // copy sections foreach (var s in _pe.ImageSectionHeaders) { ulong start = Start + s.VirtualAddress; ulong length = s.VirtualSize; + ulong datalength = Math.Min(s.VirtualSize, s.SizeOfRawData); - Marshal.Copy(_fileData, (int)s.PointerToRawData, Z.US(start), (int)s.SizeOfRawData); - WaterboxUtils.ZeroMemory(Z.US(start + s.SizeOfRawData), (long)(length - s.SizeOfRawData)); + Marshal.Copy(_fileData, (int)s.PointerToRawData, Z.US(start), (int)datalength); + WaterboxUtils.ZeroMemory(Z.US(start + datalength), (long)(length - datalength)); } // apply relocations @@ -161,7 +179,7 @@ namespace BizHawk.Emulation.Cores.Waterbox module = new Dictionary(); ImportsByModule.Add(import.DLL, module); } - module.Add(import.Name, Z.US(import.Thunk)); + module.Add(import.Name, Z.US(Start + import.Thunk)); } } @@ -249,6 +267,186 @@ namespace BizHawk.Emulation.Cores.Waterbox } } + /// + /// serves as a standin for libpsxscl.so + /// + private class Psx + { + private readonly PeRunner _parent; + private readonly List _traps = new List(); + + public Psx(PeRunner parent) + { + _parent = parent; + } + + [StructLayout(LayoutKind.Sequential)] + public struct PsxContext + { + public int Size; + public int Options; + public IntPtr SyscallVtable; + public IntPtr LdsoVtable; + public IntPtr PsxVtable; + public uint SysIdx; + public uint LibcIdx; + public IntPtr PthreadSurrogate; + public IntPtr PthreadCreate; + public IntPtr DoGlobalCtors; + public IntPtr DoGlobalDtors; + } + + private IntPtr CreateVtable(string moduleName, ICollection entries) + { + var imports = _parent._exports[moduleName]; + var ret = Z.US(_parent._sealedheap.Allocate((ulong)(entries.Count * IntPtr.Size), 16)); + var pointers = entries.Select(e => + { + var ptr = imports.Resolve(e); + if (ptr == IntPtr.Zero) + { + var s = string.Format("Trapped on unimplemented function {0}:{1}", moduleName, e); + Action del = () => { throw new InvalidOperationException(e); }; + _traps.Add(del); + ptr = Marshal.GetFunctionPointerForDelegate(del); + } + return ptr; + }).ToArray(); + Marshal.Copy(pointers, 0, ret, pointers.Length); + return ret; + } + + [BizExport(CallingConvention.Cdecl, EntryPoint = "__psx_init")] + public int PsxInit(ref int argc, ref IntPtr argv, ref IntPtr envp, [In, Out]ref PsxContext context) + { + { + // argc = 1, argv = ["foobar, NULL], envp = [NULL] + argc = 1; + var argArea = _parent._sealedheap.Allocate(32, 16); + argv = Z.US(argArea); + envp = Z.US(argArea + (uint)IntPtr.Size * 2); + Marshal.WriteIntPtr(Z.US(argArea), Z.US(argArea + 24)); + Marshal.WriteInt64(Z.US(argArea + 24), 0x7261626f6f66); + } + + context.SyscallVtable = CreateVtable("__syscalls", Enumerable.Range(0, 340).Select(i => "n" + i).ToList()); + context.LdsoVtable = CreateVtable("__syscalls", new[] // ldso + { + "dladdr", "dlinfo", "dlsym", "dlopen", "dlclose", "dlerror", "reset_tls" + }); + context.PsxVtable = CreateVtable("__syscalls", new[] // psx + { + "start_main", "convert_thread", "unmapself", "log_output" + }); + var extraTable = CreateVtable("__syscalls", new[] + { + "pthread_surrogate", "pthread_create", "do_global_ctors", "do_global_dtors" + }); + { + var tmp = new IntPtr[4]; + Marshal.Copy(extraTable, tmp, 0, 4); + context.PthreadSurrogate = tmp[0]; + context.PthreadCreate = tmp[1]; + context.DoGlobalCtors = tmp[2]; + context.DoGlobalDtors = tmp[3]; + } + + return 1; + } + } + + /// + /// special emulator-functions + /// + private class Emu + { + private readonly PeRunner _parent; + public Emu(PeRunner parent) + { + _parent = parent; + } + + public class EndOfMainException: Exception + { + } + + [BizExport(CallingConvention.Cdecl, EntryPoint = "alloc_sealed")] + public IntPtr AllocSealed(UIntPtr size) + { + return Z.US(_parent._sealedheap.Allocate((ulong)size, 16)); + } + + [BizExport(CallingConvention.Cdecl, EntryPoint = "alloc_invisible")] + public IntPtr AllocInvisible(UIntPtr size) + { + return Z.US(_parent._invisibleheap.Allocate((ulong)size, 16)); + } + + [BizExport(CallingConvention.Cdecl, EntryPoint = "_debug_puts")] + public void DebugPuts(IntPtr s) + { + Console.WriteLine("_debug_puts:" + Marshal.PtrToStringAnsi(s)); + } + + [BizExport(CallingConvention.Cdecl, EntryPoint = "_leave_main")] + public void LeaveMain() + { + throw new EndOfMainException(); + } + } + + /// + /// syscall emulation layer, as well as a bit of other stuff + /// + private class Syscalls + { + private readonly PeRunner _parent; + public Syscalls(PeRunner parent) + { + _parent = parent; + } + + [BizExport(CallingConvention.Cdecl, EntryPoint = "log_output")] + public void DebugPuts(IntPtr s) + { + Console.WriteLine("_psx_log_output:" + Marshal.PtrToStringAnsi(s)); + } + + [BizExport(CallingConvention.Cdecl, EntryPoint = "n12")] + public UIntPtr Brk(UIntPtr _p) + { + // does MUSL use this? + var heap = _parent._heap; + + var start = heap.Memory.Start; + var end = start + heap.Used; + var max = heap.Memory.End; + + var p = (ulong)_p; + + if (p < start || p > max) + { + // failure: return current break + return Z.UU(end); + } + else if (p > end) + { + // increase size of heap + heap.Allocate(p - end, 1); + return Z.UU(p); + } + else if (p < end) + { + throw new InvalidOperationException("We don't support shrinking heaps"); + } + else + { + // no change + return Z.UU(end); + } + } + } + // usual starting address for the executable private static readonly ulong CanonicalStart = 0x0000036f00000000; @@ -282,26 +480,52 @@ namespace BizHawk.Emulation.Cores.Waterbox /// private Heap _invisibleheap; + /// + /// all loaded PE files + /// private readonly List _modules = new List(); + /// + /// anything at all that needs to be disposed on finish + /// private readonly List _disposeList = new List(); + /// + /// anything at all that needs its state saved and loaded + /// private readonly List _savestateComponents = new List(); + /// + /// all of the exports, including real PeWrapper ones and fake ones + /// + private readonly Dictionary _exports = new Dictionary(); + + private Psx _psx; + private Emu _emu; + private Syscalls _syscalls; + public PeRunner(string directory, string filename, ulong heapsize, ulong sealedheapsize, ulong invisibleheapsize) { + Initialize(_nextStart); Enter(); try { + // load any predefined exports + _psx = new Psx(this); + _exports.Add("libpsxscl.so", BizExvoker.GetExvoker(_psx)); + _emu = new Emu(this); + _exports.Add("libemuhost.so", BizExvoker.GetExvoker(_emu)); + _syscalls = new Syscalls(this); + _exports.Add("__syscalls", BizExvoker.GetExvoker(_syscalls)); + // load and connect all modules, starting with the executable var todoModules = new Queue(); todoModules.Enqueue(filename); - var loadedModules = new Dictionary(); while (todoModules.Count > 0) { var moduleName = todoModules.Dequeue(); - if (!loadedModules.ContainsKey(moduleName)) + if (!_exports.ContainsKey(moduleName)) { var module = new PeWrapper(moduleName, File.ReadAllBytes(Path.Combine(directory, moduleName))); module.Mount(_nextStart); @@ -310,7 +534,7 @@ namespace BizHawk.Emulation.Cores.Waterbox _savestateComponents.Add(module); _disposeList.Add(module); - loadedModules.Add(moduleName, module); + _exports.Add(moduleName, module); _modules.Add(module); foreach (var name in module.ImportsByModule.Keys) { @@ -323,7 +547,7 @@ namespace BizHawk.Emulation.Cores.Waterbox { foreach (var name in module.ImportsByModule.Keys) { - module.ConnectImports(name, loadedModules[name]); + module.ConnectImports(name, _exports[name]); } } foreach (var module in _modules) @@ -352,6 +576,19 @@ namespace BizHawk.Emulation.Cores.Waterbox AddMemoryBlock(_invisibleheap.Memory); _savestateComponents.Add(_invisibleheap); _disposeList.Add(_invisibleheap); + + try + { + _modules[0].RunExeEntry(); + throw new InvalidOperationException("main() returned!"); + } + catch (Emu.EndOfMainException) + { } + foreach (var m in _modules.Skip(1)) + { + if (!m.RunDllEntry()) + throw new InvalidOperationException("DllMain() returned false"); + } } catch { @@ -370,6 +607,14 @@ namespace BizHawk.Emulation.Cores.Waterbox return _modules[0].Resolve(entryPoint); } + public void Seal() + { + using (this.EnterExit()) + { + _sealedheap.Seal(); + } + } + public void SaveStateBinary(BinaryWriter bw) { using (this.EnterExit()) @@ -406,6 +651,7 @@ namespace BizHawk.Emulation.Cores.Waterbox _disposeList.Clear(); PurgeMemoryBlocks(); _modules.Clear(); + _exports.Clear(); _heap = null; _sealedheap = null; _invisibleheap = null; diff --git a/References/PeNet.dll b/References/PeNet.dll index f4657450e719ee73ba0e1f900534588b0cb5bca0..ec0f2dd6a40023839de267169587adb2c9643037 100644 GIT binary patch delta 20264 zcmZ{s30PFs`}ohfGjr$8fC4j@MG;wDSO!5+L{JggL=;d2Ox%*nH8ssN$1bFqrn!yV zw=giY%-yuKveY!ozE+l&mR4xyo=f?4OY{G}?>*e)`9Hs&rw`|I-m~9x?!5z3m0PWq zTdj-cm_oLOEuI&`*Drpjl$UupZ(|AjgR>T%a4F6+khkGmJyl$5HvcMT_)jkUD=`bZ zvXQZ*bk6vS)!*>s?S<0hP(H=;S$G9Ed14~E@J~HYMC5gdo95@`=WTtg%-Phh$@n)U zCM!dg4lQKWPZ4e#`mJBnNrM=Z$M0gy9^2J(KcYkAzZrhsfn`qb&J_Fd(&A_F zGcOp`{m<=Xkug)WLZ5IpHpb5q&bDWkLi**RA*OIv(Pyv^XP3H;09JK<3ixXGF~CV_ zhdzMWw-f2p1K%#p!;&*Pie0M3%b_;-%ed)^a#Bq zfS6L&L10GeCSa%3cY))&>;#@o-3<(E{v!`(r7gl>i1p3)c@ke66S@y-9cqp_ICRcJ z(+)t%S=|l+i@Sa8`RKI}ZG~4!Wm>zVJ|&f16OQ`G@>VD2#77*5oSAXR!~kS?7vzcJ z<3^b^?M^}t_eRbLMEj@NnE0!a^Ip_%kmFT~ENq2L3j0liAHJ^Nj6#_M z&O^@giOAMr$TuUA2aA!fQT_}{-$=on&ZWrF@klxLywT3dHkTpigLapFWY)AW%p$WR zYKuuYlIq207Knh6!gEqw$*P ze7}_sL_ek+V^euHRR_if$(%hE>?JqUolKi;AzbG~mS$3Y6PZ6SoMq*Nc&=3k4hr+- z>@#O;U{NOWlPqM@aO9kPWC1ZJrL`DOYZjFf>)V=XDG5f-gwj%<)~r0MBa}}FNd@)~ zN%st26{2N9+L7NInBTP+c(l_%sD(!$oW+N(@Z#)?f~~f2wvP6oeprrm9s(sdcNqaZ z)@3A=ugn<-oIspk5C*&Qi-Kn$=So{#6AtUZnYjql3sR;-K99ir= zaUjPkNFPdP$(6pie_w)}&JlBft{9|)I3Wbn52KMC5|B1x5k(XGVb1fdk(up~!2^+> z4?uoITpKe-1DTMFS=;&}r%^hdir&k>oPVftBsH2FfH@NZ&Na+}^LrJ-E@E!Lt498<=p~TfJO&v* zaEX!sFnR^#+#BQX7b5;A@uP=k4+tfg=yF*g8n+La;)QBFKn zI~9pJO+!~09p8$shMeXx)kcmZW;NtIj7GLAUHwS@Tae?5K}HfEMq^sb4S35aw5|UJ z$ci7h!N_?Sy%lnbVzwGNx1!&JoQJ@M)!Hw82s!VWkPoAgMKQ<;<`0cBog?-@PGk&n z5YYwf#7vrez&C(7`61wJ;uGu;Rl}R+z2c)#;V)u9D5m>&LWT}Ro(({5ibEC@A-~E% zhWa75#~{y8-D8wBZA0FooJeYjQKL~-%x_NlTPdAL<(E=U29=b(vCK3*$ARf`%Kr>bo^ijJg))uo`+1VDs@D#h-JQ&i~f_=PX zwj=Zf6TCX`1t!jpv|6D-cuoIbfw_SzAl$6ic{67Z2i!2r>?#l*kkWW4`hp1`hfkO> zeP4PX(w9x2d*M9jb<1Rd?)`}^fN*1x?S295I`aWKxep9We|+Y^gHUFj0-8b2tMFJI z6Hf1WSm8Tc0NcS2*)Saf)rRs2Kbdui{E=f$9OOK1iU9U9C;AnJ;T!erpw=13;psZT zuv9;ZeW#n^$m`)}VyDQen38wgGjVOS*2~YriXx#ho2}Gm4)L?G3Skv}E5M!;w!U-> z*ek+%=S>7#C9JO1RIshW&Xm3YwqICb?^$3!2s_$)9@s@;dwMS}2E8wIQpO4}pD2AW zJ<3*rMF=}+sRQdMY)QsCuv}rEm2L(bB&i*cT>QQlFe2QbZ!cEPS{JaJ)quQ zVSW72yrZ#|*~*#})iK=0LUn~r(HtsfkX5mkeL3@HlZCz1rH#Xz9Tpat>H?Xw)v%&#$9dYbzf^d2ab%CerhG4$jGjKz2NVOx8?P!nX z4zOd}6n3w4B3OnnJa@^gKv)+zY00cyn4|Y%uu;O`ENh@sgyIoRW;2E1VNPa? zgyES?W~+qZnM`Kuh2beoW;=!9DNJSuguy8U`&Jm9-emTRFx<$|$?URF+{wx8j(V5-X^O(?C8ouQmB2lEbyRb%jV>quN;}|WEaYVs|p|B*;TTcU}qg!Oi9Jq z0aj2r&o7ttNNXq=V9#a6WEh+1acv3aD?Gin1c&VKD`0<81lzc0E@1bKaxZwQpxipo zD&Szx2U~&%4Dl;vPj+o+^`5zuO(4ToEBpqslVsS^4aY!s#fWY8D`%E&SWl0Yvj8%z zH^LLWHCP+tH=N~kZzyrsF`Si=VTn+hEwr%KEo=ESe@S_ zR&Ue`bWURCp4bZ3o8>o^Jw>K3^i)k%Q_GH@g?03@HN@S-f=kx3jvRO)Ur%?HM zYyY?WUXJ4RN;X7}pk ztkT%9ENljE7TugLvS)QuzK@&2XR;Y&Rm$l&UpAA?(T)8Pm+PFxMrLEZD)um9k^B;i z%hByhL_gw97u1X+BTtI-E3I*cWXv z*g-cKS_M?hBwNmY4BTvag-sRqec~wRJhnsF?{NQnmF+fSZ^oDaaW1}^_(J0dbXB|r#-C%2-Z?UJz7PDW> zTb%1zt%&_%{>b?*yI|O-&K<197_7IL?a1zJ-N~ZJma~^FUpjZOULv+KyU6+xD-!lr zcByqYD<8wK|K+T`={x7gY>}vV#r%_VFS{wMW9%8{es+DVKD3UpSDl}+`@)hS_Bp#c zPLCx)>=3&zEFt!u^S`X~(|W8d&aQsNHX7zszh+_M8TP-NmBqDCzhUh`bqiOIuuQ{R ztKYH`!(!F%*hs??)T3;ju&lT=^#`__%)|D__E3+rpb6NfhmC5NqyET}$dS<=5h|R#(iWRdV!@+(Sw(A#;6zBQnFdF z^Y582vGrtlL<8(s*nZs<1&-)7_Fu9pr3D<(YwVbAEFo^PdY%17c94A)JB9znurKhUdGWtQhtDKs zJG{AVy1p_qlk&jAge`?w6P_$=EyT1Yyg=xekuG~v{)Dijk#4oAvA{D_m)*x$;Q6Xs z^)VK>#2;SrjRhX#?^b=eTeNZ(Vt#yyu)7fRA7!y3`=duSH6a2={tp;+fVGAWVT=pPi zhA9rW8f46HJydLF%y1V}Y-Y@GKE#^y+oHqQA=aEXb?b}Y5-w9Pj}jISmnoR1lIgQ= z!G~yi5N<6u94(C5zYmY!P-FIc+Pc+HWA=FM!;IPEwGT6{y#yyF+_?4*I8EV=u6;zK zYaanCL(jk2$}(s)(pZ}H&}gJ_?V}4__9$az(hA*bl(90;4RG0887uRj0dBPwA1~(n zaY&8Yny(RdDx?nVq%aL)ZMg3Ydj8E;-hf~mo-;#Vw(Rg4wJmoGdn~*TY`ZX5bd4I# zF9^$tt^*5wL9h2WG#bN;g$1;%1Dn?ni?2~*`Cehpc6DI4!C?Ngm94ohdmN7uYw=mG zTaDvGh2_JNy7*FIgJ4Nr{J+8uOWBTi&MNipf0FXRl7&SLs8QSTvBDAu)PdCr>lRj{ zCh!wz8g$<;tPa$t3KT31W}nD2g>``0C-UjSii&I0_I#_bisCx3^TJxB*QgzMix>4) z($ed|`V0HSRHG*GIl>N`>cIApX|t8jVKg22Z4s=8!F1$_GxcUdp~Fsml(5dwVJBWE zjKQiU^B;xzz^WxTI?SDo?R*RF9$k#>Y=yf(mxk@EDHkM{J=NIHe@bpO)i})uLS6PW z<1~L8>Q>W?)4V^(W$$Wi*&{)2wJZ0Vg~QelSGPuk>1GTDpSS78U^IN-rZmvPb`K)qgkxfqOh zV74QVZxR+9sO5ovCUkw@Y)5Z?O4#I8?mJr_nk##q+KYmZO(LB_SmCw#ea?ePg;Zk(9x2$y}ZabgN0 z-0I+epMMdpT=pTxT|TyzTODHD<)7&7vJW-x^3!{})uG1o?^u@0KFoN+pUZNq!;I(O zVyHLVc>b+}dc*l!Vx8_ly~p`(O{iD4TYa1#6}GXL%RYi%6n3zeTOGmKE4bYHl2$ZY z(hB1k_KnPTJZT)m$0GB<8jj)jdD)JqjAM8yFAr?=bK*{p%RREua*s4_Ld(Kj_EE-7 zXmglb9c3(OJq&cTv7|R)prefwQ=XFT7-O86XH)XP8cs}L&uqt7JTch+Y$dj59%$qv zGaT1whU1JG?(CoK7;nsQZ~r{7Y^pa~$&Q%9C-Cw|TA9$Ol?ley`y4)3JVQGV`k$@* z0v{}%X|(kwHCl^F##(HFm+8sIT6_vG)02(0!0q*{u@<hSRzCJlq%fvFe6ny0K10aQAq@ zSf@d7_jrL%)k`V?N!wM8&n1KBpDU@tsqxoEFcX56e50^I5UVs+W(Yiv;2TQf1K2ot z990=B^Sje!f6-W(hfcTpqOmf~;Q2SxSecIS_B^v;Wi;jY{x170V`(1rcdN6EgO?5+ zzGNJ{0_gB1{)rgcP-t{E|3%o-(CBQg%%`N6~aVKxv$7Nq)+{wH2ajQ%C1yS_x z1ee{z{}HCZ&i8Qt1^O(;CuBR8@;G5L67s+@g*^r*eHkAlY$6==Wqgvb^0qaax}2{Q zI;m|P*ssEN7S*ULxVlj9;;W)Mu-?L6X#?PlQ?EL-gzXCYgTIt>#&asTuk`NVRc9@i|sw z98r9X)fguR@2j=OiNVKMZKKE7YOT?8Y;~jO*qe=>V{aPoFm1B39d*V#O!urju!dKd zzcaHPYm8SIKZvd2*?PB8y?6Od5zCIK zj7-KahFhu99)8)d%ea$f!piJ2?xgsOh!2cADgGkj1A2v_=ikyim;FQI9cELW zTm8^@hq;ySvVUZ}!}!2G;Uk_YhE@Tu6ubE#VQzS(*v%&iJD8vC_?W*U?3esJu!h$g zJTaf>cUk=WhezfU{w5XGFU21InO>2eYJ2z(qM6s#8ue3dS+1|sCbbT%ldz(8HR^ue zP1s=gguCB}{SaHD9x!5;V(Y;4dhq;P)UihW%m}XPSO=Cv&FF(U$Vcmq(qInq>7t85 z_(*+-uW#ruz7Fi9e~tPT4_=`U`%C{iuzcM#r4oW)b4>(SLhx(8L)g@k z8uc4~LD;;KIsE)q%Yt>_j`4{agOAu*>b->bLw)VYv9;@mBxQ zThVawzvGVyt>|@BJ<1;!_H3`8z#jee+%e;9fu+jC;1*>!LVgd@t=jY$%D^-r}%xLoAb}8KXdgpT$(DjJpUrtFkxF` zZ>YcUS~7iK)N{-0SaPQFE)1={(K^)|>y%RDvY#>5DYM9}o-uA^KS#SX`)|g*>>Ql* z-*^*hbhh#(+#t{LFfzD3Ll}*kyj6?3@h;bA{g#hJ(4HaeFn6bhh$|X}kId4;FUVRN?%CyM)~es!^}< zp2Ez{>cAco_BzC_@rlCL2i1YiB|B%s8D8fbMQlTs7uX51Dt4b@TF+IqQ1my7>-Jepu)H@OdH(&)$LSSe_V>(x^A|)jquXy+AMi!Oet>KE zfY%9|7l*b(San>5^MUa(V_fET^&jyuW47`_W`*+~eo&O0oxWXt$bWi6JpT^EoF4LP zA{ZJP=l_r^HTrySr?~77d73cqE^a6}LD*05yl2u>VOPrFPb*TDu(N6he=f};t77Gu zoxzsY{(G@a65iM}{iD-8vq@^W+VybMEKbOOb2BI~5{mhLQ)HV63V1yC^v|EW^L4bcamC zy`BrIzKM-iF;`#Ce5GPxE4vi=`%2r%uw6EvZO31#Cc~0r zAlC5PLGO;)jv%Sww}ZhQ^T0OgB{lfe4u4#bzS31mX@+)JSWF;V;u`E?wlbb<4B0^i z=hRG^qZ=LHX3_?|B&}gHX}731rr=rs7SaW>Dj2o~mavxE4ANR>yy71s_0m;&Khk9n zmqrTP1Vj7R4#7zemljY=?><~wE}Chb;qeb|*m`V4$!q=*(mFlHUWs1oA1R$Bt72QD zH~L3OQEy@QRqQ>j;9dXL(tM#`u-*P`q)*B8<&-izjqR8Ne40o1vNsAMTzdTEq zl5~R(FZ!oTd1QK{8PYg1eHIywy2y~GQEVprn4h#|NH0H9vS*``J*B0hyWor_Jf=$`~ZJgvKI1B7HpRf@SKDXWX|EMSnL20{u4I7EO4(JE*%a3 zLVky}&iF=-mM}kBx>j;ZPL!6!oB=Kjy(ssB{Ogb&I^Z^NTJAqjLeXg<7V9)>ZXi{g z#zPXCS#dz2)=`u*QO}oNuq0TgNztaRz~9W7z)#_eH^?Glsr4|l(_1>kca}`H9^xSb zmRXO%a5sA{UhFaafpsw(66K@J?XtUT)q@JXsaz>!Y5h2gip6(3BS@^EaBI? zizVDn;Mky$xH zDz)#1c5KYogj7u}fkCFW-kOcIFg*qmW@-88cNOw((?TvHt|-?R}}XnGG=Z2AOPX8IghZaM-SX8I9WVLAgGX}Sy?Yq|-XV0z%~ zrLoB-xrrB>YVrZPO+mm)Q#f#zDF!&l)B!l(lm=X6$^tGm^#!gpl>)0x!+^D>QNT5( zXMpQW(}5dJvw&MouL5_NmIHU0YJj^<>wtSr+nT`F?oBF8SUXG$a)cJ-1ZAC~oO;T+ zKsi?^=Q`!wG(|$SJFs-{UkI37KxY0BnlqdC02MQ?rMLM2qq zFwFcjFv@%e*j6*+vd5XvgCv-*06Uv;Txn*!PMMU>rF6a-uURqWlu=GOdZk&zMysibT54h)g*Q@oD|N5~q6#|<`3gG%`3gG* z`3gHh`KO?k!s^Yq+t0#EDC`2P1e_6A2{KsD*-13RzhL-VI|8JJ+P0h27=z|IyQV4B4N zOt<(0Gc7^DTuU&p(9#lEYzYUJS)zdDmNvj)mYAlRl~q_=AR{daz_FGNzzLR4z{!>r z;8aT*&~51sth8hRXIZjQ`Ig?mMV7w6rIsS#N=q@Yng&;EDTVYJ%VWTGmchV{ zmSMoHmJz@mn4_^>mM1}WTSfu*TE+qoSjGdtusj1iYTn(-aW3y^c)QUzr4ETAIe>Uzt#y1w$uO<_yQxWlv-GVXvd88=asjGL&f zjJrBc#$BBtB6d`+)1@gTRgQe}P-&BfuT<_rP89Pr%*sufVOTrBJc}Yy9z%J z%YOln$ajFpII2@JDlY49V;ngeWW?d1cz+KSgH$%@yhv-M@T za%tAyJ_?&}#pAcgipOuMwWW7Bn+Fe`c;-cPvZBCv7R(+4MzU$ZSoR{Y1A7&i%8mnj z5__|sA>E%{2M&T9EuM{_z!;_k#j{DQJ#aefPAmk@WKRVRqt2>K*yU>CKH_O2H)DP{ zu?KNDv5L5wxQ}?6$SqW!*h8Zq!--YI)x>?o(?l*)1!6jJ7_pLAOWZGe!629wONJ5C ziNlDM#9HEBVm*;58dXq`>BM2gN@6W>FR`A;Y*e0@P8>$8B-Rr566=Y~PUVT|#9_or zVy%6i1|3&=VWC>$USd75r?&_4M-YE&f@LC`Vop!u2;xj)9dTb%EOVOp8|8%gP%R&- z_s3|D z0Ay`2axbyI1*TaD<%fDPc>mdpKfGBOGK`o`tR&VF>-GF_EHjK)NvtLACDs#J1hqp< zCk`W45^ITjiS#7bg4v3B%tSc{lG2GhfcmBd=& zUSildYKQnV>+3U+zr;Py+>Y1QShib!wp_LN%B|%%Ia^*P{~&u=+gOvWgRMKP$E-K4 zk`k|^D(Omv@}jar`B3>v`9ry@$Tp`f*cM?+vK85e*eYyQw%2Xk-qN08FSI{qpJ1P2 zKV%>4HQB4yYmL`MFAMx)j58Dc&sF@G%={TV=$VbR@r2&_SbN~l*x5`=0AnNjdI2|= zI)DXvLBO|Lg#yo&wgMLSjs+g?-5$8VcW2;p8Qp+cWtqS)EqTD@83n*Yr2~M&G6n&^ z=sX-aHx_#-@xd(% zOR4F$`HLWZKO8GJ>4ChRjyy>Gg&0Zs+bEr#fzdU3$6lEJktUwJ&mBFfO zV%h&G#Rb=wx*IKW04=h9IrPQXFUOJa z)6F{|cRM!#oxL!Bcp@@Dv*M4OObncgLOuvXPR~as6Fa0}dV5bSsdw{o5;pe^@tG*h zU!)?B`Xe6@-|UO&xJaa@B}M&^T^-2Xl&uG`$c@t{Q-> z57`EMlQ<+C)4ijS&08V^+aV9-P6Q66c7Bm?xE%*zen}WInQDzJ-iG@>Jsq=-n2={F zoK}o!CpFFQ*!}-?IpS%-d$+Tx7r3-&-KGVA+aCr+a<(BbS-xi4^s}K z4H!@7qB#w{TOX|JO~YEBfJ0wS6L_vIw)|}oat)>LQ~Ih#*VvYW)&8#~?U{uQ`4hL( z?fIRuPasF1_qYf=wAnUnLEkIEWtdJZ!yD08#685nT-eU@u~ zP`QsBp>27TPjjlI%XB6mo6rZkP2C3RvF(soW08A0B8SH#zxGE~6Bm|Xx?3;gwRRJM zdJFS<9m4&uU$aNgw7$cayRhhHx+yt(VaKsFh8p>bBnOdC7Qt3v=SY2@T&9t zZNNk`UGt;o}aiaRZw|F6lQ zRhIu+zO|gQSmYLRH+i@`Ql21hkjGfxvhKAWw0>o+x1O{9VV$8YQQlTQQ+`x>+NRk& zwsp3Bw$nDNJ<*1` zvbDZDYMwY+b9zD6YwzTZz8#nL<<42}bGLC+P3vSyPwwp&e;~9hhaos@dLV|x= zaK_T$e_NOK4QKuOXZD}_gR|iG)$?=Sa4)ot_-g7OJ12Yt|4o;p@+y=Q|Gb9ju*Km4 ieE!bWNBB7INsz*JHvNv@Gf5k}?ezPBU*n4ttp5+srG-@h delta 20291 zcmZ{s30zcF8}QG$Gjr$80K&{%7DZ&$*as8^#03Eb6$J!ElM>U+H7(6Gxe!XZl*_1T zQb9_oxlpc^m8F@Mm8Dje6&9JPmA#p{=J!0$J>2B`eqX=${d4}$+0Q-a-a9Z=*=Vh7 zv@U`aS{ov97+4QG>M9hPvmGiL;(pDeoH6wbyD z8s*E`g`N)rt9niVKHYl?aC(nNfNgs|2K=noTwt5t8t{#t3xIvQF9LSx^$d__cz}m` zuLXY7<9T2~?|R@X87~_>LN7@mrt~e4F+XDmuv^A1;FRuf0Gl)30S2}^&BIw~`!E<{ zQ@ev6$8(cH4??Y@?J$Bv=Pb0xVJNwv*T=w;UdKJ_p9|5}c@3-V;XdU%tg>g)DPLJ` zbYUbh;xt66+qeC`#h%8G!YeaTO{R|PW zQe7}gRgsTuaD%nJ>j*1R@sj>hNpLJ zU@Be#ZLk+aYK;vO&VG%-Yoc>cM+fA-O%Y>Ld7iEfjB6)z_E4~o+){T2ZMJ1_os(G) zQ-EJG^9P2rzPX{E&uRllM)+~|fh!tVl!JVyFS1QI@~M1e0Wmi{T8yU?i%L)M>%_G5 z&PHTf=?LFWtgLS;luruj2`moD^7MH=M9YP=Gk*{;zvnREiEbmI79N3cmKeIui?bsI zuiL`eCfbAgVL6#r4kfpDe-L=G`$Q;TnL8CYjkvTR40h#_f*BCG6pd@bVI4R#7h(FD z^!X6SGWs09dp=Nm!f#lm%ZA+SL{3(azLf4OKjDY__eqGPMJxs;#3G%u(BV*cKiY)GfOm-kgQpsKviKIv(4gE|c=C%n%?jMYdhv8~)N~zJK&^^vI%!2b< z2H6S3yntm!{A$c9h_{PHCXQHT#P7tcgUD54LM*18#CAkm5=M$Bofd)VJt@e<5kL** zjnY8bk;J?JjJQjYBPo(d)y_m>q)q5LqvNYFFF>SS>BHn{YWGr$dF#*_(nKb#ZUjTFQkAXGB2ieC|4R4w^N=`wAzlZ^$m@e*y z3>|@N4nS^;M-~(zKgmLdI*>bKkv~%1lN9-#(p{*`$)Hozi*^uhYA-9_K+*j+f7MPQFJw<@Vk;FLPYpFd$9Sc29*6DCQ07S&@@ogOpAYg0FJylkvd|ZK zACzpVRcieeB99S0z?OI?uitV1|BOE>j{;jZRBE5UAhIwOc{>?t9)^589{CWlbU3Da z4MjdeQDkVSrF%c+8bnswkZ;Jy zwZtC2nBMDy?CFJ^mDe2eHuOs0;95r3sY_o6O45&tFn(QtpELEM7D;Z#Fm5C^=q+wkLS z8*-XAa=I6C2c=iH!So3WvXatC_S?qwyKIphu&rd|b&d@5ksRUdk>o3Ocw=hY)+?Mf zw-14**!6ZHkp3gs;U%+Op%o^0b>PpKI6K~Pod($(i_Ze{0@p!y+y1|pIlD9TPqWN^ z2f_nVnhHfLO!zo_(2VI@(mqIEG#&NAdC=>Y$qL>36Wasf#v*$=0@!8d0J^vXhNV9~ zbKyZKvu**w5P2FNtCPa%Jr66Kv<0wT{9_xYL!sIz9_5f(m&nr`BZ&}sz!U}SZ|>qK z41>34Ruj}I>oh!Fry17MA+axXQ=9{`9VT{$tcocEPJ42af}rC2ULS6tKm@1`e1G_PnqS9p{2I3j49N66~O`!htnlUkW=h@M*ALg}pn_ zQv!NR==7|0V7^iMVEPPy5iCO3VM_y8S79r&wt(dc`=GQDY^1QVtUaDVF9&P;AvU`s zwpGRAd%p*EMA+^gAA)&z((^X;J_c4UY;}(>z%~kdzUNn9hlO?R{vFr}VM8*00=p#a zeE0KULHFowPVN1>23jWcw_bmN)d_o`=XJ2l!oKVMFIY;nUeVOc?6k4v!nXIagPkC& zQ4Xc~ft?e!FfJSFT^BaUf#w~9t<)$R(*vBNZ7ft**c9!dVis8y>oAxzZ#F~N!tOCn zZ+1*rV1^qkGgcqWknUZw?SvcrHupnXigC==aY>653D8$xKtcpF?Yc|*} zVRDZOutUPsBDbAZfK{>;VTD5%K;9L~Tfqv4E^)@Q<|KXOZv-`364+%j9P4sV$g9D8 zttb7};E)%b$!u3=EO&^VjNz;cYbINxG!!*>9(gr}pZ2VW(yw~wlw9 zWo?AP=pipy*n`8%9jPo@7@o;g)>YVz(&=DX!tmUsvI1e<;iRRqGGWev9@Gz&c<-+hxrn2XS;h9WjTZG{$Ol5n8;VDdIhlIf?1p8bVp59dUy)fL! zF{$jLP~6F>?3%C#U?-I=tvhAt4pE+~bx7{fQR~0_M zv){?8!Ol7RG9?4^4zYs5ryY5$Pmh+8LH0aWLWX(MJw7{v`8rR`j^L0zjso^S%E2~n zmJ4)#n?{DMj&qD)-;!ZVe>q36OGaL! zql{U4VLd&sj0KQky$3zE#$auVV>HX{-BRMFb2J-Hh9xFB$FdiUJd-jk+GR?>fvQK2ojl68f6!y!1d76C+yLMORG*+DTU!&95ePq~Zfb&r{ zjSQ#abUn%z75OH!)NAXS&Z5Y$UX5cmdy-6F=-I4}tco2B%x2nLX33$7N@TZA zuDQ&IY=M&6EnJ?98Su{`OF`jKHjf4ACD}-_$I0|Y=dl_x>~OAQKHFgA#k=OS{YKu4 zjw*JAtcun2Pjgjitg}7Hx?7s>@~}g~LZRX+mN`Ms3$@I5t!9hKRNm)`m*t4OCoRWZ``84Lx3*ug z^)2>@u$TLduKE)O!#b-c*b!lU<9n%JvNL2Jb}%km{febc!!|u^g1f(Znw5~P zVfV%rs^7BZXc}}sHQ{a7cWj@?d=N5!U|x@4#WietOsRU7#R@weG2itg%Mms^GE)7C z$usnly|eFEo0*@m`vRlYpPBhFJ#R@;qJ|e>-8f3r3e$q`*;E4XgE|OI#?cs?2!LI1WlHzBomzil6c5#?} z5;v3o#X6Dct^CEt=%y*R2D|N7*-Tv(-+~JDDqAc}OLW`+VJ`|>mRO~HM&yI-61FBc&v~1DBy3M^KG@w|{A+a4F2HSPyk&yn0Tn9aEj@gyb!0kl zoB3p6_a#@TW?n6fSv9xa!j}kjS}RlwUnML%XQe9h!@|CfLc1pHdKg+PJs@h7S@~#X z!n%+>Bg~zSc?Za<*!a@5V3)~gUuaz6cQ2d5#l}zqv)y*Pv21bK6{?-L>vtO4>gA3jy+N0DxO8@^E3iO34Ijj_P< zRkz*OSm32ua&BLxmb(Oz^P7Z4Wdi_?e?Z z4dhzO7D{ru?Lo#2)14J+kTJt8P_eBs!+lV(tue!;kk^g}iVoL9UOS#BtOH!8V4fo^ z5iV0OA4#UqzCEwd^h`LFe>vM5v)==c-%w-r??zXsp~md-+J_ml$7>&ETzd&lOt^9F zop74MTV4BzR@XiPR)(H`HOgveG}2g_EzoGBaqVLY-S#MBWqK4=s8Pns%o^&pcQjUJ z-OviPBVQ)w`*ujZ+KC?$b|$0&?4~dc^6ueD^Xd6lqr3o__wa}2>sPH`c)c3UYlYn# z-T-z&SVBy_8pD+ey<~1o16XfiH=)s3K0{bQhX$}$Tk;a?)i~ZH%;jzX3xvtT|7w)R zJhwfb4-jkdL0*L#&oyEBu%romm#~qrqzU|@uwzo5Gm(c?>Vx@4$_FbI7B#e9b@Qdd zl7}{c9Te6ptX@sx*U&WRen?mYsJjXjEDUC!%*P7r0<%x%>xC7S)T^EOabaUi8o;bi z==IuX)~j834`Dqr8^ERud&g9-rtnR|j+q+3ejw9oln-GvU3p-&-b@n=rYkQJ77879 zthTC4_+T$a#y2Sts2eZvna1dnG=xb%;8IfEeyy9s}rWA9?U?f4)Zy#yc?2Ie>p6EI3fh2mM*-mce<>f&7-RorCki)P?%KcmO)g=W)U&L5KM~ zTUcyzo^uetS6J8Ne6UA_U4;n_=8J^gfe8-g^}^0)8jd6!Kq$ zy#cc*aK#e}MJZQ9tCkadFw?!SoHwsJbw*$=aq+YUp+dOA6j}{i)7M_2_ zJX2@@G+M$-g+)Q5C48E&tEMgLP(J%9y%}!a0XB1yZnj}=`!K##SirCfbr|13rfso7$0z(q2u<>NY5sP`Lp`3DEO?W2sl{Jen`>L}y+ce1bB zUT!?$&-JZP%Z=yX3aB^Qc>ZmIdZYPau};^Z-UIxMCe*86h57*hOW4-_Zu=N+TdXhe z;rEZFX`A;OFGs#hJz#Xoa2mRcyDArSj#ayH6YLVkZ}wz49EvtJWJfkak=CSmAu$B`On4RaG zj3);BuTkQ%^Fg!kn&FgIGn`_~aBp#*bE+}J1I77ZCNrWsrB zL-<_rDD6Dxzef2UK3F{3YU@pJwHDKjwb%hK(=&{Lrzcl-;VvHOO)dl(w6;n7R=6O+=hUVW0^CoHRD16a$!yMKt= z{uDnWPMS7-NQL^8aqzlB<|5gzDhKc*d@=on7=A)FnkX_fLAu{IsU59-}<@j>-qP>Ebt+EJy%y?Gx|-pmOn_Q{|2Mh zIHLF*d(k+e_!xW9I5Bu%tusyxKE~==J;v&_R?o5eR?o4QT0O^JGTveC>6_==V7$Zh z?wb$R@(Ob^C(pUjc!hC5-bViTU6W|wO=MN9wC@{g1J?>y;tcg)2EWWFlj$>jnV;89 zser$2ZswQCs+Cox@2Q*lb&KN?L1AC3>@yZ@8JD} zB@EAIJNW&=j*`t3_7>R!4?X|%>${`X!(xYVE6qyCbG~NWN(Uw6gB=si%!J=;z22(c z>s(!hYf+>0i>Tzg_ 5vMJ?jJxGYcnRN)cT4^GcOE|9@8-p;^@=|5tLQy^q_B{f z3U!ZhE5*0>y~eE+U*7k&+)9wJTdR+cUk=Whezfe{yr7eFU7n3XT2gl)!yY-MKkNwdi8zYagDxC+tdcI zVZw^s_3A->zp(q@6YfDH@5{J)^^lQwA+7;TuLsY+=-B?J)D!#(VUP7c19tbX=S~`D8(&PmG|o1@n0#q`s>2ub zuZ$0M_=5hG@u3c1(7!f5)HP_3`L%H@@H6dc<0S$=)1EeVer1B&{*AHoS0+@b-|!`3 zpc6aK=}Mr*gXT_^WPcX{yBYVw&ypi-|-Z( zDz+y7B3Pxc#<;)K@A&~TeP1;3j_a{rwemU)t*O;IH5u!aUgWm_XslCCQHA=WaVz^S z#;w_ZGVW#P;H3Y=6R6P|E^3rV;T`b; z|3X+bydz%V&B9he-bMbmum;Gx$gQTf(l*fG;M z*Kd4~u&Y7!>hFAvFmu}mu(`t4L*5^Jg|IC_4Pcwe&e?E=m-#V~_iA4suxn&h>=xx| zW1gplqQ6mG<~3ya{BuFkmgm?@C2sp)##-zusZjqiu3UEwh z?DfKNuIs#yu#u^|)f;@Mu+C&HpZ|^(<~eT|pa0Gj=7UXq;jZW3P5!iA5oUkGe3QQ* znwi*nw|bj53i}eS;cb3U*phg(lfr7_$GL7BA2X)p>{kC3A2Vu{ikxw-fB894vLV-9{UH!SVk*tc9<#Y$zRfj$3XT&7ojZK3krTLnqmaE+aN6jL&{JrKkxY1aomfu%J z!0Wm!wfwmz30~J_spZ#IN>rZHDz*H%CL}5!EUaFiQdP%Fu1ICVR(3pXQKUI&Eua5v zQY~fTpWK4%HfftE`fP#Q?k(*WHmTrEo415b;veN_kbN!kvS8TWG$+RNKisvHJnVyc zZ6wP}Sg%Hz9hT$YMhYU+aP|X0Q%I{=0(||+PnscYZTDh-Kk0;C5lY_c?~pE$9bz*I z#`yb7IUBH1eM$YL{bbnY6v%7&?VxwpJZF&9^4r1SuK8e}=p{9HO@cozNWbZ-q_;(D zyHOu$Y#>^Zu&HEA$POzwr?%22-RStXl|I%>(i*mv&WL)G3TFAYmy`xg21EPLj>1U~m$p-$-hH^VM>NwZYqfuP%hqFKhSmB< zNJsQMwm9Y$|47OFvfh1T%y$1MDM#3DtzegbCuytDBkUdjd!!%9a1rnIkCtwd;TJ1% z{Ntr|uh7a+UcBfK^FHuTlDbfy{ym2zskc!Q{xt?Em#mtl@{gh92w}^)_OXAmG)d@G z_OX9wY5rXmyGZK|tMTe0eW;sK*WrD0SLrihPYrn;>?>g_-Dp1uTkoz1J1;CZ=|gij zN!~=0PzsZ3G_O?2U+Cxkg3akt2-!Ivl(iHrh3qW9-Y1-;OFhW+&6eJ3hUro{u8VYQGt~Kg&-Kh3~&)NZzlaRxvAlRW(D37Upe6%O*Q( zi!A=aKSLU*8=qcycix=hd!b~B$gA)3k5`7YNf-`0Luw?`FHA>-@BDj6hbRwcal_nG`bIb9qsZNAZ|Q%+*1~?3z(ixE%BK_%~BmHq#Gkse%(^tAFN=`EU>EBo4 z+i>>PY>4^V&dsMvoxIV*&-a1v6K0?98tNl2;^JOb^cDu1#L{RSy-NVDUI0{@L2sf6=p%k%sZp4_1v za?kXe36X!}wkt8y5`Lw-M8dCkmq@ss%Ah>X#gTl`)=XbL>mgw~V<~rbgVuojpSc-maX;rsHQ@Jk`^{r57C-MH_(q`8I@yh5aqU~+$fGMMDt(`ek75kP|-9h+JlN_Qqeq$=Tp3pA|*TpY7OV< zz%t$oSkAM7V|gBMJRby{%!dG{@lxPyYX5O)$Hx3jNYxYu3^K)fYc|&2R0a}eN&!Zh zMtgg)c+)swl4&Y1#WWk3W~u`AFf9gVnmoW9Q!Oyh)BwykZ3h;b_5w>x2Y|y(M}cLg zFM#EyZ-HY?&A{=d-++@%SAo+^cf7qcHp8U&c(K_g2k>!IJ7A?L61cz=4}8kh6}Z&Y z3%J~r3tVL?1g@@ zm~kz=&4(fFXZ{$dnvVm6%%_0u&EEjS%s&95%+0`P&5X+)Z~he|$^1Jo&5YyfVaDr} zL+Lz9=bQ1Gl~80jMan2rZpHzPHRFILQ|>g%olWV-DZPNwPf>a~rB_jUty#lHYpIDk zYGM;*Z>8);>R=b-D(o1<6?Por3OfmLg?&x&Gf+!mO=jHf&9D**I}a-XX9QLP&Iqi8 z!mhwdz)69XP}nV42{Ze+!=eH+ErGxsOFLkmB?MS#2?Lf`B7ws#oq%PQ7+|?2 zzKv#OV=Zow@s`fO$(F9bX_hqL3`+)Zwxt*FaZ4Xyr6mWrz>*7m$}#}B)G`RT+)@Z! zWhn-(wG0E+(%|YWBOtxeQU=^)83o*Gc>vgGc@Ve@BO2Rh84t4GG6{IV@-Xm_NFX5bq^VLb*7BFI!DHx zoG0TJ&X;iu7s^Ya=@NMbaJak%SSGIrmdka(v2p`&GPO2MPKR1EG`Sc2m@Q`mAD8oh zmGU6q0=X3Ul)MEhER}Zvm&?0=tB7mmHy~Y0tdrk?^hWt0aFculxK;iH*eHJi+$Dbn z+$Wy_?w8L356I_$hvbXEBeHfGejJnk1|FAh08h$yfM3gIUmH6k+kj1S8(_2S0-l$H zfS2SD;AJ@ictySkcukH6-jb7n%-YS@!W3%;(A(M*=x6N>RIPo0LDpMR4VMSO@tkY^fEG-*PJ+zg5;S?{KyR9z2Q6i|As- zfr%`bl>sB!JYXDK0PMn+0W;vc(~0msb>u+y1F)F=4>%GcS|S@m8IzbjD3MKPDZqKG z4{->vnoS5Qr_QQO*kwKOJ>pp+H)A}U*oQcpSVgQSzDGPu5f925f2cXh%AEIA!ZWGiIv1U;sIh4QDc!*ftX1wCsq>chzE#a9hX4& znL0aRx||r^9n*b?qlr~Idt$tvcwi8wn}}>Mro)Jp8vUr#ISexn5HrVMy6zz=IsutU zEGJeHn}~H2f5KYC%t@FoCsq>chzE#aQ>Y!{!>rJE1YgKKL;gwBUbgJE{9w6kamvwh zqMRo`D}OEfSYxc|)=}0y)-SDBt!5=j>8WHX7}bF2Z3jUVg-++L~z3kI|UzS1!qc&_vwV9CG);8z1vfCmS52hPgM z1oj=?5BQNKAGju~2za!#6j+{hAMi-p7~rBf?4`(o+>|~6B8ibxf$a*WYw%;Tdlv9o z;5^{fP~_|&WG?aNBuuY}LO#`Cuis=o+@l^6CQO2vRs`32+rP9i6`t(zn8~vQHo6KbgqG#P5lb6n~A<{jxB3 zqu#L>rccvk^wuY7;ge@k(}^`-7biyT0UtX~d&@%77b_p<-L3$9;? zyO(|3UCX}Of@^SvBSR^zU5Q8eDY_Q;WeTPcMw3M);rivxtWDn^7*02rjVV$mx%X=V|ri=vRwycpc{EKZ#r-kwe!7%!|gg0 z+G{q{m6zAeV1DPl2Wq}?#= z{{MG55^2E)cEmE;K;(tK$gPz2?T6`)Xa{&Ap=FKzJ^(w=m;LoH%)Un1bJ8)sGaIR& zTKydVNSjVCf0#Cr-sJ^~pQGI{ou-kTvLEV>B0fSZXQEw_PUI!nmsU&}k5Z^#$DI(G zH3TyXi9=}Lt|Ts}Yq_6zj3SISU?QE1b~N-}gRrhQ4Qoph4t)(xU{*A?{CN>_Bc*Rq z`ge`4u`L&?{r{FUyDv86Puxkj=gq?pKt!MSln6Yu{cPBRzE^^WV>)>_-iSUSzDxWo z0o$1yhvgF^4+Ad^ru`otgBA1*m3P+>dTjv3X-<`NnSRX2CiH>6rtXCFWH<8nIOMxs zk)solpZX(fiOYszx>tYXAMWWuy@e(HKgRv9U$eW?r{^AQQGdr{l7g3$E8=;(f21v z@1w0Th;AAex?u+gy8Q~=Q%D;s71@p0REWdcPEEV|W4taN`9uzKaVD~fYDI?r0cpSP z*xF^fKGWHt63lGDCZI<)s)Kfb!bZ_XDF`Dev%9K3aT#b#&d32E=xJ^XPCk9hX% zTfDu=S(UQ)-?w;_D<1y4b|bJ03I5-nGgb!wRlBm!I2%%&Q~b_uTj=~9Zw!9z(9*bf z`g}5EZy|hPg*)qhhjQYdH!&TyB0PX^-CK2>PvLvpe8F#+q+`AII= // mark an entry point or callback pointer -#define ECL_ENTRY __attribute__((ms_abi)) +#define ECL_ENTRY // mark a visible symbol -#define ECL_EXPORT __attribute__((visibility("default"))) +#define ECL_EXPORT // allocate memory from the "sealed" pool. this memory can never be freed, // and can only be allocated or written to during the init phase. after that, the host @@ -22,4 +22,8 @@ void *alloc_invisible(size_t size); // send a debug string somewhere, bypassing stdio void _debug_puts(const char *); +// this might be used for something +void _leave_main(void); + + #endif diff --git a/waterbox/gpgx/Makefile b/waterbox/gpgx/Makefile index 967eceed66..06855b1617 100644 --- a/waterbox/gpgx/Makefile +++ b/waterbox/gpgx/Makefile @@ -1,32 +1,16 @@ -CC = gcc - -ARCH = 64 -#MACHINE = $(shell $(CC) -dumpmachine) -#ifneq (,$(findstring i686,$(MACHINE))) -# ARCH = 32 -#else ifneq (,$(findstring x86_64,$(MACHINE))) -# ARCH = 64 -#else -# $(error Unknown arch) -#endif +CC = x86_64-nt64-midipix-gcc CCFLAGS:=-Icore -Iutil -Icore/m68k -Icore/z80 -Icore/input_hw \ -Icore/cart_hw -Icore/cart_hw/svp -Icore/sound -Icore/ntsc -Icore/cd_hw \ + -I../emulibc \ -Wall -Werror=pointer-to-int-cast -Werror=int-to-pointer-cast -Werror=implicit-function-declaration \ -std=c99 -fomit-frame-pointer -fvisibility=hidden \ -DLSB_FIRST -DUSE_32BPP_RENDERING -DINLINE=static\ __inline__ \ - -ffreestanding -nostdinc -nostdlib \ - -I../libc/includes -I../libc/internals \ - -mcmodel=large -O2 + -O2#-mcmodel=large -TARGET = gpgx.elf +TARGET = gpgx.exe -LDFLAGS_32 = -LDFLAGS_64 = -static -LDFLAGS = $(LDFLAGS_$(ARCH)) $(CCFLAGS) - -#DEST_32 = ../../../../../output/dll -#DEST_64 = ../../../../../output64/dll +LDFLAGS = -Wl,--dynamicbase,--export-all-symbols ROOT_DIR:=$(shell dirname $(realpath $(lastword $(MAKEFILE_LIST)))) SRCS:=$(shell find $(ROOT_DIR) -type f -name '*.c') @@ -43,8 +27,8 @@ all: $(TARGET) .PHONY: clean all -$(TARGET) : $(OBJS) lscript - @$(CC) -o $@ $(LDFLAGS) -T lscript $(CCFLAGS) $(OBJS) ../libc/emulibc.a +$(TARGET) : $(OBJS) + @$(CC) -o $@ $(LDFLAGS) $(CCFLAGS) $(OBJS) ../emulibc/libemuhost.so clean: rm -rf $(OBJ_DIR) diff --git a/waterbox/gpgx/cinterface/cinterface.c b/waterbox/gpgx/cinterface/cinterface.c index a1b4106915..2161f91a90 100644 --- a/waterbox/gpgx/cinterface/cinterface.c +++ b/waterbox/gpgx/cinterface/cinterface.c @@ -713,3 +713,8 @@ GPGX_EX int gpgx_getregs(gpregister_t *regs) return ret; } + +int main(void) +{ + _leave_main(); +} diff --git a/waterbox/gpgx/lscript b/waterbox/gpgx/lscript deleted file mode 100644 index 88a2a40c1f..0000000000 --- a/waterbox/gpgx/lscript +++ /dev/null @@ -1,228 +0,0 @@ -/* dumped with -Wl,-verbose; base address moved -/* Script for -z combreloc: combine and sort reloc sections */ -/* Copyright (C) 2014 Free Software Foundation, Inc. - Copying and distribution of this script, with or without modification, - are permitted in any medium without royalty provided the copyright - notice and this notice are preserved. */ -OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64", - "elf64-x86-64") -OUTPUT_ARCH(i386:x86-64) -ENTRY(_start) -SEARCH_DIR("=/usr/x86_64-linux-gnu/lib64"); SEARCH_DIR("=/usr/local/lib/x86_64-linux-gnu"); SEARCH_DIR("=/usr/local/lib64"); SEARCH_DIR("=/lib/x86_64-linux-gnu"); SEARCH_DIR("=/lib64"); SEARCH_DIR("=/usr/lib/x86_64-linux-gnu"); SEARCH_DIR("=/usr/lib64"); SEARCH_DIR("=/usr/x86_64-linux-gnu/lib"); SEARCH_DIR("=/usr/local/lib"); SEARCH_DIR("=/lib"); SEARCH_DIR("=/usr/lib"); -SECTIONS -{ - /* Read-only sections, merged into text segment: */ - PROVIDE (__executable_start = SEGMENT_START("text-segment", 0x0000036f00000000)); . = SEGMENT_START("text-segment", 0x0000036f00000000) + SIZEOF_HEADERS; - .interp : { *(.interp) } - .note.gnu.build-id : { *(.note.gnu.build-id) } - .hash : { *(.hash) } - .gnu.hash : { *(.gnu.hash) } - .dynsym : { *(.dynsym) } - .dynstr : { *(.dynstr) } - .gnu.version : { *(.gnu.version) } - .gnu.version_d : { *(.gnu.version_d) } - .gnu.version_r : { *(.gnu.version_r) } - .rela.dyn : - { - *(.rela.init) - *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) - *(.rela.fini) - *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) - *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) - *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) - *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) - *(.rela.ctors) - *(.rela.dtors) - *(.rela.got) - *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) - *(.rela.ldata .rela.ldata.* .rela.gnu.linkonce.l.*) - *(.rela.lbss .rela.lbss.* .rela.gnu.linkonce.lb.*) - *(.rela.lrodata .rela.lrodata.* .rela.gnu.linkonce.lr.*) - *(.rela.ifunc) - } - .rela.plt : - { - *(.rela.plt) - PROVIDE_HIDDEN (__rela_iplt_start = .); - *(.rela.iplt) - PROVIDE_HIDDEN (__rela_iplt_end = .); - } - .init : - { - KEEP (*(SORT_NONE(.init))) - } - .plt : { *(.plt) *(.iplt) } - .plt.bnd : { *(.plt.bnd) } - .text : - { - *(.text.unlikely .text.*_unlikely .text.unlikely.*) - *(.text.exit .text.exit.*) - *(.text.startup .text.startup.*) - *(.text.hot .text.hot.*) - *(.text .stub .text.* .gnu.linkonce.t.*) - /* .gnu.warning sections are handled specially by elf32.em. */ - *(.gnu.warning) - } - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } - .rodata1 : { *(.rodata1) } - .eh_frame_hdr : { *(.eh_frame_hdr) } - .eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) } - .gcc_except_table : ONLY_IF_RO { *(.gcc_except_table - .gcc_except_table.*) } - /* These sections are generated by the Sun/Oracle C++ compiler. */ - .exception_ranges : ONLY_IF_RO { *(.exception_ranges - .exception_ranges*) } - /* Adjust the address for the data segment. We want to adjust up to - the same address within the page on the next page up. */ - . = ALIGN (CONSTANT (MAXPAGESIZE)) - ((CONSTANT (MAXPAGESIZE) - .) & (CONSTANT (MAXPAGESIZE) - 1)); . = DATA_SEGMENT_ALIGN (CONSTANT (MAXPAGESIZE), CONSTANT (COMMONPAGESIZE)); - /* Exception handling */ - .eh_frame : ONLY_IF_RW { KEEP (*(.eh_frame)) } - .gcc_except_table : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) } - .exception_ranges : ONLY_IF_RW { *(.exception_ranges .exception_ranges*) } - /* Thread Local Storage sections */ - .tdata : { *(.tdata .tdata.* .gnu.linkonce.td.*) } - .tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) } - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } - .jcr : { KEEP (*(.jcr)) } - .data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro .data.rel.ro.* .gnu.linkonce.d.rel.ro.*) } - .dynamic : { *(.dynamic) } - .got : { *(.got) *(.igot) } - . = DATA_SEGMENT_RELRO_END (SIZEOF (.got.plt) >= 24 ? 24 : 0, .); - .got.plt : { *(.got.plt) *(.igot.plt) } - .data : - { - *(.data .data.* .gnu.linkonce.d.*) - SORT(CONSTRUCTORS) - } - .data1 : { *(.data1) } - _edata = .; PROVIDE (edata = .); - . = .; - __bss_start = .; - .bss : - { - *(.dynbss) - *(.bss .bss.* .gnu.linkonce.b.*) - *(COMMON) - /* Align here to ensure that the .bss section occupies space up to - _end. Align after .bss to ensure correct alignment even if the - .bss section disappears because there are no input sections. - FIXME: Why do we need it? When there is no .bss section, we don't - pad the .data section. */ - . = ALIGN(. != 0 ? 64 / 8 : 1); - } - .lbss : - { - *(.dynlbss) - *(.lbss .lbss.* .gnu.linkonce.lb.*) - *(LARGE_COMMON) - } - . = ALIGN(64 / 8); - . = SEGMENT_START("ldata-segment", .); - .lrodata ALIGN(CONSTANT (MAXPAGESIZE)) + (. & (CONSTANT (MAXPAGESIZE) - 1)) : - { - *(.lrodata .lrodata.* .gnu.linkonce.lr.*) - } - .ldata ALIGN(CONSTANT (MAXPAGESIZE)) + (. & (CONSTANT (MAXPAGESIZE) - 1)) : - { - *(.ldata .ldata.* .gnu.linkonce.l.*) - . = ALIGN(. != 0 ? 64 / 8 : 1); - } - . = ALIGN(64 / 8); - _end = .; PROVIDE (end = .); - . = DATA_SEGMENT_END (.); - /* Stabs debugging sections. */ - .stab 0 : { *(.stab) } - .stabstr 0 : { *(.stabstr) } - .stab.excl 0 : { *(.stab.excl) } - .stab.exclstr 0 : { *(.stab.exclstr) } - .stab.index 0 : { *(.stab.index) } - .stab.indexstr 0 : { *(.stab.indexstr) } - .comment 0 : { *(.comment) } - /* DWARF debug sections. - Symbols in the DWARF debugging sections are relative to the beginning - of the section so we begin them at 0. */ - /* DWARF 1 */ - .debug 0 : { *(.debug) } - .line 0 : { *(.line) } - /* GNU DWARF 1 extensions */ - .debug_srcinfo 0 : { *(.debug_srcinfo) } - .debug_sfnames 0 : { *(.debug_sfnames) } - /* DWARF 1.1 and DWARF 2 */ - .debug_aranges 0 : { *(.debug_aranges) } - .debug_pubnames 0 : { *(.debug_pubnames) } - /* DWARF 2 */ - .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } - .debug_abbrev 0 : { *(.debug_abbrev) } - .debug_line 0 : { *(.debug_line .debug_line.* .debug_line_end ) } - .debug_frame 0 : { *(.debug_frame) } - .debug_str 0 : { *(.debug_str) } - .debug_loc 0 : { *(.debug_loc) } - .debug_macinfo 0 : { *(.debug_macinfo) } - /* SGI/MIPS DWARF 2 extensions */ - .debug_weaknames 0 : { *(.debug_weaknames) } - .debug_funcnames 0 : { *(.debug_funcnames) } - .debug_typenames 0 : { *(.debug_typenames) } - .debug_varnames 0 : { *(.debug_varnames) } - /* DWARF 3 */ - .debug_pubtypes 0 : { *(.debug_pubtypes) } - .debug_ranges 0 : { *(.debug_ranges) } - /* DWARF Extension. */ - .debug_macro 0 : { *(.debug_macro) } - .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) } - /DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) } -} diff --git a/waterbox/libc/COPYING.CC0 b/waterbox/libc/COPYING.CC0 deleted file mode 100644 index 1625c17936..0000000000 --- a/waterbox/libc/COPYING.CC0 +++ /dev/null @@ -1,121 +0,0 @@ -Creative Commons Legal Code - -CC0 1.0 Universal - - CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE - LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN - ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS - INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES - REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS - PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM - THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED - HEREUNDER. - -Statement of Purpose - -The laws of most jurisdictions throughout the world automatically confer -exclusive Copyright and Related Rights (defined below) upon the creator -and subsequent owner(s) (each and all, an "owner") of an original work of -authorship and/or a database (each, a "Work"). - -Certain owners wish to permanently relinquish those rights to a Work for -the purpose of contributing to a commons of creative, cultural and -scientific works ("Commons") that the public can reliably and without fear -of later claims of infringement build upon, modify, incorporate in other -works, reuse and redistribute as freely as possible in any form whatsoever -and for any purposes, including without limitation commercial purposes. -These owners may contribute to the Commons to promote the ideal of a free -culture and the further production of creative, cultural and scientific -works, or to gain reputation or greater distribution for their Work in -part through the use and efforts of others. - -For these and/or other purposes and motivations, and without any -expectation of additional consideration or compensation, the person -associating CC0 with a Work (the "Affirmer"), to the extent that he or she -is an owner of Copyright and Related Rights in the Work, voluntarily -elects to apply CC0 to the Work and publicly distribute the Work under its -terms, with knowledge of his or her Copyright and Related Rights in the -Work and the meaning and intended legal effect of CC0 on those rights. - -1. Copyright and Related Rights. A Work made available under CC0 may be -protected by copyright and related or neighboring rights ("Copyright and -Related Rights"). Copyright and Related Rights include, but are not -limited to, the following: - - i. the right to reproduce, adapt, distribute, perform, display, - communicate, and translate a Work; - ii. moral rights retained by the original author(s) and/or performer(s); -iii. publicity and privacy rights pertaining to a person's image or - likeness depicted in a Work; - iv. rights protecting against unfair competition in regards to a Work, - subject to the limitations in paragraph 4(a), below; - v. rights protecting the extraction, dissemination, use and reuse of data - in a Work; - vi. database rights (such as those arising under Directive 96/9/EC of the - European Parliament and of the Council of 11 March 1996 on the legal - protection of databases, and under any national implementation - thereof, including any amended or successor version of such - directive); and -vii. other similar, equivalent or corresponding rights throughout the - world based on applicable law or treaty, and any national - implementations thereof. - -2. Waiver. To the greatest extent permitted by, but not in contravention -of, applicable law, Affirmer hereby overtly, fully, permanently, -irrevocably and unconditionally waives, abandons, and surrenders all of -Affirmer's Copyright and Related Rights and associated claims and causes -of action, whether now known or unknown (including existing as well as -future claims and causes of action), in the Work (i) in all territories -worldwide, (ii) for the maximum duration provided by applicable law or -treaty (including future time extensions), (iii) in any current or future -medium and for any number of copies, and (iv) for any purpose whatsoever, -including without limitation commercial, advertising or promotional -purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each -member of the public at large and to the detriment of Affirmer's heirs and -successors, fully intending that such Waiver shall not be subject to -revocation, rescission, cancellation, termination, or any other legal or -equitable action to disrupt the quiet enjoyment of the Work by the public -as contemplated by Affirmer's express Statement of Purpose. - -3. Public License Fallback. Should any part of the Waiver for any reason -be judged legally invalid or ineffective under applicable law, then the -Waiver shall be preserved to the maximum extent permitted taking into -account Affirmer's express Statement of Purpose. In addition, to the -extent the Waiver is so judged Affirmer hereby grants to each affected -person a royalty-free, non transferable, non sublicensable, non exclusive, -irrevocable and unconditional license to exercise Affirmer's Copyright and -Related Rights in the Work (i) in all territories worldwide, (ii) for the -maximum duration provided by applicable law or treaty (including future -time extensions), (iii) in any current or future medium and for any number -of copies, and (iv) for any purpose whatsoever, including without -limitation commercial, advertising or promotional purposes (the -"License"). The License shall be deemed effective as of the date CC0 was -applied by Affirmer to the Work. Should any part of the License for any -reason be judged legally invalid or ineffective under applicable law, such -partial invalidity or ineffectiveness shall not invalidate the remainder -of the License, and in such case Affirmer hereby affirms that he or she -will not (i) exercise any of his or her remaining Copyright and Related -Rights in the Work or (ii) assert any associated claims and causes of -action with respect to the Work, in either case contrary to Affirmer's -express Statement of Purpose. - -4. Limitations and Disclaimers. - - a. No trademark or patent rights held by Affirmer are waived, abandoned, - surrendered, licensed or otherwise affected by this document. - b. Affirmer offers the Work as-is and makes no representations or - warranties of any kind concerning the Work, express, implied, - statutory or otherwise, including without limitation warranties of - title, merchantability, fitness for a particular purpose, non - infringement, or the absence of latent or other defects, accuracy, or - the present or absence of errors, whether or not discoverable, all to - the greatest extent permissible under applicable law. - c. Affirmer disclaims responsibility for clearing rights of other persons - that may apply to the Work or any use thereof, including without - limitation any person's Copyright and Related Rights in the Work. - Further, Affirmer disclaims responsibility for obtaining any necessary - consents, permissions or other rights required for any use of the - Work. - d. Affirmer understands and acknowledges that Creative Commons is not a - party to this document and has no duty or obligation with respect to - this CC0 or use of the Work. \ No newline at end of file diff --git a/waterbox/libc/Makefile b/waterbox/libc/Makefile deleted file mode 100644 index 9513cf7568..0000000000 --- a/waterbox/libc/Makefile +++ /dev/null @@ -1,41 +0,0 @@ -CC:=gcc -TARGET:=emulibc.a - -CFLAGS:=-Wall -Wextra -pedantic -Wno-unused-parameter -Wshadow \ - -Wpointer-arith -Wwrite-strings -Wmissing-declarations \ - -Wno-long-long -Wuninitialized -Wno-deprecated-declarations \ - -Wredundant-decls -Winline -Wcast-align -Wno-format \ - -Wnested-externs -Wstrict-prototypes -Wmissing-prototypes \ - -Wno-unused-but-set-variable -Wno-parentheses \ - -Iinternals -Iincludes -Icompileincludes \ - -ffreestanding -std=c11 -D_PDCLIB_BUILD -nostdinc -nostdlib \ - -mcmodel=large -O2 - -ROOT_DIR:=$(shell dirname $(realpath $(lastword $(MAKEFILE_LIST)))) -SRCS:=$(shell find $(ROOT_DIR) -type f -name '*.c' -o -name '*.s') -OBJ_DIR:=$(ROOT_DIR)/obj - -_OBJS:=$(SRCS:.c=.o) -_OBJS:=$(_OBJS:.s=.o) -OBJS:=$(patsubst $(ROOT_DIR)%,$(OBJ_DIR)%,$(_OBJS)) - -$(OBJ_DIR)/%.o: %.c - @mkdir -p $(@D) - @$(CC) -c -o $@ $< $(CFLAGS) - -$(OBJ_DIR)/%.o: %.s - @mkdir -p $(@D) - @$(CC) -c -o $@ $< $(CFLAGS) - -$(TARGET): $(OBJS) - @ar rcs $@ $^ - -all: $(TARGET) - -.PHONY: clean all - -clean: - rm -rf $(OBJ_DIR) - rm -f $(TARGET) - -print-% : ; @echo $* = $($*) diff --git a/waterbox/libc/Notes.txt b/waterbox/libc/Notes.txt deleted file mode 100644 index ceb68b9d91..0000000000 --- a/waterbox/libc/Notes.txt +++ /dev/null @@ -1,110 +0,0 @@ -Credits -======= - -The vast majority of PDCLib is original work by me. I felt it was the only way -to ensure that the code was indeed free of third-party rights, and thus free to -be released into the Public Domain. - -Another issue was that of coding style, quality and stability of the code, and -the urge to really understand every miniscule part of the code as to be able to -maintain it well once v1.0 has been released. - -That is not to say there are no credits to be given. To the contrary: - -Paul Edwards (author of the PDPCLIB), for inspirational code fragments, thanks. - -P.J. Plauger (author of "The Standard C Library"), for a book without which I -would not have been able to create PDCLib at this quality, thanks. - -Paul Bourke (author of mathlib), for allowing me access to a complete math -library under public domain terms so I could use it as a reference, thanks. - -Peter ("Candy") Bindels (netizen of osdev.org), who located a copy of Cody -& Waite's "Software Manual for the Elementary Functions" for me and saved me -serious cash in the process, thanks. - -Michael Moody, who contributed the generic implementation for to -the Public Domain which can now be found in <_PDCLIB_config.h>, thanks. - -Rod Pemberton, for pointing out several flaws in early versions of PDCLib and -giving other valuable hints, thanks. - -Brian Damgaard, for a very friendly exchange over the fine details of the -Quicksort algorithm and its implementation in PDCLib, thanks. - -Rink Springer, for very precise bug reports including patches, and a heads-up -on the capabilities of PDCLib when I most needed it, thanks. - -Everyone involved in the first, "public" attempt at PDCLib, for bearing with me -when I restarted from scratch, thanks. - -Everyone bearing with me during the "stdio block", a period of many years in -which PDCLib received not a single update because I was stuck and could not -find the time and energy to work it out. - -Lennart Frid�n and Sammy Nordstr�m, who have been great pals even after I sunk -some other project that had eaten countless hours of work between the three of -us, thanks. - -My wife, daughter, and son for sharing husband and daddy with this strange -machine, thanks. - - -Style -===== - -I followed a set of guidelines in creating PDCLib. If you find some piece that -does not adhere to them, that's a bug worth reporting. I mean it. I am a bit -obsessive when it comes to coding style. ;-) - -- All the stuff that is not part of the standard specification is "hidden" in - the _PDCLIB_* namespace - functions, variables, macros, files, directories. - This is to make it easier to distinguish between what the standard dictates - and what I added to make PDCLib work. - -- Any internal includes (i.e. those not specified by the standard) have their - header guards defined in the *including* file, for a tiny bit of compile-time - performance. - -- I always try to minimize the use of local variables. Wherever possible I used - parameters passed by-value directly, and deferred declaration of locals to the - innermost block of statements, in hopes that it might reduce memory footprint - when the library is compiled with a compiler that is not that great at - optimization. - -- Every function, every static data item that could possibly be shared, got its - own implementation file. This means the library itself is probably larger than - strictly necessary, and might take a couple of clock cycles longer to link, - but it reduces size of object files and executables. - -- Where possible, I tried to share functionality between similar functions (as - can be seen in the atoi() and strtol() function families). This means one or - two additional function calls, but again reduces memory footprint and eases - maintenance of the library. - -- Function arguments are named exactly as in the standard document. - -- The standard is taken quite literally in places. For example, the default - implementations of memcpy() really copies char-wise. This runs contrary to - earlier claims of performance, but is consistent with the *letter* of the - standard, and you will probably use your compiler builtins (through a platform - overlay) anyhow. - -- Every file has an Id tag, so that it is on file for *every* code file. - -- PDCLib code has no bias towards POSIX; indeed the absence of POSIX tidbits is - one of its hallmarks. However, PDCLib also has no bias *against* POSIX, and - when one platform abstraction is as good as another, I chose the POSIX one for - sheer familiarity. (This is mainly referring to naming and parameter lists of - OS "glue" functions.) - -- Identifiers are tersely named, but not cryptically abbreviated, and should be - intuitive enough to allow easy understanding of PDCLib inner workings. - -- I disagree with the notion that good code needs no comments. Code tells you - *how*, but not the *why*, and you have to figure out the *what* yourself. So - I added comments to every nontrivial piece of code explaining my motives and - hopefully keeping overly ambitious editors from repeating my mistakes. The - header files especially should be self-documenting to the point of being a - suitable replacement for any library reference book you might be using. - diff --git a/waterbox/libc/UNICODE DATA LICENSE.txt b/waterbox/libc/UNICODE DATA LICENSE.txt deleted file mode 100644 index c33d814a62..0000000000 --- a/waterbox/libc/UNICODE DATA LICENSE.txt +++ /dev/null @@ -1,46 +0,0 @@ -Unicode Data Files include all data files under the directories -http://www.unicode.org/Public/, http://www.unicode.org/reports/, and -http://www.unicode.org/cldr/data/. Unicode Data Files do not include PDF online -code charts under the directory http://www.unicode.org/Public/. Software -includes any source code published in the Unicode Standard or under the -directories http://www.unicode.org/Public/, http://www.unicode.org/reports/, and -http://www.unicode.org/cldr/data/. - -NOTICE TO USER: Carefully read the following legal agreement. BY DOWNLOADING, -INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S DATA FILES ("DATA FILES"), -AND/OR SOFTWARE ("SOFTWARE"), YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND -BY, ALL OF THE TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE, DO -NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWAR. - -COPYRIGHT AND PERMISSION NOTICE - -Copyright © 1991-2013 Unicode, Inc. All rights reserved. Distributed under the -Terms of Use in http://www.unicode.org/copyright.html. - -Permission is hereby granted, free of charge, to any person obtaining a copy of -the Unicode data files and any associated documentation (the "Data Files") or -Unicode software and any associated documentation (the "Software") to deal in -the Data Files or Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, and/or sell copies of -the Data Files or Software, and to permit persons to whom the Data Files or -Software are furnished to do so, provided that (a) the above copyright notice(s) -and this permission notice appear with all copies of the Data Files or Software, -(b) both the above copyright notice(s) and this permission notice appear in -associated documentation, and (c) there is clear notice in each modified Data -File or in the Software as well as in the documentation associated with the Data -File(s) or Software that the data or software has been modified. - -THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD -PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS -NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL -DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING -OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA FILES OR -SOFTWARE. - -Except as contained in this notice, the name of a copyright holder shall not be -used in advertising or otherwise to promote the sale, use or other dealings in -these Data Files or Software without prior written authorization of the -copyright holder. diff --git a/waterbox/libc/compileincludes/libm.h b/waterbox/libc/compileincludes/libm.h deleted file mode 100644 index 1f3ee7b204..0000000000 --- a/waterbox/libc/compileincludes/libm.h +++ /dev/null @@ -1,188 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/math_private.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. - * ==================================================== - */ - -#ifndef _LIBM_H -#define _LIBM_H - -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif - -#include -#include -#include -#include -#include - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384 && __BYTE_ORDER == __LITTLE_ENDIAN -union ldshape { - long double f; - struct { - uint64_t m; - uint16_t se; - } i; -}; -#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384 && __BYTE_ORDER == __LITTLE_ENDIAN -union ldshape { - long double f; - struct { - uint64_t lo; - uint32_t mid; - uint16_t top; - uint16_t se; - } i; - struct { - uint64_t lo; - uint64_t hi; - } i2; -}; -#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384 && __BYTE_ORDER == __BIG_ENDIAN -union ldshape { - long double f; - struct { - uint16_t se; - uint16_t top; - uint32_t mid; - uint64_t lo; - } i; - struct { - uint64_t hi; - uint64_t lo; - } i2; -}; -#else -#error Unsupported long double representation -#endif - -#define FORCE_EVAL(x) do { \ - if (sizeof(x) == sizeof(float)) { \ - volatile float __x; \ - __x = (x); \ - } else if (sizeof(x) == sizeof(double)) { \ - volatile double __x; \ - __x = (x); \ - } else { \ - volatile long double __x; \ - __x = (x); \ - } \ -} while(0) - -/* Get two 32 bit ints from a double. */ -#define EXTRACT_WORDS(hi,lo,d) \ -do { \ - union {double f; uint64_t i;} __u; \ - __u.f = (d); \ - (hi) = __u.i >> 32; \ - (lo) = (uint32_t)__u.i; \ -} while (0) - -/* Get the more significant 32 bit int from a double. */ -#define GET_HIGH_WORD(hi,d) \ -do { \ - union {double f; uint64_t i;} __u; \ - __u.f = (d); \ - (hi) = __u.i >> 32; \ -} while (0) - -/* Get the less significant 32 bit int from a double. */ -#define GET_LOW_WORD(lo,d) \ -do { \ - union {double f; uint64_t i;} __u; \ - __u.f = (d); \ - (lo) = (uint32_t)__u.i; \ -} while (0) - -/* Set a double from two 32 bit ints. */ -#define INSERT_WORDS(d,hi,lo) \ -do { \ - union {double f; uint64_t i;} __u; \ - __u.i = ((uint64_t)(hi)<<32) | (uint32_t)(lo); \ - (d) = __u.f; \ -} while (0) - -/* Set the more significant 32 bits of a double from an int. */ -#define SET_HIGH_WORD(d,hi) \ -do { \ - union {double f; uint64_t i;} __u; \ - __u.f = (d); \ - __u.i &= 0xffffffff; \ - __u.i |= (uint64_t)(hi) << 32; \ - (d) = __u.f; \ -} while (0) - -/* Set the less significant 32 bits of a double from an int. */ -#define SET_LOW_WORD(d,lo) \ -do { \ - union {double f; uint64_t i;} __u; \ - __u.f = (d); \ - __u.i &= 0xffffffff00000000ull; \ - __u.i |= (uint32_t)(lo); \ - (d) = __u.f; \ -} while (0) - -/* Get a 32 bit int from a float. */ -#define GET_FLOAT_WORD(w,d) \ -do { \ - union {float f; uint32_t i;} __u; \ - __u.f = (d); \ - (w) = __u.i; \ -} while (0) - -/* Set a float from a 32 bit int. */ -#define SET_FLOAT_WORD(d,w) \ -do { \ - union {float f; uint32_t i;} __u; \ - __u.i = (w); \ - (d) = __u.f; \ -} while (0) - -#undef __CMPLX -#undef CMPLX -#undef CMPLXF -#undef CMPLXL - -#define __CMPLX(x, y, t) \ - ((union { _Complex t __z; t __xy[2]; }){.__xy = {(x),(y)}}.__z) - -#define CMPLX(x, y) __CMPLX(x, y, double) -#define CMPLXF(x, y) __CMPLX(x, y, float) -#define CMPLXL(x, y) __CMPLX(x, y, long double) - -/* fdlibm kernel functions */ - -int __rem_pio2_large(double*,double*,int,int,int); - -int __rem_pio2(double,double*); -double __sin(double,double,int); -double __cos(double,double); -double __tan(double,double,int); -double __expo2(double); -double complex __ldexp_cexp(double complex,int); - -int __rem_pio2f(float,double*); -float __sindf(double); -float __cosdf(double); -float __tandf(double,int); -float __expo2f(float); -float complex __ldexp_cexpf(float complex,int); - -int __rem_pio2l(long double, long double *); -long double __sinl(long double, long double, int); -long double __cosl(long double, long double); -long double __tanl(long double, long double, int); - -/* polynomial evaluation */ -long double __polevll(long double, const long double *, int); -long double __p1evll(long double, const long double *, int); - -#endif diff --git a/waterbox/libc/compileincludes/readme.txt b/waterbox/libc/compileincludes/readme.txt deleted file mode 100644 index ccf1e5fe26..0000000000 --- a/waterbox/libc/compileincludes/readme.txt +++ /dev/null @@ -1 +0,0 @@ -includes for compiling the library only \ No newline at end of file diff --git a/waterbox/libc/functions/_PDCLIB/Readme.txt b/waterbox/libc/functions/_PDCLIB/Readme.txt deleted file mode 100644 index 46796879c0..0000000000 --- a/waterbox/libc/functions/_PDCLIB/Readme.txt +++ /dev/null @@ -1,11 +0,0 @@ -This directory holds various "internals" of PDCLib: - -- definitions of helper functions not specified by the standard (hidden in the - _PDCLIB_* namespace); - -- definitions of data objects, both internal (like digits.c) and specified by - the standard (errno.c); - -- test drivers for functionality that does not have its own implementation - file to put the test driver in. - diff --git a/waterbox/libc/functions/_PDCLIB/_PDCLIB_ascii.c b/waterbox/libc/functions/_PDCLIB/_PDCLIB_ascii.c deleted file mode 100644 index ac5a593d96..0000000000 --- a/waterbox/libc/functions/_PDCLIB/_PDCLIB_ascii.c +++ /dev/null @@ -1,139 +0,0 @@ -/* ASCII codec - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#ifndef REGTEST -#include -#include "_PDCLIB_encoding.h" - -static bool ascii_mbsinit( const mbstate_t *ps ) -{ return 1; } - -static bool asciitoc32( - char32_t *restrict *restrict p_outbuf, - size_t *restrict p_outsz, - const char *restrict *restrict p_inbuf, - size_t *restrict p_insz, - mbstate_t *restrict p_ps -) -{ - while(*p_outsz && *p_insz) { - unsigned char c = **p_inbuf; - if(c > 127) - return false; - - if(p_outbuf) { - **p_outbuf = c; - (*p_outbuf)++; - } - - (*p_inbuf)++; - (*p_insz)--; - (*p_outsz)--; - } - return true; -} - -static bool c32toascii( - char *restrict *restrict p_outbuf, - size_t *restrict p_outsz, - const char32_t *restrict *restrict p_inbuf, - size_t *restrict p_insz, - mbstate_t *restrict p_ps -) -{ - while(*p_outsz && *p_insz) { - char32_t c = **p_inbuf; - if(c > 127) - return false; - - if(p_outbuf) { - **p_outbuf = c; - (*p_outbuf)++; - } - - (*p_inbuf)++; - (*p_insz)--; - (*p_outsz)--; - } - return true; -} - -const struct _PDCLIB_charcodec_t _PDCLIB_ascii_codec = { - .__mbsinit = ascii_mbsinit, - .__mbstoc32s = asciitoc32, - .__c32stombs = c32toascii, - .__mb_max = 1, -}; - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ -#ifndef REGTEST - // Valid conversion & back - - char32_t c32out[5]; - - char32_t *c32ptr = &c32out[0]; - size_t c32rem = 5; - char *chrptr = (char*) &abcde[0]; - size_t chrrem = 5; - mbstate_t mbs = { 0 }; - - TESTCASE(asciitoc32(&c32ptr, &c32rem, &chrptr, &chrrem, &mbs) == true); - TESTCASE(c32rem == 0); - TESTCASE(chrrem == 0); - TESTCASE(c32ptr == &c32out[5]); - TESTCASE(chrptr == &abcde[5]); - TESTCASE(c32out[0] == 'a' && c32out[1] == 'b' && c32out[2] == 'c' && \ - c32out[3] == 'd' && c32out[4] == 'e'); - - char chrout[5]; - c32ptr = &c32out[0]; - c32rem = 5; - chrptr = &chrout[0]; - chrrem = 5; - - - TESTCASE(c32toascii(&chrptr, &chrrem, &c32ptr, &c32rem, &mbs) == true); - TESTCASE(c32rem == 0); - TESTCASE(chrrem == 0); - TESTCASE(c32ptr == &c32out[5]); - TESTCASE(chrptr == &chrout[5]); - TESTCASE(memcmp(chrout, abcde, 5) == 0); - - // Invalid conversions - char badascii = '\xC0'; - c32ptr = &c32out[0]; - c32rem = 5; - chrptr = &badascii; - chrrem = 1; - TESTCASE(asciitoc32(&c32ptr, &c32rem, &chrptr, &chrrem, &mbs) == false); - TESTCASE(c32ptr == &c32out[0]); - TESTCASE(c32rem == 5); - TESTCASE(chrptr == &badascii); - TESTCASE(chrrem == 1); - - char32_t baduni = 0xC0; - c32ptr = &baduni; - c32rem = 1; - chrptr = &chrout[0]; - chrrem = 5; - TESTCASE(c32toascii(&chrptr, &chrrem, &c32ptr, &c32rem, &mbs) == false); - TESTCASE(c32ptr == &baduni); - TESTCASE(c32rem == 1); - TESTCASE(chrptr == &chrout[0]); - TESTCASE(chrrem == 5); -#endif - return TEST_RESULTS; -} - -#endif - diff --git a/waterbox/libc/functions/_PDCLIB/_PDCLIB_atomax.c b/waterbox/libc/functions/_PDCLIB/_PDCLIB_atomax.c deleted file mode 100644 index 053f776b0f..0000000000 --- a/waterbox/libc/functions/_PDCLIB/_PDCLIB_atomax.c +++ /dev/null @@ -1,44 +0,0 @@ -/* _PDCLIB_atomax( const char * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#ifndef REGTEST -#include "_PDCLIB_int.h" -#include -#include - -_PDCLIB_intmax_t _PDCLIB_atomax( const char * s ) -{ - _PDCLIB_intmax_t rc = 0; - char sign = '+'; - const char * x; - /* TODO: In other than "C" locale, additional patterns may be defined */ - while ( isspace( *s ) ) ++s; - if ( *s == '+' ) ++s; - else if ( *s == '-' ) sign = *(s++); - /* TODO: Earlier version was missing tolower() but was not caught by tests */ - while ( ( x = memchr( _PDCLIB_digits, tolower(*(s++)), 10 ) ) != NULL ) - { - rc = rc * 10 + ( x - _PDCLIB_digits ); - } - return ( sign == '+' ) ? rc : -rc; -} -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ -#ifndef REGTEST - /* basic functionality */ - TESTCASE( _PDCLIB_atomax( "123" ) == 123 ); - /* testing skipping of leading whitespace and trailing garbage */ - TESTCASE( _PDCLIB_atomax( " \n\v\t\f123xyz" ) == 123 ); -#endif - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/_PDCLIB/_PDCLIB_closeall.c b/waterbox/libc/functions/_PDCLIB/_PDCLIB_closeall.c deleted file mode 100644 index 5f62ca183a..0000000000 --- a/waterbox/libc/functions/_PDCLIB/_PDCLIB_closeall.c +++ /dev/null @@ -1,36 +0,0 @@ -/* _PDCLIB_closeall( void ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST -#include "_PDCLIB_io.h" -extern _PDCLIB_file_t * _PDCLIB_filelist; - -void _PDCLIB_closeall( void ) -{ - _PDCLIB_file_t * stream = _PDCLIB_filelist; - _PDCLIB_file_t * next; - while ( stream != NULL ) - { - next = stream->next; - fclose( stream ); - stream = next; - } -} -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - /* No testdriver */ - return TEST_RESULTS; -} - -#endif - diff --git a/waterbox/libc/functions/_PDCLIB/_PDCLIB_digits.c b/waterbox/libc/functions/_PDCLIB/_PDCLIB_digits.c deleted file mode 100644 index 1e3d6ab163..0000000000 --- a/waterbox/libc/functions/_PDCLIB/_PDCLIB_digits.c +++ /dev/null @@ -1,30 +0,0 @@ -/* _PDCLIB_digits - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#ifndef REGTEST -#include "_PDCLIB_int.h" -#endif - -char _PDCLIB_digits[] = "0123456789abcdefghijklmnopqrstuvwxyz"; - -/* For _PDCLIB/print.c only; obsolete with ctype.h */ -char _PDCLIB_Xdigits[] = "0123456789ABCDEF"; - -#ifdef TEST -#include "_PDCLIB_test.h" - -#include - -int main( void ) -{ -#ifndef REGTEST - TESTCASE( strcmp( _PDCLIB_digits, "0123456789abcdefghijklmnopqrstuvwxyz" ) == 0 ); - TESTCASE( strcmp( _PDCLIB_Xdigits, "0123456789ABCDEF" ) == 0 ); -#endif - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/_PDCLIB/_PDCLIB_fileops.c b/waterbox/libc/functions/_PDCLIB/_PDCLIB_fileops.c deleted file mode 100644 index bfe3d85b63..0000000000 --- a/waterbox/libc/functions/_PDCLIB/_PDCLIB_fileops.c +++ /dev/null @@ -1,56 +0,0 @@ -/* _PDCLIB_fileops - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#ifndef REGTEST -#include -#include -#include "_PDCLIB_glue.h" -#include - -static bool readf( _PDCLIB_fd_t self, void * buf, size_t length, - size_t * numBytesRead ) -{ - errno = ENOTSUP; - return false; -} - -static bool writef( _PDCLIB_fd_t self, const void * buf, size_t length, - size_t * numBytesWritten ) -{ - errno = ENOTSUP; - return false; -} -static bool seekf( _PDCLIB_fd_t self, int_fast64_t offset, int whence, - int_fast64_t* newPos ) -{ - errno = ENOTSUP; - return false; -} - -static void closef( _PDCLIB_fd_t self ) -{ - errno = ENOTSUP; -} - -const _PDCLIB_fileops_t _PDCLIB_fileops = { - .read = readf, - .write = writef, - .seek = seekf, - .close = closef, -}; - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - // Tested by stdio test cases - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/_PDCLIB/_PDCLIB_initclocale.c b/waterbox/libc/functions/_PDCLIB/_PDCLIB_initclocale.c deleted file mode 100644 index d7cf35063f..0000000000 --- a/waterbox/libc/functions/_PDCLIB/_PDCLIB_initclocale.c +++ /dev/null @@ -1,29 +0,0 @@ -/* _PDCLIB_initclocale( locale_t ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#ifndef REGTEST -#include "_PDCLIB_clocale.h" -#include "_PDCLIB_locale.h" - -void _PDCLIB_initclocale( locale_t l ) -{ - // TODO: There will be more added here... - - l->_WCType = _PDCLIB_wcinfo; - l->_WCTypeSize = _PDCLIB_wcinfo_size; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main() -{ - return TEST_RESULTS; -} - -#endif \ No newline at end of file diff --git a/waterbox/libc/functions/_PDCLIB/_PDCLIB_latin1.c b/waterbox/libc/functions/_PDCLIB/_PDCLIB_latin1.c deleted file mode 100644 index dba6ae9ce1..0000000000 --- a/waterbox/libc/functions/_PDCLIB/_PDCLIB_latin1.c +++ /dev/null @@ -1,126 +0,0 @@ -/* Latin-1 codec - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#ifndef REGTEST -#include -#include "_PDCLIB_encoding.h" - -static bool latin1_mbsinit( const mbstate_t *ps ) -{ return 1; } - -static bool latin1toc32( - char32_t *restrict *restrict p_outbuf, - size_t *restrict p_outsz, - const char *restrict *restrict p_inbuf, - size_t *restrict p_insz, - mbstate_t *restrict p_ps -) -{ - while(*p_outsz && *p_insz) { - unsigned char c = **p_inbuf; - - if(p_outbuf) { - **p_outbuf = c; - (*p_outbuf)++; - } - - (*p_inbuf)++; - (*p_insz)--; - (*p_outsz)--; - } - return true; -} - -static bool c32tolatin1( - char *restrict *restrict p_outbuf, - size_t *restrict p_outsz, - const char32_t *restrict *restrict p_inbuf, - size_t *restrict p_insz, - mbstate_t *restrict p_ps -) -{ - while(*p_outsz && *p_insz) { - char32_t c = **p_inbuf; - if(c > 255) - return false; - - if(p_outbuf) { - **p_outbuf = c; - (*p_outbuf)++; - } - - (*p_inbuf)++; - (*p_insz)--; - (*p_outsz)--; - } - return true; -} - -const struct _PDCLIB_charcodec_t _PDCLIB_latin1_codec = { - .__mbsinit = latin1_mbsinit, - .__mbstoc32s = latin1toc32, - .__c32stombs = c32tolatin1, - .__mb_max = 1, -}; - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ -#ifndef REGTEST - // Valid conversion & back - - char32_t c32out[5]; - - char32_t *c32ptr = &c32out[0]; - size_t c32rem = 5; - char *chrptr = (char*) &abcde[0]; - size_t chrrem = 5; - mbstate_t mbs = { 0 }; - - TESTCASE(latin1toc32(&c32ptr, &c32rem, &chrptr, &chrrem, &mbs) == true); - TESTCASE(c32rem == 0); - TESTCASE(chrrem == 0); - TESTCASE(c32ptr == &c32out[5]); - TESTCASE(chrptr == &abcde[5]); - TESTCASE(c32out[0] == 'a' && c32out[1] == 'b' && c32out[2] == 'c' && \ - c32out[3] == 'd' && c32out[4] == 'e'); - - char chrout[5]; - c32ptr = &c32out[0]; - c32rem = 5; - chrptr = &chrout[0]; - chrrem = 5; - - - TESTCASE(c32tolatin1(&chrptr, &chrrem, &c32ptr, &c32rem, &mbs) == true); - TESTCASE(c32rem == 0); - TESTCASE(chrrem == 0); - TESTCASE(c32ptr == &c32out[5]); - TESTCASE(chrptr == &chrout[5]); - TESTCASE(memcmp(chrout, abcde, 5) == 0); - - // Invalid conversions - char32_t baduni = 0xFFFE; - c32ptr = &baduni; - c32rem = 1; - chrptr = &chrout[0]; - chrrem = 5; - TESTCASE(c32tolatin1(&chrptr, &chrrem, &c32ptr, &c32rem, &mbs) == false); - TESTCASE(c32ptr == &baduni); - TESTCASE(c32rem == 1); - TESTCASE(chrptr == &chrout[0]); - TESTCASE(chrrem == 5); -#endif - return TEST_RESULTS; -} - -#endif - diff --git a/waterbox/libc/functions/_PDCLIB/_PDCLIB_open.c b/waterbox/libc/functions/_PDCLIB/_PDCLIB_open.c deleted file mode 100644 index 117d149c76..0000000000 --- a/waterbox/libc/functions/_PDCLIB/_PDCLIB_open.c +++ /dev/null @@ -1,37 +0,0 @@ -/* _PDCLIB_open( char const * const, int ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -/* This is a stub implementation of open. -*/ - -#include -#include - -#ifndef REGTEST -#include "_PDCLIB_glue.h" - -bool _PDCLIB_open( _PDCLIB_fd_t * pFd, const _PDCLIB_fileops_t ** pOps, - char const * const filename, unsigned int mode ) -{ - errno = ENOTSUP; - return false; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -#include -#include - -int main( void ) -{ - return TEST_RESULTS; -} - -#endif - diff --git a/waterbox/libc/functions/_PDCLIB/_PDCLIB_seed.c b/waterbox/libc/functions/_PDCLIB/_PDCLIB_seed.c deleted file mode 100644 index 37c9b47988..0000000000 --- a/waterbox/libc/functions/_PDCLIB/_PDCLIB_seed.c +++ /dev/null @@ -1,18 +0,0 @@ -/* _PDCLIB_seed - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -unsigned long int _PDCLIB_seed = 1; - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - /* no tests for raw data */ - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/_PDCLIB/_PDCLIB_strtox_main.c b/waterbox/libc/functions/_PDCLIB/_PDCLIB_strtox_main.c deleted file mode 100644 index cf9ae5e3a8..0000000000 --- a/waterbox/libc/functions/_PDCLIB/_PDCLIB_strtox_main.c +++ /dev/null @@ -1,85 +0,0 @@ -/* _PDCLIB_strtox_main( const char * *, int, _PDCLIB_uintmax_t, _PDCLIB_uintmax_t, int ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#include -#include -#include - -#ifndef REGTEST -#include "_PDCLIB_int.h" -_PDCLIB_uintmax_t _PDCLIB_strtox_main( const char ** p, unsigned int base, uintmax_t error, uintmax_t limval, int limdigit, char * sign ) -{ - _PDCLIB_uintmax_t rc = 0; - int digit = -1; - const char * x; - while ( ( x = memchr( _PDCLIB_digits, tolower(**p), base ) ) != NULL ) - { - digit = x - _PDCLIB_digits; - if ( ( rc < limval ) || ( ( rc == limval ) && ( digit <= limdigit ) ) ) - { - rc = rc * base + (unsigned)digit; - ++(*p); - } - else - { - errno = ERANGE; - /* TODO: Only if endptr != NULL - but do we really want *another* parameter? */ - /* TODO: Earlier version was missing tolower() here but was not caught by tests */ - while ( memchr( _PDCLIB_digits, tolower(**p), base ) != NULL ) ++(*p); - /* TODO: This is ugly, but keeps caller from negating the error value */ - *sign = '+'; - return error; - } - } - if ( digit == -1 ) - { - *p = NULL; - return 0; - } - return rc; -} -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" -#include - -int main( void ) -{ -#ifndef REGTEST - const char * p; - char test[] = "123_"; - char fail[] = "xxx"; - char sign = '-'; - /* basic functionality */ - p = test; - errno = 0; - TESTCASE( _PDCLIB_strtox_main( &p, 10u, (uintmax_t)999, (uintmax_t)12, 3, &sign ) == 123 ); - TESTCASE( errno == 0 ); - TESTCASE( p == &test[3] ); - /* proper functioning to smaller base */ - p = test; - TESTCASE( _PDCLIB_strtox_main( &p, 8u, (uintmax_t)999, (uintmax_t)12, 3, &sign ) == 0123 ); - TESTCASE( errno == 0 ); - TESTCASE( p == &test[3] ); - /* overflowing subject sequence must still return proper endptr */ - p = test; - TESTCASE( _PDCLIB_strtox_main( &p, 4u, (uintmax_t)999, (uintmax_t)1, 2, &sign ) == 999 ); - TESTCASE( errno == ERANGE ); - TESTCASE( p == &test[3] ); - TESTCASE( sign == '+' ); - /* testing conversion failure */ - errno = 0; - p = fail; - sign = '-'; - TESTCASE( _PDCLIB_strtox_main( &p, 10u, (uintmax_t)999, (uintmax_t)99, 8, &sign ) == 0 ); - TESTCASE( p == NULL ); -#endif - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/_PDCLIB/_PDCLIB_strtox_prelim.c b/waterbox/libc/functions/_PDCLIB/_PDCLIB_strtox_prelim.c deleted file mode 100644 index 789409d2b9..0000000000 --- a/waterbox/libc/functions/_PDCLIB/_PDCLIB_strtox_prelim.c +++ /dev/null @@ -1,90 +0,0 @@ -/* _PDCLIB_strtox_prelim( const char *, char *, int * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#include -#include -#ifndef REGTEST -const char * _PDCLIB_strtox_prelim( const char * p, char * sign, int * base ) -{ - /* skipping leading whitespace */ - while ( isspace( *p ) ) ++p; - /* determining / skipping sign */ - if ( *p != '+' && *p != '-' ) *sign = '+'; - else *sign = *(p++); - /* determining base */ - if ( *p == '0' ) - { - ++p; - if ( ( *base == 0 || *base == 16 ) && ( *p == 'x' || *p == 'X' ) ) - { - *base = 16; - ++p; - /* catching a border case here: "0x" followed by a non-digit should - be parsed as the unprefixed zero. - We have to "rewind" the parsing; having the base set to 16 if it - was zero previously does not hurt, as the result is zero anyway. - */ - if ( memchr( _PDCLIB_digits, tolower(*p), *base ) == NULL ) - { - p -= 2; - } - } - else if ( *base == 0 ) - { - *base = 8; - } - else - { - --p; - } - } - else if ( ! *base ) - { - *base = 10; - } - return ( ( *base >= 2 ) && ( *base <= 36 ) ) ? p : NULL; -} -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ -#ifndef REGTEST - int base = 0; - char sign = '\0'; - char test1[] = " 123"; - char test2[] = "\t+0123"; - char test3[] = "\v-0x123"; - TESTCASE( _PDCLIB_strtox_prelim( test1, &sign, &base ) == &test1[2] ); - TESTCASE( sign == '+' ); - TESTCASE( base == 10 ); - base = 0; - sign = '\0'; - TESTCASE( _PDCLIB_strtox_prelim( test2, &sign, &base ) == &test2[3] ); - TESTCASE( sign == '+' ); - TESTCASE( base == 8 ); - base = 0; - sign = '\0'; - TESTCASE( _PDCLIB_strtox_prelim( test3, &sign, &base ) == &test3[4] ); - TESTCASE( sign == '-' ); - TESTCASE( base == 16 ); - base = 10; - sign = '\0'; - TESTCASE( _PDCLIB_strtox_prelim( test3, &sign, &base ) == &test3[2] ); - TESTCASE( sign == '-' ); - TESTCASE( base == 10 ); - base = 1; - TESTCASE( _PDCLIB_strtox_prelim( test3, &sign, &base ) == NULL ); - base = 37; - TESTCASE( _PDCLIB_strtox_prelim( test3, &sign, &base ) == NULL ); -#endif - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/_PDCLIB/_PDCLIB_utf8.c b/waterbox/libc/functions/_PDCLIB/_PDCLIB_utf8.c deleted file mode 100644 index a4c19adb34..0000000000 --- a/waterbox/libc/functions/_PDCLIB/_PDCLIB_utf8.c +++ /dev/null @@ -1,338 +0,0 @@ -/* UTF-8 codec - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#ifndef REGTEST -#include -#include -#include -#include -#include "_PDCLIB_encoding.h" - -/* Use of the mbstate: - * - * _StUC[0] is the current decoding state - * _St32[1] is the character accumulated so far - */ - -static bool utf8_mbsinit( const mbstate_t *p_s ) -{ return p_s->_StUC[0] == 0; } - -enum { - DecStart = 0, - - Dec2B2, - - Dec3B2, - Dec3B3, - - Dec4B2, - Dec4B3, - Dec4B4 -}; - -#define state (p_s->_StUC[0]) -#define accum (p_s->_St32[1]) - -#define START_CONVERSION \ - bool result = true; \ - -#define END_CONVERSION \ -end_conversion: \ - return result - -#define FINISH(_r) do { \ - result = (_r); \ - goto end_conversion; \ -} while(0) - -#define OUT32(_c) do { \ - if(p_outbuf) \ - (*((*p_outbuf)++)) = (_c); \ - (*p_outsz)--; \ - _PDCLIB_UNDEFINED(accum); \ - state = DecStart; \ -} while(0) - -#define CHECK_CONTINUATION \ - do { if((c & 0xC0) != 0x80) return false; } while(0) - -static bool utf8toc32( - char32_t *restrict *restrict p_outbuf, - size_t *restrict p_outsz, - const char *restrict *restrict p_inbuf, - size_t *restrict p_insz, - mbstate_t *restrict p_s -) -{ - START_CONVERSION - while(*p_outsz && *p_insz) { - unsigned char c = **p_inbuf; - char32_t c32; - switch(state) { - case DecStart: - // 1 byte - if(c <= 0x7F) { - OUT32(c); - } else if(c <= 0xDF) { - accum = (c & 0x1F) << 6; - state = Dec2B2; - } else if(c <= 0xEF) { - accum = (c & 0x0F) << 12; - state = Dec3B2; - } else if(c <= 0xF4) { - accum = (c & 0x07) << 18; - state = Dec4B2; - } else { - // 5+byte sequence illegal - FINISH(false); - } - break; - - case Dec2B2: - CHECK_CONTINUATION; - - c32 = accum | (c & 0x3F); - - // Overlong sequence (e.g. NUL injection) - if(c32 <= 0x7F) - FINISH(false); - - OUT32(c32); - break; - - case Dec3B2: - CHECK_CONTINUATION; - accum |= (c & 0x3F) << 6; - state = Dec3B3; - break; - - case Dec3B3: - CHECK_CONTINUATION; - - c32 = accum | (c & 0x3F); - - // Overlong - if(c32 <= 0x07FF) - FINISH(false); - - // Surrogate - if(c32 >= 0xD800 && c32 <= 0xDFFF) - FINISH(false); - - OUT32(c32); - break; - - case Dec4B2: - CHECK_CONTINUATION; - accum |= (c & 0x3F) << 12; - state = Dec4B3; - break; - - case Dec4B3: - CHECK_CONTINUATION; - accum |= (c & 0x3F) << 6; - state = Dec4B4; - break; - - case Dec4B4: - CHECK_CONTINUATION; - - c32 = accum | (c & 0x3F); - - // Overlong - if(c32 <= 0xFFFF) FINISH(false); - - // Not in Unicode - if(c32 > 0x10FFFF) FINISH(false); - - OUT32(c32); - break; - - default: - assert(!"Invalid state"); - } - - (*p_inbuf)++; - (*p_insz)--; - } - END_CONVERSION; -} - -enum { - EncStart = 0, - Enc1R, - Enc2R, - Enc3R, -}; - -static bool c32toutf8( - char *restrict *restrict p_outbuf, - size_t *restrict p_outsz, - const char32_t *restrict *restrict p_inbuf, - size_t *restrict p_insz, - mbstate_t *restrict p_s -) -{ - START_CONVERSION - while(*p_outsz) { - unsigned char outc = 0; - switch(state) { - case Enc3R: - outc = 0x80 | ((accum >> 12) & 0x3F); - state = Enc2R; - break; - - case Enc2R: - outc = 0x80 | ((accum >> 6) & 0x3F); - state = Enc1R; - break; - - case Enc1R: - outc = 0x80 | (accum & 0x3F); - state = EncStart; - _PDCLIB_UNDEFINED(accum); - break; - - case EncStart: - if(*p_insz == 0) - FINISH(true); - - accum = **p_inbuf; - (*p_inbuf)++; - (*p_insz)--; - - if(accum <= 0x7F) { - outc = accum; - state = EncStart; - _PDCLIB_UNDEFINED(accum); - } else if(accum <= 0x7FF) { - outc = 0xC0 | (accum >> 6); - state = Enc1R; - } else if(accum <= 0xFFFF) { - outc = 0xE0 | (accum >> 12); - state = Enc2R; - } else if(accum <= 0x10FFFF) { - outc = 0xF0 | (accum >> 18); - state = Enc3R; - } else { - FINISH(false); - } - break; - } - - if(p_outbuf) { - **p_outbuf = outc; - (*p_outbuf)++; - } - (*p_outsz)--; - } - END_CONVERSION; -} - -const struct _PDCLIB_charcodec_t _PDCLIB_utf8_codec = { - .__mbsinit = utf8_mbsinit, - .__mbstoc32s = utf8toc32, - .__c32stombs = c32toutf8, - .__mb_max = 4, -}; - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ -#ifndef REGTEST - // Valid conversion & back - - static const char* input = "abcde" "\xDF\xBF" "\xEF\xBF\xBF" - "\xF4\x8F\xBF\xBF"; - - char32_t c32out[8]; - - char32_t *c32ptr = &c32out[0]; - size_t c32rem = 8; - const char *chrptr = (char*) &input[0]; - size_t chrrem = strlen(input); - mbstate_t mbs = { 0 }; - - TESTCASE(utf8toc32(&c32ptr, &c32rem, &chrptr, &chrrem, &mbs)); - TESTCASE(c32rem == 0); - TESTCASE(chrrem == 0); - TESTCASE(c32ptr == &c32out[8]); - TESTCASE(chrptr == &input[strlen(input)]); - TESTCASE(c32out[0] == 'a' && c32out[1] == 'b' && c32out[2] == 'c' && - c32out[3] == 'd' && c32out[4] == 'e' && c32out[5] == 0x7FF && - c32out[6] == 0xFFFF && c32out[7] == 0x10FFFF); - - char chrout[strlen(input)]; - c32ptr = &c32out[0]; - c32rem = 8; - chrptr = &chrout[0]; - chrrem = strlen(input); - TESTCASE(c32toutf8(&chrptr, &chrrem, &c32ptr, &c32rem, &mbs)); - TESTCASE(c32rem == 0); - TESTCASE(chrrem == 0); - TESTCASE(c32ptr == &c32out[8]); - TESTCASE(chrptr == &chrout[strlen(input)]); - TESTCASE(memcmp(chrout, input, strlen(input)) == 0); - - // Multi-part conversion - static const char* mpinput = "\xDF\xBF"; - c32ptr = &c32out[0]; - c32rem = 8; - chrptr = &mpinput[0]; - chrrem = 1; - TESTCASE(utf8toc32(&c32ptr, &c32rem, &chrptr, &chrrem, &mbs)); - TESTCASE(c32ptr == &c32out[0]); - TESTCASE(c32rem == 8); - TESTCASE(chrptr == &mpinput[1]); - TESTCASE(chrrem == 0); - chrrem = 1; - TESTCASE(utf8toc32(&c32ptr, &c32rem, &chrptr, &chrrem, &mbs)); - TESTCASE(c32ptr == &c32out[1]); - TESTCASE(c32rem == 7); - TESTCASE(chrptr == &mpinput[2]); - TESTCASE(chrrem == 0); - - // Invalid conversions - - // Overlong nuls - const char* nul2 = "\xC0\x80"; - c32ptr = &c32out[0]; - c32rem = 8; - chrptr = &nul2[0]; - chrrem = 2; - TESTCASE(utf8toc32(&c32ptr, &c32rem, &chrptr, &chrrem, &mbs) == false); - memset(&mbs, 0, sizeof mbs); - const char* nul3 = "\xE0\x80\x80"; - c32ptr = &c32out[0]; - c32rem = 8; - chrptr = &nul3[0]; - chrrem = 3; - TESTCASE(utf8toc32(&c32ptr, &c32rem, &chrptr, &chrrem, &mbs) == false); - memset(&mbs, 0, sizeof mbs); - const char* nul4 = "\xF0\x80\x80\x80"; - c32ptr = &c32out[0]; - c32rem = 8; - chrptr = &nul4[0]; - chrrem = 4; - TESTCASE(utf8toc32(&c32ptr, &c32rem, &chrptr, &chrrem, &mbs) == false); - - // Starting on a continuation - const char* cont = "\x80"; - c32ptr = &c32out[0]; - c32rem = 8; - chrptr = &cont[0]; - chrrem = 1; - TESTCASE(utf8toc32(&c32ptr, &c32rem, &chrptr, &chrrem, &mbs) == false); -#endif - return TEST_RESULTS; -} - -#endif - diff --git a/waterbox/libc/functions/_PDCLIB/assert.c b/waterbox/libc/functions/_PDCLIB/assert.c deleted file mode 100644 index f4d2cbc2a0..0000000000 --- a/waterbox/libc/functions/_PDCLIB/assert.c +++ /dev/null @@ -1,67 +0,0 @@ -/* _PDCLIB_assert( char const * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#include -#include - -#ifndef REGTEST - -#include "_PDCLIB_aux.h" - -void _PDCLIB_assert99( char const * const message1, char const * const function, char const * const message2 ) -{ - fputs( message1, stderr ); - fputs( function, stderr ); - fputs( message2, stderr ); - abort(); -} - -void _PDCLIB_assert89( char const * const message ) -{ - fputs( message, stderr ); - abort(); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" -#include - -static int EXPECTED_ABORT = 0; -static int UNEXPECTED_ABORT = 1; - -static void aborthandler( int sig ) -{ - TESTCASE( ! EXPECTED_ABORT ); - exit( (signed int)TEST_RESULTS ); -} - -#define NDEBUG -#include - -static int disabled_test( void ) -{ - int i = 0; - assert( i == 0 ); /* NDEBUG set, condition met */ - assert( i == 1 ); /* NDEBUG set, condition fails */ - return i; -} - -#undef NDEBUG -#include - -int main( void ) -{ - TESTCASE( signal( SIGABRT, &aborthandler ) != SIG_ERR ); - TESTCASE( disabled_test() == 0 ); - assert( UNEXPECTED_ABORT ); /* NDEBUG not set, condition met */ - assert( EXPECTED_ABORT ); /* NDEBUG not set, condition fails - should abort */ - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/_PDCLIB/emulibc.c b/waterbox/libc/functions/_PDCLIB/emulibc.c deleted file mode 100644 index 303b01eb6b..0000000000 --- a/waterbox/libc/functions/_PDCLIB/emulibc.c +++ /dev/null @@ -1,39 +0,0 @@ -#include -#include -#include "_PDCLIB_glue.h" -#include -#include - -ECL_EXPORT ECL_ENTRY __attribute__((noreturn)) void (*_ecl_trap)(void); // something very unexpected happened. should not return -ECL_EXPORT ECL_ENTRY void *(*_ecl_sbrk)(size_t n); // sbrk. won't return if the request can't be satisfied -ECL_EXPORT ECL_ENTRY void (*_ecl_debug_puts)(const char *); // low level debug write, doesn't involve STDIO - -ECL_EXPORT ECL_ENTRY void *(*_ecl_sbrk_sealed)(size_t n); // allocate memory; see emulibc.h -ECL_EXPORT ECL_ENTRY void *(*_ecl_sbrk_invisible)(size_t n); // allocate memory; see emulibc.h - -void *alloc_sealed(size_t size) -{ - return _ecl_sbrk_sealed(size); -} - -void *alloc_invisible(size_t size) -{ - return _ecl_sbrk_invisible(size); -} - -void _debug_puts(const char *s) -{ - _ecl_debug_puts(s); -} - -void *_PDCLIB_sbrk(size_t n) -{ - void *ret = _ecl_sbrk(n); - return ret; -} - -void _PDCLIB_Exit( int status ) -{ - _ecl_trap(); -} - diff --git a/waterbox/libc/functions/_PDCLIB/rename.c b/waterbox/libc/functions/_PDCLIB/rename.c deleted file mode 100644 index 219ee5f218..0000000000 --- a/waterbox/libc/functions/_PDCLIB/rename.c +++ /dev/null @@ -1,31 +0,0 @@ -/* _PDCLIB_rename( const char *, const char * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST -#include "_PDCLIB_glue.h" -#include - -int _PDCLIB_rename( const char * old, const char * new ) -{ - errno = ENOTSUP; - return -1; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -#include - -int main( void ) -{ - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/_PDCLIB/stdarg.c b/waterbox/libc/functions/_PDCLIB/stdarg.c deleted file mode 100644 index 9e43be6a10..0000000000 --- a/waterbox/libc/functions/_PDCLIB/stdarg.c +++ /dev/null @@ -1,113 +0,0 @@ -/* stdarg - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#include -#include -#ifdef TEST - -#include "_PDCLIB_test.h" - -typedef int (*intfunc_t)( void ); - -enum tag_t -{ - TAG_END, - TAG_INT, - TAG_LONG, - TAG_LLONG, - TAG_DBL, - TAG_LDBL, - TAG_INTPTR, - TAG_LDBLPTR, - TAG_FUNCPTR -}; - -static int dummy( void ) -{ - return INT_MAX; -} - -static int test( enum tag_t s, ... ) -{ - enum tag_t tag = s; - va_list ap; - va_start( ap, s ); - for (;;) - { - switch ( tag ) - { - case TAG_INT: - { - TESTCASE( va_arg( ap, int ) == INT_MAX ); - tag = va_arg( ap, enum tag_t ); - break; - } - case TAG_LONG: - { - TESTCASE( va_arg( ap, long ) == LONG_MAX ); - tag = va_arg( ap, enum tag_t ); - break; - } - case TAG_LLONG: - { - TESTCASE( va_arg( ap, long long ) == LLONG_MAX ); - tag = va_arg( ap, enum tag_t ); - break; - } - case TAG_DBL: - { - TESTCASE( va_arg( ap, double ) == DBL_MAX ); - tag = va_arg( ap, enum tag_t ); - break; - } - case TAG_LDBL: - { - TESTCASE( va_arg( ap, long double ) == LDBL_MAX ); - tag = va_arg( ap, enum tag_t ); - break; - } - case TAG_INTPTR: - { - TESTCASE( *( va_arg( ap, int * ) ) == INT_MAX ); - tag = va_arg( ap, enum tag_t ); - break; - } - case TAG_LDBLPTR: - { - TESTCASE( *( va_arg( ap, long double * ) ) == LDBL_MAX ); - tag = va_arg( ap, enum tag_t ); - break; - } - case TAG_FUNCPTR: - { - intfunc_t function; - TESTCASE( ( function = va_arg( ap, intfunc_t ) ) == dummy ); - TESTCASE( function() == INT_MAX ); - tag = va_arg( ap, enum tag_t ); - break; - } - case TAG_END: - { - va_end( ap ); - return 0; - } - } - } -} - -int main( void ) -{ - int x = INT_MAX; - long double d = LDBL_MAX; - test( TAG_END ); - test( TAG_INT, INT_MAX, TAG_END ); - test( TAG_LONG, LONG_MAX, TAG_LLONG, LLONG_MAX, TAG_END ); - test( TAG_DBL, DBL_MAX, TAG_LDBL, LDBL_MAX, TAG_END ); - test( TAG_INTPTR, &x, TAG_LDBLPTR, &d, TAG_FUNCPTR, dummy, TAG_END ); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/_PDCLIB/stdinit.c b/waterbox/libc/functions/_PDCLIB/stdinit.c deleted file mode 100644 index b10e99a26c..0000000000 --- a/waterbox/libc/functions/_PDCLIB/stdinit.c +++ /dev/null @@ -1,522 +0,0 @@ -/* _PDCLIB_stdinit - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -/* This is an example initialization of stdin, stdout and stderr to the integer - file descriptors 0, 1, and 2, respectively. This applies for a great variety - of operating systems, including POSIX compliant ones. -*/ - -#include -#include -#include - -#ifndef REGTEST -#include "_PDCLIB_io.h" -#include "_PDCLIB_locale.h" -#include "_PDCLIB_encoding.h" - -extern const _PDCLIB_fileops_t _PDCLIB_fileops; - -/* In a POSIX system, stdin / stdout / stderr are equivalent to the (int) file - descriptors 0, 1, and 2 respectively. -*/ -/* TODO: This is proof-of-concept, requires finetuning. */ -static char _PDCLIB_sin_buffer[BUFSIZ]; -static char _PDCLIB_sout_buffer[BUFSIZ]; -static char _PDCLIB_serr_buffer[BUFSIZ]; - -static unsigned char _PDCLIB_sin_ungetbuf[_PDCLIB_UNGETCBUFSIZE]; -static unsigned char _PDCLIB_sout_ungetbuf[_PDCLIB_UNGETCBUFSIZE]; -static unsigned char _PDCLIB_serr_ungetbuf[_PDCLIB_UNGETCBUFSIZE]; - - -static FILE _PDCLIB_serr = { - .ops = &_PDCLIB_fileops, - .buffer = _PDCLIB_serr_buffer, - .bufsize = BUFSIZ, - .bufidx = 0, - .bufend = 0, - .ungetidx = 0, - .ungetbuf = _PDCLIB_serr_ungetbuf, - .status = _IONBF | _PDCLIB_FWRITE | _PDCLIB_STATIC, - .filename = NULL, - .next = NULL, -}; -static FILE _PDCLIB_sout = { - .ops = &_PDCLIB_fileops, - .buffer = _PDCLIB_sout_buffer, - .bufsize = BUFSIZ, - .bufidx = 0, - .bufend = 0, - .ungetidx = 0, - .ungetbuf = _PDCLIB_sout_ungetbuf, - .status = _IOLBF | _PDCLIB_FWRITE | _PDCLIB_STATIC, - .filename = NULL, - .next = &_PDCLIB_serr -}; -static FILE _PDCLIB_sin = { - .ops = &_PDCLIB_fileops, - .buffer = _PDCLIB_sin_buffer, - .bufsize = BUFSIZ, - .bufidx = 0, - .bufend = 0, - .ungetidx = 0, - .ungetbuf = _PDCLIB_sin_ungetbuf, - .status = _IOLBF | _PDCLIB_FREAD | _PDCLIB_STATIC, - .filename = NULL, - .next = &_PDCLIB_sout -}; - -FILE *stdin = &_PDCLIB_sin; -FILE *stdout = &_PDCLIB_sout; -FILE *stderr = &_PDCLIB_serr; - -FILE *_PDCLIB_filelist = &_PDCLIB_sin; - -/* "C" locale - defaulting to ASCII-7. - 1 kByte (+ 4 byte) of data. - Each line: flags, lowercase, uppercase, collation. -*/ -static const _PDCLIB_ctype_t global_ctype[] = { - { /* EOF */ 0, 0, 0, 0 }, - { /* NUL */ _PDCLIB_CTYPE_CNTRL, 0x00, 0x00, 0x00 }, - { /* SOH */ _PDCLIB_CTYPE_CNTRL, 0x01, 0x01, 0x01 }, - { /* STX */ _PDCLIB_CTYPE_CNTRL, 0x02, 0x02, 0x02 }, - { /* ETX */ _PDCLIB_CTYPE_CNTRL, 0x03, 0x03, 0x03 }, - { /* EOT */ _PDCLIB_CTYPE_CNTRL, 0x04, 0x04, 0x04 }, - { /* ENQ */ _PDCLIB_CTYPE_CNTRL, 0x05, 0x05, 0x05 }, - { /* ACK */ _PDCLIB_CTYPE_CNTRL, 0x06, 0x06, 0x06 }, - { /* BEL */ _PDCLIB_CTYPE_CNTRL, 0x07, 0x07, 0x07 }, - { /* BS */ _PDCLIB_CTYPE_CNTRL, 0x08, 0x08, 0x08 }, - { /* HT */ _PDCLIB_CTYPE_CNTRL | _PDCLIB_CTYPE_BLANK | _PDCLIB_CTYPE_SPACE, 0x09, 0x09, 0x09 }, - { /* LF */ _PDCLIB_CTYPE_CNTRL | _PDCLIB_CTYPE_SPACE, 0x0A, 0x0A, 0x0A }, - { /* VT */ _PDCLIB_CTYPE_CNTRL | _PDCLIB_CTYPE_SPACE, 0x0B, 0x0B, 0x0B }, - { /* FF */ _PDCLIB_CTYPE_CNTRL | _PDCLIB_CTYPE_SPACE, 0x0C, 0x0C, 0x0C }, - { /* CR */ _PDCLIB_CTYPE_CNTRL | _PDCLIB_CTYPE_SPACE, 0x0D, 0x0D, 0x0D }, - { /* SO */ _PDCLIB_CTYPE_CNTRL, 0x0E, 0x0E, 0x0E }, - { /* SI */ _PDCLIB_CTYPE_CNTRL, 0x0F, 0x0F, 0x0F }, - { /* DLE */ _PDCLIB_CTYPE_CNTRL, 0x10, 0x10, 0x10 }, - { /* DC1 */ _PDCLIB_CTYPE_CNTRL, 0x11, 0x11, 0x11 }, - { /* DC2 */ _PDCLIB_CTYPE_CNTRL, 0x12, 0x12, 0x12 }, - { /* DC3 */ _PDCLIB_CTYPE_CNTRL, 0x13, 0x13, 0x13 }, - { /* DC4 */ _PDCLIB_CTYPE_CNTRL, 0x14, 0x14, 0x14 }, - { /* NAK */ _PDCLIB_CTYPE_CNTRL, 0x15, 0x15, 0x15 }, - { /* SYN */ _PDCLIB_CTYPE_CNTRL, 0x16, 0x16, 0x16 }, - { /* ETB */ _PDCLIB_CTYPE_CNTRL, 0x17, 0x17, 0x17 }, - { /* CAN */ _PDCLIB_CTYPE_CNTRL, 0x18, 0x18, 0x18 }, - { /* EM */ _PDCLIB_CTYPE_CNTRL, 0x19, 0x19, 0x19 }, - { /* SUB */ _PDCLIB_CTYPE_CNTRL, 0x1A, 0x1A, 0x1A }, - { /* ESC */ _PDCLIB_CTYPE_CNTRL, 0x1B, 0x1B, 0x1B }, - { /* FS */ _PDCLIB_CTYPE_CNTRL, 0x1C, 0x1C, 0x1C }, - { /* GS */ _PDCLIB_CTYPE_CNTRL, 0x1D, 0x1D, 0x1D }, - { /* RS */ _PDCLIB_CTYPE_CNTRL, 0x1E, 0x1E, 0x1E }, - { /* US */ _PDCLIB_CTYPE_CNTRL, 0x1F, 0x1F, 0x1F }, - { /* SP */ _PDCLIB_CTYPE_BLANK | _PDCLIB_CTYPE_SPACE, 0x20, 0x20, 0x20 }, - { /* '!' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT, 0x21, 0x21, 0x21 }, - { /* '"' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT, 0x22, 0x22, 0x22 }, - { /* '#' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT, 0x23, 0x23, 0x23 }, - { /* '$' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT, 0x24, 0x24, 0x24 }, - { /* '%' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT, 0x25, 0x25, 0x25 }, - { /* '&' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT, 0x26, 0x26, 0x26 }, - { /* ''' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT, 0x27, 0x27, 0x27 }, - { /* '(' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT, 0x28, 0x28, 0x28 }, - { /* ')' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT, 0x29, 0x29, 0x29 }, - { /* '*' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT, 0x2A, 0x2A, 0x2A }, - { /* '+' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT, 0x2B, 0x2B, 0x2B }, - { /* ',' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT, 0x2C, 0x2C, 0x2C }, - { /* '-' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT, 0x2D, 0x2D, 0x2D }, - { /* '.' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT, 0x2E, 0x2E, 0x2E }, - { /* '/' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT, 0x2F, 0x2F, 0x2F }, - { /* '0' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_DIGIT | _PDCLIB_CTYPE_XDIGT, 0x30, 0x30, 0x30 }, - { /* '1' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_DIGIT | _PDCLIB_CTYPE_XDIGT, 0x31, 0x31, 0x31 }, - { /* '2' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_DIGIT | _PDCLIB_CTYPE_XDIGT, 0x32, 0x32, 0x32 }, - { /* '3' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_DIGIT | _PDCLIB_CTYPE_XDIGT, 0x33, 0x33, 0x33 }, - { /* '4' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_DIGIT | _PDCLIB_CTYPE_XDIGT, 0x34, 0x34, 0x34 }, - { /* '5' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_DIGIT | _PDCLIB_CTYPE_XDIGT, 0x35, 0x35, 0x35 }, - { /* '6' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_DIGIT | _PDCLIB_CTYPE_XDIGT, 0x36, 0x36, 0x36 }, - { /* '7' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_DIGIT | _PDCLIB_CTYPE_XDIGT, 0x37, 0x37, 0x37 }, - { /* '8' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_DIGIT | _PDCLIB_CTYPE_XDIGT, 0x38, 0x38, 0x38 }, - { /* '9' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_DIGIT | _PDCLIB_CTYPE_XDIGT, 0x39, 0x39, 0x39 }, - { /* ':' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT, 0x3A, 0x3A, 0x3A }, - { /* ';' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT, 0x3B, 0x3B, 0x3B }, - { /* '<' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT, 0x3C, 0x3C, 0x3C }, - { /* '=' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT, 0x3D, 0x3D, 0x3D }, - { /* '>' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT, 0x3E, 0x3E, 0x3E }, - { /* '?' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT, 0x3F, 0x3F, 0x3F }, - { /* '@' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT, 0x40, 0x40, 0x40 }, - { /* 'A' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER | _PDCLIB_CTYPE_XDIGT, 0x41, 0x61, 0x41 }, - { /* 'B' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER | _PDCLIB_CTYPE_XDIGT, 0x42, 0x62, 0x42 }, - { /* 'C' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER | _PDCLIB_CTYPE_XDIGT, 0x43, 0x63, 0x43 }, - { /* 'D' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER | _PDCLIB_CTYPE_XDIGT, 0x44, 0x64, 0x44 }, - { /* 'E' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER | _PDCLIB_CTYPE_XDIGT, 0x45, 0x65, 0x45 }, - { /* 'F' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER | _PDCLIB_CTYPE_XDIGT, 0x46, 0x66, 0x46 }, - { /* 'G' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER, 0x47, 0x67, 0x47 }, - { /* 'H' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER, 0x48, 0x68, 0x48 }, - { /* 'I' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER, 0x49, 0x69, 0x49 }, - { /* 'J' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER, 0x4A, 0x6A, 0x4A }, - { /* 'K' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER, 0x4B, 0x6B, 0x4B }, - { /* 'L' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER, 0x4C, 0x6C, 0x4C }, - { /* 'M' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER, 0x4D, 0x6D, 0x4D }, - { /* 'N' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER, 0x4E, 0x6E, 0x4E }, - { /* 'O' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER, 0x4F, 0x6F, 0x4F }, - { /* 'P' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER, 0x50, 0x70, 0x50 }, - { /* 'Q' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER, 0x51, 0x71, 0x51 }, - { /* 'R' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER, 0x52, 0x72, 0x52 }, - { /* 'S' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER, 0x53, 0x73, 0x53 }, - { /* 'T' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER, 0x54, 0x74, 0x54 }, - { /* 'U' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER, 0x55, 0x75, 0x55 }, - { /* 'V' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER, 0x56, 0x76, 0x56 }, - { /* 'W' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER, 0x57, 0x77, 0x57 }, - { /* 'X' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER, 0x58, 0x78, 0x58 }, - { /* 'Y' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER, 0x59, 0x79, 0x59 }, - { /* 'Z' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER, 0x5A, 0x7A, 0x5A }, - { /* '[' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT, 0x5B, 0x5B, 0x5B }, - { /* '\' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT, 0x5C, 0x5C, 0x5C }, - { /* ']' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT, 0x5D, 0x5D, 0x5D }, - { /* '^' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT, 0x5E, 0x5E, 0x5E }, - { /* '_' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT, 0x5F, 0x5F, 0x5F }, - { /* '`' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT, 0x60, 0x60, 0x60 }, - { /* 'a' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER | _PDCLIB_CTYPE_XDIGT, 0x41, 0x61, 0x61 }, - { /* 'b' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER | _PDCLIB_CTYPE_XDIGT, 0x42, 0x62, 0x62 }, - { /* 'c' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER | _PDCLIB_CTYPE_XDIGT, 0x43, 0x63, 0x63 }, - { /* 'd' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER | _PDCLIB_CTYPE_XDIGT, 0x44, 0x64, 0x64 }, - { /* 'e' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER | _PDCLIB_CTYPE_XDIGT, 0x45, 0x65, 0x65 }, - { /* 'f' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER | _PDCLIB_CTYPE_XDIGT, 0x46, 0x66, 0x66 }, - { /* 'g' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER, 0x47, 0x67, 0x67 }, - { /* 'h' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER, 0x48, 0x68, 0x68 }, - { /* 'i' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER, 0x49, 0x69, 0x69 }, - { /* 'j' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER, 0x4A, 0x6A, 0x6A }, - { /* 'k' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER, 0x4B, 0x6B, 0x6B }, - { /* 'l' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER, 0x4C, 0x6C, 0x6C }, - { /* 'm' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER, 0x4D, 0x6D, 0x6D }, - { /* 'n' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER, 0x4E, 0x6E, 0x6E }, - { /* 'o' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER, 0x4F, 0x6F, 0x6F }, - { /* 'p' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER, 0x50, 0x70, 0x70 }, - { /* 'q' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER, 0x51, 0x71, 0x71 }, - { /* 'r' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER, 0x52, 0x72, 0x72 }, - { /* 's' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER, 0x53, 0x73, 0x73 }, - { /* 't' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER, 0x54, 0x74, 0x74 }, - { /* 'u' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER, 0x55, 0x75, 0x75 }, - { /* 'v' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER, 0x56, 0x76, 0x76 }, - { /* 'w' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER, 0x57, 0x77, 0x77 }, - { /* 'x' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER, 0x58, 0x78, 0x78 }, - { /* 'y' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER, 0x59, 0x79, 0x79 }, - { /* 'z' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER, 0x5A, 0x7A, 0x7A }, - { /* '{' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT, 0x7B, 0x7B, 0x7B }, - { /* '|' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT, 0x7C, 0x7C, 0x7C }, - { /* '}' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT, 0x7D, 0x7D, 0x7D }, - { /* '~' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT, 0x7E, 0x7E, 0x7E }, - { /* DEL */ _PDCLIB_CTYPE_CNTRL, 0x7F, 0x7F, 0x7F }, - { 0x00, 0x80, 0x80, 0x80 }, - { 0x00, 0x81, 0x81, 0x81 }, - { 0x00, 0x82, 0x82, 0x82 }, - { 0x00, 0x83, 0x83, 0x83 }, - { 0x00, 0x84, 0x84, 0x84 }, - { 0x00, 0x85, 0x85, 0x85 }, - { 0x00, 0x86, 0x86, 0x86 }, - { 0x00, 0x87, 0x87, 0x87 }, - { 0x00, 0x88, 0x88, 0x88 }, - { 0x00, 0x89, 0x89, 0x89 }, - { 0x00, 0x8A, 0x8A, 0x8A }, - { 0x00, 0x8B, 0x8B, 0x8B }, - { 0x00, 0x8C, 0x8C, 0x8C }, - { 0x00, 0x8D, 0x8D, 0x8D }, - { 0x00, 0x8E, 0x8E, 0x8E }, - { 0x00, 0x8F, 0x8F, 0x8F }, - { 0x00, 0x90, 0x90, 0x90 }, - { 0x00, 0x91, 0x91, 0x91 }, - { 0x00, 0x92, 0x92, 0x92 }, - { 0x00, 0x93, 0x93, 0x93 }, - { 0x00, 0x94, 0x94, 0x94 }, - { 0x00, 0x95, 0x95, 0x95 }, - { 0x00, 0x96, 0x96, 0x96 }, - { 0x00, 0x97, 0x97, 0x97 }, - { 0x00, 0x98, 0x98, 0x98 }, - { 0x00, 0x99, 0x99, 0x99 }, - { 0x00, 0x9A, 0x9A, 0x9A }, - { 0x00, 0x9B, 0x9B, 0x9B }, - { 0x00, 0x9C, 0x9C, 0x9C }, - { 0x00, 0x9D, 0x9D, 0x9D }, - { 0x00, 0x9E, 0x9E, 0x9E }, - { 0x00, 0x9F, 0x9F, 0x9F }, - { 0x00, 0xA0, 0xA0, 0xA0 }, - { 0x00, 0xA1, 0xA1, 0xA1 }, - { 0x00, 0xA2, 0xA2, 0xA2 }, - { 0x00, 0xA3, 0xA3, 0xA3 }, - { 0x00, 0xA4, 0xA4, 0xA4 }, - { 0x00, 0xA5, 0xA5, 0xA5 }, - { 0x00, 0xA6, 0xA6, 0xA6 }, - { 0x00, 0xA7, 0xA7, 0xA7 }, - { 0x00, 0xA8, 0xA8, 0xA8 }, - { 0x00, 0xA9, 0xA9, 0xA9 }, - { 0x00, 0xAA, 0xAA, 0xAA }, - { 0x00, 0xAB, 0xAB, 0xAB }, - { 0x00, 0xAC, 0xAC, 0xAC }, - { 0x00, 0xAD, 0xAD, 0xAD }, - { 0x00, 0xAE, 0xAE, 0xAE }, - { 0x00, 0xAF, 0xAF, 0xAF }, - { 0x00, 0xB0, 0xB0, 0xB0 }, - { 0x00, 0xB1, 0xB1, 0xB1 }, - { 0x00, 0xB2, 0xB2, 0xB2 }, - { 0x00, 0xB3, 0xB3, 0xB3 }, - { 0x00, 0xB4, 0xB4, 0xB4 }, - { 0x00, 0xB5, 0xB5, 0xB5 }, - { 0x00, 0xB6, 0xB6, 0xB6 }, - { 0x00, 0xB7, 0xB7, 0xB7 }, - { 0x00, 0xB8, 0xB8, 0xB8 }, - { 0x00, 0xB9, 0xB9, 0xB9 }, - { 0x00, 0xBA, 0xBA, 0xBA }, - { 0x00, 0xBB, 0xBB, 0xBB }, - { 0x00, 0xBC, 0xBC, 0xBC }, - { 0x00, 0xBD, 0xBD, 0xBD }, - { 0x00, 0xBE, 0xBE, 0xBE }, - { 0x00, 0xBF, 0xBF, 0xBF }, - { 0x00, 0xC0, 0xC0, 0xC0 }, - { 0x00, 0xC1, 0xC1, 0xC1 }, - { 0x00, 0xC2, 0xC2, 0xC2 }, - { 0x00, 0xC3, 0xC3, 0xC3 }, - { 0x00, 0xC4, 0xC4, 0xC4 }, - { 0x00, 0xC5, 0xC5, 0xC5 }, - { 0x00, 0xC6, 0xC6, 0xC6 }, - { 0x00, 0xC7, 0xC7, 0xC7 }, - { 0x00, 0xC8, 0xC8, 0xC8 }, - { 0x00, 0xC9, 0xC9, 0xC9 }, - { 0x00, 0xCA, 0xCA, 0xCA }, - { 0x00, 0xCB, 0xCB, 0xCB }, - { 0x00, 0xCC, 0xCC, 0xCC }, - { 0x00, 0xCD, 0xCD, 0xCD }, - { 0x00, 0xCE, 0xCE, 0xCE }, - { 0x00, 0xCF, 0xCF, 0xCF }, - { 0x00, 0xD0, 0xD0, 0xD0 }, - { 0x00, 0xD1, 0xD1, 0xD1 }, - { 0x00, 0xD2, 0xD2, 0xD2 }, - { 0x00, 0xD3, 0xD3, 0xD3 }, - { 0x00, 0xD4, 0xD4, 0xD4 }, - { 0x00, 0xD5, 0xD5, 0xD5 }, - { 0x00, 0xD6, 0xD6, 0xD6 }, - { 0x00, 0xD7, 0xD7, 0xD7 }, - { 0x00, 0xD8, 0xD8, 0xD8 }, - { 0x00, 0xD9, 0xD9, 0xD9 }, - { 0x00, 0xDA, 0xDA, 0xDA }, - { 0x00, 0xDB, 0xDB, 0xDB }, - { 0x00, 0xDC, 0xDC, 0xDC }, - { 0x00, 0xDD, 0xDD, 0xDD }, - { 0x00, 0xDE, 0xDE, 0xDE }, - { 0x00, 0xDF, 0xDF, 0xDF }, - { 0x00, 0xE0, 0xE0, 0xE0 }, - { 0x00, 0xE1, 0xE1, 0xE1 }, - { 0x00, 0xE2, 0xE2, 0xE2 }, - { 0x00, 0xE3, 0xE3, 0xE3 }, - { 0x00, 0xE4, 0xE4, 0xE4 }, - { 0x00, 0xE5, 0xE5, 0xE5 }, - { 0x00, 0xE6, 0xE6, 0xE6 }, - { 0x00, 0xE7, 0xE7, 0xE7 }, - { 0x00, 0xE8, 0xE8, 0xE8 }, - { 0x00, 0xE9, 0xE9, 0xE9 }, - { 0x00, 0xEA, 0xEA, 0xEA }, - { 0x00, 0xEB, 0xEB, 0xEB }, - { 0x00, 0xEC, 0xEC, 0xEC }, - { 0x00, 0xED, 0xED, 0xED }, - { 0x00, 0xEE, 0xEE, 0xEE }, - { 0x00, 0xEF, 0xEF, 0xEF }, - { 0x00, 0xF0, 0xF0, 0xF0 }, - { 0x00, 0xF1, 0xF1, 0xF1 }, - { 0x00, 0xF2, 0xF2, 0xF2 }, - { 0x00, 0xF3, 0xF3, 0xF3 }, - { 0x00, 0xF4, 0xF4, 0xF4 }, - { 0x00, 0xF5, 0xF5, 0xF5 }, - { 0x00, 0xF6, 0xF6, 0xF6 }, - { 0x00, 0xF7, 0xF7, 0xF7 }, - { 0x00, 0xF8, 0xF8, 0xF8 }, - { 0x00, 0xF9, 0xF9, 0xF9 }, - { 0x00, 0xFA, 0xFA, 0xFA }, - { 0x00, 0xFB, 0xFB, 0xFB }, - { 0x00, 0xFC, 0xFC, 0xFC }, - { 0x00, 0xFD, 0xFD, 0xFD }, - { 0x00, 0xFE, 0xFE, 0xFE }, - { 0x00, 0xFF, 0xFF, 0xFF } -}; - -extern const struct _PDCLIB_charcodec_t _PDCLIB_ascii_codec; -struct _PDCLIB_locale _PDCLIB_global_locale = { - ._Codec = &_PDCLIB_ascii_codec, - ._Conv = { - /* decimal_point */ (char *)".", - /* thousands_sep */ (char *)"", - /* grouping */ (char *)"", - /* mon_decimal_point */ (char *)"", - /* mon_thousands_sep */ (char *)"", - /* mon_grouping */ (char *)"", - /* positive_sign */ (char *)"", - /* negative_sign */ (char *)"", - /* currency_symbol */ (char *)"", - /* int_curr_symbol */ (char *)"", - /* frac_digits */ CHAR_MAX, - /* p_cs_precedes */ CHAR_MAX, - /* n_cs_precedes */ CHAR_MAX, - /* p_sep_by_space */ CHAR_MAX, - /* n_sep_by_space */ CHAR_MAX, - /* p_sign_posn */ CHAR_MAX, - /* n_sign_posn */ CHAR_MAX, - /* int_frac_digits */ CHAR_MAX, - /* int_p_cs_precedes */ CHAR_MAX, - /* int_n_cs_precedes */ CHAR_MAX, - /* int_p_sep_by_space */ CHAR_MAX, - /* int_n_sep_by_space */ CHAR_MAX, - /* int_p_sign_posn */ CHAR_MAX, - /* int_n_sign_posn */ CHAR_MAX, - }, - ._CType = &global_ctype[1], - ._ErrnoStr = { - "Success", - "EPERM (operation not permitted)", - "ENOENT (no such file or directory)", - "ESRCH (no such process)", - "EINTR (interrupted)", - "EIO (io error)", - "ENXIO (no such device or address)", - "E2BIG (argument list too long)", - "ENOEXEC (executable format error)", - "EBADF (bad file descriptor)", - "ECHILD (no child process)", - "EAGAIN (resource unavailable try again)", - "ENOMEM (not enough memory)", - "EACCES (permission denied)", - "EFAULT (bad address)", - "Unknown error", - "EBUSY (device or resource busy)", - "EEXIST (file exists)", - "EXDEV (cross device link)", - "ENODEV (no such device)", - "ENOTDIR (not a directory)", - "EISDIR (is a directory)", - "EINVAL (invalid argument)", - "ENFILE (too many files open in system)", - "EMFILE (too many files open)", - "ENOTTY (inappropriate io control operation)", - "ETXTBSY (text file busy)", - "EFBIG (file too large)", - "ENOSPC (no space on device)", - "ESPIPE (invalid seek)", - "EROFS (read only file system)", - "EMLINK (too many links)", - "EPIPE (broken pipe)", - "EDOM (argument out of domain)", - "ERANGE (result out of range)", - "EDEADLK (resource deadlock would occur)", - "ENAMETOOLONG (filename too long)", - "ENOLCK (no lock available)", - "ENOSYS (function not supported)", - "ENOTEMPTY (directory not empty)", - "ELOOP (too many symbolic link levels)", - "Unknown error", - "ENOMSG (no message)", - "EIDRM (identifier removed)", - "Unknown error", - "Unknown error", - "Unknown error", - "Unknown error", - "Unknown error", - "Unknown error", - "Unknown error", - "Unknown error", - "Unknown error", - "Unknown error", - "Unknown error", - "Unknown error", - "Unknown error", - "Unknown error", - "Unknown error", - "Unknown error", - "ENOSTR (not a stream)", - "ENODATA (no message available)", - "ETIME (stream timeout)", - "ENOSR (no stream resources)", - "Unknown error", - "Unknown error", - "Unknown error", - "ENOLINK (no link)", - "Unknown error", - "Unknown error", - "Unknown error", - "EPROTO (protocol error)", - "Unknown error", - "Unknown error", - "EBADMSG (bad message)", - "EOVERFLOW (value too large)", - "Unknown error", - "Unknown error", - "Unknown error", - "Unknown error", - "Unknown error", - "Unknown error", - "Unknown error", - "Unknown error", - "EILSEQ (illegal byte sequence)", - "Unknown error", - "Unknown error", - "Unknown error", - "ENOTSOCK (not a socket)", - "EDESTADDRREQ (destination address required)", - "EMSGSIZE (message size)", - "EPROTOTYPE (wrong protocol type)", - "ENOPROTOOPT (no protocol option)", - "EPROTONOSUPPORT (protocol not supported)", - "Unknown error", - "ENOTSUP (not supported)", - "Unknown error", - "EAFNOSUPPORT (address family not supported)", - "EADDRINUSE (address in use)", - "EADDRNOTAVAIL (address not available)", - "ENETDOWN (network down)", - "ENETUNREACH (network unreachable)", - "ENETRESET (network reset)", - "ECONNABORTED (connection aborted)", - "ECONNRESET (connection reset)", - "ENOBUFS (no buffer space)", - "EISCONN (already connected)", - "ENOTCONN (not connected)", - "Unknown error", - "Unknown error", - "ETIMEDOUT (timed out)", - "ECONNREFUSED (connection refused)", - "Unknown error", - "EHOSTUNREACH (host unreachable)", - "EALREADY (connection already in progress)", - "EINPROGRESS (operation in progress)", - "Unknown error", - "Unknown error", - "Unknown error", - "Unknown error", - "Unknown error", - "Unknown error", - "Unknown error", - "Unknown error", - "Unknown error", - "ECANCELED (operation canceled)", - "Unknown error", - "Unknown error", - "Unknown error", - "Unknown error", - "EOWNERDEAD (owner dead)", - "ENOTRECOVERABLE (state not recoverable)", - }, -}; - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - /* Testing covered by several other testdrivers using stdin / stdout / - stderr. - */ - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/_dlmalloc/dlmalloc.c b/waterbox/libc/functions/_dlmalloc/dlmalloc.c deleted file mode 100644 index 520be7f9d6..0000000000 --- a/waterbox/libc/functions/_dlmalloc/dlmalloc.c +++ /dev/null @@ -1,6227 +0,0 @@ -/* - This is a version (aka dlmalloc) of malloc/free/realloc written by - Doug Lea and released to the public domain, as explained at - http://creativecommons.org/publicdomain/zero/1.0/ Send questions, - comments, complaints, performance data, etc to dl@cs.oswego.edu - -* Version 2.8.5 Sun May 22 10:26:02 2011 Doug Lea (dl at gee) - - Note: There may be an updated version of this malloc obtainable at - ftp://gee.cs.oswego.edu/pub/misc/malloc.c - Check before installing! - -* Quickstart - - This library is all in one file to simplify the most common usage: - ftp it, compile it (-O3), and link it into another program. All of - the compile-time options default to reasonable values for use on - most platforms. You might later want to step through various - compile-time and dynamic tuning options. - - For convenience, an include file for code using this malloc is at: - ftp://gee.cs.oswego.edu/pub/misc/malloc-2.8.5.h - You don't really need this .h file unless you call functions not - defined in your system include files. The .h file contains only the - excerpts from this file needed for using this malloc on ANSI C/C++ - systems, so long as you haven't changed compile-time options about - naming and tuning parameters. If you do, then you can create your - own malloc.h that does include all settings by cutting at the point - indicated below. Note that you may already by default be using a C - library containing a malloc that is based on some version of this - malloc (for example in linux). You might still want to use the one - in this file to customize settings or to avoid overheads associated - with library versions. - -* Vital statistics: - - Supported pointer/size_t representation: 4 or 8 bytes - size_t MUST be an unsigned type of the same width as - pointers. (If you are using an ancient system that declares - size_t as a signed type, or need it to be a different width - than pointers, you can use a previous release of this malloc - (e.g. 2.7.2) supporting these.) - - Alignment: 8 bytes (default) - This suffices for nearly all current machines and C compilers. - However, you can define MALLOC_ALIGNMENT to be wider than this - if necessary (up to 128bytes), at the expense of using more space. - - Minimum overhead per allocated chunk: 4 or 8 bytes (if 4byte sizes) - 8 or 16 bytes (if 8byte sizes) - Each malloced chunk has a hidden word of overhead holding size - and status information, and additional cross-check word - if FOOTERS is defined. - - Minimum allocated size: 4-byte ptrs: 16 bytes (including overhead) - 8-byte ptrs: 32 bytes (including overhead) - - Even a request for zero bytes (i.e., malloc(0)) returns a - pointer to something of the minimum allocatable size. - The maximum overhead wastage (i.e., number of extra bytes - allocated than were requested in malloc) is less than or equal - to the minimum size, except for requests >= mmap_threshold that - are serviced via mmap(), where the worst case wastage is about - 32 bytes plus the remainder from a system page (the minimal - mmap unit); typically 4096 or 8192 bytes. - - Security: static-safe; optionally more or less - The "security" of malloc refers to the ability of malicious - code to accentuate the effects of errors (for example, freeing - space that is not currently malloc'ed or overwriting past the - ends of chunks) in code that calls malloc. This malloc - guarantees not to modify any memory locations below the base of - heap, i.e., static variables, even in the presence of usage - errors. The routines additionally detect most improper frees - and reallocs. All this holds as long as the static bookkeeping - for malloc itself is not corrupted by some other means. This - is only one aspect of security -- these checks do not, and - cannot, detect all possible programming errors. - - If FOOTERS is defined nonzero, then each allocated chunk - carries an additional check word to verify that it was malloced - from its space. These check words are the same within each - execution of a program using malloc, but differ across - executions, so externally crafted fake chunks cannot be - freed. This improves security by rejecting frees/reallocs that - could corrupt heap memory, in addition to the checks preventing - writes to statics that are always on. This may further improve - security at the expense of time and space overhead. (Note that - FOOTERS may also be worth using with MSPACES.) - - By default detected errors cause the program to abort (calling - "abort()"). You can override this to instead proceed past - errors by defining PROCEED_ON_ERROR. In this case, a bad free - has no effect, and a malloc that encounters a bad address - caused by user overwrites will ignore the bad address by - dropping pointers and indices to all known memory. This may - be appropriate for programs that should continue if at all - possible in the face of programming errors, although they may - run out of memory because dropped memory is never reclaimed. - - If you don't like either of these options, you can define - CORRUPTION_ERROR_ACTION and USAGE_ERROR_ACTION to do anything - else. And if if you are sure that your program using malloc has - no errors or vulnerabilities, you can define INSECURE to 1, - which might (or might not) provide a small performance improvement. - - It is also possible to limit the maximum total allocatable - space, using malloc_set_footprint_limit. This is not - designed as a security feature in itself (calls to set limits - are not screened or privileged), but may be useful as one - aspect of a secure implementation. - - Thread-safety: NOT thread-safe unless USE_LOCKS defined non-zero - When USE_LOCKS is defined, each public call to malloc, free, - etc is surrounded with a lock. By default, this uses a plain - pthread mutex, win32 critical section, or a spin-lock if if - available for the platform and not disabled by setting - USE_SPIN_LOCKS=0. However, if USE_RECURSIVE_LOCKS is defined, - recursive versions are used instead (which are not required for - base functionality but may be needed in layered extensions). - Using a global lock is not especially fast, and can be a major - bottleneck. It is designed only to provide minimal protection - in concurrent environments, and to provide a basis for - extensions. If you are using malloc in a concurrent program, - consider instead using nedmalloc - (http://www.nedprod.com/programs/portable/nedmalloc/) or - ptmalloc (See http://www.malloc.de), which are derived from - versions of this malloc. - - System requirements: Any combination of MORECORE and/or MMAP/MUNMAP - This malloc can use unix sbrk or any emulation (invoked using - the CALL_MORECORE macro) and/or mmap/munmap or any emulation - (invoked using CALL_MMAP/CALL_MUNMAP) to get and release system - memory. On most unix systems, it tends to work best if both - MORECORE and MMAP are enabled. On Win32, it uses emulations - based on VirtualAlloc. It also uses common C library functions - like memset. - - Compliance: I believe it is compliant with the Single Unix Specification - (See http://www.unix.org). Also SVID/XPG, ANSI C, and probably - others as well. - -* Overview of algorithms - - This is not the fastest, most space-conserving, most portable, or - most tunable malloc ever written. However it is among the fastest - while also being among the most space-conserving, portable and - tunable. Consistent balance across these factors results in a good - general-purpose allocator for malloc-intensive programs. - - In most ways, this malloc is a best-fit allocator. Generally, it - chooses the best-fitting existing chunk for a request, with ties - broken in approximately least-recently-used order. (This strategy - normally maintains low fragmentation.) However, for requests less - than 256bytes, it deviates from best-fit when there is not an - exactly fitting available chunk by preferring to use space adjacent - to that used for the previous small request, as well as by breaking - ties in approximately most-recently-used order. (These enhance - locality of series of small allocations.) And for very large requests - (>= 256Kb by default), it relies on system memory mapping - facilities, if supported. (This helps avoid carrying around and - possibly fragmenting memory used only for large chunks.) - - All operations (except malloc_stats and mallinfo) have execution - times that are bounded by a constant factor of the number of bits in - a size_t, not counting any clearing in calloc or copying in realloc, - or actions surrounding MORECORE and MMAP that have times - proportional to the number of non-contiguous regions returned by - system allocation routines, which is often just 1. In real-time - applications, you can optionally suppress segment traversals using - NO_SEGMENT_TRAVERSAL, which assures bounded execution even when - system allocators return non-contiguous spaces, at the typical - expense of carrying around more memory and increased fragmentation. - - The implementation is not very modular and seriously overuses - macros. Perhaps someday all C compilers will do as good a job - inlining modular code as can now be done by brute-force expansion, - but now, enough of them seem not to. - - Some compilers issue a lot of warnings about code that is - dead/unreachable only on some platforms, and also about intentional - uses of negation on unsigned types. All known cases of each can be - ignored. - - For a longer but out of date high-level description, see - http://gee.cs.oswego.edu/dl/html/malloc.html - -* MSPACES - If MSPACES is defined, then in addition to malloc, free, etc., - this file also defines mspace_malloc, mspace_free, etc. These - are versions of malloc routines that take an "mspace" argument - obtained using create_mspace, to control all internal bookkeeping. - If ONLY_MSPACES is defined, only these versions are compiled. - So if you would like to use this allocator for only some allocations, - and your system malloc for others, you can compile with - ONLY_MSPACES and then do something like... - static mspace mymspace = create_mspace(0,0); // for example - #define mymalloc(bytes) mspace_malloc(mymspace, bytes) - - (Note: If you only need one instance of an mspace, you can instead - use "USE_DL_PREFIX" to relabel the global malloc.) - - You can similarly create thread-local allocators by storing - mspaces as thread-locals. For example: - static __thread mspace tlms = 0; - void* tlmalloc(size_t bytes) { - if (tlms == 0) tlms = create_mspace(0, 0); - return mspace_malloc(tlms, bytes); - } - void tlfree(void* mem) { mspace_free(tlms, mem); } - - Unless FOOTERS is defined, each mspace is completely independent. - You cannot allocate from one and free to another (although - conformance is only weakly checked, so usage errors are not always - caught). If FOOTERS is defined, then each chunk carries around a tag - indicating its originating mspace, and frees are directed to their - originating spaces. Normally, this requires use of locks. - - ------------------------- Compile-time options --------------------------- - -Be careful in setting #define values for numerical constants of type -size_t. On some systems, literal values are not automatically extended -to size_t precision unless they are explicitly casted. You can also -use the symbolic values MAX_SIZE_T, SIZE_T_ONE, etc below. - -WIN32 default: defined if _WIN32 defined - Defining WIN32 sets up defaults for MS environment and compilers. - Otherwise defaults are for unix. Beware that there seem to be some - cases where this malloc might not be a pure drop-in replacement for - Win32 malloc: Random-looking failures from Win32 GDI API's (eg; - SetDIBits()) may be due to bugs in some video driver implementations - when pixel buffers are malloc()ed, and the region spans more than - one VirtualAlloc()ed region. Because dlmalloc uses a small (64Kb) - default granularity, pixel buffers may straddle virtual allocation - regions more often than when using the Microsoft allocator. You can - avoid this by using VirtualAlloc() and VirtualFree() for all pixel - buffers rather than using malloc(). If this is not possible, - recompile this malloc with a larger DEFAULT_GRANULARITY. Note: - in cases where MSC and gcc (cygwin) are known to differ on WIN32, - conditions use _MSC_VER to distinguish them. - -DLMALLOC_EXPORT default: extern - Defines how public APIs are declared. If you want to export via a - Windows DLL, you might define this as - #define DLMALLOC_EXPORT extern __declspace(dllexport) - If you want a POSIX ELF shared object, you might use - #define DLMALLOC_EXPORT extern __attribute__((visibility("default"))) - -MALLOC_ALIGNMENT default: (size_t)8 - Controls the minimum alignment for malloc'ed chunks. It must be a - power of two and at least 8, even on machines for which smaller - alignments would suffice. It may be defined as larger than this - though. Note however that code and data structures are optimized for - the case of 8-byte alignment. - -MSPACES default: 0 (false) - If true, compile in support for independent allocation spaces. - This is only supported if HAVE_MMAP is true. - -ONLY_MSPACES default: 0 (false) - If true, only compile in mspace versions, not regular versions. - -USE_LOCKS default: 0 (false) - Causes each call to each public routine to be surrounded with - pthread or WIN32 mutex lock/unlock. (If set true, this can be - overridden on a per-mspace basis for mspace versions.) If set to a - non-zero value other than 1, locks are used, but their - implementation is left out, so lock functions must be supplied manually, - as described below. - -USE_SPIN_LOCKS default: 1 iff USE_LOCKS and spin locks available - If true, uses custom spin locks for locking. This is currently - supported only gcc >= 4.1, older gccs on x86 platforms, and recent - MS compilers. Otherwise, posix locks or win32 critical sections are - used. - -USE_RECURSIVE_LOCKS default: not defined - If defined nonzero, uses recursive (aka reentrant) locks, otherwise - uses plain mutexes. This is not required for malloc proper, but may - be needed for layered allocators such as nedmalloc. - -FOOTERS default: 0 - If true, provide extra checking and dispatching by placing - information in the footers of allocated chunks. This adds - space and time overhead. - -INSECURE default: 0 - If true, omit checks for usage errors and heap space overwrites. - -USE_DL_PREFIX default: NOT defined - Causes compiler to prefix all public routines with the string 'dl'. - This can be useful when you only want to use this malloc in one part - of a program, using your regular system malloc elsewhere. - -MALLOC_INSPECT_ALL default: NOT defined - If defined, compiles malloc_inspect_all and mspace_inspect_all, that - perform traversal of all heap space. Unless access to these - functions is otherwise restricted, you probably do not want to - include them in secure implementations. - -ABORT default: defined as abort() - Defines how to abort on failed checks. On most systems, a failed - check cannot die with an "assert" or even print an informative - message, because the underlying print routines in turn call malloc, - which will fail again. Generally, the best policy is to simply call - abort(). It's not very useful to do more than this because many - errors due to overwriting will show up as address faults (null, odd - addresses etc) rather than malloc-triggered checks, so will also - abort. Also, most compilers know that abort() does not return, so - can better optimize code conditionally calling it. - -PROCEED_ON_ERROR default: defined as 0 (false) - Controls whether detected bad addresses cause them to bypassed - rather than aborting. If set, detected bad arguments to free and - realloc are ignored. And all bookkeeping information is zeroed out - upon a detected overwrite of freed heap space, thus losing the - ability to ever return it from malloc again, but enabling the - application to proceed. If PROCEED_ON_ERROR is defined, the - static variable malloc_corruption_error_count is compiled in - and can be examined to see if errors have occurred. This option - generates slower code than the default abort policy. - -DEBUG default: NOT defined - The DEBUG setting is mainly intended for people trying to modify - this code or diagnose problems when porting to new platforms. - However, it may also be able to better isolate user errors than just - using runtime checks. The assertions in the check routines spell - out in more detail the assumptions and invariants underlying the - algorithms. The checking is fairly extensive, and will slow down - execution noticeably. Calling malloc_stats or mallinfo with DEBUG - set will attempt to check every non-mmapped allocated and free chunk - in the course of computing the summaries. - -ABORT_ON_ASSERT_FAILURE default: defined as 1 (true) - Debugging assertion failures can be nearly impossible if your - version of the assert macro causes malloc to be called, which will - lead to a cascade of further failures, blowing the runtime stack. - ABORT_ON_ASSERT_FAILURE cause assertions failures to call abort(), - which will usually make debugging easier. - -MALLOC_FAILURE_ACTION default: sets errno to ENOMEM, or no-op on win32 - The action to take before "return 0" when malloc fails to be able to - return memory because there is none available. - -HAVE_MORECORE default: 1 (true) unless win32 or ONLY_MSPACES - True if this system supports sbrk or an emulation of it. - -MORECORE default: sbrk - The name of the sbrk-style system routine to call to obtain more - memory. See below for guidance on writing custom MORECORE - functions. The type of the argument to sbrk/MORECORE varies across - systems. It cannot be size_t, because it supports negative - arguments, so it is normally the signed type of the same width as - size_t (sometimes declared as "intptr_t"). It doesn't much matter - though. Internally, we only call it with arguments less than half - the max value of a size_t, which should work across all reasonable - possibilities, although sometimes generating compiler warnings. - -MORECORE_CONTIGUOUS default: 1 (true) if HAVE_MORECORE - If true, take advantage of fact that consecutive calls to MORECORE - with positive arguments always return contiguous increasing - addresses. This is true of unix sbrk. It does not hurt too much to - set it true anyway, since malloc copes with non-contiguities. - Setting it false when definitely non-contiguous saves time - and possibly wasted space it would take to discover this though. - -MORECORE_CANNOT_TRIM default: NOT defined - True if MORECORE cannot release space back to the system when given - negative arguments. This is generally necessary only if you are - using a hand-crafted MORECORE function that cannot handle negative - arguments. - -NO_SEGMENT_TRAVERSAL default: 0 - If non-zero, suppresses traversals of memory segments - returned by either MORECORE or CALL_MMAP. This disables - merging of segments that are contiguous, and selectively - releasing them to the OS if unused, but bounds execution times. - -HAVE_MMAP default: 1 (true) - True if this system supports mmap or an emulation of it. If so, and - HAVE_MORECORE is not true, MMAP is used for all system - allocation. If set and HAVE_MORECORE is true as well, MMAP is - primarily used to directly allocate very large blocks. It is also - used as a backup strategy in cases where MORECORE fails to provide - space from system. Note: A single call to MUNMAP is assumed to be - able to unmap memory that may have be allocated using multiple calls - to MMAP, so long as they are adjacent. - -HAVE_MREMAP default: 1 on linux, else 0 - If true realloc() uses mremap() to re-allocate large blocks and - extend or shrink allocation spaces. - -MMAP_CLEARS default: 1 except on WINCE. - True if mmap clears memory so calloc doesn't need to. This is true - for standard unix mmap using /dev/zero and on WIN32 except for WINCE. - -USE_BUILTIN_FFS default: 0 (i.e., not used) - Causes malloc to use the builtin ffs() function to compute indices. - Some compilers may recognize and intrinsify ffs to be faster than the - supplied C version. Also, the case of x86 using gcc is special-cased - to an asm instruction, so is already as fast as it can be, and so - this setting has no effect. Similarly for Win32 under recent MS compilers. - (On most x86s, the asm version is only slightly faster than the C version.) - -malloc_getpagesize default: derive from system includes, or 4096. - The system page size. To the extent possible, this malloc manages - memory from the system in page-size units. This may be (and - usually is) a function rather than a constant. This is ignored - if WIN32, where page size is determined using getSystemInfo during - initialization. - -USE_DEV_RANDOM default: 0 (i.e., not used) - Causes malloc to use /dev/random to initialize secure magic seed for - stamping footers. Otherwise, the current time is used. - -NO_MALLINFO default: 0 - If defined, don't compile "mallinfo". This can be a simple way - of dealing with mismatches between system declarations and - those in this file. - -MALLINFO_FIELD_TYPE default: size_t - The type of the fields in the mallinfo struct. This was originally - defined as "int" in SVID etc, but is more usefully defined as - size_t. The value is used only if HAVE_USR_INCLUDE_MALLOC_H is not set - -NO_MALLOC_STATS default: 0 - If defined, don't compile "malloc_stats". This avoids calls to - fprintf and bringing in stdio dependencies you might not want. - -REALLOC_ZERO_BYTES_FREES default: not defined - This should be set if a call to realloc with zero bytes should - be the same as a call to free. Some people think it should. Otherwise, - since this malloc returns a unique pointer for malloc(0), so does - realloc(p, 0). - -LACKS_UNISTD_H, LACKS_FCNTL_H, LACKS_SYS_PARAM_H, LACKS_SYS_MMAN_H -LACKS_STRINGS_H, LACKS_STRING_H, LACKS_SYS_TYPES_H, LACKS_ERRNO_H -LACKS_STDLIB_H LACKS_SCHED_H LACKS_TIME_H default: NOT defined unless on WIN32 - Define these if your system does not have these header files. - You might need to manually insert some of the declarations they provide. - -DEFAULT_GRANULARITY default: page size if MORECORE_CONTIGUOUS, - system_info.dwAllocationGranularity in WIN32, - otherwise 64K. - Also settable using mallopt(M_GRANULARITY, x) - The unit for allocating and deallocating memory from the system. On - most systems with contiguous MORECORE, there is no reason to - make this more than a page. However, systems with MMAP tend to - either require or encourage larger granularities. You can increase - this value to prevent system allocation functions to be called so - often, especially if they are slow. The value must be at least one - page and must be a power of two. Setting to 0 causes initialization - to either page size or win32 region size. (Note: In previous - versions of malloc, the equivalent of this option was called - "TOP_PAD") - -DEFAULT_TRIM_THRESHOLD default: 2MB - Also settable using mallopt(M_TRIM_THRESHOLD, x) - The maximum amount of unused top-most memory to keep before - releasing via malloc_trim in free(). Automatic trimming is mainly - useful in long-lived programs using contiguous MORECORE. Because - trimming via sbrk can be slow on some systems, and can sometimes be - wasteful (in cases where programs immediately afterward allocate - more large chunks) the value should be high enough so that your - overall system performance would improve by releasing this much - memory. As a rough guide, you might set to a value close to the - average size of a process (program) running on your system. - Releasing this much memory would allow such a process to run in - memory. Generally, it is worth tuning trim thresholds when a - program undergoes phases where several large chunks are allocated - and released in ways that can reuse each other's storage, perhaps - mixed with phases where there are no such chunks at all. The trim - value must be greater than page size to have any useful effect. To - disable trimming completely, you can set to MAX_SIZE_T. Note that the trick - some people use of mallocing a huge space and then freeing it at - program startup, in an attempt to reserve system memory, doesn't - have the intended effect under automatic trimming, since that memory - will immediately be returned to the system. - -DEFAULT_MMAP_THRESHOLD default: 256K - Also settable using mallopt(M_MMAP_THRESHOLD, x) - The request size threshold for using MMAP to directly service a - request. Requests of at least this size that cannot be allocated - using already-existing space will be serviced via mmap. (If enough - normal freed space already exists it is used instead.) Using mmap - segregates relatively large chunks of memory so that they can be - individually obtained and released from the host system. A request - serviced through mmap is never reused by any other request (at least - not directly; the system may just so happen to remap successive - requests to the same locations). Segregating space in this way has - the benefits that: Mmapped space can always be individually released - back to the system, which helps keep the system level memory demands - of a long-lived program low. Also, mapped memory doesn't become - `locked' between other chunks, as can happen with normally allocated - chunks, which means that even trimming via malloc_trim would not - release them. However, it has the disadvantage that the space - cannot be reclaimed, consolidated, and then used to service later - requests, as happens with normal chunks. The advantages of mmap - nearly always outweigh disadvantages for "large" chunks, but the - value of "large" may vary across systems. The default is an - empirically derived value that works well in most systems. You can - disable mmap by setting to MAX_SIZE_T. - -MAX_RELEASE_CHECK_RATE default: 4095 unless not HAVE_MMAP - The number of consolidated frees between checks to release - unused segments when freeing. When using non-contiguous segments, - especially with multiple mspaces, checking only for topmost space - doesn't always suffice to trigger trimming. To compensate for this, - free() will, with a period of MAX_RELEASE_CHECK_RATE (or the - current number of segments, if greater) try to release unused - segments to the OS when freeing chunks that result in - consolidation. The best value for this parameter is a compromise - between slowing down frees with relatively costly checks that - rarely trigger versus holding on to unused memory. To effectively - disable, set to MAX_SIZE_T. This may lead to a very slight speed - improvement at the expense of carrying around more memory. -*/ - -#ifndef REGTEST -#include "dlmalloc.h" - -/* Version identifier to allow people to support multiple versions */ -#ifndef DLMALLOC_VERSION -#define DLMALLOC_VERSION 20805 -#endif /* DLMALLOC_VERSION */ - -#ifndef DLMALLOC_EXPORT -#define DLMALLOC_EXPORT extern -#endif - - -#ifndef LACKS_SYS_TYPES_H -#include /* For size_t */ -#endif /* LACKS_SYS_TYPES_H */ - -/* The maximum possible size_t value has all bits set */ -#define MAX_SIZE_T (~(size_t)0) - -#ifndef USE_LOCKS /* ensure true if spin or recursive locks set */ -#define USE_LOCKS ((defined(USE_SPIN_LOCKS) && USE_SPIN_LOCKS != 0) || \ - (defined(USE_RECURSIVE_LOCKS) && USE_RECURSIVE_LOCKS != 0)) -#endif /* USE_LOCKS */ - -#if USE_LOCKS /* Spin locks for gcc >= 4.1, older gcc on x86, MSC >= 1310 */ -#if ((defined(__GNUC__) && \ - ((__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1)) || \ - defined(__i386__) || defined(__x86_64__))) || \ - (defined(_MSC_VER) && _MSC_VER>=1310)) -#ifndef USE_SPIN_LOCKS -#define USE_SPIN_LOCKS 1 -#endif /* USE_SPIN_LOCKS */ -#elif USE_SPIN_LOCKS -#error "USE_SPIN_LOCKS defined without implementation" -#endif /* ... locks available... */ -#elif !defined(USE_SPIN_LOCKS) -#define USE_SPIN_LOCKS 0 -#endif /* USE_LOCKS */ - -#ifndef ONLY_MSPACES -#define ONLY_MSPACES 0 -#endif /* ONLY_MSPACES */ -#ifndef MSPACES -#if ONLY_MSPACES -#define MSPACES 1 -#else /* ONLY_MSPACES */ -#define MSPACES 0 -#endif /* ONLY_MSPACES */ -#endif /* MSPACES */ -#ifndef MALLOC_ALIGNMENT -#define MALLOC_ALIGNMENT ((size_t)8U) -#endif /* MALLOC_ALIGNMENT */ -#ifndef FOOTERS -#define FOOTERS 0 -#endif /* FOOTERS */ -#ifndef ABORT -#define ABORT abort() -#endif /* ABORT */ -#ifndef ABORT_ON_ASSERT_FAILURE -#define ABORT_ON_ASSERT_FAILURE 1 -#endif /* ABORT_ON_ASSERT_FAILURE */ -#ifndef PROCEED_ON_ERROR -#define PROCEED_ON_ERROR 0 -#endif /* PROCEED_ON_ERROR */ - -#ifndef INSECURE -#define INSECURE 0 -#endif /* INSECURE */ -#ifndef MALLOC_INSPECT_ALL -#define MALLOC_INSPECT_ALL 0 -#endif /* MALLOC_INSPECT_ALL */ -#ifndef HAVE_MMAP -#define HAVE_MMAP 1 -#endif /* HAVE_MMAP */ -#ifndef MMAP_CLEARS -#define MMAP_CLEARS 1 -#endif /* MMAP_CLEARS */ -#ifndef HAVE_MREMAP -#ifdef linux -#define HAVE_MREMAP 1 -#define _GNU_SOURCE /* Turns on mremap() definition */ -#else /* linux */ -#define HAVE_MREMAP 0 -#endif /* linux */ -#endif /* HAVE_MREMAP */ -#ifndef MALLOC_FAILURE_ACTION -#define MALLOC_FAILURE_ACTION errno = ENOMEM; -#endif /* MALLOC_FAILURE_ACTION */ -#ifndef HAVE_MORECORE -#if ONLY_MSPACES -#define HAVE_MORECORE 0 -#else /* ONLY_MSPACES */ -#define HAVE_MORECORE 1 -#endif /* ONLY_MSPACES */ -#endif /* HAVE_MORECORE */ -#if !HAVE_MORECORE -#define MORECORE_CONTIGUOUS 0 -#else /* !HAVE_MORECORE */ -#define MORECORE_DEFAULT sbrk -#ifndef MORECORE_CONTIGUOUS -#define MORECORE_CONTIGUOUS 1 -#endif /* MORECORE_CONTIGUOUS */ -#endif /* HAVE_MORECORE */ -#ifndef DEFAULT_GRANULARITY -#if (MORECORE_CONTIGUOUS || defined(WIN32)) -#define DEFAULT_GRANULARITY (0) /* 0 means to compute in init_mparams */ -#else /* MORECORE_CONTIGUOUS */ -#define DEFAULT_GRANULARITY ((size_t)64U * (size_t)1024U) -#endif /* MORECORE_CONTIGUOUS */ -#endif /* DEFAULT_GRANULARITY */ -#ifndef DEFAULT_TRIM_THRESHOLD -#ifndef MORECORE_CANNOT_TRIM -#define DEFAULT_TRIM_THRESHOLD ((size_t)2U * (size_t)1024U * (size_t)1024U) -#else /* MORECORE_CANNOT_TRIM */ -#define DEFAULT_TRIM_THRESHOLD MAX_SIZE_T -#endif /* MORECORE_CANNOT_TRIM */ -#endif /* DEFAULT_TRIM_THRESHOLD */ -#ifndef DEFAULT_MMAP_THRESHOLD -#if HAVE_MMAP -#define DEFAULT_MMAP_THRESHOLD ((size_t)256U * (size_t)1024U) -#else /* HAVE_MMAP */ -#define DEFAULT_MMAP_THRESHOLD MAX_SIZE_T -#endif /* HAVE_MMAP */ -#endif /* DEFAULT_MMAP_THRESHOLD */ -#ifndef MAX_RELEASE_CHECK_RATE -#if HAVE_MMAP -#define MAX_RELEASE_CHECK_RATE 4095 -#else -#define MAX_RELEASE_CHECK_RATE MAX_SIZE_T -#endif /* HAVE_MMAP */ -#endif /* MAX_RELEASE_CHECK_RATE */ -#ifndef USE_BUILTIN_FFS -#define USE_BUILTIN_FFS 0 -#endif /* USE_BUILTIN_FFS */ -#ifndef USE_DEV_RANDOM -#define USE_DEV_RANDOM 0 -#endif /* USE_DEV_RANDOM */ -#ifndef NO_MALLINFO -#define NO_MALLINFO 0 -#endif /* NO_MALLINFO */ -#ifndef MALLINFO_FIELD_TYPE -#define MALLINFO_FIELD_TYPE size_t -#endif /* MALLINFO_FIELD_TYPE */ -#ifndef NO_MALLOC_STATS -#define NO_MALLOC_STATS 0 -#endif /* NO_MALLOC_STATS */ -#ifndef NO_SEGMENT_TRAVERSAL -#define NO_SEGMENT_TRAVERSAL 0 -#endif /* NO_SEGMENT_TRAVERSAL */ - -/* - mallopt tuning options. SVID/XPG defines four standard parameter - numbers for mallopt, normally defined in malloc.h. None of these - are used in this malloc, so setting them has no effect. But this - malloc does support the following options. -*/ - -#define M_TRIM_THRESHOLD (-1) -#define M_GRANULARITY (-2) -#define M_MMAP_THRESHOLD (-3) - -/* ------------------------ Mallinfo declarations ------------------------ */ - -#if !NO_MALLINFO -/* - This version of malloc supports the standard SVID/XPG mallinfo - routine that returns a struct containing usage properties and - statistics. It should work on any system that has a - /usr/include/malloc.h defining struct mallinfo. The main - declaration needed is the mallinfo struct that is returned (by-copy) - by mallinfo(). The malloinfo struct contains a bunch of fields that - are not even meaningful in this version of malloc. These fields are - are instead filled by mallinfo() with other numbers that might be of - interest. - - HAVE_USR_INCLUDE_MALLOC_H should be set if you have a - /usr/include/malloc.h file that includes a declaration of struct - mallinfo. If so, it is included; else a compliant version is - declared below. These must be precisely the same for mallinfo() to - work. The original SVID version of this struct, defined on most - systems with mallinfo, declares all fields as ints. But some others - define as unsigned long. If your system defines the fields using a - type of different width than listed here, you MUST #include your - system version and #define HAVE_USR_INCLUDE_MALLOC_H. -*/ - -/* #define HAVE_USR_INCLUDE_MALLOC_H */ - -#ifdef HAVE_USR_INCLUDE_MALLOC_H -#include "/usr/include/malloc.h" -#else /* HAVE_USR_INCLUDE_MALLOC_H */ -#ifndef STRUCT_MALLINFO_DECLARED -/* HP-UX (and others?) redefines mallinfo unless _STRUCT_MALLINFO is defined */ -#define _STRUCT_MALLINFO -#define STRUCT_MALLINFO_DECLARED 1 -struct mallinfo { - MALLINFO_FIELD_TYPE arena; /* non-mmapped space allocated from system */ - MALLINFO_FIELD_TYPE ordblks; /* number of free chunks */ - MALLINFO_FIELD_TYPE smblks; /* always 0 */ - MALLINFO_FIELD_TYPE hblks; /* always 0 */ - MALLINFO_FIELD_TYPE hblkhd; /* space in mmapped regions */ - MALLINFO_FIELD_TYPE usmblks; /* maximum total allocated space */ - MALLINFO_FIELD_TYPE fsmblks; /* always 0 */ - MALLINFO_FIELD_TYPE uordblks; /* total allocated space */ - MALLINFO_FIELD_TYPE fordblks; /* total free space */ - MALLINFO_FIELD_TYPE keepcost; /* releasable (via malloc_trim) space */ -}; -#endif /* STRUCT_MALLINFO_DECLARED */ -#endif /* HAVE_USR_INCLUDE_MALLOC_H */ -#endif /* NO_MALLINFO */ - -/* - Try to persuade compilers to inline. The most critical functions for - inlining are defined as macros, so these aren't used for them. -*/ - -#ifndef FORCEINLINE - #if defined(__GNUC__) -#define FORCEINLINE __inline __attribute__ ((always_inline)) - #elif defined(_MSC_VER) - #define FORCEINLINE __forceinline - #endif -#endif -#ifndef NOINLINE - #if defined(__GNUC__) - #define NOINLINE __attribute__ ((noinline)) - #elif defined(_MSC_VER) - #define NOINLINE __declspec(noinline) - #else - #define NOINLINE - #endif -#endif - -#ifdef __cplusplus -extern "C" { -#ifndef FORCEINLINE - #define FORCEINLINE inline -#endif -#endif /* __cplusplus */ -#ifndef FORCEINLINE - #define FORCEINLINE -#endif - -#if !ONLY_MSPACES - -/* ------------------- Declarations of public routines ------------------- */ - -#ifndef USE_DL_PREFIX -#define dlcalloc calloc -#define dlfree free -#define dlmalloc malloc -#define dlmemalign aligned_alloc -#define dlposix_memalign posix_memalign -#define dlrealloc realloc -#define dlrealloc_in_place realloc_in_place -#define dlvalloc valloc -#define dlpvalloc pvalloc -#define dlmallinfo mallinfo -#define dlmallopt mallopt -#define dlmalloc_trim malloc_trim -#define dlmalloc_stats malloc_stats -#define dlmalloc_usable_size malloc_usable_size -#define dlmalloc_footprint malloc_footprint -#define dlmalloc_max_footprint malloc_max_footprint -#define dlmalloc_footprint_limit malloc_footprint_limit -#define dlmalloc_set_footprint_limit malloc_set_footprint_limit -#define dlmalloc_inspect_all malloc_inspect_all -#define dlindependent_calloc independent_calloc -#define dlindependent_comalloc independent_comalloc -#define dlbulk_free bulk_free -#endif /* USE_DL_PREFIX */ - -#if 0 // Redeclaration warnings as PDCLib already declares these in - -/* - malloc(size_t n) - Returns a pointer to a newly allocated chunk of at least n bytes, or - null if no space is available, in which case errno is set to ENOMEM - on ANSI C systems. - - If n is zero, malloc returns a minimum-sized chunk. (The minimum - size is 16 bytes on most 32bit systems, and 32 bytes on 64bit - systems.) Note that size_t is an unsigned type, so calls with - arguments that would be negative if signed are interpreted as - requests for huge amounts of space, which will often fail. The - maximum supported value of n differs across systems, but is in all - cases less than the maximum representable value of a size_t. -*/ -DLMALLOC_EXPORT void* dlmalloc(size_t); - -/* - free(void* p) - Releases the chunk of memory pointed to by p, that had been previously - allocated using malloc or a related routine such as realloc. - It has no effect if p is null. If p was not malloced or already - freed, free(p) will by default cause the current program to abort. -*/ -DLMALLOC_EXPORT void dlfree(void*); - -/* - calloc(size_t n_elements, size_t element_size); - Returns a pointer to n_elements * element_size bytes, with all locations - set to zero. -*/ -DLMALLOC_EXPORT void* dlcalloc(size_t, size_t); - -/* - realloc(void* p, size_t n) - Returns a pointer to a chunk of size n that contains the same data - as does chunk p up to the minimum of (n, p's size) bytes, or null - if no space is available. - - The returned pointer may or may not be the same as p. The algorithm - prefers extending p in most cases when possible, otherwise it - employs the equivalent of a malloc-copy-free sequence. - - If p is null, realloc is equivalent to malloc. - - If space is not available, realloc returns null, errno is set (if on - ANSI) and p is NOT freed. - - if n is for fewer bytes than already held by p, the newly unused - space is lopped off and freed if possible. realloc with a size - argument of zero (re)allocates a minimum-sized chunk. - - The old unix realloc convention of allowing the last-free'd chunk - to be used as an argument to realloc is not supported. -*/ -DLMALLOC_EXPORT void* dlrealloc(void*, size_t); - -#endif - -/* - realloc_in_place(void* p, size_t n) - Resizes the space allocated for p to size n, only if this can be - done without moving p (i.e., only if there is adjacent space - available if n is greater than p's current allocated size, or n is - less than or equal to p's size). This may be used instead of plain - realloc if an alternative allocation strategy is needed upon failure - to expand space; for example, reallocation of a buffer that must be - memory-aligned or cleared. You can use realloc_in_place to trigger - these alternatives only when needed. - - Returns p if successful; otherwise null. -*/ -DLMALLOC_EXPORT void* dlrealloc_in_place(void*, size_t); - -#if 0 // Redeclaration warnings as PDCLib already declares these in - -/* - memalign(size_t alignment, size_t n); - Returns a pointer to a newly allocated chunk of n bytes, aligned - in accord with the alignment argument. - - The alignment argument should be a power of two. If the argument is - not a power of two, the nearest greater power is used. - 8-byte alignment is guaranteed by normal malloc calls, so don't - bother calling memalign with an argument of 8 or less. - - Overreliance on memalign is a sure way to fragment space. -*/ -DLMALLOC_EXPORT void* dlmemalign(size_t, size_t); - -#endif - -/* - int posix_memalign(void** pp, size_t alignment, size_t n); - Allocates a chunk of n bytes, aligned in accord with the alignment - argument. Differs from memalign only in that it (1) assigns the - allocated memory to *pp rather than returning it, (2) fails and - returns EINVAL if the alignment is not a power of two (3) fails and - returns ENOMEM if memory cannot be allocated. -*/ -DLMALLOC_EXPORT int dlposix_memalign(void**, size_t, size_t); - -/* - valloc(size_t n); - Equivalent to memalign(pagesize, n), where pagesize is the page - size of the system. If the pagesize is unknown, 4096 is used. -*/ -DLMALLOC_EXPORT void* dlvalloc(size_t); - -/* - mallopt(int parameter_number, int parameter_value) - Sets tunable parameters The format is to provide a - (parameter-number, parameter-value) pair. mallopt then sets the - corresponding parameter to the argument value if it can (i.e., so - long as the value is meaningful), and returns 1 if successful else - 0. To workaround the fact that mallopt is specified to use int, - not size_t parameters, the value -1 is specially treated as the - maximum unsigned size_t value. - - SVID/XPG/ANSI defines four standard param numbers for mallopt, - normally defined in malloc.h. None of these are use in this malloc, - so setting them has no effect. But this malloc also supports other - options in mallopt. See below for details. Briefly, supported - parameters are as follows (listed defaults are for "typical" - configurations). - - Symbol param # default allowed param values - M_TRIM_THRESHOLD -1 2*1024*1024 any (-1 disables) - M_GRANULARITY -2 page size any power of 2 >= page size - M_MMAP_THRESHOLD -3 256*1024 any (or 0 if no MMAP support) -*/ -DLMALLOC_EXPORT int dlmallopt(int, int); - -/* - malloc_footprint(); - Returns the number of bytes obtained from the system. The total - number of bytes allocated by malloc, realloc etc., is less than this - value. Unlike mallinfo, this function returns only a precomputed - result, so can be called frequently to monitor memory consumption. - Even if locks are otherwise defined, this function does not use them, - so results might not be up to date. -*/ -DLMALLOC_EXPORT size_t dlmalloc_footprint(void); - -/* - malloc_max_footprint(); - Returns the maximum number of bytes obtained from the system. This - value will be greater than current footprint if deallocated space - has been reclaimed by the system. The peak number of bytes allocated - by malloc, realloc etc., is less than this value. Unlike mallinfo, - this function returns only a precomputed result, so can be called - frequently to monitor memory consumption. Even if locks are - otherwise defined, this function does not use them, so results might - not be up to date. -*/ -DLMALLOC_EXPORT size_t dlmalloc_max_footprint(void); - -/* - malloc_footprint_limit(); - Returns the number of bytes that the heap is allowed to obtain from - the system, returning the last value returned by - malloc_set_footprint_limit, or the maximum size_t value if - never set. The returned value reflects a permission. There is no - guarantee that this number of bytes can actually be obtained from - the system. -*/ -DLMALLOC_EXPORT size_t dlmalloc_footprint_limit(void); - -/* - malloc_set_footprint_limit(); - Sets the maximum number of bytes to obtain from the system, causing - failure returns from malloc and related functions upon attempts to - exceed this value. The argument value may be subject to page - rounding to an enforceable limit; this actual value is returned. - Using an argument of the maximum possible size_t effectively - disables checks. If the argument is less than or equal to the - current malloc_footprint, then all future allocations that require - additional system memory will fail. However, invocation cannot - retroactively deallocate existing used memory. -*/ -DLMALLOC_EXPORT size_t dlmalloc_set_footprint_limit(size_t bytes); - -#if MALLOC_INSPECT_ALL -/* - malloc_inspect_all(void(*handler)(void *start, - void *end, - size_t used_bytes, - void* callback_arg), - void* arg); - Traverses the heap and calls the given handler for each managed - region, skipping all bytes that are (or may be) used for bookkeeping - purposes. Traversal does not include include chunks that have been - directly memory mapped. Each reported region begins at the start - address, and continues up to but not including the end address. The - first used_bytes of the region contain allocated data. If - used_bytes is zero, the region is unallocated. The handler is - invoked with the given callback argument. If locks are defined, they - are held during the entire traversal. It is a bad idea to invoke - other malloc functions from within the handler. - - For example, to count the number of in-use chunks with size greater - than 1000, you could write: - static int count = 0; - void count_chunks(void* start, void* end, size_t used, void* arg) { - if (used >= 1000) ++count; - } - then: - malloc_inspect_all(count_chunks, NULL); - - malloc_inspect_all is compiled only if MALLOC_INSPECT_ALL is defined. -*/ -DLMALLOC_EXPORT void dlmalloc_inspect_all(void(*handler)(void*, void *, size_t, void*), - void* arg); - -#endif /* MALLOC_INSPECT_ALL */ - -#if !NO_MALLINFO -/* - mallinfo() - Returns (by copy) a struct containing various summary statistics: - - arena: current total non-mmapped bytes allocated from system - ordblks: the number of free chunks - smblks: always zero. - hblks: current number of mmapped regions - hblkhd: total bytes held in mmapped regions - usmblks: the maximum total allocated space. This will be greater - than current total if trimming has occurred. - fsmblks: always zero - uordblks: current total allocated space (normal or mmapped) - fordblks: total free space - keepcost: the maximum number of bytes that could ideally be released - back to system via malloc_trim. ("ideally" means that - it ignores page restrictions etc.) - - Because these fields are ints, but internal bookkeeping may - be kept as longs, the reported values may wrap around zero and - thus be inaccurate. -*/ -DLMALLOC_EXPORT struct mallinfo dlmallinfo(void); -#endif /* NO_MALLINFO */ - -/* - independent_calloc(size_t n_elements, size_t element_size, void* chunks[]); - - independent_calloc is similar to calloc, but instead of returning a - single cleared space, it returns an array of pointers to n_elements - independent elements that can hold contents of size elem_size, each - of which starts out cleared, and can be independently freed, - realloc'ed etc. The elements are guaranteed to be adjacently - allocated (this is not guaranteed to occur with multiple callocs or - mallocs), which may also improve cache locality in some - applications. - - The "chunks" argument is optional (i.e., may be null, which is - probably the most typical usage). If it is null, the returned array - is itself dynamically allocated and should also be freed when it is - no longer needed. Otherwise, the chunks array must be of at least - n_elements in length. It is filled in with the pointers to the - chunks. - - In either case, independent_calloc returns this pointer array, or - null if the allocation failed. If n_elements is zero and "chunks" - is null, it returns a chunk representing an array with zero elements - (which should be freed if not wanted). - - Each element must be freed when it is no longer needed. This can be - done all at once using bulk_free. - - independent_calloc simplifies and speeds up implementations of many - kinds of pools. It may also be useful when constructing large data - structures that initially have a fixed number of fixed-sized nodes, - but the number is not known at compile time, and some of the nodes - may later need to be freed. For example: - - struct Node { int item; struct Node* next; }; - - struct Node* build_list() { - struct Node** pool; - int n = read_number_of_nodes_needed(); - if (n <= 0) return 0; - pool = (struct Node**)(independent_calloc(n, sizeof(struct Node), 0); - if (pool == 0) die(); - // organize into a linked list... - struct Node* first = pool[0]; - for (i = 0; i < n-1; ++i) - pool[i]->next = pool[i+1]; - free(pool); // Can now free the array (or not, if it is needed later) - return first; - } -*/ -DLMALLOC_EXPORT void** dlindependent_calloc(size_t, size_t, void**); - -/* - independent_comalloc(size_t n_elements, size_t sizes[], void* chunks[]); - - independent_comalloc allocates, all at once, a set of n_elements - chunks with sizes indicated in the "sizes" array. It returns - an array of pointers to these elements, each of which can be - independently freed, realloc'ed etc. The elements are guaranteed to - be adjacently allocated (this is not guaranteed to occur with - multiple callocs or mallocs), which may also improve cache locality - in some applications. - - The "chunks" argument is optional (i.e., may be null). If it is null - the returned array is itself dynamically allocated and should also - be freed when it is no longer needed. Otherwise, the chunks array - must be of at least n_elements in length. It is filled in with the - pointers to the chunks. - - In either case, independent_comalloc returns this pointer array, or - null if the allocation failed. If n_elements is zero and chunks is - null, it returns a chunk representing an array with zero elements - (which should be freed if not wanted). - - Each element must be freed when it is no longer needed. This can be - done all at once using bulk_free. - - independent_comallac differs from independent_calloc in that each - element may have a different size, and also that it does not - automatically clear elements. - - independent_comalloc can be used to speed up allocation in cases - where several structs or objects must always be allocated at the - same time. For example: - - struct Head { ... } - struct Foot { ... } - - void send_message(char* msg) { - int msglen = strlen(msg); - size_t sizes[3] = { sizeof(struct Head), msglen, sizeof(struct Foot) }; - void* chunks[3]; - if (independent_comalloc(3, sizes, chunks) == 0) - die(); - struct Head* head = (struct Head*)(chunks[0]); - char* body = (char*)(chunks[1]); - struct Foot* foot = (struct Foot*)(chunks[2]); - // ... - } - - In general though, independent_comalloc is worth using only for - larger values of n_elements. For small values, you probably won't - detect enough difference from series of malloc calls to bother. - - Overuse of independent_comalloc can increase overall memory usage, - since it cannot reuse existing noncontiguous small chunks that - might be available for some of the elements. -*/ -DLMALLOC_EXPORT void** dlindependent_comalloc(size_t, size_t*, void**); - -/* - bulk_free(void* array[], size_t n_elements) - Frees and clears (sets to null) each non-null pointer in the given - array. This is likely to be faster than freeing them one-by-one. - If footers are used, pointers that have been allocated in different - mspaces are not freed or cleared, and the count of all such pointers - is returned. For large arrays of pointers with poor locality, it - may be worthwhile to sort this array before calling bulk_free. -*/ -DLMALLOC_EXPORT size_t dlbulk_free(void**, size_t n_elements); - -/* - pvalloc(size_t n); - Equivalent to valloc(minimum-page-that-holds(n)), that is, - round up n to nearest pagesize. - */ -DLMALLOC_EXPORT void* dlpvalloc(size_t); - -/* - malloc_trim(size_t pad); - - If possible, gives memory back to the system (via negative arguments - to sbrk) if there is unused memory at the `high' end of the malloc - pool or in unused MMAP segments. You can call this after freeing - large blocks of memory to potentially reduce the system-level memory - requirements of a program. However, it cannot guarantee to reduce - memory. Under some allocation patterns, some large free blocks of - memory will be locked between two used chunks, so they cannot be - given back to the system. - - The `pad' argument to malloc_trim represents the amount of free - trailing space to leave untrimmed. If this argument is zero, only - the minimum amount of memory to maintain internal data structures - will be left. Non-zero arguments can be supplied to maintain enough - trailing space to service future expected allocations without having - to re-obtain memory from the system. - - Malloc_trim returns 1 if it actually released any memory, else 0. -*/ -DLMALLOC_EXPORT int dlmalloc_trim(size_t); - -/* - malloc_stats(); - Prints on stderr the amount of space obtained from the system (both - via sbrk and mmap), the maximum amount (which may be more than - current if malloc_trim and/or munmap got called), and the current - number of bytes allocated via malloc (or realloc, etc) but not yet - freed. Note that this is the number of bytes allocated, not the - number requested. It will be larger than the number requested - because of alignment and bookkeeping overhead. Because it includes - alignment wastage as being in use, this figure may be greater than - zero even when no user-level chunks are allocated. - - The reported current and maximum system memory can be inaccurate if - a program makes other calls to system memory allocation functions - (normally sbrk) outside of malloc. - - malloc_stats prints only the most commonly interesting statistics. - More information can be obtained by calling mallinfo. -*/ -DLMALLOC_EXPORT void dlmalloc_stats(void); - -#endif /* ONLY_MSPACES */ - -/* - malloc_usable_size(void* p); - - Returns the number of bytes you can actually use in - an allocated chunk, which may be more than you requested (although - often not) due to alignment and minimum size constraints. - You can use this many bytes without worrying about - overwriting other allocated objects. This is not a particularly great - programming practice. malloc_usable_size can be more useful in - debugging and assertions, for example: - - p = malloc(n); - assert(malloc_usable_size(p) >= 256); -*/ -size_t dlmalloc_usable_size(void*); - -#if MSPACES - -/* - mspace is an opaque type representing an independent - region of space that supports mspace_malloc, etc. -*/ -typedef void* mspace; - -/* - create_mspace creates and returns a new independent space with the - given initial capacity, or, if 0, the default granularity size. It - returns null if there is no system memory available to create the - space. If argument locked is non-zero, the space uses a separate - lock to control access. The capacity of the space will grow - dynamically as needed to service mspace_malloc requests. You can - control the sizes of incremental increases of this space by - compiling with a different DEFAULT_GRANULARITY or dynamically - setting with mallopt(M_GRANULARITY, value). -*/ -DLMALLOC_EXPORT mspace create_mspace(size_t capacity, int locked); - -/* - destroy_mspace destroys the given space, and attempts to return all - of its memory back to the system, returning the total number of - bytes freed. After destruction, the results of access to all memory - used by the space become undefined. -*/ -DLMALLOC_EXPORT size_t destroy_mspace(mspace msp); - -/* - create_mspace_with_base uses the memory supplied as the initial base - of a new mspace. Part (less than 128*sizeof(size_t) bytes) of this - space is used for bookkeeping, so the capacity must be at least this - large. (Otherwise 0 is returned.) When this initial space is - exhausted, additional memory will be obtained from the system. - Destroying this space will deallocate all additionally allocated - space (if possible) but not the initial base. -*/ -DLMALLOC_EXPORT mspace create_mspace_with_base(void* base, size_t capacity, int locked); - -/* - mspace_track_large_chunks controls whether requests for large chunks - are allocated in their own untracked mmapped regions, separate from - others in this mspace. By default large chunks are not tracked, - which reduces fragmentation. However, such chunks are not - necessarily released to the system upon destroy_mspace. Enabling - tracking by setting to true may increase fragmentation, but avoids - leakage when relying on destroy_mspace to release all memory - allocated using this space. The function returns the previous - setting. -*/ -DLMALLOC_EXPORT int mspace_track_large_chunks(mspace msp, int enable); - - -/* - mspace_malloc behaves as malloc, but operates within - the given space. -*/ -DLMALLOC_EXPORT void* mspace_malloc(mspace msp, size_t bytes); - -/* - mspace_free behaves as free, but operates within - the given space. - - If compiled with FOOTERS==1, mspace_free is not actually needed. - free may be called instead of mspace_free because freed chunks from - any space are handled by their originating spaces. -*/ -DLMALLOC_EXPORT void mspace_free(mspace msp, void* mem); - -/* - mspace_realloc behaves as realloc, but operates within - the given space. - - If compiled with FOOTERS==1, mspace_realloc is not actually - needed. realloc may be called instead of mspace_realloc because - realloced chunks from any space are handled by their originating - spaces. -*/ -DLMALLOC_EXPORT void* mspace_realloc(mspace msp, void* mem, size_t newsize); - -/* - mspace_calloc behaves as calloc, but operates within - the given space. -*/ -DLMALLOC_EXPORT void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size); - -/* - mspace_memalign behaves as memalign, but operates within - the given space. -*/ -DLMALLOC_EXPORT void* mspace_memalign(mspace msp, size_t alignment, size_t bytes); - -/* - mspace_independent_calloc behaves as independent_calloc, but - operates within the given space. -*/ -DLMALLOC_EXPORT void** mspace_independent_calloc(mspace msp, size_t n_elements, - size_t elem_size, void* chunks[]); - -/* - mspace_independent_comalloc behaves as independent_comalloc, but - operates within the given space. -*/ -DLMALLOC_EXPORT void** mspace_independent_comalloc(mspace msp, size_t n_elements, - size_t sizes[], void* chunks[]); - -/* - mspace_footprint() returns the number of bytes obtained from the - system for this space. -*/ -DLMALLOC_EXPORT size_t mspace_footprint(mspace msp); - -/* - mspace_max_footprint() returns the peak number of bytes obtained from the - system for this space. -*/ -DLMALLOC_EXPORT size_t mspace_max_footprint(mspace msp); - - -#if !NO_MALLINFO -/* - mspace_mallinfo behaves as mallinfo, but reports properties of - the given space. -*/ -DLMALLOC_EXPORT struct mallinfo mspace_mallinfo(mspace msp); -#endif /* NO_MALLINFO */ - -/* - malloc_usable_size(void* p) behaves the same as malloc_usable_size; -*/ -DLMALLOC_EXPORT size_t mspace_usable_size(void* mem); - -/* - mspace_malloc_stats behaves as malloc_stats, but reports - properties of the given space. -*/ -DLMALLOC_EXPORT void mspace_malloc_stats(mspace msp); - -/* - mspace_trim behaves as malloc_trim, but - operates within the given space. -*/ -DLMALLOC_EXPORT int mspace_trim(mspace msp, size_t pad); - -/* - An alias for mallopt. -*/ -DLMALLOC_EXPORT int mspace_mallopt(int, int); - -#endif /* MSPACES */ - -#ifdef __cplusplus -} /* end of extern "C" */ -#endif /* __cplusplus */ - -/* - ======================================================================== - To make a fully customizable malloc.h header file, cut everything - above this line, put into file malloc.h, edit to suit, and #include it - on the next line, as well as in programs that use this malloc. - ======================================================================== -*/ - -/* #include "malloc.h" */ - -/*------------------------------ internal #includes ---------------------- */ - -#ifdef _MSC_VER -#pragma warning( disable : 4146 ) /* no "unsigned" warnings */ -#endif /* _MSC_VER */ -#if !NO_MALLOC_STATS -#include /* for printing in malloc_stats */ -#endif /* NO_MALLOC_STATS */ -#ifndef LACKS_ERRNO_H -#include /* for MALLOC_FAILURE_ACTION */ -#endif /* LACKS_ERRNO_H */ -#ifdef DEBUG -#if ABORT_ON_ASSERT_FAILURE -#undef assert -#define assert(x) if(!(x)) ABORT -#else /* ABORT_ON_ASSERT_FAILURE */ -#include -#endif /* ABORT_ON_ASSERT_FAILURE */ -#else /* DEBUG */ -#ifndef assert -#define assert(x) -#endif -#define DEBUG 0 -#endif /* DEBUG */ -#if !defined(WIN32) && !defined(LACKS_TIME_H) -#include /* for magic initialization */ -#endif /* WIN32 */ -#ifndef LACKS_STDLIB_H -#include /* for abort() */ -#endif /* LACKS_STDLIB_H */ -#ifndef LACKS_STRING_H -#include /* for memset etc */ -#endif /* LACKS_STRING_H */ -#if USE_BUILTIN_FFS -#ifndef LACKS_STRINGS_H -#include /* for ffs */ -#endif /* LACKS_STRINGS_H */ -#endif /* USE_BUILTIN_FFS */ -#if HAVE_MMAP -#ifndef LACKS_SYS_MMAN_H -/* On some versions of linux, mremap decl in mman.h needs __USE_GNU set */ -#if (defined(linux) && !defined(__USE_GNU)) -#define __USE_GNU 1 -#include /* for mmap */ -#undef __USE_GNU -#else -#include /* for mmap */ -#endif /* linux */ -#endif /* LACKS_SYS_MMAN_H */ -#ifndef LACKS_FCNTL_H -#include -#endif /* LACKS_FCNTL_H */ -#endif /* HAVE_MMAP */ -#ifndef LACKS_UNISTD_H -#include /* for sbrk, sysconf */ -#else /* LACKS_UNISTD_H */ -#if !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__) -/*extern void* sbrk(ptrdiff_t);*/ -#endif /* FreeBSD etc */ -#endif /* LACKS_UNISTD_H */ - -/* Declarations for locking */ -#if USE_LOCKS -#ifndef WIN32 -#if defined (__SVR4) && defined (__sun) /* solaris */ -#include -#elif !defined(LACKS_SCHED_H) -#include -#endif /* solaris or LACKS_SCHED_H */ -#if (defined(USE_RECURSIVE_LOCKS) && USE_RECURSIVE_LOCKS != 0) || !USE_SPIN_LOCKS -/*#include */ -#endif /* USE_RECURSIVE_LOCKS ... */ -#elif defined(_MSC_VER) -#ifndef _M_AMD64 -/* These are already defined on AMD64 builds */ -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ -LONG __cdecl _InterlockedCompareExchange(LONG volatile *Dest, LONG Exchange, LONG Comp); -LONG __cdecl _InterlockedExchange(LONG volatile *Target, LONG Value); -#ifdef __cplusplus -} -#endif /* __cplusplus */ -#endif /* _M_AMD64 */ -#pragma intrinsic (_InterlockedCompareExchange) -#pragma intrinsic (_InterlockedExchange) -#define interlockedcompareexchange _InterlockedCompareExchange -#define interlockedexchange _InterlockedExchange -#elif defined(WIN32) && defined(__GNUC__) -#define interlockedcompareexchange(a, b, c) __sync_val_compare_and_swap(a, c, b) -#define interlockedexchange __sync_lock_test_and_set -#endif /* Win32 */ -#endif /* USE_LOCKS */ - -/* Declarations for bit scanning on win32 */ -#if defined(_MSC_VER) && _MSC_VER>=1300 -#ifndef BitScanForward /* Try to avoid pulling in WinNT.h */ -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ -unsigned char _BitScanForward(unsigned long *index, unsigned long mask); -unsigned char _BitScanReverse(unsigned long *index, unsigned long mask); -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#define BitScanForward _BitScanForward -#define BitScanReverse _BitScanReverse -#pragma intrinsic(_BitScanForward) -#pragma intrinsic(_BitScanReverse) -#endif /* BitScanForward */ -#endif /* defined(_MSC_VER) && _MSC_VER>=1300 */ - -#ifndef WIN32 -#ifndef malloc_getpagesize -# ifdef _SC_PAGESIZE /* some SVR4 systems omit an underscore */ -# ifndef _SC_PAGE_SIZE -# define _SC_PAGE_SIZE _SC_PAGESIZE -# endif -# endif -# ifdef _SC_PAGE_SIZE -# define malloc_getpagesize sysconf(_SC_PAGE_SIZE) -# else -# if defined(BSD) || defined(DGUX) || defined(HAVE_GETPAGESIZE) - extern size_t getpagesize(); -# define malloc_getpagesize getpagesize() -# else -# ifdef WIN32 /* use supplied emulation of getpagesize */ -# define malloc_getpagesize getpagesize() -# else -# ifndef LACKS_SYS_PARAM_H -# include -# endif -# ifdef EXEC_PAGESIZE -# define malloc_getpagesize EXEC_PAGESIZE -# else -# ifdef NBPG -# ifndef CLSIZE -# define malloc_getpagesize NBPG -# else -# define malloc_getpagesize (NBPG * CLSIZE) -# endif -# else -# ifdef NBPC -# define malloc_getpagesize NBPC -# else -# ifdef PAGESIZE -# define malloc_getpagesize PAGESIZE -# else /* just guess */ -# define malloc_getpagesize ((size_t)4096U) -# endif -# endif -# endif -# endif -# endif -# endif -# endif -#endif -#endif - -/* ------------------- size_t and alignment properties -------------------- */ - -/* The byte and bit size of a size_t */ -#define SIZE_T_SIZE (sizeof(size_t)) -#define SIZE_T_BITSIZE (sizeof(size_t) << 3) - -/* Some constants coerced to size_t */ -/* Annoying but necessary to avoid errors on some platforms */ -#define SIZE_T_ZERO ((size_t)0) -#define SIZE_T_ONE ((size_t)1) -#define SIZE_T_TWO ((size_t)2) -#define SIZE_T_FOUR ((size_t)4) -#define TWO_SIZE_T_SIZES (SIZE_T_SIZE<<1) -#define FOUR_SIZE_T_SIZES (SIZE_T_SIZE<<2) -#define SIX_SIZE_T_SIZES (FOUR_SIZE_T_SIZES+TWO_SIZE_T_SIZES) -#define HALF_MAX_SIZE_T (MAX_SIZE_T / 2U) - -/* The bit mask value corresponding to MALLOC_ALIGNMENT */ -#define CHUNK_ALIGN_MASK (MALLOC_ALIGNMENT - SIZE_T_ONE) - -/* True if address a has acceptable alignment */ -#define is_aligned(A) (((size_t)((A)) & (CHUNK_ALIGN_MASK)) == 0) - -/* the number of bytes to offset an address to align it */ -#define align_offset(A)\ - ((((size_t)(A) & CHUNK_ALIGN_MASK) == 0)? 0 :\ - ((MALLOC_ALIGNMENT - ((size_t)(A) & CHUNK_ALIGN_MASK)) & CHUNK_ALIGN_MASK)) - -/* -------------------------- MMAP preliminaries ------------------------- */ - -/* - If HAVE_MORECORE or HAVE_MMAP are false, we just define calls and - checks to fail so compiler optimizer can delete code rather than - using so many "#if"s. -*/ - - -/* MORECORE and MMAP must return MFAIL on failure */ -#define MFAIL ((void*)(MAX_SIZE_T)) -#define CMFAIL ((char*)(MFAIL)) /* defined for convenience */ - -#if HAVE_MMAP - -#ifdef MMAP_DEFAULT -#elif !defined(WIN32) -#define MUNMAP_DEFAULT(a, s) munmap((a), (s)) -#define MMAP_PROT (PROT_READ|PROT_WRITE) -#if !defined(MAP_ANONYMOUS) && defined(MAP_ANON) -#define MAP_ANONYMOUS MAP_ANON -#endif /* MAP_ANON */ -#ifdef MAP_ANONYMOUS -#define MMAP_FLAGS (MAP_PRIVATE|MAP_ANONYMOUS) -#define MMAP_DEFAULT(s) mmap(0, (s), MMAP_PROT, MMAP_FLAGS, -1, 0) -#else /* MAP_ANONYMOUS */ -/* - Nearly all versions of mmap support MAP_ANONYMOUS, so the following - is unlikely to be needed, but is supplied just in case. -*/ -#define MMAP_FLAGS (MAP_PRIVATE) -#define MMAP_DEFAULT(s) ((dev_zero_fd < 0) ? \ - (dev_zero_fd = open("/dev/zero", O_RDWR), \ - mmap(0, (s), MMAP_PROT, MMAP_FLAGS, dev_zero_fd, 0)) : \ - mmap(0, (s), MMAP_PROT, MMAP_FLAGS, dev_zero_fd, 0)) -#endif /* MAP_ANONYMOUS */ - -#define DIRECT_MMAP_DEFAULT(s) MMAP_DEFAULT(s) - -#else /* WIN32 */ - -/* Win32 MMAP via VirtualAlloc */ -static FORCEINLINE void* win32mmap(size_t size) { - void* ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE); - return (ptr != 0)? ptr: MFAIL; -} - -/* For direct MMAP, use MEM_TOP_DOWN to minimize interference */ -static FORCEINLINE void* win32direct_mmap(size_t size) { - void* ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN, - PAGE_READWRITE); - return (ptr != 0)? ptr: MFAIL; -} - -/* This function supports releasing coalesed segments */ -static FORCEINLINE int win32munmap(void* ptr, size_t size) { - MEMORY_BASIC_INFORMATION minfo; - char* cptr = (char*)ptr; - while (size) { - if (VirtualQuery(cptr, &minfo, sizeof(minfo)) == 0) - return -1; - if (minfo.BaseAddress != cptr || minfo.AllocationBase != cptr || - minfo.State != MEM_COMMIT || minfo.RegionSize > size) - return -1; - if (VirtualFree(cptr, 0, MEM_RELEASE) == 0) - return -1; - cptr += minfo.RegionSize; - size -= minfo.RegionSize; - } - return 0; -} - -#define MMAP_DEFAULT(s) win32mmap(s) -#define MUNMAP_DEFAULT(a, s) win32munmap((a), (s)) -#define DIRECT_MMAP_DEFAULT(s) win32direct_mmap(s) -#endif /* WIN32 */ -#endif /* HAVE_MMAP */ - -#if HAVE_MREMAP && !defined(MREMAP_DEFAULT) -#ifndef WIN32 -#define MREMAP_DEFAULT(addr, osz, nsz, mv) mremap((addr), (osz), (nsz), (mv)) -#endif /* WIN32 */ -#endif /* HAVE_MREMAP */ - -/** - * Define CALL_MORECORE - */ -#if HAVE_MORECORE - #ifdef MORECORE - #define CALL_MORECORE(S) MORECORE(S) - #else /* MORECORE */ - #define CALL_MORECORE(S) MORECORE_DEFAULT(S) - #endif /* MORECORE */ -#else /* HAVE_MORECORE */ - #define CALL_MORECORE(S) MFAIL -#endif /* HAVE_MORECORE */ - -/** - * Define CALL_MMAP/CALL_MUNMAP/CALL_DIRECT_MMAP - */ -#if HAVE_MMAP - #define USE_MMAP_BIT (SIZE_T_ONE) - - #ifdef MMAP - #define CALL_MMAP(s) MMAP(s) - #else /* MMAP */ - #define CALL_MMAP(s) MMAP_DEFAULT(s) - #endif /* MMAP */ - #ifdef MUNMAP - #define CALL_MUNMAP(a, s) MUNMAP((a), (s)) - #else /* MUNMAP */ - #define CALL_MUNMAP(a, s) MUNMAP_DEFAULT((a), (s)) - #endif /* MUNMAP */ - #ifdef DIRECT_MMAP - #define CALL_DIRECT_MMAP(s) DIRECT_MMAP(s) - #else /* DIRECT_MMAP */ - #define CALL_DIRECT_MMAP(s) DIRECT_MMAP_DEFAULT(s) - #endif /* DIRECT_MMAP */ -#else /* HAVE_MMAP */ - #define USE_MMAP_BIT (SIZE_T_ZERO) - - #define MMAP(s) MFAIL - #define MUNMAP(a, s) (-1) - #define DIRECT_MMAP(s) MFAIL - #define CALL_DIRECT_MMAP(s) DIRECT_MMAP(s) - #define CALL_MMAP(s) MMAP(s) - #define CALL_MUNMAP(a, s) MUNMAP((a), (s)) -#endif /* HAVE_MMAP */ - -/** - * Define CALL_MREMAP - */ -#if HAVE_MMAP && HAVE_MREMAP - #ifdef MREMAP - #define CALL_MREMAP(addr, osz, nsz, mv) MREMAP((addr), (osz), (nsz), (mv)) - #else /* MREMAP */ - #define CALL_MREMAP(addr, osz, nsz, mv) MREMAP_DEFAULT((addr), (osz), (nsz), (mv)) - #endif /* MREMAP */ -#else /* HAVE_MMAP && HAVE_MREMAP */ - #define CALL_MREMAP(addr, osz, nsz, mv) MFAIL -#endif /* HAVE_MMAP && HAVE_MREMAP */ - -/* mstate bit set if continguous morecore disabled or failed */ -#define USE_NONCONTIGUOUS_BIT (4U) - -/* segment bit set in create_mspace_with_base */ -#define EXTERN_BIT (8U) - - -/* --------------------------- Lock preliminaries ------------------------ */ - -/* - When locks are defined, there is one global lock, plus - one per-mspace lock. - - The global lock_ensures that mparams.magic and other unique - mparams values are initialized only once. It also protects - sequences of calls to MORECORE. In many cases sys_alloc requires - two calls, that should not be interleaved with calls by other - threads. This does not protect against direct calls to MORECORE - by other threads not using this lock, so there is still code to - cope the best we can on interference. - - Per-mspace locks surround calls to malloc, free, etc. - By default, locks are simple non-reentrant mutexes. - - Because lock-protected regions generally have bounded times, it is - OK to use the supplied simple spinlocks. Spinlocks are likely to - improve performance for lightly contended applications, but worsen - performance under heavy contention. - - If USE_LOCKS is > 1, the definitions of lock routines here are - bypassed, in which case you will need to define the type MLOCK_T, - and at least INITIAL_LOCK, DESTROY_LOCK, ACQUIRE_LOCK, RELEASE_LOCK - and TRY_LOCK. You must also declare a - static MLOCK_T malloc_global_mutex = { initialization values };. - -*/ - -#if !USE_LOCKS -#define USE_LOCK_BIT (0U) -#define INITIAL_LOCK(l) (0) -#define DESTROY_LOCK(l) (0) -#define ACQUIRE_MALLOC_GLOBAL_LOCK() -#define RELEASE_MALLOC_GLOBAL_LOCK() - -#else -#if USE_LOCKS > 1 -/* ----------------------- User-defined locks ------------------------ */ -/* Define your own lock implementation here */ -/* #define INITIAL_LOCK(lk) ... */ -/* #define DESTROY_LOCK(lk) ... */ -/* #define ACQUIRE_LOCK(lk) ... */ -/* #define RELEASE_LOCK(lk) ... */ -/* #define TRY_LOCK(lk) ... */ -/* static MLOCK_T malloc_global_mutex = ... */ - -#elif USE_SPIN_LOCKS - -/* First, define CAS_LOCK and CLEAR_LOCK on ints */ -/* Note CAS_LOCK defined to return 0 on success */ - -#if defined(__GNUC__)&& (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1)) -#define CAS_LOCK(sl) __sync_lock_test_and_set(sl, 1) -#define CLEAR_LOCK(sl) __sync_lock_release(sl) - -#elif (defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))) -/* Custom spin locks for older gcc on x86 */ -static FORCEINLINE int x86_cas_lock(int *sl) { - int ret; - int val = 1; - int cmp = 0; - __asm__ __volatile__ ("lock; cmpxchgl %1, %2" - : "=a" (ret) - : "r" (val), "m" (*(sl)), "0"(cmp) - : "memory", "cc"); - return ret; -} - -static FORCEINLINE void x86_clear_lock(int* sl) { - assert(*sl != 0); - int prev = 0; - int ret; - __asm__ __volatile__ ("lock; xchgl %0, %1" - : "=r" (ret) - : "m" (*(sl)), "0"(prev) - : "memory"); -} - -#define CAS_LOCK(sl) x86_cas_lock(sl) -#define CLEAR_LOCK(sl) x86_clear_lock(sl) - -#else /* Win32 MSC */ -#define CAS_LOCK(sl) interlockedexchange(sl, 1) -#define CLEAR_LOCK(sl) interlockedexchange (sl, 0) - -#endif /* ... gcc spins locks ... */ - -/* How to yield for a spin lock */ -#define SPINS_PER_YIELD 63 -#if defined(_MSC_VER) -#define SLEEP_EX_DURATION 50 /* delay for yield/sleep */ -#define SPIN_LOCK_YIELD SleepEx(SLEEP_EX_DURATION, FALSE) -#elif defined (__SVR4) && defined (__sun) /* solaris */ -#define SPIN_LOCK_YIELD thr_yield(); -#elif !defined(LACKS_SCHED_H) -#define SPIN_LOCK_YIELD sched_yield(); -#else -#define SPIN_LOCK_YIELD -#endif /* ... yield ... */ - -#if !defined(USE_RECURSIVE_LOCKS) || USE_RECURSIVE_LOCKS == 0 -/* Plain spin locks use single word (embedded in malloc_states) */ -static int spin_acquire_lock(int *sl) { - int spins = 0; - while (*(volatile int *)sl != 0 || CAS_LOCK(sl)) { - if ((++spins & SPINS_PER_YIELD) == 0) { - SPIN_LOCK_YIELD; - } - } - return 0; -} - -#define MLOCK_T int -#define TRY_LOCK(sl) !CAS_LOCK(sl) -#define RELEASE_LOCK(sl) CLEAR_LOCK(sl) -#define ACQUIRE_LOCK(sl) (CAS_LOCK(sl)? spin_acquire_lock(sl) : 0) -#define INITIAL_LOCK(sl) (*sl = 0) -#define DESTROY_LOCK(sl) (0) -static MLOCK_T malloc_global_mutex = 0; - -#else /* USE_RECURSIVE_LOCKS */ -/* types for lock owners */ -#ifdef WIN32 -#define THREAD_ID_T DWORD -#define CURRENT_THREAD GetCurrentThreadId() -#define EQ_OWNER(X,Y) ((X) == (Y)) -#else -/* - Note: the following assume that pthread_t is a type that can be - initialized to (casted) zero. If this is not the case, you will need to - somehow redefine these or not use spin locks. -*/ -#define THREAD_ID_T pthread_t -#define CURRENT_THREAD pthread_self() -#define EQ_OWNER(X,Y) pthread_equal(X, Y) -#endif - -struct malloc_recursive_lock { - int sl; - unsigned int c; - THREAD_ID_T threadid; -}; - -#define MLOCK_T struct malloc_recursive_lock -static MLOCK_T malloc_global_mutex = { 0, 0, (THREAD_ID_T)0}; - -static FORCEINLINE void recursive_release_lock(MLOCK_T *lk) { - assert(lk->sl != 0); - if (--lk->c == 0) { - CLEAR_LOCK(&lk->sl); - } -} - -static FORCEINLINE int recursive_acquire_lock(MLOCK_T *lk) { - THREAD_ID_T mythreadid = CURRENT_THREAD; - int spins = 0; - for (;;) { - if (*((volatile int *)(&lk->sl)) == 0) { - if (!CAS_LOCK(&lk->sl)) { - lk->threadid = mythreadid; - lk->c = 1; - return 0; - } - } - else if (EQ_OWNER(lk->threadid, mythreadid)) { - ++lk->c; - return 0; - } - if ((++spins & SPINS_PER_YIELD) == 0) { - SPIN_LOCK_YIELD; - } - } -} - -static FORCEINLINE int recursive_try_lock(MLOCK_T *lk) { - THREAD_ID_T mythreadid = CURRENT_THREAD; - if (*((volatile int *)(&lk->sl)) == 0) { - if (!CAS_LOCK(&lk->sl)) { - lk->threadid = mythreadid; - lk->c = 1; - return 1; - } - } - else if (EQ_OWNER(lk->threadid, mythreadid)) { - ++lk->c; - return 1; - } - return 0; -} - -#define RELEASE_LOCK(lk) recursive_release_lock(lk) -#define TRY_LOCK(lk) recursive_try_lock(lk) -#define ACQUIRE_LOCK(lk) recursive_acquire_lock(lk) -#define INITIAL_LOCK(lk) ((lk)->threadid = (THREAD_ID_T)0, (lk)->sl = 0, (lk)->c = 0) -#define DESTROY_LOCK(lk) (0) -#endif /* USE_RECURSIVE_LOCKS */ - -#elif defined(WIN32) /* Win32 critical sections */ -#define MLOCK_T CRITICAL_SECTION -#define ACQUIRE_LOCK(lk) (EnterCriticalSection(lk), 0) -#define RELEASE_LOCK(lk) LeaveCriticalSection(lk) -#define TRY_LOCK(lk) TryEnterCriticalSection(lk) -#define INITIAL_LOCK(lk) (!InitializeCriticalSectionAndSpinCount((lk), 0x80000000|4000)) -#define DESTROY_LOCK(lk) (DeleteCriticalSection(lk), 0) -#define NEED_GLOBAL_LOCK_INIT - -static MLOCK_T malloc_global_mutex; -static volatile long malloc_global_mutex_status; - -/* Use spin loop to initialize global lock */ -static void init_malloc_global_mutex() { - for (;;) { - long stat = malloc_global_mutex_status; - if (stat > 0) - return; - /* transition to < 0 while initializing, then to > 0) */ - if (stat == 0 && - interlockedcompareexchange(&malloc_global_mutex_status, -1, 0) == 0) { - InitializeCriticalSection(&malloc_global_mutex); - interlockedexchange(&malloc_global_mutex_status,1); - return; - } - SleepEx(0, FALSE); - } -} - -#else /* pthreads-based locks */ -#define MLOCK_T pthread_mutex_t -#define ACQUIRE_LOCK(lk) pthread_mutex_lock(lk) -#define RELEASE_LOCK(lk) pthread_mutex_unlock(lk) -#define TRY_LOCK(lk) (!pthread_mutex_trylock(lk)) -#define INITIAL_LOCK(lk) pthread_init_lock(lk) -#define DESTROY_LOCK(lk) pthread_mutex_destroy(lk) - -#if defined(USE_RECURSIVE_LOCKS) && USE_RECURSIVE_LOCKS != 0 && defined(linux) && !defined(PTHREAD_MUTEX_RECURSIVE) -/* Cope with old-style linux recursive lock initialization by adding */ -/* skipped internal declaration from pthread.h */ -extern int pthread_mutexattr_setkind_np __P ((pthread_mutexattr_t *__attr, - int __kind)); -#define PTHREAD_MUTEX_RECURSIVE PTHREAD_MUTEX_RECURSIVE_NP -#define pthread_mutexattr_settype(x,y) pthread_mutexattr_setkind_np(x,y) -#endif /* USE_RECURSIVE_LOCKS ... */ - -static MLOCK_T malloc_global_mutex = PTHREAD_MUTEX_INITIALIZER; - -static int pthread_init_lock (MLOCK_T *lk) { - pthread_mutexattr_t attr; - if (pthread_mutexattr_init(&attr)) return 1; -#if defined(USE_RECURSIVE_LOCKS) && USE_RECURSIVE_LOCKS != 0 - if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE)) return 1; -#endif - if (pthread_mutex_init(lk, &attr)) return 1; - if (pthread_mutexattr_destroy(&attr)) return 1; - return 0; -} - -#endif /* ... lock types ... */ - -/* Common code for all lock types */ -#define USE_LOCK_BIT (2U) - -#ifndef ACQUIRE_MALLOC_GLOBAL_LOCK -#define ACQUIRE_MALLOC_GLOBAL_LOCK() ACQUIRE_LOCK(&malloc_global_mutex); -#endif - -#ifndef RELEASE_MALLOC_GLOBAL_LOCK -#define RELEASE_MALLOC_GLOBAL_LOCK() RELEASE_LOCK(&malloc_global_mutex); -#endif - -#endif /* USE_LOCKS */ - -/* ----------------------- Chunk representations ------------------------ */ - -/* - (The following includes lightly edited explanations by Colin Plumb.) - - The malloc_chunk declaration below is misleading (but accurate and - necessary). It declares a "view" into memory allowing access to - necessary fields at known offsets from a given base. - - Chunks of memory are maintained using a `boundary tag' method as - originally described by Knuth. (See the paper by Paul Wilson - ftp://ftp.cs.utexas.edu/pub/garbage/allocsrv.ps for a survey of such - techniques.) Sizes of free chunks are stored both in the front of - each chunk and at the end. This makes consolidating fragmented - chunks into bigger chunks fast. The head fields also hold bits - representing whether chunks are free or in use. - - Here are some pictures to make it clearer. They are "exploded" to - show that the state of a chunk can be thought of as extending from - the high 31 bits of the head field of its header through the - prev_foot and PINUSE_BIT bit of the following chunk header. - - A chunk that's in use looks like: - - chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Size of previous chunk (if P = 0) | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |P| - | Size of this chunk 1| +-+ - mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | | - +- -+ - | | - +- -+ - | : - +- size - sizeof(size_t) available payload bytes -+ - : | - chunk-> +- -+ - | | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |1| - | Size of next chunk (may or may not be in use) | +-+ - mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - - And if it's free, it looks like this: - - chunk-> +- -+ - | User payload (must be in use, or we would have merged!) | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |P| - | Size of this chunk 0| +-+ - mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Next pointer | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Prev pointer | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | : - +- size - sizeof(struct chunk) unused bytes -+ - : | - chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Size of this chunk | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |0| - | Size of next chunk (must be in use, or we would have merged)| +-+ - mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | : - +- User payload -+ - : | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - |0| - +-+ - Note that since we always merge adjacent free chunks, the chunks - adjacent to a free chunk must be in use. - - Given a pointer to a chunk (which can be derived trivially from the - payload pointer) we can, in O(1) time, find out whether the adjacent - chunks are free, and if so, unlink them from the lists that they - are on and merge them with the current chunk. - - Chunks always begin on even word boundaries, so the mem portion - (which is returned to the user) is also on an even word boundary, and - thus at least double-word aligned. - - The P (PINUSE_BIT) bit, stored in the unused low-order bit of the - chunk size (which is always a multiple of two words), is an in-use - bit for the *previous* chunk. If that bit is *clear*, then the - word before the current chunk size contains the previous chunk - size, and can be used to find the front of the previous chunk. - The very first chunk allocated always has this bit set, preventing - access to non-existent (or non-owned) memory. If pinuse is set for - any given chunk, then you CANNOT determine the size of the - previous chunk, and might even get a memory addressing fault when - trying to do so. - - The C (CINUSE_BIT) bit, stored in the unused second-lowest bit of - the chunk size redundantly records whether the current chunk is - inuse (unless the chunk is mmapped). This redundancy enables usage - checks within free and realloc, and reduces indirection when freeing - and consolidating chunks. - - Each freshly allocated chunk must have both cinuse and pinuse set. - That is, each allocated chunk borders either a previously allocated - and still in-use chunk, or the base of its memory arena. This is - ensured by making all allocations from the `lowest' part of any - found chunk. Further, no free chunk physically borders another one, - so each free chunk is known to be preceded and followed by either - inuse chunks or the ends of memory. - - Note that the `foot' of the current chunk is actually represented - as the prev_foot of the NEXT chunk. This makes it easier to - deal with alignments etc but can be very confusing when trying - to extend or adapt this code. - - The exceptions to all this are - - 1. The special chunk `top' is the top-most available chunk (i.e., - the one bordering the end of available memory). It is treated - specially. Top is never included in any bin, is used only if - no other chunk is available, and is released back to the - system if it is very large (see M_TRIM_THRESHOLD). In effect, - the top chunk is treated as larger (and thus less well - fitting) than any other available chunk. The top chunk - doesn't update its trailing size field since there is no next - contiguous chunk that would have to index off it. However, - space is still allocated for it (TOP_FOOT_SIZE) to enable - separation or merging when space is extended. - - 3. Chunks allocated via mmap, have both cinuse and pinuse bits - cleared in their head fields. Because they are allocated - one-by-one, each must carry its own prev_foot field, which is - also used to hold the offset this chunk has within its mmapped - region, which is needed to preserve alignment. Each mmapped - chunk is trailed by the first two fields of a fake next-chunk - for sake of usage checks. - -*/ - -struct malloc_chunk { - size_t prev_foot; /* Size of previous chunk (if free). */ - size_t head; /* Size and inuse bits. */ - struct malloc_chunk* fd; /* double links -- used only if free. */ - struct malloc_chunk* bk; -}; - -typedef struct malloc_chunk mchunk; -typedef struct malloc_chunk* mchunkptr; -typedef struct malloc_chunk* sbinptr; /* The type of bins of chunks */ -typedef unsigned int bindex_t; /* Described below */ -typedef unsigned int binmap_t; /* Described below */ -typedef unsigned int flag_t; /* The type of various bit flag sets */ - -/* ------------------- Chunks sizes and alignments ----------------------- */ - -#define MCHUNK_SIZE (sizeof(mchunk)) - -#if FOOTERS -#define CHUNK_OVERHEAD (TWO_SIZE_T_SIZES) -#else /* FOOTERS */ -#define CHUNK_OVERHEAD (SIZE_T_SIZE) -#endif /* FOOTERS */ - -/* MMapped chunks need a second word of overhead ... */ -#define MMAP_CHUNK_OVERHEAD (TWO_SIZE_T_SIZES) -/* ... and additional padding for fake next-chunk at foot */ -#define MMAP_FOOT_PAD (FOUR_SIZE_T_SIZES) - -/* The smallest size we can malloc is an aligned minimal chunk */ -#define MIN_CHUNK_SIZE\ - ((MCHUNK_SIZE + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK) - -/* conversion from malloc headers to user pointers, and back */ -#define chunk2mem(p) ((void*)((char*)(p) + TWO_SIZE_T_SIZES)) -#define mem2chunk(mem) ((mchunkptr)((char*)(mem) - TWO_SIZE_T_SIZES)) -/* chunk associated with aligned address A */ -#define align_as_chunk(A) (mchunkptr)((A) + align_offset(chunk2mem(A))) - -/* Bounds on request (not chunk) sizes. */ -#define MAX_REQUEST ((-MIN_CHUNK_SIZE) << 2) -#define MIN_REQUEST (MIN_CHUNK_SIZE - CHUNK_OVERHEAD - SIZE_T_ONE) - -/* pad request bytes into a usable size */ -#define pad_request(req) \ - (((req) + CHUNK_OVERHEAD + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK) - -/* pad request, checking for minimum (but not maximum) */ -#define request2size(req) \ - (((req) < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(req)) - - -/* ------------------ Operations on head and foot fields ----------------- */ - -/* - The head field of a chunk is or'ed with PINUSE_BIT when previous - adjacent chunk in use, and or'ed with CINUSE_BIT if this chunk is in - use, unless mmapped, in which case both bits are cleared. - - FLAG4_BIT is not used by this malloc, but might be useful in extensions. -*/ - -#define PINUSE_BIT (SIZE_T_ONE) -#define CINUSE_BIT (SIZE_T_TWO) -#define FLAG4_BIT (SIZE_T_FOUR) -#define INUSE_BITS (PINUSE_BIT|CINUSE_BIT) -#define FLAG_BITS (PINUSE_BIT|CINUSE_BIT|FLAG4_BIT) - -/* Head value for fenceposts */ -#define FENCEPOST_HEAD (INUSE_BITS|SIZE_T_SIZE) - -/* extraction of fields from head words */ -#define cinuse(p) ((p)->head & CINUSE_BIT) -#define pinuse(p) ((p)->head & PINUSE_BIT) -#define flag4inuse(p) ((p)->head & FLAG4_BIT) -#define is_inuse(p) (((p)->head & INUSE_BITS) != PINUSE_BIT) -#define is_mmapped(p) (((p)->head & INUSE_BITS) == 0) - -#define chunksize(p) ((p)->head & ~(FLAG_BITS)) - -#define clear_pinuse(p) ((p)->head &= ~PINUSE_BIT) -#define set_flag4(p) ((p)->head |= FLAG4_BIT) -#define clear_flag4(p) ((p)->head &= ~FLAG4_BIT) - -/* Treat space at ptr +/- offset as a chunk */ -#define chunk_plus_offset(p, s) ((mchunkptr)(((char*)(p)) + (s))) -#define chunk_minus_offset(p, s) ((mchunkptr)(((char*)(p)) - (s))) - -/* Ptr to next or previous physical malloc_chunk. */ -#define next_chunk(p) ((mchunkptr)( ((char*)(p)) + ((p)->head & ~FLAG_BITS))) -#define prev_chunk(p) ((mchunkptr)( ((char*)(p)) - ((p)->prev_foot) )) - -/* extract next chunk's pinuse bit */ -#define next_pinuse(p) ((next_chunk(p)->head) & PINUSE_BIT) - -/* Get/set size at footer */ -#define get_foot(p, s) (((mchunkptr)((char*)(p) + (s)))->prev_foot) -#define set_foot(p, s) (((mchunkptr)((char*)(p) + (s)))->prev_foot = (s)) - -/* Set size, pinuse bit, and foot */ -#define set_size_and_pinuse_of_free_chunk(p, s)\ - ((p)->head = (s|PINUSE_BIT), set_foot(p, s)) - -/* Set size, pinuse bit, foot, and clear next pinuse */ -#define set_free_with_pinuse(p, s, n)\ - (clear_pinuse(n), set_size_and_pinuse_of_free_chunk(p, s)) - -/* Get the internal overhead associated with chunk p */ -#define overhead_for(p)\ - (is_mmapped(p)? MMAP_CHUNK_OVERHEAD : CHUNK_OVERHEAD) - -/* Return true if malloced space is not necessarily cleared */ -#if MMAP_CLEARS -#define calloc_must_clear(p) (!is_mmapped(p)) -#else /* MMAP_CLEARS */ -#define calloc_must_clear(p) (1) -#endif /* MMAP_CLEARS */ - -/* ---------------------- Overlaid data structures ----------------------- */ - -/* - When chunks are not in use, they are treated as nodes of either - lists or trees. - - "Small" chunks are stored in circular doubly-linked lists, and look - like this: - - chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Size of previous chunk | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - `head:' | Size of chunk, in bytes |P| - mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Forward pointer to next chunk in list | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Back pointer to previous chunk in list | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Unused space (may be 0 bytes long) . - . . - . | -nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - `foot:' | Size of chunk, in bytes | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - - Larger chunks are kept in a form of bitwise digital trees (aka - tries) keyed on chunksizes. Because malloc_tree_chunks are only for - free chunks greater than 256 bytes, their size doesn't impose any - constraints on user chunk sizes. Each node looks like: - - chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Size of previous chunk | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - `head:' | Size of chunk, in bytes |P| - mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Forward pointer to next chunk of same size | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Back pointer to previous chunk of same size | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Pointer to left child (child[0]) | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Pointer to right child (child[1]) | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Pointer to parent | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | bin index of this chunk | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Unused space . - . | -nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - `foot:' | Size of chunk, in bytes | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - - Each tree holding treenodes is a tree of unique chunk sizes. Chunks - of the same size are arranged in a circularly-linked list, with only - the oldest chunk (the next to be used, in our FIFO ordering) - actually in the tree. (Tree members are distinguished by a non-null - parent pointer.) If a chunk with the same size an an existing node - is inserted, it is linked off the existing node using pointers that - work in the same way as fd/bk pointers of small chunks. - - Each tree contains a power of 2 sized range of chunk sizes (the - smallest is 0x100 <= x < 0x180), which is is divided in half at each - tree level, with the chunks in the smaller half of the range (0x100 - <= x < 0x140 for the top nose) in the left subtree and the larger - half (0x140 <= x < 0x180) in the right subtree. This is, of course, - done by inspecting individual bits. - - Using these rules, each node's left subtree contains all smaller - sizes than its right subtree. However, the node at the root of each - subtree has no particular ordering relationship to either. (The - dividing line between the subtree sizes is based on trie relation.) - If we remove the last chunk of a given size from the interior of the - tree, we need to replace it with a leaf node. The tree ordering - rules permit a node to be replaced by any leaf below it. - - The smallest chunk in a tree (a common operation in a best-fit - allocator) can be found by walking a path to the leftmost leaf in - the tree. Unlike a usual binary tree, where we follow left child - pointers until we reach a null, here we follow the right child - pointer any time the left one is null, until we reach a leaf with - both child pointers null. The smallest chunk in the tree will be - somewhere along that path. - - The worst case number of steps to add, find, or remove a node is - bounded by the number of bits differentiating chunks within - bins. Under current bin calculations, this ranges from 6 up to 21 - (for 32 bit sizes) or up to 53 (for 64 bit sizes). The typical case - is of course much better. -*/ - -struct malloc_tree_chunk { - /* The first four fields must be compatible with malloc_chunk */ - size_t prev_foot; - size_t head; - struct malloc_tree_chunk* fd; - struct malloc_tree_chunk* bk; - - struct malloc_tree_chunk* child[2]; - struct malloc_tree_chunk* parent; - bindex_t index; -}; - -typedef struct malloc_tree_chunk tchunk; -typedef struct malloc_tree_chunk* tchunkptr; -typedef struct malloc_tree_chunk* tbinptr; /* The type of bins of trees */ - -/* A little helper macro for trees */ -#define leftmost_child(t) ((t)->child[0] != 0? (t)->child[0] : (t)->child[1]) - -/* ----------------------------- Segments -------------------------------- */ - -/* - Each malloc space may include non-contiguous segments, held in a - list headed by an embedded malloc_segment record representing the - top-most space. Segments also include flags holding properties of - the space. Large chunks that are directly allocated by mmap are not - included in this list. They are instead independently created and - destroyed without otherwise keeping track of them. - - Segment management mainly comes into play for spaces allocated by - MMAP. Any call to MMAP might or might not return memory that is - adjacent to an existing segment. MORECORE normally contiguously - extends the current space, so this space is almost always adjacent, - which is simpler and faster to deal with. (This is why MORECORE is - used preferentially to MMAP when both are available -- see - sys_alloc.) When allocating using MMAP, we don't use any of the - hinting mechanisms (inconsistently) supported in various - implementations of unix mmap, or distinguish reserving from - committing memory. Instead, we just ask for space, and exploit - contiguity when we get it. It is probably possible to do - better than this on some systems, but no general scheme seems - to be significantly better. - - Management entails a simpler variant of the consolidation scheme - used for chunks to reduce fragmentation -- new adjacent memory is - normally prepended or appended to an existing segment. However, - there are limitations compared to chunk consolidation that mostly - reflect the fact that segment processing is relatively infrequent - (occurring only when getting memory from system) and that we - don't expect to have huge numbers of segments: - - * Segments are not indexed, so traversal requires linear scans. (It - would be possible to index these, but is not worth the extra - overhead and complexity for most programs on most platforms.) - * New segments are only appended to old ones when holding top-most - memory; if they cannot be prepended to others, they are held in - different segments. - - Except for the top-most segment of an mstate, each segment record - is kept at the tail of its segment. Segments are added by pushing - segment records onto the list headed by &mstate.seg for the - containing mstate. - - Segment flags control allocation/merge/deallocation policies: - * If EXTERN_BIT set, then we did not allocate this segment, - and so should not try to deallocate or merge with others. - (This currently holds only for the initial segment passed - into create_mspace_with_base.) - * If USE_MMAP_BIT set, the segment may be merged with - other surrounding mmapped segments and trimmed/de-allocated - using munmap. - * If neither bit is set, then the segment was obtained using - MORECORE so can be merged with surrounding MORECORE'd segments - and deallocated/trimmed using MORECORE with negative arguments. -*/ - -struct malloc_segment { - char* base; /* base address */ - size_t size; /* allocated size */ - struct malloc_segment* next; /* ptr to next segment */ - flag_t sflags; /* mmap and extern flag */ -}; - -#define is_mmapped_segment(S) ((S)->sflags & USE_MMAP_BIT) -#define is_extern_segment(S) ((S)->sflags & EXTERN_BIT) - -typedef struct malloc_segment msegment; -typedef struct malloc_segment* msegmentptr; - -/* ---------------------------- malloc_state ----------------------------- */ - -/* - A malloc_state holds all of the bookkeeping for a space. - The main fields are: - - Top - The topmost chunk of the currently active segment. Its size is - cached in topsize. The actual size of topmost space is - topsize+TOP_FOOT_SIZE, which includes space reserved for adding - fenceposts and segment records if necessary when getting more - space from the system. The size at which to autotrim top is - cached from mparams in trim_check, except that it is disabled if - an autotrim fails. - - Designated victim (dv) - This is the preferred chunk for servicing small requests that - don't have exact fits. It is normally the chunk split off most - recently to service another small request. Its size is cached in - dvsize. The link fields of this chunk are not maintained since it - is not kept in a bin. - - SmallBins - An array of bin headers for free chunks. These bins hold chunks - with sizes less than MIN_LARGE_SIZE bytes. Each bin contains - chunks of all the same size, spaced 8 bytes apart. To simplify - use in double-linked lists, each bin header acts as a malloc_chunk - pointing to the real first node, if it exists (else pointing to - itself). This avoids special-casing for headers. But to avoid - waste, we allocate only the fd/bk pointers of bins, and then use - repositioning tricks to treat these as the fields of a chunk. - - TreeBins - Treebins are pointers to the roots of trees holding a range of - sizes. There are 2 equally spaced treebins for each power of two - from TREE_SHIFT to TREE_SHIFT+16. The last bin holds anything - larger. - - Bin maps - There is one bit map for small bins ("smallmap") and one for - treebins ("treemap). Each bin sets its bit when non-empty, and - clears the bit when empty. Bit operations are then used to avoid - bin-by-bin searching -- nearly all "search" is done without ever - looking at bins that won't be selected. The bit maps - conservatively use 32 bits per map word, even if on 64bit system. - For a good description of some of the bit-based techniques used - here, see Henry S. Warren Jr's book "Hacker's Delight" (and - supplement at http://hackersdelight.org/). Many of these are - intended to reduce the branchiness of paths through malloc etc, as - well as to reduce the number of memory locations read or written. - - Segments - A list of segments headed by an embedded malloc_segment record - representing the initial space. - - Address check support - The least_addr field is the least address ever obtained from - MORECORE or MMAP. Attempted frees and reallocs of any address less - than this are trapped (unless INSECURE is defined). - - Magic tag - A cross-check field that should always hold same value as mparams.magic. - - Max allowed footprint - The maximum allowed bytes to allocate from system (zero means no limit) - - Flags - Bits recording whether to use MMAP, locks, or contiguous MORECORE - - Statistics - Each space keeps track of current and maximum system memory - obtained via MORECORE or MMAP. - - Trim support - Fields holding the amount of unused topmost memory that should trigger - trimming, and a counter to force periodic scanning to release unused - non-topmost segments. - - Locking - If USE_LOCKS is defined, the "mutex" lock is acquired and released - around every public call using this mspace. - - Extension support - A void* pointer and a size_t field that can be used to help implement - extensions to this malloc. -*/ - -/* Bin types, widths and sizes */ -#define NSMALLBINS (32U) -#define NTREEBINS (32U) -#define SMALLBIN_SHIFT (3U) -#define SMALLBIN_WIDTH (SIZE_T_ONE << SMALLBIN_SHIFT) -#define TREEBIN_SHIFT (8U) -#define MIN_LARGE_SIZE (SIZE_T_ONE << TREEBIN_SHIFT) -#define MAX_SMALL_SIZE (MIN_LARGE_SIZE - SIZE_T_ONE) -#define MAX_SMALL_REQUEST (MAX_SMALL_SIZE - CHUNK_ALIGN_MASK - CHUNK_OVERHEAD) - -struct malloc_state { - binmap_t smallmap; - binmap_t treemap; - size_t dvsize; - size_t topsize; - char* least_addr; - mchunkptr dv; - mchunkptr top; - size_t trim_check; - size_t release_checks; - size_t magic; - mchunkptr smallbins[(NSMALLBINS+1)*2]; - tbinptr treebins[NTREEBINS]; - size_t footprint; - size_t max_footprint; - size_t footprint_limit; /* zero means no limit */ - flag_t mflags; -#if USE_LOCKS - MLOCK_T mutex; /* locate lock among fields that rarely change */ -#endif /* USE_LOCKS */ - msegment seg; - void* extp; /* Unused but available for extensions */ - size_t exts; -}; - -typedef struct malloc_state* mstate; - -/* ------------- Global malloc_state and malloc_params ------------------- */ - -/* - malloc_params holds global properties, including those that can be - dynamically set using mallopt. There is a single instance, mparams, - initialized in init_mparams. Note that the non-zeroness of "magic" - also serves as an initialization flag. -*/ - -struct malloc_params { - size_t magic; - size_t page_size; - size_t granularity; - size_t mmap_threshold; - size_t trim_threshold; - flag_t default_mflags; -}; - -static struct malloc_params mparams; - -/* Ensure mparams initialized */ -#define ensure_initialization() (void)(mparams.magic != 0 || init_mparams()) - -#if !ONLY_MSPACES - -/* The global malloc_state used for all non-"mspace" calls */ -static struct malloc_state _gm_; -#define gm (&_gm_) -#define is_global(M) ((M) == &_gm_) - -#endif /* !ONLY_MSPACES */ - -#define is_initialized(M) ((M)->top != 0) - -/* -------------------------- system alloc setup ------------------------- */ - -/* Operations on mflags */ - -#define use_lock(M) ((M)->mflags & USE_LOCK_BIT) -#define enable_lock(M) ((M)->mflags |= USE_LOCK_BIT) -#if USE_LOCKS -#define disable_lock(M) ((M)->mflags &= ~USE_LOCK_BIT) -#else -#define disable_lock(M) -#endif - -#define use_mmap(M) ((M)->mflags & USE_MMAP_BIT) -#define enable_mmap(M) ((M)->mflags |= USE_MMAP_BIT) -#if HAVE_MMAP -#define disable_mmap(M) ((M)->mflags &= ~USE_MMAP_BIT) -#else -#define disable_mmap(M) -#endif - -#define use_noncontiguous(M) ((M)->mflags & USE_NONCONTIGUOUS_BIT) -#define disable_contiguous(M) ((M)->mflags |= USE_NONCONTIGUOUS_BIT) - -#define set_lock(M,L)\ - ((M)->mflags = (L)?\ - ((M)->mflags | USE_LOCK_BIT) :\ - ((M)->mflags & ~USE_LOCK_BIT)) - -/* page-align a size */ -#define page_align(S)\ - (((S) + (mparams.page_size - SIZE_T_ONE)) & ~(mparams.page_size - SIZE_T_ONE)) - -/* granularity-align a size */ -#define granularity_align(S)\ - (((S) + (mparams.granularity - SIZE_T_ONE))\ - & ~(mparams.granularity - SIZE_T_ONE)) - - -/* For mmap, use granularity alignment on windows, else page-align */ -#ifdef WIN32 -#define mmap_align(S) granularity_align(S) -#else -#define mmap_align(S) page_align(S) -#endif - -/* For sys_alloc, enough padding to ensure can malloc request on success */ -#define SYS_ALLOC_PADDING (TOP_FOOT_SIZE + MALLOC_ALIGNMENT) - -#define is_page_aligned(S)\ - (((size_t)(S) & (mparams.page_size - SIZE_T_ONE)) == 0) -#define is_granularity_aligned(S)\ - (((size_t)(S) & (mparams.granularity - SIZE_T_ONE)) == 0) - -/* True if segment S holds address A */ -#define segment_holds(S, A)\ - ((char*)(A) >= S->base && (char*)(A) < S->base + S->size) - -/* Return segment holding given address */ -static msegmentptr segment_holding(mstate m, char* addr) { - msegmentptr sp = &m->seg; - for (;;) { - if (addr >= sp->base && addr < sp->base + sp->size) - return sp; - if ((sp = sp->next) == 0) - return 0; - } -} - -/* Return true if segment contains a segment link */ -static int has_segment_link(mstate m, msegmentptr ss) { - msegmentptr sp = &m->seg; - for (;;) { - if ((char*)sp >= ss->base && (char*)sp < ss->base + ss->size) - return 1; - if ((sp = sp->next) == 0) - return 0; - } -} - -#ifndef MORECORE_CANNOT_TRIM -#define should_trim(M,s) ((s) > (M)->trim_check) -#else /* MORECORE_CANNOT_TRIM */ -#define should_trim(M,s) (0) -#endif /* MORECORE_CANNOT_TRIM */ - -/* - TOP_FOOT_SIZE is padding at the end of a segment, including space - that may be needed to place segment records and fenceposts when new - noncontiguous segments are added. -*/ -#define TOP_FOOT_SIZE\ - (align_offset(chunk2mem(0))+pad_request(sizeof(struct malloc_segment))+MIN_CHUNK_SIZE) - - -/* ------------------------------- Hooks -------------------------------- */ - -/* - PREACTION should be defined to return 0 on success, and nonzero on - failure. If you are not using locking, you can redefine these to do - anything you like. -*/ - -#if USE_LOCKS -#define PREACTION(M) ((use_lock(M))? ACQUIRE_LOCK(&(M)->mutex) : 0) -#define POSTACTION(M) { if (use_lock(M)) RELEASE_LOCK(&(M)->mutex); } -#else /* USE_LOCKS */ - -#ifndef PREACTION -#define PREACTION(M) (0) -#endif /* PREACTION */ - -#ifndef POSTACTION -#define POSTACTION(M) -#endif /* POSTACTION */ - -#endif /* USE_LOCKS */ - -/* - CORRUPTION_ERROR_ACTION is triggered upon detected bad addresses. - USAGE_ERROR_ACTION is triggered on detected bad frees and - reallocs. The argument p is an address that might have triggered the - fault. It is ignored by the two predefined actions, but might be - useful in custom actions that try to help diagnose errors. -*/ - -#if PROCEED_ON_ERROR - -/* A count of the number of corruption errors causing resets */ -int malloc_corruption_error_count; - -/* default corruption action */ -static void reset_on_error(mstate m); - -#define CORRUPTION_ERROR_ACTION(m) reset_on_error(m) -#define USAGE_ERROR_ACTION(m, p) - -#else /* PROCEED_ON_ERROR */ - -#ifndef CORRUPTION_ERROR_ACTION -#define CORRUPTION_ERROR_ACTION(m) ABORT -#endif /* CORRUPTION_ERROR_ACTION */ - -#ifndef USAGE_ERROR_ACTION -#define USAGE_ERROR_ACTION(m,p) ABORT -#endif /* USAGE_ERROR_ACTION */ - -#endif /* PROCEED_ON_ERROR */ - - -/* -------------------------- Debugging setup ---------------------------- */ - -#if ! DEBUG - -#define check_free_chunk(M,P) -#define check_inuse_chunk(M,P) -#define check_malloced_chunk(M,P,N) -#define check_mmapped_chunk(M,P) -#define check_malloc_state(M) -#define check_top_chunk(M,P) - -#else /* DEBUG */ -#define check_free_chunk(M,P) do_check_free_chunk(M,P) -#define check_inuse_chunk(M,P) do_check_inuse_chunk(M,P) -#define check_top_chunk(M,P) do_check_top_chunk(M,P) -#define check_malloced_chunk(M,P,N) do_check_malloced_chunk(M,P,N) -#define check_mmapped_chunk(M,P) do_check_mmapped_chunk(M,P) -#define check_malloc_state(M) do_check_malloc_state(M) - -static void do_check_any_chunk(mstate m, mchunkptr p); -static void do_check_top_chunk(mstate m, mchunkptr p); -static void do_check_mmapped_chunk(mstate m, mchunkptr p); -static void do_check_inuse_chunk(mstate m, mchunkptr p); -static void do_check_free_chunk(mstate m, mchunkptr p); -static void do_check_malloced_chunk(mstate m, void* mem, size_t s); -static void do_check_tree(mstate m, tchunkptr t); -static void do_check_treebin(mstate m, bindex_t i); -static void do_check_smallbin(mstate m, bindex_t i); -static void do_check_malloc_state(mstate m); -static int bin_find(mstate m, mchunkptr x); -static size_t traverse_and_check(mstate m); -#endif /* DEBUG */ - -/* ---------------------------- Indexing Bins ---------------------------- */ - -#define is_small(s) (((s) >> SMALLBIN_SHIFT) < NSMALLBINS) -#define small_index(s) (bindex_t)((s) >> SMALLBIN_SHIFT) -#define small_index2size(i) ((i) << SMALLBIN_SHIFT) -#define MIN_SMALL_INDEX (small_index(MIN_CHUNK_SIZE)) - -/* addressing by index. See above about smallbin repositioning */ -#define smallbin_at(M, i) ((sbinptr)((char*)&((M)->smallbins[(i)<<1]))) -#define treebin_at(M,i) (&((M)->treebins[i])) - -/* assign tree index for size S to variable I. Use x86 asm if possible */ -#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) -#define compute_tree_index(S, I)\ -{\ - unsigned int X = S >> TREEBIN_SHIFT;\ - if (X == 0)\ - I = 0;\ - else if (X > 0xFFFF)\ - I = NTREEBINS-1;\ - else {\ - unsigned int K = (unsigned) sizeof(X)*__CHAR_BIT__ - 1 - (unsigned) __builtin_clz(X); \ - I = (bindex_t)((K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1)));\ - }\ -} - -#elif defined (__INTEL_COMPILER) -#define compute_tree_index(S, I)\ -{\ - size_t X = S >> TREEBIN_SHIFT;\ - if (X == 0)\ - I = 0;\ - else if (X > 0xFFFF)\ - I = NTREEBINS-1;\ - else {\ - unsigned int K = _bit_scan_reverse (X); \ - I = (bindex_t)((K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1)));\ - }\ -} - -#elif defined(_MSC_VER) && _MSC_VER>=1300 -#define compute_tree_index(S, I)\ -{\ - size_t X = S >> TREEBIN_SHIFT;\ - if (X == 0)\ - I = 0;\ - else if (X > 0xFFFF)\ - I = NTREEBINS-1;\ - else {\ - unsigned int K;\ - _BitScanReverse((DWORD *) &K, (DWORD) X);\ - I = (bindex_t)((K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1)));\ - }\ -} - -#else /* GNUC */ -#define compute_tree_index(S, I)\ -{\ - size_t X = S >> TREEBIN_SHIFT;\ - if (X == 0)\ - I = 0;\ - else if (X > 0xFFFF)\ - I = NTREEBINS-1;\ - else {\ - unsigned int Y = (unsigned int)X;\ - unsigned int N = ((Y - 0x100) >> 16) & 8;\ - unsigned int K = (((Y <<= N) - 0x1000) >> 16) & 4;\ - N += K;\ - N += K = (((Y <<= K) - 0x4000) >> 16) & 2;\ - K = 14 - N + ((Y <<= K) >> 15);\ - I = (K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1));\ - }\ -} -#endif /* GNUC */ - -/* Bit representing maximum resolved size in a treebin at i */ -#define bit_for_tree_index(i) \ - (i == NTREEBINS-1)? (SIZE_T_BITSIZE-1) : (((i) >> 1) + TREEBIN_SHIFT - 2) - -/* Shift placing maximum resolved bit in a treebin at i as sign bit */ -#define leftshift_for_tree_index(i) \ - ((i == NTREEBINS-1)? 0 : \ - ((SIZE_T_BITSIZE-SIZE_T_ONE) - (((i) >> 1) + TREEBIN_SHIFT - 2))) - -/* The size of the smallest chunk held in bin with index i */ -#define minsize_for_tree_index(i) \ - ((SIZE_T_ONE << (((i) >> 1) + TREEBIN_SHIFT)) | \ - (((size_t)((i) & SIZE_T_ONE)) << (((i) >> 1) + TREEBIN_SHIFT - 1))) - - -/* ------------------------ Operations on bin maps ----------------------- */ - -/* bit corresponding to given index */ -#define idx2bit(i) ((binmap_t)(1) << (i)) - -/* Mark/Clear bits with given index */ -#define mark_smallmap(M,i) ((M)->smallmap |= idx2bit(i)) -#define clear_smallmap(M,i) ((M)->smallmap &= ~idx2bit(i)) -#define smallmap_is_marked(M,i) ((M)->smallmap & idx2bit(i)) - -#define mark_treemap(M,i) ((M)->treemap |= idx2bit(i)) -#define clear_treemap(M,i) ((M)->treemap &= ~idx2bit(i)) -#define treemap_is_marked(M,i) ((M)->treemap & idx2bit(i)) - -/* isolate the least set bit of a bitmap */ -#define least_bit(x) ((x) & -(x)) - -/* mask with all bits to left of least bit of x on */ -#define left_bits(x) ((x<<1) | -(x<<1)) - -/* mask with all bits to left of or equal to least bit of x on */ -#define same_or_left_bits(x) ((x) | -(x)) - -/* index corresponding to given bit. Use x86 asm if possible */ - -#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) -#define compute_bit2idx(X, I)\ -{\ - unsigned int J;\ - J = __builtin_ctz(X); \ - I = (bindex_t)J;\ -} - -#elif defined (__INTEL_COMPILER) -#define compute_bit2idx(X, I)\ -{\ - unsigned int J;\ - J = _bit_scan_forward (X); \ - I = (bindex_t)J;\ -} - -#elif defined(_MSC_VER) && _MSC_VER>=1300 -#define compute_bit2idx(X, I)\ -{\ - unsigned int J;\ - _BitScanForward((DWORD *) &J, X);\ - I = (bindex_t)J;\ -} - -#elif USE_BUILTIN_FFS -#define compute_bit2idx(X, I) I = ffs(X)-1 - -#else -#define compute_bit2idx(X, I)\ -{\ - unsigned int Y = X - 1;\ - unsigned int K = Y >> (16-4) & 16;\ - unsigned int N = K; Y >>= K;\ - N += K = Y >> (8-3) & 8; Y >>= K;\ - N += K = Y >> (4-2) & 4; Y >>= K;\ - N += K = Y >> (2-1) & 2; Y >>= K;\ - N += K = Y >> (1-0) & 1; Y >>= K;\ - I = (bindex_t)(N + Y);\ -} -#endif /* GNUC */ - - -/* ----------------------- Runtime Check Support ------------------------- */ - -/* - For security, the main invariant is that malloc/free/etc never - writes to a static address other than malloc_state, unless static - malloc_state itself has been corrupted, which cannot occur via - malloc (because of these checks). In essence this means that we - believe all pointers, sizes, maps etc held in malloc_state, but - check all of those linked or offsetted from other embedded data - structures. These checks are interspersed with main code in a way - that tends to minimize their run-time cost. - - When FOOTERS is defined, in addition to range checking, we also - verify footer fields of inuse chunks, which can be used guarantee - that the mstate controlling malloc/free is intact. This is a - streamlined version of the approach described by William Robertson - et al in "Run-time Detection of Heap-based Overflows" LISA'03 - http://www.usenix.org/events/lisa03/tech/robertson.html The footer - of an inuse chunk holds the xor of its mstate and a random seed, - that is checked upon calls to free() and realloc(). This is - (probabalistically) unguessable from outside the program, but can be - computed by any code successfully malloc'ing any chunk, so does not - itself provide protection against code that has already broken - security through some other means. Unlike Robertson et al, we - always dynamically check addresses of all offset chunks (previous, - next, etc). This turns out to be cheaper than relying on hashes. -*/ - -#if !INSECURE -/* Check if address a is at least as high as any from MORECORE or MMAP */ -#define ok_address(M, a) ((char*)(a) >= (M)->least_addr) -/* Check if address of next chunk n is higher than base chunk p */ -#define ok_next(p, n) ((char*)(p) < (char*)(n)) -/* Check if p has inuse status */ -#define ok_inuse(p) is_inuse(p) -/* Check if p has its pinuse bit on */ -#define ok_pinuse(p) pinuse(p) - -#else /* !INSECURE */ -#define ok_address(M, a) (1) -#define ok_next(b, n) (1) -#define ok_inuse(p) (1) -#define ok_pinuse(p) (1) -#endif /* !INSECURE */ - -#if (FOOTERS && !INSECURE) -/* Check if (alleged) mstate m has expected magic field */ -#define ok_magic(M) ((M)->magic == mparams.magic) -#else /* (FOOTERS && !INSECURE) */ -#define ok_magic(M) (1) -#endif /* (FOOTERS && !INSECURE) */ - -/* In gcc, use __builtin_expect to minimize impact of checks */ -#if !INSECURE -#if defined(__GNUC__) && __GNUC__ >= 3 -#define RTCHECK(e) __builtin_expect(e, 1) -#else /* GNUC */ -#define RTCHECK(e) (e) -#endif /* GNUC */ -#else /* !INSECURE */ -#define RTCHECK(e) (1) -#endif /* !INSECURE */ - -/* macros to set up inuse chunks with or without footers */ - -#if !FOOTERS - -#define mark_inuse_foot(M,p,s) - -/* Macros for setting head/foot of non-mmapped chunks */ - -/* Set cinuse bit and pinuse bit of next chunk */ -#define set_inuse(M,p,s)\ - ((p)->head = (((p)->head & PINUSE_BIT)|s|CINUSE_BIT),\ - ((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT) - -/* Set cinuse and pinuse of this chunk and pinuse of next chunk */ -#define set_inuse_and_pinuse(M,p,s)\ - ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\ - ((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT) - -/* Set size, cinuse and pinuse bit of this chunk */ -#define set_size_and_pinuse_of_inuse_chunk(M, p, s)\ - ((p)->head = (s|PINUSE_BIT|CINUSE_BIT)) - -#else /* FOOTERS */ - -/* Set foot of inuse chunk to be xor of mstate and seed */ -#define mark_inuse_foot(M,p,s)\ - (((mchunkptr)((char*)(p) + (s)))->prev_foot = ((size_t)(M) ^ mparams.magic)) - -#define get_mstate_for(p)\ - ((mstate)(((mchunkptr)((char*)(p) +\ - (chunksize(p))))->prev_foot ^ mparams.magic)) - -#define set_inuse(M,p,s)\ - ((p)->head = (((p)->head & PINUSE_BIT)|s|CINUSE_BIT),\ - (((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT), \ - mark_inuse_foot(M,p,s)) - -#define set_inuse_and_pinuse(M,p,s)\ - ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\ - (((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT),\ - mark_inuse_foot(M,p,s)) - -#define set_size_and_pinuse_of_inuse_chunk(M, p, s)\ - ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\ - mark_inuse_foot(M, p, s)) - -#endif /* !FOOTERS */ - -/* ---------------------------- setting mparams -------------------------- */ - -/* Initialize mparams */ -static int init_mparams(void) { -#ifdef NEED_GLOBAL_LOCK_INIT - call_once(&malloc_global_mutex_init_once, init_malloc_global_mutex); -#endif - - ACQUIRE_MALLOC_GLOBAL_LOCK(); - if (mparams.magic == 0) { - size_t magic; - size_t psize; - size_t gsize; - -#ifndef WIN32 - psize = malloc_getpagesize; - gsize = ((DEFAULT_GRANULARITY != 0)? DEFAULT_GRANULARITY : psize); -#else /* WIN32 */ - { - SYSTEM_INFO system_info; - GetSystemInfo(&system_info); - psize = system_info.dwPageSize; - gsize = ((DEFAULT_GRANULARITY != 0)? - DEFAULT_GRANULARITY : system_info.dwAllocationGranularity); - } -#endif /* WIN32 */ - - /* Sanity-check configuration: - size_t must be unsigned and as wide as pointer type. - ints must be at least 4 bytes. - alignment must be at least 8. - Alignment, min chunk size, and page size must all be powers of 2. - */ - if ((sizeof(size_t) != sizeof(char*)) || - (MAX_SIZE_T < MIN_CHUNK_SIZE) || - (sizeof(int) < 4) || - (MALLOC_ALIGNMENT < (size_t)8U) || - ((MALLOC_ALIGNMENT & (MALLOC_ALIGNMENT-SIZE_T_ONE)) != 0) || - ((MCHUNK_SIZE & (MCHUNK_SIZE-SIZE_T_ONE)) != 0) || - ((gsize & (gsize-SIZE_T_ONE)) != 0) || - ((psize & (psize-SIZE_T_ONE)) != 0)) - ABORT; - - mparams.granularity = gsize; - mparams.page_size = psize; - mparams.mmap_threshold = DEFAULT_MMAP_THRESHOLD; - mparams.trim_threshold = DEFAULT_TRIM_THRESHOLD; -#if MORECORE_CONTIGUOUS - mparams.default_mflags = USE_LOCK_BIT|USE_MMAP_BIT; -#else /* MORECORE_CONTIGUOUS */ - mparams.default_mflags = USE_LOCK_BIT|USE_MMAP_BIT|USE_NONCONTIGUOUS_BIT; -#endif /* MORECORE_CONTIGUOUS */ - -#if !ONLY_MSPACES - /* Set up lock for main malloc area */ - gm->mflags = mparams.default_mflags; - (void)INITIAL_LOCK(&gm->mutex); -#endif - - { -#if USE_DEV_RANDOM - int fd; - unsigned char buf[sizeof(size_t)]; - /* Try to use /dev/urandom, else fall back on using time */ - if ((fd = open("/dev/urandom", O_RDONLY)) >= 0 && - read(fd, buf, sizeof(buf)) == sizeof(buf)) { - magic = *((size_t *) buf); - close(fd); - } - else -#endif /* USE_DEV_RANDOM */ -#ifdef WIN32 - magic = (size_t)(GetTickCount() ^ (size_t)0x55555555U); -#elif defined(LACKS_TIME_H) - magic = (size_t)&magic ^ (size_t)0x55555555U; -#else - magic = (size_t)(time(0) ^ (size_t)0x55555555U); -#endif - magic |= (size_t)8U; /* ensure nonzero */ - magic &= ~(size_t)7U; /* improve chances of fault for bad values */ - /* Until memory modes commonly available, use volatile-write */ - (*(volatile size_t *)(&(mparams.magic))) = magic; - } - } - - RELEASE_MALLOC_GLOBAL_LOCK(); - return 1; -} - -/* support for mallopt */ -static int change_mparam(int param_number, int value) { - size_t val; - ensure_initialization(); - val = (value == -1)? MAX_SIZE_T : (size_t)value; - switch(param_number) { - case M_TRIM_THRESHOLD: - mparams.trim_threshold = val; - return 1; - case M_GRANULARITY: - if (val >= mparams.page_size && ((val & (val-1)) == 0)) { - mparams.granularity = val; - return 1; - } - else - return 0; - case M_MMAP_THRESHOLD: - mparams.mmap_threshold = val; - return 1; - default: - return 0; - } -} - -#if DEBUG -/* ------------------------- Debugging Support --------------------------- */ - -/* Check properties of any chunk, whether free, inuse, mmapped etc */ -static void do_check_any_chunk(mstate m, mchunkptr p) { - assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD)); - assert(ok_address(m, p)); -} - -/* Check properties of top chunk */ -static void do_check_top_chunk(mstate m, mchunkptr p) { - msegmentptr sp = segment_holding(m, (char*)p); - size_t sz = p->head & ~INUSE_BITS; /* third-lowest bit can be set! */ - assert(sp != 0); - assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD)); - assert(ok_address(m, p)); - assert(sz == m->topsize); - assert(sz > 0); - assert(sz == ((sp->base + sp->size) - (char*)p) - TOP_FOOT_SIZE); - assert(pinuse(p)); - assert(!pinuse(chunk_plus_offset(p, sz))); -} - -/* Check properties of (inuse) mmapped chunks */ -static void do_check_mmapped_chunk(mstate m, mchunkptr p) { - size_t sz = chunksize(p); - size_t len = (sz + (p->prev_foot) + MMAP_FOOT_PAD); - assert(is_mmapped(p)); - assert(use_mmap(m)); - assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD)); - assert(ok_address(m, p)); - assert(!is_small(sz)); - assert((len & (mparams.page_size-SIZE_T_ONE)) == 0); - assert(chunk_plus_offset(p, sz)->head == FENCEPOST_HEAD); - assert(chunk_plus_offset(p, sz+SIZE_T_SIZE)->head == 0); -} - -/* Check properties of inuse chunks */ -static void do_check_inuse_chunk(mstate m, mchunkptr p) { - do_check_any_chunk(m, p); - assert(is_inuse(p)); - assert(next_pinuse(p)); - /* If not pinuse and not mmapped, previous chunk has OK offset */ - assert(is_mmapped(p) || pinuse(p) || next_chunk(prev_chunk(p)) == p); - if (is_mmapped(p)) - do_check_mmapped_chunk(m, p); -} - -/* Check properties of free chunks */ -static void do_check_free_chunk(mstate m, mchunkptr p) { - size_t sz = chunksize(p); - mchunkptr next = chunk_plus_offset(p, sz); - do_check_any_chunk(m, p); - assert(!is_inuse(p)); - assert(!next_pinuse(p)); - assert (!is_mmapped(p)); - if (p != m->dv && p != m->top) { - if (sz >= MIN_CHUNK_SIZE) { - assert((sz & CHUNK_ALIGN_MASK) == 0); - assert(is_aligned(chunk2mem(p))); - assert(next->prev_foot == sz); - assert(pinuse(p)); - assert (next == m->top || is_inuse(next)); - assert(p->fd->bk == p); - assert(p->bk->fd == p); - } - else /* markers are always of size SIZE_T_SIZE */ - assert(sz == SIZE_T_SIZE); - } -} - -/* Check properties of malloced chunks at the point they are malloced */ -static void do_check_malloced_chunk(mstate m, void* mem, size_t s) { - if (mem != 0) { - mchunkptr p = mem2chunk(mem); - size_t sz = p->head & ~INUSE_BITS; - do_check_inuse_chunk(m, p); - assert((sz & CHUNK_ALIGN_MASK) == 0); - assert(sz >= MIN_CHUNK_SIZE); - assert(sz >= s); - /* unless mmapped, size is less than MIN_CHUNK_SIZE more than request */ - assert(is_mmapped(p) || sz < (s + MIN_CHUNK_SIZE)); - } -} - -/* Check a tree and its subtrees. */ -static void do_check_tree(mstate m, tchunkptr t) { - tchunkptr head = 0; - tchunkptr u = t; - bindex_t tindex = t->index; - size_t tsize = chunksize(t); - bindex_t idx; - compute_tree_index(tsize, idx); - assert(tindex == idx); - assert(tsize >= MIN_LARGE_SIZE); - assert(tsize >= minsize_for_tree_index(idx)); - assert((idx == NTREEBINS-1) || (tsize < minsize_for_tree_index((idx+1)))); - - do { /* traverse through chain of same-sized nodes */ - do_check_any_chunk(m, ((mchunkptr)u)); - assert(u->index == tindex); - assert(chunksize(u) == tsize); - assert(!is_inuse(u)); - assert(!next_pinuse(u)); - assert(u->fd->bk == u); - assert(u->bk->fd == u); - if (u->parent == 0) { - assert(u->child[0] == 0); - assert(u->child[1] == 0); - } - else { - assert(head == 0); /* only one node on chain has parent */ - head = u; - assert(u->parent != u); - assert (u->parent->child[0] == u || - u->parent->child[1] == u || - *((tbinptr*)(u->parent)) == u); - if (u->child[0] != 0) { - assert(u->child[0]->parent == u); - assert(u->child[0] != u); - do_check_tree(m, u->child[0]); - } - if (u->child[1] != 0) { - assert(u->child[1]->parent == u); - assert(u->child[1] != u); - do_check_tree(m, u->child[1]); - } - if (u->child[0] != 0 && u->child[1] != 0) { - assert(chunksize(u->child[0]) < chunksize(u->child[1])); - } - } - u = u->fd; - } while (u != t); - assert(head != 0); -} - -/* Check all the chunks in a treebin. */ -static void do_check_treebin(mstate m, bindex_t i) { - tbinptr* tb = treebin_at(m, i); - tchunkptr t = *tb; - int empty = (m->treemap & (1U << i)) == 0; - if (t == 0) - assert(empty); - if (!empty) - do_check_tree(m, t); -} - -/* Check all the chunks in a smallbin. */ -static void do_check_smallbin(mstate m, bindex_t i) { - sbinptr b = smallbin_at(m, i); - mchunkptr p = b->bk; - unsigned int empty = (m->smallmap & (1U << i)) == 0; - if (p == b) - assert(empty); - if (!empty) { - for (; p != b; p = p->bk) { - size_t size = chunksize(p); - mchunkptr q; - /* each chunk claims to be free */ - do_check_free_chunk(m, p); - /* chunk belongs in bin */ - assert(small_index(size) == i); - assert(p->bk == b || chunksize(p->bk) == chunksize(p)); - /* chunk is followed by an inuse chunk */ - q = next_chunk(p); - if (q->head != FENCEPOST_HEAD) - do_check_inuse_chunk(m, q); - } - } -} - -/* Find x in a bin. Used in other check functions. */ -static int bin_find(mstate m, mchunkptr x) { - size_t size = chunksize(x); - if (is_small(size)) { - bindex_t sidx = small_index(size); - sbinptr b = smallbin_at(m, sidx); - if (smallmap_is_marked(m, sidx)) { - mchunkptr p = b; - do { - if (p == x) - return 1; - } while ((p = p->fd) != b); - } - } - else { - bindex_t tidx; - compute_tree_index(size, tidx); - if (treemap_is_marked(m, tidx)) { - tchunkptr t = *treebin_at(m, tidx); - size_t sizebits = size << leftshift_for_tree_index(tidx); - while (t != 0 && chunksize(t) != size) { - t = t->child[(sizebits >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]; - sizebits <<= 1; - } - if (t != 0) { - tchunkptr u = t; - do { - if (u == (tchunkptr)x) - return 1; - } while ((u = u->fd) != t); - } - } - } - return 0; -} - -/* Traverse each chunk and check it; return total */ -static size_t traverse_and_check(mstate m) { - size_t sum = 0; - if (is_initialized(m)) { - msegmentptr s = &m->seg; - sum += m->topsize + TOP_FOOT_SIZE; - while (s != 0) { - mchunkptr q = align_as_chunk(s->base); - mchunkptr lastq = 0; - assert(pinuse(q)); - while (segment_holds(s, q) && - q != m->top && q->head != FENCEPOST_HEAD) { - sum += chunksize(q); - if (is_inuse(q)) { - assert(!bin_find(m, q)); - do_check_inuse_chunk(m, q); - } - else { - assert(q == m->dv || bin_find(m, q)); - assert(lastq == 0 || is_inuse(lastq)); /* Not 2 consecutive free */ - do_check_free_chunk(m, q); - } - lastq = q; - q = next_chunk(q); - } - s = s->next; - } - } - return sum; -} - - -/* Check all properties of malloc_state. */ -static void do_check_malloc_state(mstate m) { - bindex_t i; - size_t total; - /* check bins */ - for (i = 0; i < NSMALLBINS; ++i) - do_check_smallbin(m, i); - for (i = 0; i < NTREEBINS; ++i) - do_check_treebin(m, i); - - if (m->dvsize != 0) { /* check dv chunk */ - do_check_any_chunk(m, m->dv); - assert(m->dvsize == chunksize(m->dv)); - assert(m->dvsize >= MIN_CHUNK_SIZE); - assert(bin_find(m, m->dv) == 0); - } - - if (m->top != 0) { /* check top chunk */ - do_check_top_chunk(m, m->top); - /*assert(m->topsize == chunksize(m->top)); redundant */ - assert(m->topsize > 0); - assert(bin_find(m, m->top) == 0); - } - - total = traverse_and_check(m); - assert(total <= m->footprint); - assert(m->footprint <= m->max_footprint); -} -#endif /* DEBUG */ - -/* ----------------------------- statistics ------------------------------ */ - -#if !NO_MALLINFO -static struct mallinfo internal_mallinfo(mstate m) { - struct mallinfo nm = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - ensure_initialization(); - if (!PREACTION(m)) { - check_malloc_state(m); - if (is_initialized(m)) { - size_t nfree = SIZE_T_ONE; /* top always free */ - size_t mfree = m->topsize + TOP_FOOT_SIZE; - size_t sum = mfree; - msegmentptr s = &m->seg; - while (s != 0) { - mchunkptr q = align_as_chunk(s->base); - while (segment_holds(s, q) && - q != m->top && q->head != FENCEPOST_HEAD) { - size_t sz = chunksize(q); - sum += sz; - if (!is_inuse(q)) { - mfree += sz; - ++nfree; - } - q = next_chunk(q); - } - s = s->next; - } - - nm.arena = sum; - nm.ordblks = nfree; - nm.hblkhd = m->footprint - sum; - nm.usmblks = m->max_footprint; - nm.uordblks = m->footprint - mfree; - nm.fordblks = mfree; - nm.keepcost = m->topsize; - } - - POSTACTION(m); - } - return nm; -} -#endif /* !NO_MALLINFO */ - -#if !NO_MALLOC_STATS -static void internal_malloc_stats(mstate m) { - ensure_initialization(); - if (!PREACTION(m)) { - size_t maxfp = 0; - size_t fp = 0; - size_t used = 0; - check_malloc_state(m); - if (is_initialized(m)) { - msegmentptr s = &m->seg; - maxfp = m->max_footprint; - fp = m->footprint; - used = fp - (m->topsize + TOP_FOOT_SIZE); - - while (s != 0) { - mchunkptr q = align_as_chunk(s->base); - while (segment_holds(s, q) && - q != m->top && q->head != FENCEPOST_HEAD) { - if (!is_inuse(q)) - used -= chunksize(q); - q = next_chunk(q); - } - s = s->next; - } - } - POSTACTION(m); /* drop lock */ - fprintf(stderr, "max system bytes = %10lu\n", (unsigned long)(maxfp)); - fprintf(stderr, "system bytes = %10lu\n", (unsigned long)(fp)); - fprintf(stderr, "in use bytes = %10lu\n", (unsigned long)(used)); - } -} -#endif /* NO_MALLOC_STATS */ - -/* ----------------------- Operations on smallbins ----------------------- */ - -/* - Various forms of linking and unlinking are defined as macros. Even - the ones for trees, which are very long but have very short typical - paths. This is ugly but reduces reliance on inlining support of - compilers. -*/ - -/* Link a free chunk into a smallbin */ -#define insert_small_chunk(M, P, S) {\ - bindex_t I = small_index(S);\ - mchunkptr B = smallbin_at(M, I);\ - mchunkptr F = B;\ - assert(S >= MIN_CHUNK_SIZE);\ - if (!smallmap_is_marked(M, I))\ - mark_smallmap(M, I);\ - else if (RTCHECK(ok_address(M, B->fd)))\ - F = B->fd;\ - else {\ - CORRUPTION_ERROR_ACTION(M);\ - }\ - B->fd = P;\ - F->bk = P;\ - P->fd = F;\ - P->bk = B;\ -} - -/* Unlink a chunk from a smallbin */ -#define unlink_small_chunk(M, P, S) {\ - mchunkptr F = P->fd;\ - mchunkptr B = P->bk;\ - bindex_t I = small_index(S);\ - assert(P != B);\ - assert(P != F);\ - assert(chunksize(P) == small_index2size(I));\ - if (RTCHECK(F == smallbin_at(M,I) || (ok_address(M, F) && F->bk == P))) { \ - if (B == F) {\ - clear_smallmap(M, I);\ - }\ - else if (RTCHECK(B == smallbin_at(M,I) ||\ - (ok_address(M, B) && B->fd == P))) {\ - F->bk = B;\ - B->fd = F;\ - }\ - else {\ - CORRUPTION_ERROR_ACTION(M);\ - }\ - }\ - else {\ - CORRUPTION_ERROR_ACTION(M);\ - }\ -} - -/* Unlink the first chunk from a smallbin */ -#define unlink_first_small_chunk(M, B, P, I) {\ - mchunkptr F = P->fd;\ - assert(P != B);\ - assert(P != F);\ - assert(chunksize(P) == small_index2size(I));\ - if (B == F) {\ - clear_smallmap(M, I);\ - }\ - else if (RTCHECK(ok_address(M, F) && F->bk == P)) {\ - F->bk = B;\ - B->fd = F;\ - }\ - else {\ - CORRUPTION_ERROR_ACTION(M);\ - }\ -} - -/* Replace dv node, binning the old one */ -/* Used only when dvsize known to be small */ -#define replace_dv(M, P, S) {\ - size_t DVS = M->dvsize;\ - assert(is_small(DVS));\ - if (DVS != 0) {\ - mchunkptr DV = M->dv;\ - insert_small_chunk(M, DV, DVS);\ - }\ - M->dvsize = S;\ - M->dv = P;\ -} - -/* ------------------------- Operations on trees ------------------------- */ - -/* Insert chunk into tree */ -#define insert_large_chunk(M, X, S) {\ - tbinptr* H;\ - bindex_t I;\ - compute_tree_index(S, I);\ - H = treebin_at(M, I);\ - X->index = I;\ - X->child[0] = X->child[1] = 0;\ - if (!treemap_is_marked(M, I)) {\ - mark_treemap(M, I);\ - *H = X;\ - X->parent = (tchunkptr)H;\ - X->fd = X->bk = X;\ - }\ - else {\ - tchunkptr T = *H;\ - size_t K = S << leftshift_for_tree_index(I);\ - for (;;) {\ - if (chunksize(T) != S) {\ - tchunkptr* C = &(T->child[(K >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]);\ - K <<= 1;\ - if (*C != 0)\ - T = *C;\ - else if (RTCHECK(ok_address(M, C))) {\ - *C = X;\ - X->parent = T;\ - X->fd = X->bk = X;\ - break;\ - }\ - else {\ - CORRUPTION_ERROR_ACTION(M);\ - break;\ - }\ - }\ - else {\ - tchunkptr F = T->fd;\ - if (RTCHECK(ok_address(M, T) && ok_address(M, F))) {\ - T->fd = F->bk = X;\ - X->fd = F;\ - X->bk = T;\ - X->parent = 0;\ - break;\ - }\ - else {\ - CORRUPTION_ERROR_ACTION(M);\ - break;\ - }\ - }\ - }\ - }\ -} - -/* - Unlink steps: - - 1. If x is a chained node, unlink it from its same-sized fd/bk links - and choose its bk node as its replacement. - 2. If x was the last node of its size, but not a leaf node, it must - be replaced with a leaf node (not merely one with an open left or - right), to make sure that lefts and rights of descendents - correspond properly to bit masks. We use the rightmost descendent - of x. We could use any other leaf, but this is easy to locate and - tends to counteract removal of leftmosts elsewhere, and so keeps - paths shorter than minimally guaranteed. This doesn't loop much - because on average a node in a tree is near the bottom. - 3. If x is the base of a chain (i.e., has parent links) relink - x's parent and children to x's replacement (or null if none). -*/ - -#define unlink_large_chunk(M, X) {\ - tchunkptr XP = X->parent;\ - tchunkptr R;\ - if (X->bk != X) {\ - tchunkptr F = X->fd;\ - R = X->bk;\ - if (RTCHECK(ok_address(M, F) && F->bk == X && R->fd == X)) {\ - F->bk = R;\ - R->fd = F;\ - }\ - else {\ - CORRUPTION_ERROR_ACTION(M);\ - }\ - }\ - else {\ - tchunkptr* RP;\ - if (((R = *(RP = &(X->child[1]))) != 0) ||\ - ((R = *(RP = &(X->child[0]))) != 0)) {\ - tchunkptr* CP;\ - while ((*(CP = &(R->child[1])) != 0) ||\ - (*(CP = &(R->child[0])) != 0)) {\ - R = *(RP = CP);\ - }\ - if (RTCHECK(ok_address(M, RP)))\ - *RP = 0;\ - else {\ - CORRUPTION_ERROR_ACTION(M);\ - }\ - }\ - }\ - if (XP != 0) {\ - tbinptr* H = treebin_at(M, X->index);\ - if (X == *H) {\ - if ((*H = R) == 0) \ - clear_treemap(M, X->index);\ - }\ - else if (RTCHECK(ok_address(M, XP))) {\ - if (XP->child[0] == X) \ - XP->child[0] = R;\ - else \ - XP->child[1] = R;\ - }\ - else\ - CORRUPTION_ERROR_ACTION(M);\ - if (R != 0) {\ - if (RTCHECK(ok_address(M, R))) {\ - tchunkptr C0, C1;\ - R->parent = XP;\ - if ((C0 = X->child[0]) != 0) {\ - if (RTCHECK(ok_address(M, C0))) {\ - R->child[0] = C0;\ - C0->parent = R;\ - }\ - else\ - CORRUPTION_ERROR_ACTION(M);\ - }\ - if ((C1 = X->child[1]) != 0) {\ - if (RTCHECK(ok_address(M, C1))) {\ - R->child[1] = C1;\ - C1->parent = R;\ - }\ - else\ - CORRUPTION_ERROR_ACTION(M);\ - }\ - }\ - else\ - CORRUPTION_ERROR_ACTION(M);\ - }\ - }\ -} - -/* Relays to large vs small bin operations */ - -#define insert_chunk(M, P, S)\ - if (is_small(S)) insert_small_chunk(M, P, S)\ - else { tchunkptr TP = (tchunkptr)(P); insert_large_chunk(M, TP, S); } - -#define unlink_chunk(M, P, S)\ - if (is_small(S)) unlink_small_chunk(M, P, S)\ - else { tchunkptr TP = (tchunkptr)(P); unlink_large_chunk(M, TP); } - - -/* Relays to internal calls to malloc/free from realloc, memalign etc */ - -#if ONLY_MSPACES -#define internal_malloc(m, b) mspace_malloc(m, b) -#define internal_free(m, mem) mspace_free(m,mem); -#else /* ONLY_MSPACES */ -#if MSPACES -#define internal_malloc(m, b)\ - ((m == gm)? dlmalloc(b) : mspace_malloc(m, b)) -#define internal_free(m, mem)\ - if (m == gm) dlfree(mem); else mspace_free(m,mem); -#else /* MSPACES */ -#define internal_malloc(m, b) dlmalloc(b) -#define internal_free(m, mem) dlfree(mem) -#endif /* MSPACES */ -#endif /* ONLY_MSPACES */ - -/* ----------------------- Direct-mmapping chunks ----------------------- */ - -/* - Directly mmapped chunks are set up with an offset to the start of - the mmapped region stored in the prev_foot field of the chunk. This - allows reconstruction of the required argument to MUNMAP when freed, - and also allows adjustment of the returned chunk to meet alignment - requirements (especially in memalign). -*/ - -/* Malloc using mmap */ -static void* mmap_alloc(mstate m, size_t nb) { - size_t mmsize = mmap_align(nb + SIX_SIZE_T_SIZES + CHUNK_ALIGN_MASK); - if (m->footprint_limit != 0) { - size_t fp = m->footprint + mmsize; - if (fp <= m->footprint || fp > m->footprint_limit) - return 0; - } - if (mmsize > nb) { /* Check for wrap around 0 */ - char* mm = (char*)(CALL_DIRECT_MMAP(mmsize)); - if (mm != CMFAIL) { - size_t offset = align_offset(chunk2mem(mm)); - size_t psize = mmsize - offset - MMAP_FOOT_PAD; - mchunkptr p = (mchunkptr)(mm + offset); - p->prev_foot = offset; - p->head = psize; - mark_inuse_foot(m, p, psize); - chunk_plus_offset(p, psize)->head = FENCEPOST_HEAD; - chunk_plus_offset(p, psize+SIZE_T_SIZE)->head = 0; - - if (m->least_addr == 0 || mm < m->least_addr) - m->least_addr = mm; - if ((m->footprint += mmsize) > m->max_footprint) - m->max_footprint = m->footprint; - assert(is_aligned(chunk2mem(p))); - check_mmapped_chunk(m, p); - return chunk2mem(p); - } - } - return 0; -} - -/* Realloc using mmap */ -static mchunkptr mmap_resize(mstate m, mchunkptr oldp, size_t nb, int flags) { - size_t oldsize = chunksize(oldp); - (void) flags; - if (is_small(nb)) /* Can't shrink mmap regions below small size */ - return 0; - /* Keep old chunk if big enough but not too big */ - if (oldsize >= nb + SIZE_T_SIZE && - (oldsize - nb) <= (mparams.granularity << 1)) - return oldp; - else { - size_t offset = oldp->prev_foot; - size_t oldmmsize = oldsize + offset + MMAP_FOOT_PAD; - size_t newmmsize = mmap_align(nb + SIX_SIZE_T_SIZES + CHUNK_ALIGN_MASK); - char* cp = (char*)CALL_MREMAP((char*)oldp - offset, - oldmmsize, newmmsize, flags); - if (cp != CMFAIL) { - mchunkptr newp = (mchunkptr)(cp + offset); - size_t psize = newmmsize - offset - MMAP_FOOT_PAD; - newp->head = psize; - mark_inuse_foot(m, newp, psize); - chunk_plus_offset(newp, psize)->head = FENCEPOST_HEAD; - chunk_plus_offset(newp, psize+SIZE_T_SIZE)->head = 0; - - if (cp < m->least_addr) - m->least_addr = cp; - if ((m->footprint += newmmsize - oldmmsize) > m->max_footprint) - m->max_footprint = m->footprint; - check_mmapped_chunk(m, newp); - return newp; - } - } - return 0; -} - - -/* -------------------------- mspace management -------------------------- */ - -/* Initialize top chunk and its size */ -static void init_top(mstate m, mchunkptr p, size_t psize) { - /* Ensure alignment */ - size_t offset = align_offset(chunk2mem(p)); - p = (mchunkptr)((char*)p + offset); - psize -= offset; - - m->top = p; - m->topsize = psize; - p->head = psize | PINUSE_BIT; - /* set size of fake trailing chunk holding overhead space only once */ - chunk_plus_offset(p, psize)->head = TOP_FOOT_SIZE; - m->trim_check = mparams.trim_threshold; /* reset on each update */ -} - -/* Initialize bins for a new mstate that is otherwise zeroed out */ -static void init_bins(mstate m) { - /* Establish circular links for smallbins */ - bindex_t i; - for (i = 0; i < NSMALLBINS; ++i) { - sbinptr bin = smallbin_at(m,i); - bin->fd = bin->bk = bin; - } -} - -#if PROCEED_ON_ERROR - -/* default corruption action */ -static void reset_on_error(mstate m) { - int i; - ++malloc_corruption_error_count; - /* Reinitialize fields to forget about all memory */ - m->smallmap = m->treemap = 0; - m->dvsize = m->topsize = 0; - m->seg.base = 0; - m->seg.size = 0; - m->seg.next = 0; - m->top = m->dv = 0; - for (i = 0; i < NTREEBINS; ++i) - *treebin_at(m, i) = 0; - init_bins(m); -} -#endif /* PROCEED_ON_ERROR */ - -/* Allocate chunk and prepend remainder with chunk in successor base. */ -static void* prepend_alloc(mstate m, char* newbase, char* oldbase, - size_t nb) { - mchunkptr p = align_as_chunk(newbase); - mchunkptr oldfirst = align_as_chunk(oldbase); - size_t psize = (char*)oldfirst - (char*)p; - mchunkptr q = chunk_plus_offset(p, nb); - size_t qsize = psize - nb; - set_size_and_pinuse_of_inuse_chunk(m, p, nb); - - assert((char*)oldfirst > (char*)q); - assert(pinuse(oldfirst)); - assert(qsize >= MIN_CHUNK_SIZE); - - /* consolidate remainder with first chunk of old base */ - if (oldfirst == m->top) { - size_t tsize = m->topsize += qsize; - m->top = q; - q->head = tsize | PINUSE_BIT; - check_top_chunk(m, q); - } - else if (oldfirst == m->dv) { - size_t dsize = m->dvsize += qsize; - m->dv = q; - set_size_and_pinuse_of_free_chunk(q, dsize); - } - else { - if (!is_inuse(oldfirst)) { - size_t nsize = chunksize(oldfirst); - unlink_chunk(m, oldfirst, nsize); - oldfirst = chunk_plus_offset(oldfirst, nsize); - qsize += nsize; - } - set_free_with_pinuse(q, qsize, oldfirst); - insert_chunk(m, q, qsize); - check_free_chunk(m, q); - } - - check_malloced_chunk(m, chunk2mem(p), nb); - return chunk2mem(p); -} - -/* Add a segment to hold a new noncontiguous region */ -static void add_segment(mstate m, char* tbase, size_t tsize, flag_t mmapped) { - /* Determine locations and sizes of segment, fenceposts, old top */ - char* old_top = (char*)m->top; - msegmentptr oldsp = segment_holding(m, old_top); - char* old_end = oldsp->base + oldsp->size; - size_t ssize = pad_request(sizeof(struct malloc_segment)); - char* rawsp = old_end - (ssize + FOUR_SIZE_T_SIZES + CHUNK_ALIGN_MASK); - size_t offset = align_offset(chunk2mem(rawsp)); - char* asp = rawsp + offset; - char* csp = (asp < (old_top + MIN_CHUNK_SIZE))? old_top : asp; - mchunkptr sp = (mchunkptr)csp; - msegmentptr ss = (msegmentptr)(chunk2mem(sp)); - mchunkptr tnext = chunk_plus_offset(sp, ssize); - mchunkptr p = tnext; - int nfences = 0; - - /* reset top to new space */ - init_top(m, (mchunkptr)tbase, tsize - TOP_FOOT_SIZE); - - /* Set up segment record */ - assert(is_aligned(ss)); - set_size_and_pinuse_of_inuse_chunk(m, sp, ssize); - *ss = m->seg; /* Push current record */ - m->seg.base = tbase; - m->seg.size = tsize; - m->seg.sflags = mmapped; - m->seg.next = ss; - - /* Insert trailing fenceposts */ - for (;;) { - mchunkptr nextp = chunk_plus_offset(p, SIZE_T_SIZE); - p->head = FENCEPOST_HEAD; - ++nfences; - if ((char*)(&(nextp->head)) < old_end) - p = nextp; - else - break; - } - assert(nfences >= 2); - - /* Insert the rest of old top into a bin as an ordinary free chunk */ - if (csp != old_top) { - mchunkptr q = (mchunkptr)old_top; - size_t psize = csp - old_top; - mchunkptr tn = chunk_plus_offset(q, psize); - set_free_with_pinuse(q, psize, tn); - insert_chunk(m, q, psize); - } - - check_top_chunk(m, m->top); -} - -/* -------------------------- System allocation -------------------------- */ - -/* Get memory from system using MORECORE or MMAP */ -static void* sys_alloc(mstate m, size_t nb) { - char* tbase = CMFAIL; - size_t tsize = 0; - flag_t mmap_flag = 0; - size_t asize; /* allocation size */ - - ensure_initialization(); - - /* Directly map large chunks, but only if already initialized */ - if (use_mmap(m) && nb >= mparams.mmap_threshold && m->topsize != 0) { - void* mem = mmap_alloc(m, nb); - if (mem != 0) - return mem; - } - - asize = granularity_align(nb + SYS_ALLOC_PADDING); - if (asize <= nb) - return 0; /* wraparound */ - if (m->footprint_limit != 0) { - size_t fp = m->footprint + asize; - if (fp <= m->footprint || fp > m->footprint_limit) - return 0; - } - - /* - Try getting memory in any of three ways (in most-preferred to - least-preferred order): - 1. A call to MORECORE that can normally contiguously extend memory. - (disabled if not MORECORE_CONTIGUOUS or not HAVE_MORECORE or - or main space is mmapped or a previous contiguous call failed) - 2. A call to MMAP new space (disabled if not HAVE_MMAP). - Note that under the default settings, if MORECORE is unable to - fulfill a request, and HAVE_MMAP is true, then mmap is - used as a noncontiguous system allocator. This is a useful backup - strategy for systems with holes in address spaces -- in this case - sbrk cannot contiguously expand the heap, but mmap may be able to - find space. - 3. A call to MORECORE that cannot usually contiguously extend memory. - (disabled if not HAVE_MORECORE) - - In all cases, we need to request enough bytes from system to ensure - we can malloc nb bytes upon success, so pad with enough space for - top_foot, plus alignment-pad to make sure we don't lose bytes if - not on boundary, and round this up to a granularity unit. - */ - - if (MORECORE_CONTIGUOUS && !use_noncontiguous(m)) { - char* br = CMFAIL; - msegmentptr ss = (m->top == 0)? 0 : segment_holding(m, (char*)m->top); - ACQUIRE_MALLOC_GLOBAL_LOCK(); - - if (ss == 0) { /* First time through or recovery */ - char* base = (char*)CALL_MORECORE(0); - if (base != CMFAIL) { - size_t fp; - /* Adjust to end on a page boundary */ - if (!is_page_aligned(base)) - asize += (page_align((size_t)base) - (size_t)base); - fp = m->footprint + asize; /* recheck limits */ - if (asize > nb && asize < HALF_MAX_SIZE_T && - (m->footprint_limit == 0 || - (fp > m->footprint && fp <= m->footprint_limit)) && - (br = (char*)(CALL_MORECORE(asize))) == base) { - tbase = base; - tsize = asize; - } - } - } - else { - /* Subtract out existing available top space from MORECORE request. */ - asize = granularity_align(nb - m->topsize + SYS_ALLOC_PADDING); - /* Use mem here only if it did continuously extend old space */ - if (asize < HALF_MAX_SIZE_T && - (br = (char*)(CALL_MORECORE(asize))) == ss->base+ss->size) { - tbase = br; - tsize = asize; - } - } - - if (tbase == CMFAIL) { /* Cope with partial failure */ - if (br != CMFAIL) { /* Try to use/extend the space we did get */ - if (asize < HALF_MAX_SIZE_T && - asize < nb + SYS_ALLOC_PADDING) { - size_t esize = granularity_align(nb + SYS_ALLOC_PADDING - asize); - if (esize < HALF_MAX_SIZE_T) { - char* end = (char*)CALL_MORECORE(esize); - if (end != CMFAIL) - asize += esize; - else { /* Can't use; try to release */ - (void) CALL_MORECORE(-asize); - br = CMFAIL; - } - } - } - } - if (br != CMFAIL) { /* Use the space we did get */ - tbase = br; - tsize = asize; - } - else - disable_contiguous(m); /* Don't try contiguous path in the future */ - } - - RELEASE_MALLOC_GLOBAL_LOCK(); - } - - if (HAVE_MMAP && tbase == CMFAIL) { /* Try MMAP */ - char* mp = (char*)(CALL_MMAP(asize)); - if (mp != CMFAIL) { - tbase = mp; - tsize = asize; - mmap_flag = USE_MMAP_BIT; - } - } - - if (HAVE_MORECORE && tbase == CMFAIL) { /* Try noncontiguous MORECORE */ - if (asize < HALF_MAX_SIZE_T) { - char* br = CMFAIL; - char* end = CMFAIL; - ACQUIRE_MALLOC_GLOBAL_LOCK(); - br = (char*)(CALL_MORECORE(asize)); - end = (char*)(CALL_MORECORE(0)); - RELEASE_MALLOC_GLOBAL_LOCK(); - if (br != CMFAIL && end != CMFAIL && br < end) { - size_t ssize = end - br; - if (ssize > nb + TOP_FOOT_SIZE) { - tbase = br; - tsize = ssize; - } - } - } - } - - if (tbase != CMFAIL) { - - if ((m->footprint += tsize) > m->max_footprint) - m->max_footprint = m->footprint; - - if (!is_initialized(m)) { /* first-time initialization */ - if (m->least_addr == 0 || tbase < m->least_addr) - m->least_addr = tbase; - m->seg.base = tbase; - m->seg.size = tsize; - m->seg.sflags = mmap_flag; - m->magic = mparams.magic; - m->release_checks = MAX_RELEASE_CHECK_RATE; - init_bins(m); -#if !ONLY_MSPACES - if (is_global(m)) - init_top(m, (mchunkptr)tbase, tsize - TOP_FOOT_SIZE); - else -#endif - { - /* Offset top by embedded malloc_state */ - mchunkptr mn = next_chunk(mem2chunk(m)); - init_top(m, mn, (size_t)((tbase + tsize) - (char*)mn) -TOP_FOOT_SIZE); - } - } - - else { - /* Try to merge with an existing segment */ - msegmentptr sp = &m->seg; - /* Only consider most recent segment if traversal suppressed */ - while (sp != 0 && tbase != sp->base + sp->size) - sp = (NO_SEGMENT_TRAVERSAL) ? 0 : sp->next; - if (sp != 0 && - !is_extern_segment(sp) && - (sp->sflags & USE_MMAP_BIT) == mmap_flag && - segment_holds(sp, m->top)) { /* append */ - sp->size += tsize; - init_top(m, m->top, m->topsize + tsize); - } - else { - if (tbase < m->least_addr) - m->least_addr = tbase; - sp = &m->seg; - while (sp != 0 && sp->base != tbase + tsize) - sp = (NO_SEGMENT_TRAVERSAL) ? 0 : sp->next; - if (sp != 0 && - !is_extern_segment(sp) && - (sp->sflags & USE_MMAP_BIT) == mmap_flag) { - char* oldbase = sp->base; - sp->base = tbase; - sp->size += tsize; - return prepend_alloc(m, tbase, oldbase, nb); - } - else - add_segment(m, tbase, tsize, mmap_flag); - } - } - - if (nb < m->topsize) { /* Allocate from new or extended top space */ - size_t rsize = m->topsize -= nb; - mchunkptr p = m->top; - mchunkptr r = m->top = chunk_plus_offset(p, nb); - r->head = rsize | PINUSE_BIT; - set_size_and_pinuse_of_inuse_chunk(m, p, nb); - check_top_chunk(m, m->top); - check_malloced_chunk(m, chunk2mem(p), nb); - return chunk2mem(p); - } - } - - MALLOC_FAILURE_ACTION; - return 0; -} - -/* ----------------------- system deallocation -------------------------- */ - -/* Unmap and unlink any mmapped segments that don't contain used chunks */ -static size_t release_unused_segments(mstate m) { - size_t released = 0; - int nsegs = 0; - msegmentptr pred = &m->seg; - msegmentptr sp = pred->next; - while (sp != 0) { - char* base = sp->base; - size_t size = sp->size; - msegmentptr next = sp->next; - ++nsegs; - if (is_mmapped_segment(sp) && !is_extern_segment(sp)) { - mchunkptr p = align_as_chunk(base); - size_t psize = chunksize(p); - /* Can unmap if first chunk holds entire segment and not pinned */ - if (!is_inuse(p) && (char*)p + psize >= base + size - TOP_FOOT_SIZE) { - tchunkptr tp = (tchunkptr)p; - assert(segment_holds(sp, (char*)sp)); - if (p == m->dv) { - m->dv = 0; - m->dvsize = 0; - } - else { - unlink_large_chunk(m, tp); - } - if (CALL_MUNMAP(base, size) == 0) { - released += size; - m->footprint -= size; - /* unlink obsoleted record */ - sp = pred; - sp->next = next; - } - else { /* back out if cannot unmap */ - insert_large_chunk(m, tp, psize); - } - } - } - if (NO_SEGMENT_TRAVERSAL) /* scan only first segment */ - break; - pred = sp; - sp = next; - } - /* Reset check counter */ - m->release_checks = ((nsegs > MAX_RELEASE_CHECK_RATE)? - nsegs : MAX_RELEASE_CHECK_RATE); - return released; -} - -static int sys_trim(mstate m, size_t pad) { - size_t released = 0; - ensure_initialization(); - if (pad < MAX_REQUEST && is_initialized(m)) { - pad += TOP_FOOT_SIZE; /* ensure enough room for segment overhead */ - - if (m->topsize > pad) { - /* Shrink top space in granularity-size units, keeping at least one */ - size_t unit = mparams.granularity; - size_t extra = ((m->topsize - pad + (unit - SIZE_T_ONE)) / unit - - SIZE_T_ONE) * unit; - msegmentptr sp = segment_holding(m, (char*)m->top); - - if (!is_extern_segment(sp)) { - if (is_mmapped_segment(sp)) { - if (HAVE_MMAP && - sp->size >= extra && - !has_segment_link(m, sp)) { /* can't shrink if pinned */ - size_t newsize = sp->size - extra; - /* Prefer mremap, fall back to munmap */ - if ((CALL_MREMAP(sp->base, sp->size, newsize, 0) != MFAIL) || - (CALL_MUNMAP(sp->base + newsize, extra) == 0)) { - released = extra; - } - } - } - else if (HAVE_MORECORE) { - if (extra >= HALF_MAX_SIZE_T) /* Avoid wrapping negative */ - extra = (HALF_MAX_SIZE_T) + SIZE_T_ONE - unit; - ACQUIRE_MALLOC_GLOBAL_LOCK(); - { - /* Make sure end of memory is where we last set it. */ - char* old_br = (char*)(CALL_MORECORE(0)); - if (old_br == sp->base + sp->size) { - char* rel_br = (char*)(CALL_MORECORE(-extra)); - char* new_br = (char*)(CALL_MORECORE(0)); - if (rel_br != CMFAIL && new_br < old_br) - released = old_br - new_br; - } - } - RELEASE_MALLOC_GLOBAL_LOCK(); - } - } - - if (released != 0) { - sp->size -= released; - m->footprint -= released; - init_top(m, m->top, m->topsize - released); - check_top_chunk(m, m->top); - } - } - - /* Unmap any unused mmapped segments */ - if (HAVE_MMAP) - released += release_unused_segments(m); - - /* On failure, disable autotrim to avoid repeated failed future calls */ - if (released == 0 && m->topsize > m->trim_check) - m->trim_check = MAX_SIZE_T; - } - - return (released != 0)? 1 : 0; -} - -/* Consolidate and bin a chunk. Differs from exported versions - of free mainly in that the chunk need not be marked as inuse. -*/ -static void dispose_chunk(mstate m, mchunkptr p, size_t psize) { - mchunkptr next = chunk_plus_offset(p, psize); - if (!pinuse(p)) { - mchunkptr prev; - size_t prevsize = p->prev_foot; - if (is_mmapped(p)) { - psize += prevsize + MMAP_FOOT_PAD; - if (CALL_MUNMAP((char*)p - prevsize, psize) == 0) - m->footprint -= psize; - return; - } - prev = chunk_minus_offset(p, prevsize); - psize += prevsize; - p = prev; - if (RTCHECK(ok_address(m, prev))) { /* consolidate backward */ - if (p != m->dv) { - unlink_chunk(m, p, prevsize); - } - else if ((next->head & INUSE_BITS) == INUSE_BITS) { - m->dvsize = psize; - set_free_with_pinuse(p, psize, next); - return; - } - } - else { - CORRUPTION_ERROR_ACTION(m); - return; - } - } - if (RTCHECK(ok_address(m, next))) { - if (!cinuse(next)) { /* consolidate forward */ - if (next == m->top) { - size_t tsize = m->topsize += psize; - m->top = p; - p->head = tsize | PINUSE_BIT; - if (p == m->dv) { - m->dv = 0; - m->dvsize = 0; - } - return; - } - else if (next == m->dv) { - size_t dsize = m->dvsize += psize; - m->dv = p; - set_size_and_pinuse_of_free_chunk(p, dsize); - return; - } - else { - size_t nsize = chunksize(next); - psize += nsize; - unlink_chunk(m, next, nsize); - set_size_and_pinuse_of_free_chunk(p, psize); - if (p == m->dv) { - m->dvsize = psize; - return; - } - } - } - else { - set_free_with_pinuse(p, psize, next); - } - insert_chunk(m, p, psize); - } - else { - CORRUPTION_ERROR_ACTION(m); - } -} - -/* ---------------------------- malloc --------------------------- */ - -/* allocate a large request from the best fitting chunk in a treebin */ -static void* tmalloc_large(mstate m, size_t nb) { - tchunkptr v = 0; - size_t rsize = -nb; /* Unsigned negation */ - tchunkptr t; - bindex_t idx; - compute_tree_index(nb, idx); - if ((t = *treebin_at(m, idx)) != 0) { - /* Traverse tree for this bin looking for node with size == nb */ - size_t sizebits = nb << leftshift_for_tree_index(idx); - tchunkptr rst = 0; /* The deepest untaken right subtree */ - for (;;) { - tchunkptr rt; - size_t trem = chunksize(t) - nb; - if (trem < rsize) { - v = t; - if ((rsize = trem) == 0) - break; - } - rt = t->child[1]; - t = t->child[(sizebits >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]; - if (rt != 0 && rt != t) - rst = rt; - if (t == 0) { - t = rst; /* set t to least subtree holding sizes > nb */ - break; - } - sizebits <<= 1; - } - } - if (t == 0 && v == 0) { /* set t to root of next non-empty treebin */ - binmap_t leftbits = left_bits(idx2bit(idx)) & m->treemap; - if (leftbits != 0) { - bindex_t i; - binmap_t leastbit = least_bit(leftbits); - compute_bit2idx(leastbit, i); - t = *treebin_at(m, i); - } - } - - while (t != 0) { /* find smallest of tree or subtree */ - size_t trem = chunksize(t) - nb; - if (trem < rsize) { - rsize = trem; - v = t; - } - t = leftmost_child(t); - } - - /* If dv is a better fit, return 0 so malloc will use it */ - if (v != 0 && rsize < (size_t)(m->dvsize - nb)) { - if (RTCHECK(ok_address(m, v))) { /* split */ - mchunkptr r = chunk_plus_offset(v, nb); - assert(chunksize(v) == rsize + nb); - if (RTCHECK(ok_next(v, r))) { - unlink_large_chunk(m, v); - if (rsize < MIN_CHUNK_SIZE) - set_inuse_and_pinuse(m, v, (rsize + nb)); - else { - set_size_and_pinuse_of_inuse_chunk(m, v, nb); - set_size_and_pinuse_of_free_chunk(r, rsize); - insert_chunk(m, r, rsize); - } - return chunk2mem(v); - } - } - CORRUPTION_ERROR_ACTION(m); - } - return 0; -} - -/* allocate a small request from the best fitting chunk in a treebin */ -static void* tmalloc_small(mstate m, size_t nb) { - tchunkptr t, v; - size_t rsize; - bindex_t i; - binmap_t leastbit = least_bit(m->treemap); - compute_bit2idx(leastbit, i); - v = t = *treebin_at(m, i); - rsize = chunksize(t) - nb; - - while ((t = leftmost_child(t)) != 0) { - size_t trem = chunksize(t) - nb; - if (trem < rsize) { - rsize = trem; - v = t; - } - } - - if (RTCHECK(ok_address(m, v))) { - mchunkptr r = chunk_plus_offset(v, nb); - assert(chunksize(v) == rsize + nb); - if (RTCHECK(ok_next(v, r))) { - unlink_large_chunk(m, v); - if (rsize < MIN_CHUNK_SIZE) - set_inuse_and_pinuse(m, v, (rsize + nb)); - else { - set_size_and_pinuse_of_inuse_chunk(m, v, nb); - set_size_and_pinuse_of_free_chunk(r, rsize); - replace_dv(m, r, rsize); - } - return chunk2mem(v); - } - } - - CORRUPTION_ERROR_ACTION(m); - return 0; -} - -#if !ONLY_MSPACES - -void* dlmalloc(size_t bytes) { - /* - Basic algorithm: - If a small request (< 256 bytes minus per-chunk overhead): - 1. If one exists, use a remainderless chunk in associated smallbin. - (Remainderless means that there are too few excess bytes to - represent as a chunk.) - 2. If it is big enough, use the dv chunk, which is normally the - chunk adjacent to the one used for the most recent small request. - 3. If one exists, split the smallest available chunk in a bin, - saving remainder in dv. - 4. If it is big enough, use the top chunk. - 5. If available, get memory from system and use it - Otherwise, for a large request: - 1. Find the smallest available binned chunk that fits, and use it - if it is better fitting than dv chunk, splitting if necessary. - 2. If better fitting than any binned chunk, use the dv chunk. - 3. If it is big enough, use the top chunk. - 4. If request size >= mmap threshold, try to directly mmap this chunk. - 5. If available, get memory from system and use it - - The ugly goto's here ensure that postaction occurs along all paths. - */ - -#if USE_LOCKS - ensure_initialization(); /* initialize in sys_alloc if not using locks */ -#endif - - if (!PREACTION(gm)) { - void* mem; - size_t nb; - if (bytes <= MAX_SMALL_REQUEST) { - bindex_t idx; - binmap_t smallbits; - nb = (bytes < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(bytes); - idx = small_index(nb); - smallbits = gm->smallmap >> idx; - - if ((smallbits & 0x3U) != 0) { /* Remainderless fit to a smallbin. */ - mchunkptr b, p; - idx += ~smallbits & 1; /* Uses next bin if idx empty */ - b = smallbin_at(gm, idx); - p = b->fd; - assert(chunksize(p) == small_index2size(idx)); - unlink_first_small_chunk(gm, b, p, idx); - set_inuse_and_pinuse(gm, p, small_index2size(idx)); - mem = chunk2mem(p); - check_malloced_chunk(gm, mem, nb); - goto postaction; - } - - else if (nb > gm->dvsize) { - if (smallbits != 0) { /* Use chunk in next nonempty smallbin */ - mchunkptr b, p, r; - size_t rsize; - bindex_t i; - binmap_t leftbits = (smallbits << idx) & left_bits(idx2bit(idx)); - binmap_t leastbit = least_bit(leftbits); - compute_bit2idx(leastbit, i); - b = smallbin_at(gm, i); - p = b->fd; - assert(chunksize(p) == small_index2size(i)); - unlink_first_small_chunk(gm, b, p, i); - rsize = small_index2size(i) - nb; - /* Fit here cannot be remainderless if 4byte sizes */ - if (SIZE_T_SIZE != 4 && rsize < MIN_CHUNK_SIZE) - set_inuse_and_pinuse(gm, p, small_index2size(i)); - else { - set_size_and_pinuse_of_inuse_chunk(gm, p, nb); - r = chunk_plus_offset(p, nb); - set_size_and_pinuse_of_free_chunk(r, rsize); - replace_dv(gm, r, rsize); - } - mem = chunk2mem(p); - check_malloced_chunk(gm, mem, nb); - goto postaction; - } - - else if (gm->treemap != 0 && (mem = tmalloc_small(gm, nb)) != 0) { - check_malloced_chunk(gm, mem, nb); - goto postaction; - } - } - } - else if (bytes >= MAX_REQUEST) - nb = MAX_SIZE_T; /* Too big to allocate. Force failure (in sys alloc) */ - else { - nb = pad_request(bytes); - if (gm->treemap != 0 && (mem = tmalloc_large(gm, nb)) != 0) { - check_malloced_chunk(gm, mem, nb); - goto postaction; - } - } - - if (nb <= gm->dvsize) { - size_t rsize = gm->dvsize - nb; - mchunkptr p = gm->dv; - if (rsize >= MIN_CHUNK_SIZE) { /* split dv */ - mchunkptr r = gm->dv = chunk_plus_offset(p, nb); - gm->dvsize = rsize; - set_size_and_pinuse_of_free_chunk(r, rsize); - set_size_and_pinuse_of_inuse_chunk(gm, p, nb); - } - else { /* exhaust dv */ - size_t dvs = gm->dvsize; - gm->dvsize = 0; - gm->dv = 0; - set_inuse_and_pinuse(gm, p, dvs); - } - mem = chunk2mem(p); - check_malloced_chunk(gm, mem, nb); - goto postaction; - } - - else if (nb < gm->topsize) { /* Split top */ - size_t rsize = gm->topsize -= nb; - mchunkptr p = gm->top; - mchunkptr r = gm->top = chunk_plus_offset(p, nb); - r->head = rsize | PINUSE_BIT; - set_size_and_pinuse_of_inuse_chunk(gm, p, nb); - mem = chunk2mem(p); - check_top_chunk(gm, gm->top); - check_malloced_chunk(gm, mem, nb); - goto postaction; - } - - mem = sys_alloc(gm, nb); - - postaction: - POSTACTION(gm); - return mem; - } - - return 0; -} - -/* ---------------------------- free --------------------------- */ - -void dlfree(void* mem) { - /* - Consolidate freed chunks with preceeding or succeeding bordering - free chunks, if they exist, and then place in a bin. Intermixed - with special cases for top, dv, mmapped chunks, and usage errors. - */ - - if (mem != 0) { - mchunkptr p = mem2chunk(mem); -#if FOOTERS - mstate fm = get_mstate_for(p); - if (!ok_magic(fm)) { - USAGE_ERROR_ACTION(fm, p); - return; - } -#else /* FOOTERS */ -#define fm gm -#endif /* FOOTERS */ - if (!PREACTION(fm)) { - check_inuse_chunk(fm, p); - if (RTCHECK(ok_address(fm, p) && ok_inuse(p))) { - size_t psize = chunksize(p); - mchunkptr next = chunk_plus_offset(p, psize); - if (!pinuse(p)) { - size_t prevsize = p->prev_foot; - if (is_mmapped(p)) { - psize += prevsize + MMAP_FOOT_PAD; - if (CALL_MUNMAP((char*)p - prevsize, psize) == 0) - fm->footprint -= psize; - goto postaction; - } - else { - mchunkptr prev = chunk_minus_offset(p, prevsize); - psize += prevsize; - p = prev; - if (RTCHECK(ok_address(fm, prev))) { /* consolidate backward */ - if (p != fm->dv) { - unlink_chunk(fm, p, prevsize); - } - else if ((next->head & INUSE_BITS) == INUSE_BITS) { - fm->dvsize = psize; - set_free_with_pinuse(p, psize, next); - goto postaction; - } - } - else - goto erroraction; - } - } - - if (RTCHECK(ok_next(p, next) && ok_pinuse(next))) { - if (!cinuse(next)) { /* consolidate forward */ - if (next == fm->top) { - size_t tsize = fm->topsize += psize; - fm->top = p; - p->head = tsize | PINUSE_BIT; - if (p == fm->dv) { - fm->dv = 0; - fm->dvsize = 0; - } - if (should_trim(fm, tsize)) - sys_trim(fm, 0); - goto postaction; - } - else if (next == fm->dv) { - size_t dsize = fm->dvsize += psize; - fm->dv = p; - set_size_and_pinuse_of_free_chunk(p, dsize); - goto postaction; - } - else { - size_t nsize = chunksize(next); - psize += nsize; - unlink_chunk(fm, next, nsize); - set_size_and_pinuse_of_free_chunk(p, psize); - if (p == fm->dv) { - fm->dvsize = psize; - goto postaction; - } - } - } - else - set_free_with_pinuse(p, psize, next); - - if (is_small(psize)) { - insert_small_chunk(fm, p, psize); - check_free_chunk(fm, p); - } - else { - tchunkptr tp = (tchunkptr)p; - insert_large_chunk(fm, tp, psize); - check_free_chunk(fm, p); - if (--fm->release_checks == 0) - release_unused_segments(fm); - } - goto postaction; - } - } - erroraction: - USAGE_ERROR_ACTION(fm, p); - postaction: - POSTACTION(fm); - } - } -#if !FOOTERS -#undef fm -#endif /* FOOTERS */ -} - -void* dlcalloc(size_t n_elements, size_t elem_size) { - void* mem; - size_t req = 0; - if (n_elements != 0) { - req = n_elements * elem_size; - if (((n_elements | elem_size) & ~(size_t)0xffff) && - (req / n_elements != elem_size)) - req = MAX_SIZE_T; /* force downstream failure on overflow */ - } - mem = dlmalloc(req); - if (mem != 0 && calloc_must_clear(mem2chunk(mem))) - memset(mem, 0, req); - return mem; -} - -#endif /* !ONLY_MSPACES */ - -/* ------------ Internal support for realloc, memalign, etc -------------- */ - -/* Try to realloc; only in-place unless can_move true */ -static mchunkptr try_realloc_chunk(mstate m, mchunkptr p, size_t nb, - int can_move) { - mchunkptr newp = 0; - size_t oldsize = chunksize(p); - mchunkptr next = chunk_plus_offset(p, oldsize); - if (RTCHECK(ok_address(m, p) && ok_inuse(p) && - ok_next(p, next) && ok_pinuse(next))) { - if (is_mmapped(p)) { - newp = mmap_resize(m, p, nb, can_move); - } - else if (oldsize >= nb) { /* already big enough */ - size_t rsize = oldsize - nb; - if (rsize >= MIN_CHUNK_SIZE) { /* split off remainder */ - mchunkptr r = chunk_plus_offset(p, nb); - set_inuse(m, p, nb); - set_inuse(m, r, rsize); - dispose_chunk(m, r, rsize); - } - newp = p; - } - else if (next == m->top) { /* extend into top */ - if (oldsize + m->topsize > nb) { - size_t newsize = oldsize + m->topsize; - size_t newtopsize = newsize - nb; - mchunkptr newtop = chunk_plus_offset(p, nb); - set_inuse(m, p, nb); - newtop->head = newtopsize |PINUSE_BIT; - m->top = newtop; - m->topsize = newtopsize; - newp = p; - } - } - else if (next == m->dv) { /* extend into dv */ - size_t dvs = m->dvsize; - if (oldsize + dvs >= nb) { - size_t dsize = oldsize + dvs - nb; - if (dsize >= MIN_CHUNK_SIZE) { - mchunkptr r = chunk_plus_offset(p, nb); - mchunkptr n = chunk_plus_offset(r, dsize); - set_inuse(m, p, nb); - set_size_and_pinuse_of_free_chunk(r, dsize); - clear_pinuse(n); - m->dvsize = dsize; - m->dv = r; - } - else { /* exhaust dv */ - size_t newsize = oldsize + dvs; - set_inuse(m, p, newsize); - m->dvsize = 0; - m->dv = 0; - } - newp = p; - } - } - else if (!cinuse(next)) { /* extend into next free chunk */ - size_t nextsize = chunksize(next); - if (oldsize + nextsize >= nb) { - size_t rsize = oldsize + nextsize - nb; - unlink_chunk(m, next, nextsize); - if (rsize < MIN_CHUNK_SIZE) { - size_t newsize = oldsize + nextsize; - set_inuse(m, p, newsize); - } - else { - mchunkptr r = chunk_plus_offset(p, nb); - set_inuse(m, p, nb); - set_inuse(m, r, rsize); - dispose_chunk(m, r, rsize); - } - newp = p; - } - } - } - else { - USAGE_ERROR_ACTION(m, oldmem); - } - return newp; -} - -static void* internal_memalign(mstate m, size_t alignment, size_t bytes) { - void* mem = 0; - if (alignment < MIN_CHUNK_SIZE) /* must be at least a minimum chunk size */ - alignment = MIN_CHUNK_SIZE; - if ((alignment & (alignment-SIZE_T_ONE)) != 0) {/* Ensure a power of 2 */ - size_t a = MALLOC_ALIGNMENT << 1; - while (a < alignment) a <<= 1; - alignment = a; - } - if (bytes >= MAX_REQUEST - alignment) { - if (m != 0) { /* Test isn't needed but avoids compiler warning */ - MALLOC_FAILURE_ACTION; - } - } - else { - size_t nb = request2size(bytes); - size_t req = nb + alignment + MIN_CHUNK_SIZE - CHUNK_OVERHEAD; - mem = internal_malloc(m, req); - if (mem != 0) { - mchunkptr p = mem2chunk(mem); - if (PREACTION(m)) - return 0; - if ((((size_t)(mem)) & (alignment - 1)) != 0) { /* misaligned */ - /* - Find an aligned spot inside chunk. Since we need to give - back leading space in a chunk of at least MIN_CHUNK_SIZE, if - the first calculation places us at a spot with less than - MIN_CHUNK_SIZE leader, we can move to the next aligned spot. - We've allocated enough total room so that this is always - possible. - */ - char* br = (char*)mem2chunk((size_t)(((size_t)((char*)mem + alignment - - SIZE_T_ONE)) & - -alignment)); - char* pos = ((size_t)(br - (char*)(p)) >= MIN_CHUNK_SIZE)? - br : br+alignment; - mchunkptr newp = (mchunkptr)pos; - size_t leadsize = pos - (char*)(p); - size_t newsize = chunksize(p) - leadsize; - - if (is_mmapped(p)) { /* For mmapped chunks, just adjust offset */ - newp->prev_foot = p->prev_foot + leadsize; - newp->head = newsize; - } - else { /* Otherwise, give back leader, use the rest */ - set_inuse(m, newp, newsize); - set_inuse(m, p, leadsize); - dispose_chunk(m, p, leadsize); - } - p = newp; - } - - /* Give back spare room at the end */ - if (!is_mmapped(p)) { - size_t size = chunksize(p); - if (size > nb + MIN_CHUNK_SIZE) { - size_t remainder_size = size - nb; - mchunkptr remainder = chunk_plus_offset(p, nb); - set_inuse(m, p, nb); - set_inuse(m, remainder, remainder_size); - dispose_chunk(m, remainder, remainder_size); - } - } - - mem = chunk2mem(p); - assert (chunksize(p) >= nb); - assert(((size_t)mem & (alignment - 1)) == 0); - check_inuse_chunk(m, p); - POSTACTION(m); - } - } - return mem; -} - -/* - Common support for independent_X routines, handling - all of the combinations that can result. - The opts arg has: - bit 0 set if all elements are same size (using sizes[0]) - bit 1 set if elements should be zeroed -*/ -static void** ialloc(mstate m, - size_t n_elements, - size_t* sizes, - int opts, - void* chunks[]) { - - size_t element_size; /* chunksize of each element, if all same */ - size_t contents_size; /* total size of elements */ - size_t array_size; /* request size of pointer array */ - void* mem; /* malloced aggregate space */ - mchunkptr p; /* corresponding chunk */ - size_t remainder_size; /* remaining bytes while splitting */ - void** marray; /* either "chunks" or malloced ptr array */ - mchunkptr array_chunk; /* chunk for malloced ptr array */ - flag_t was_enabled; /* to disable mmap */ - size_t size; - size_t i; - - ensure_initialization(); - /* compute array length, if needed */ - if (chunks != 0) { - if (n_elements == 0) - return chunks; /* nothing to do */ - marray = chunks; - array_size = 0; - } - else { - /* if empty req, must still return chunk representing empty array */ - if (n_elements == 0) - return (void**)internal_malloc(m, 0); - marray = 0; - array_size = request2size(n_elements * (sizeof(void*))); - } - - /* compute total element size */ - if (opts & 0x1) { /* all-same-size */ - element_size = request2size(*sizes); - contents_size = n_elements * element_size; - } - else { /* add up all the sizes */ - element_size = 0; - contents_size = 0; - for (i = 0; i != n_elements; ++i) - contents_size += request2size(sizes[i]); - } - - size = contents_size + array_size; - - /* - Allocate the aggregate chunk. First disable direct-mmapping so - malloc won't use it, since we would not be able to later - free/realloc space internal to a segregated mmap region. - */ - was_enabled = use_mmap(m); - disable_mmap(m); - mem = internal_malloc(m, size - CHUNK_OVERHEAD); - if (was_enabled) - enable_mmap(m); - if (mem == 0) - return 0; - - if (PREACTION(m)) return 0; - p = mem2chunk(mem); - remainder_size = chunksize(p); - - assert(!is_mmapped(p)); - - if (opts & 0x2) { /* optionally clear the elements */ - memset((size_t*)mem, 0, remainder_size - SIZE_T_SIZE - array_size); - } - - /* If not provided, allocate the pointer array as final part of chunk */ - if (marray == 0) { - size_t array_chunk_size; - array_chunk = chunk_plus_offset(p, contents_size); - array_chunk_size = remainder_size - contents_size; - marray = (void**) (chunk2mem(array_chunk)); - set_size_and_pinuse_of_inuse_chunk(m, array_chunk, array_chunk_size); - remainder_size = contents_size; - } - - /* split out elements */ - for (i = 0; ; ++i) { - marray[i] = chunk2mem(p); - if (i != n_elements-1) { - if (element_size != 0) - size = element_size; - else - size = request2size(sizes[i]); - remainder_size -= size; - set_size_and_pinuse_of_inuse_chunk(m, p, size); - p = chunk_plus_offset(p, size); - } - else { /* the final element absorbs any overallocation slop */ - set_size_and_pinuse_of_inuse_chunk(m, p, remainder_size); - break; - } - } - -#if DEBUG - if (marray != chunks) { - /* final element must have exactly exhausted chunk */ - if (element_size != 0) { - assert(remainder_size == element_size); - } - else { - assert(remainder_size == request2size(sizes[i])); - } - check_inuse_chunk(m, mem2chunk(marray)); - } - for (i = 0; i != n_elements; ++i) - check_inuse_chunk(m, mem2chunk(marray[i])); - -#endif /* DEBUG */ - - POSTACTION(m); - return marray; -} - -/* Try to free all pointers in the given array. - Note: this could be made faster, by delaying consolidation, - at the price of disabling some user integrity checks, We - still optimize some consolidations by combining adjacent - chunks before freeing, which will occur often if allocated - with ialloc or the array is sorted. -*/ -static size_t internal_bulk_free(mstate m, void* array[], size_t nelem) { - size_t unfreed = 0; - if (!PREACTION(m)) { - void** a; - void** fence = &(array[nelem]); - for (a = array; a != fence; ++a) { - void* mem = *a; - if (mem != 0) { - mchunkptr p = mem2chunk(mem); - size_t psize = chunksize(p); -#if FOOTERS - if (get_mstate_for(p) != m) { - ++unfreed; - continue; - } -#endif - check_inuse_chunk(m, p); - *a = 0; - if (RTCHECK(ok_address(m, p) && ok_inuse(p))) { - void ** b = a + 1; /* try to merge with next chunk */ - mchunkptr next = next_chunk(p); - if (b != fence && *b == chunk2mem(next)) { - size_t newsize = chunksize(next) + psize; - set_inuse(m, p, newsize); - *b = chunk2mem(p); - } - else - dispose_chunk(m, p, psize); - } - else { - CORRUPTION_ERROR_ACTION(m); - break; - } - } - } - if (should_trim(m, m->topsize)) - sys_trim(m, 0); - POSTACTION(m); - } - return unfreed; -} - -/* Traversal */ -#if MALLOC_INSPECT_ALL -static void internal_inspect_all(mstate m, - void(*handler)(void *start, - void *end, - size_t used_bytes, - void* callback_arg), - void* arg) { - if (is_initialized(m)) { - mchunkptr top = m->top; - msegmentptr s; - for (s = &m->seg; s != 0; s = s->next) { - mchunkptr q = align_as_chunk(s->base); - while (segment_holds(s, q) && q->head != FENCEPOST_HEAD) { - mchunkptr next = next_chunk(q); - size_t sz = chunksize(q); - size_t used; - void* start; - if (is_inuse(q)) { - used = sz - CHUNK_OVERHEAD; /* must not be mmapped */ - start = chunk2mem(q); - } - else { - used = 0; - if (is_small(sz)) { /* offset by possible bookkeeping */ - start = (void*)((char*)q + sizeof(malloc_chunk)); - } - else { - start = (void*)((char*)q + sizeof(malloc_tree_chunk)); - } - } - if (start < (void*)next) /* skip if all space is bookkeeping */ - handler(start, next, used, arg); - if (q == top) - break; - q = next; - } - } - } -} -#endif /* MALLOC_INSPECT_ALL */ - -/* ------------------ Exported realloc, memalign, etc -------------------- */ - -#if !ONLY_MSPACES - -void* dlrealloc(void* oldmem, size_t bytes) { - void* mem = 0; - if (oldmem == 0) { - mem = dlmalloc(bytes); - } - else if (bytes >= MAX_REQUEST) { - MALLOC_FAILURE_ACTION; - } -#ifdef REALLOC_ZERO_BYTES_FREES - else if (bytes == 0) { - dlfree(oldmem); - } -#endif /* REALLOC_ZERO_BYTES_FREES */ - else { - size_t nb = request2size(bytes); - mchunkptr oldp = mem2chunk(oldmem); -#if ! FOOTERS - mstate m = gm; -#else /* FOOTERS */ - mstate m = get_mstate_for(oldp); - if (!ok_magic(m)) { - USAGE_ERROR_ACTION(m, oldmem); - return 0; - } -#endif /* FOOTERS */ - if (!PREACTION(m)) { - mchunkptr newp = try_realloc_chunk(m, oldp, nb, 1); - POSTACTION(m); - if (newp != 0) { - check_inuse_chunk(m, newp); - mem = chunk2mem(newp); - } - else { - mem = internal_malloc(m, bytes); - if (mem != 0) { - size_t oc = chunksize(oldp) - overhead_for(oldp); - memcpy(mem, oldmem, (oc < bytes)? oc : bytes); - internal_free(m, oldmem); - } - } - } - } - return mem; -} - -void* dlrealloc_in_place(void* oldmem, size_t bytes) { - void* mem = 0; - if (oldmem != 0) { - if (bytes >= MAX_REQUEST) { - MALLOC_FAILURE_ACTION; - } - else { - size_t nb = request2size(bytes); - mchunkptr oldp = mem2chunk(oldmem); -#if ! FOOTERS - mstate m = gm; -#else /* FOOTERS */ - mstate m = get_mstate_for(oldp); - if (!ok_magic(m)) { - USAGE_ERROR_ACTION(m, oldmem); - return 0; - } -#endif /* FOOTERS */ - if (!PREACTION(m)) { - mchunkptr newp = try_realloc_chunk(m, oldp, nb, 0); - POSTACTION(m); - if (newp == oldp) { - check_inuse_chunk(m, newp); - mem = oldmem; - } - } - } - } - return mem; -} - -void* dlmemalign(size_t alignment, size_t bytes) { - if (alignment <= MALLOC_ALIGNMENT) { - return dlmalloc(bytes); - } - return internal_memalign(gm, alignment, bytes); -} - -int dlposix_memalign(void** pp, size_t alignment, size_t bytes) { - void* mem = 0; - if (alignment == MALLOC_ALIGNMENT) - mem = dlmalloc(bytes); - else { - size_t d = alignment / sizeof(void*); - size_t r = alignment % sizeof(void*); - if (r != 0 || d == 0 || (d & (d-SIZE_T_ONE)) != 0) - return EINVAL; - else if (bytes >= MAX_REQUEST - alignment) { - if (alignment < MIN_CHUNK_SIZE) - alignment = MIN_CHUNK_SIZE; - mem = internal_memalign(gm, alignment, bytes); - } - } - if (mem == 0) - return ENOMEM; - else { - *pp = mem; - return 0; - } -} - -void* dlvalloc(size_t bytes) { - size_t pagesz; - ensure_initialization(); - pagesz = mparams.page_size; - return dlmemalign(pagesz, bytes); -} - -void* dlpvalloc(size_t bytes) { - size_t pagesz; - ensure_initialization(); - pagesz = mparams.page_size; - return dlmemalign(pagesz, (bytes + pagesz - SIZE_T_ONE) & ~(pagesz - SIZE_T_ONE)); -} - -void** dlindependent_calloc(size_t n_elements, size_t elem_size, - void* chunks[]) { - size_t sz = elem_size; /* serves as 1-element array */ - return ialloc(gm, n_elements, &sz, 3, chunks); -} - -void** dlindependent_comalloc(size_t n_elements, size_t sizes[], - void* chunks[]) { - return ialloc(gm, n_elements, sizes, 0, chunks); -} - -size_t dlbulk_free(void* array[], size_t nelem) { - return internal_bulk_free(gm, array, nelem); -} - -#if MALLOC_INSPECT_ALL -void dlmalloc_inspect_all(void(*handler)(void *start, - void *end, - size_t used_bytes, - void* callback_arg), - void* arg) { - ensure_initialization(); - if (!PREACTION(gm)) { - internal_inspect_all(gm, handler, arg); - POSTACTION(gm); - } -} -#endif /* MALLOC_INSPECT_ALL */ - -int dlmalloc_trim(size_t pad) { - int result = 0; - ensure_initialization(); - if (!PREACTION(gm)) { - result = sys_trim(gm, pad); - POSTACTION(gm); - } - return result; -} - -size_t dlmalloc_footprint(void) { - return gm->footprint; -} - -size_t dlmalloc_max_footprint(void) { - return gm->max_footprint; -} - -size_t dlmalloc_footprint_limit(void) { - size_t maf = gm->footprint_limit; - return maf == 0 ? MAX_SIZE_T : maf; -} - -size_t dlmalloc_set_footprint_limit(size_t bytes) { - size_t result; /* invert sense of 0 */ - if (bytes == 0) - result = granularity_align(1); /* Use minimal size */ - if (bytes == MAX_SIZE_T) - result = 0; /* disable */ - else - result = granularity_align(bytes); - return gm->footprint_limit = result; -} - -#if !NO_MALLINFO -struct mallinfo dlmallinfo(void) { - return internal_mallinfo(gm); -} -#endif /* NO_MALLINFO */ - -#if !NO_MALLOC_STATS -void dlmalloc_stats() { - internal_malloc_stats(gm); -} -#endif /* NO_MALLOC_STATS */ - -int dlmallopt(int param_number, int value) { - return change_mparam(param_number, value); -} - -size_t dlmalloc_usable_size(void* mem) { - if (mem != 0) { - mchunkptr p = mem2chunk(mem); - if (is_inuse(p)) - return chunksize(p) - overhead_for(p); - } - return 0; -} - -#endif /* !ONLY_MSPACES */ - -/* ----------------------------- user mspaces ---------------------------- */ - -#if MSPACES - -static mstate init_user_mstate(char* tbase, size_t tsize) { - size_t msize = pad_request(sizeof(struct malloc_state)); - mchunkptr mn; - mchunkptr msp = align_as_chunk(tbase); - mstate m = (mstate)(chunk2mem(msp)); - memset(m, 0, msize); - (void)INITIAL_LOCK(&m->mutex); - msp->head = (msize|INUSE_BITS); - m->seg.base = m->least_addr = tbase; - m->seg.size = m->footprint = m->max_footprint = tsize; - m->magic = mparams.magic; - m->release_checks = MAX_RELEASE_CHECK_RATE; - m->mflags = mparams.default_mflags; - m->extp = 0; - m->exts = 0; - disable_contiguous(m); - init_bins(m); - mn = next_chunk(mem2chunk(m)); - init_top(m, mn, (size_t)((tbase + tsize) - (char*)mn) - TOP_FOOT_SIZE); - check_top_chunk(m, m->top); - return m; -} - -mspace create_mspace(size_t capacity, int locked) { - mstate m = 0; - size_t msize; - ensure_initialization(); - msize = pad_request(sizeof(struct malloc_state)); - if (capacity < (size_t) -(msize + TOP_FOOT_SIZE + mparams.page_size)) { - size_t rs = ((capacity == 0)? mparams.granularity : - (capacity + TOP_FOOT_SIZE + msize)); - size_t tsize = granularity_align(rs); - char* tbase = (char*)(CALL_MMAP(tsize)); - if (tbase != CMFAIL) { - m = init_user_mstate(tbase, tsize); - m->seg.sflags = USE_MMAP_BIT; - set_lock(m, locked); - } - } - return (mspace)m; -} - -mspace create_mspace_with_base(void* base, size_t capacity, int locked) { - mstate m = 0; - size_t msize; - ensure_initialization(); - msize = pad_request(sizeof(struct malloc_state)); - if (capacity > msize + TOP_FOOT_SIZE && - capacity < (size_t) -(msize + TOP_FOOT_SIZE + mparams.page_size)) { - m = init_user_mstate((char*)base, capacity); - m->seg.sflags = EXTERN_BIT; - set_lock(m, locked); - } - return (mspace)m; -} - -int mspace_track_large_chunks(mspace msp, int enable) { - int ret = 0; - mstate ms = (mstate)msp; - if (!PREACTION(ms)) { - if (!use_mmap(ms)) - ret = 1; - if (!enable) - enable_mmap(ms); - else - disable_mmap(ms); - POSTACTION(ms); - } - return ret; -} - -size_t destroy_mspace(mspace msp) { - size_t freed = 0; - mstate ms = (mstate)msp; - if (ok_magic(ms)) { - msegmentptr sp = &ms->seg; - (void)DESTROY_LOCK(&ms->mutex); /* destroy before unmapped */ - while (sp != 0) { - char* base = sp->base; - size_t size = sp->size; - flag_t flag = sp->sflags; - sp = sp->next; - if ((flag & USE_MMAP_BIT) && !(flag & EXTERN_BIT) && - CALL_MUNMAP(base, size) == 0) - freed += size; - } - } - else { - USAGE_ERROR_ACTION(ms,ms); - } - return freed; -} - -/* - mspace versions of routines are near-clones of the global - versions. This is not so nice but better than the alternatives. -*/ - -void* mspace_malloc(mspace msp, size_t bytes) { - mstate ms = (mstate)msp; - if (!ok_magic(ms)) { - USAGE_ERROR_ACTION(ms,ms); - return 0; - } - if (!PREACTION(ms)) { - void* mem; - size_t nb; - if (bytes <= MAX_SMALL_REQUEST) { - bindex_t idx; - binmap_t smallbits; - nb = (bytes < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(bytes); - idx = small_index(nb); - smallbits = ms->smallmap >> idx; - - if ((smallbits & 0x3U) != 0) { /* Remainderless fit to a smallbin. */ - mchunkptr b, p; - idx += ~smallbits & 1; /* Uses next bin if idx empty */ - b = smallbin_at(ms, idx); - p = b->fd; - assert(chunksize(p) == small_index2size(idx)); - unlink_first_small_chunk(ms, b, p, idx); - set_inuse_and_pinuse(ms, p, small_index2size(idx)); - mem = chunk2mem(p); - check_malloced_chunk(ms, mem, nb); - goto postaction; - } - - else if (nb > ms->dvsize) { - if (smallbits != 0) { /* Use chunk in next nonempty smallbin */ - mchunkptr b, p, r; - size_t rsize; - bindex_t i; - binmap_t leftbits = (smallbits << idx) & left_bits(idx2bit(idx)); - binmap_t leastbit = least_bit(leftbits); - compute_bit2idx(leastbit, i); - b = smallbin_at(ms, i); - p = b->fd; - assert(chunksize(p) == small_index2size(i)); - unlink_first_small_chunk(ms, b, p, i); - rsize = small_index2size(i) - nb; - /* Fit here cannot be remainderless if 4byte sizes */ - if (SIZE_T_SIZE != 4 && rsize < MIN_CHUNK_SIZE) - set_inuse_and_pinuse(ms, p, small_index2size(i)); - else { - set_size_and_pinuse_of_inuse_chunk(ms, p, nb); - r = chunk_plus_offset(p, nb); - set_size_and_pinuse_of_free_chunk(r, rsize); - replace_dv(ms, r, rsize); - } - mem = chunk2mem(p); - check_malloced_chunk(ms, mem, nb); - goto postaction; - } - - else if (ms->treemap != 0 && (mem = tmalloc_small(ms, nb)) != 0) { - check_malloced_chunk(ms, mem, nb); - goto postaction; - } - } - } - else if (bytes >= MAX_REQUEST) - nb = MAX_SIZE_T; /* Too big to allocate. Force failure (in sys alloc) */ - else { - nb = pad_request(bytes); - if (ms->treemap != 0 && (mem = tmalloc_large(ms, nb)) != 0) { - check_malloced_chunk(ms, mem, nb); - goto postaction; - } - } - - if (nb <= ms->dvsize) { - size_t rsize = ms->dvsize - nb; - mchunkptr p = ms->dv; - if (rsize >= MIN_CHUNK_SIZE) { /* split dv */ - mchunkptr r = ms->dv = chunk_plus_offset(p, nb); - ms->dvsize = rsize; - set_size_and_pinuse_of_free_chunk(r, rsize); - set_size_and_pinuse_of_inuse_chunk(ms, p, nb); - } - else { /* exhaust dv */ - size_t dvs = ms->dvsize; - ms->dvsize = 0; - ms->dv = 0; - set_inuse_and_pinuse(ms, p, dvs); - } - mem = chunk2mem(p); - check_malloced_chunk(ms, mem, nb); - goto postaction; - } - - else if (nb < ms->topsize) { /* Split top */ - size_t rsize = ms->topsize -= nb; - mchunkptr p = ms->top; - mchunkptr r = ms->top = chunk_plus_offset(p, nb); - r->head = rsize | PINUSE_BIT; - set_size_and_pinuse_of_inuse_chunk(ms, p, nb); - mem = chunk2mem(p); - check_top_chunk(ms, ms->top); - check_malloced_chunk(ms, mem, nb); - goto postaction; - } - - mem = sys_alloc(ms, nb); - - postaction: - POSTACTION(ms); - return mem; - } - - return 0; -} - -void mspace_free(mspace msp, void* mem) { - if (mem != 0) { - mchunkptr p = mem2chunk(mem); -#if FOOTERS - mstate fm = get_mstate_for(p); - msp = msp; /* placate people compiling -Wunused */ -#else /* FOOTERS */ - mstate fm = (mstate)msp; -#endif /* FOOTERS */ - if (!ok_magic(fm)) { - USAGE_ERROR_ACTION(fm, p); - return; - } - if (!PREACTION(fm)) { - check_inuse_chunk(fm, p); - if (RTCHECK(ok_address(fm, p) && ok_inuse(p))) { - size_t psize = chunksize(p); - mchunkptr next = chunk_plus_offset(p, psize); - if (!pinuse(p)) { - size_t prevsize = p->prev_foot; - if (is_mmapped(p)) { - psize += prevsize + MMAP_FOOT_PAD; - if (CALL_MUNMAP((char*)p - prevsize, psize) == 0) - fm->footprint -= psize; - goto postaction; - } - else { - mchunkptr prev = chunk_minus_offset(p, prevsize); - psize += prevsize; - p = prev; - if (RTCHECK(ok_address(fm, prev))) { /* consolidate backward */ - if (p != fm->dv) { - unlink_chunk(fm, p, prevsize); - } - else if ((next->head & INUSE_BITS) == INUSE_BITS) { - fm->dvsize = psize; - set_free_with_pinuse(p, psize, next); - goto postaction; - } - } - else - goto erroraction; - } - } - - if (RTCHECK(ok_next(p, next) && ok_pinuse(next))) { - if (!cinuse(next)) { /* consolidate forward */ - if (next == fm->top) { - size_t tsize = fm->topsize += psize; - fm->top = p; - p->head = tsize | PINUSE_BIT; - if (p == fm->dv) { - fm->dv = 0; - fm->dvsize = 0; - } - if (should_trim(fm, tsize)) - sys_trim(fm, 0); - goto postaction; - } - else if (next == fm->dv) { - size_t dsize = fm->dvsize += psize; - fm->dv = p; - set_size_and_pinuse_of_free_chunk(p, dsize); - goto postaction; - } - else { - size_t nsize = chunksize(next); - psize += nsize; - unlink_chunk(fm, next, nsize); - set_size_and_pinuse_of_free_chunk(p, psize); - if (p == fm->dv) { - fm->dvsize = psize; - goto postaction; - } - } - } - else - set_free_with_pinuse(p, psize, next); - - if (is_small(psize)) { - insert_small_chunk(fm, p, psize); - check_free_chunk(fm, p); - } - else { - tchunkptr tp = (tchunkptr)p; - insert_large_chunk(fm, tp, psize); - check_free_chunk(fm, p); - if (--fm->release_checks == 0) - release_unused_segments(fm); - } - goto postaction; - } - } - erroraction: - USAGE_ERROR_ACTION(fm, p); - postaction: - POSTACTION(fm); - } - } -} - -void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size) { - void* mem; - size_t req = 0; - mstate ms = (mstate)msp; - if (!ok_magic(ms)) { - USAGE_ERROR_ACTION(ms,ms); - return 0; - } - if (n_elements != 0) { - req = n_elements * elem_size; - if (((n_elements | elem_size) & ~(size_t)0xffff) && - (req / n_elements != elem_size)) - req = MAX_SIZE_T; /* force downstream failure on overflow */ - } - mem = internal_malloc(ms, req); - if (mem != 0 && calloc_must_clear(mem2chunk(mem))) - memset(mem, 0, req); - return mem; -} - -void* mspace_realloc(mspace msp, void* oldmem, size_t bytes) { - void* mem = 0; - if (oldmem == 0) { - mem = mspace_malloc(msp, bytes); - } - else if (bytes >= MAX_REQUEST) { - MALLOC_FAILURE_ACTION; - } -#ifdef REALLOC_ZERO_BYTES_FREES - else if (bytes == 0) { - mspace_free(msp, oldmem); - } -#endif /* REALLOC_ZERO_BYTES_FREES */ - else { - size_t nb = request2size(bytes); - mchunkptr oldp = mem2chunk(oldmem); -#if ! FOOTERS - mstate m = (mstate)msp; -#else /* FOOTERS */ - mstate m = get_mstate_for(oldp); - if (!ok_magic(m)) { - USAGE_ERROR_ACTION(m, oldmem); - return 0; - } -#endif /* FOOTERS */ - if (!PREACTION(m)) { - mchunkptr newp = try_realloc_chunk(m, oldp, nb, 1); - POSTACTION(m); - if (newp != 0) { - check_inuse_chunk(m, newp); - mem = chunk2mem(newp); - } - else { - mem = mspace_malloc(m, bytes); - if (mem != 0) { - size_t oc = chunksize(oldp) - overhead_for(oldp); - memcpy(mem, oldmem, (oc < bytes)? oc : bytes); - mspace_free(m, oldmem); - } - } - } - } - return mem; -} - -void* mspace_realloc_in_place(mspace msp, void* oldmem, size_t bytes) { - void* mem = 0; - if (oldmem != 0) { - if (bytes >= MAX_REQUEST) { - MALLOC_FAILURE_ACTION; - } - else { - size_t nb = request2size(bytes); - mchunkptr oldp = mem2chunk(oldmem); -#if ! FOOTERS - mstate m = (mstate)msp; -#else /* FOOTERS */ - mstate m = get_mstate_for(oldp); - msp = msp; /* placate people compiling -Wunused */ - if (!ok_magic(m)) { - USAGE_ERROR_ACTION(m, oldmem); - return 0; - } -#endif /* FOOTERS */ - if (!PREACTION(m)) { - mchunkptr newp = try_realloc_chunk(m, oldp, nb, 0); - POSTACTION(m); - if (newp == oldp) { - check_inuse_chunk(m, newp); - mem = oldmem; - } - } - } - } - return mem; -} - -void* mspace_memalign(mspace msp, size_t alignment, size_t bytes) { - mstate ms = (mstate)msp; - if (!ok_magic(ms)) { - USAGE_ERROR_ACTION(ms,ms); - return 0; - } - if (alignment <= MALLOC_ALIGNMENT) - return mspace_malloc(msp, bytes); - return internal_memalign(ms, alignment, bytes); -} - -void** mspace_independent_calloc(mspace msp, size_t n_elements, - size_t elem_size, void* chunks[]) { - size_t sz = elem_size; /* serves as 1-element array */ - mstate ms = (mstate)msp; - if (!ok_magic(ms)) { - USAGE_ERROR_ACTION(ms,ms); - return 0; - } - return ialloc(ms, n_elements, &sz, 3, chunks); -} - -void** mspace_independent_comalloc(mspace msp, size_t n_elements, - size_t sizes[], void* chunks[]) { - mstate ms = (mstate)msp; - if (!ok_magic(ms)) { - USAGE_ERROR_ACTION(ms,ms); - return 0; - } - return ialloc(ms, n_elements, sizes, 0, chunks); -} - -size_t mspace_bulk_free(mspace msp, void* array[], size_t nelem) { - return internal_bulk_free((mstate)msp, array, nelem); -} - -#if MALLOC_INSPECT_ALL -void mspace_inspect_all(mspace msp, - void(*handler)(void *start, - void *end, - size_t used_bytes, - void* callback_arg), - void* arg) { - mstate ms = (mstate)msp; - if (ok_magic(ms)) { - if (!PREACTION(ms)) { - internal_inspect_all(ms, handler, arg); - POSTACTION(ms); - } - } - else { - USAGE_ERROR_ACTION(ms,ms); - } -} -#endif /* MALLOC_INSPECT_ALL */ - -int mspace_trim(mspace msp, size_t pad) { - int result = 0; - mstate ms = (mstate)msp; - if (ok_magic(ms)) { - if (!PREACTION(ms)) { - result = sys_trim(ms, pad); - POSTACTION(ms); - } - } - else { - USAGE_ERROR_ACTION(ms,ms); - } - return result; -} - -#if !NO_MALLOC_STATS -void mspace_malloc_stats(mspace msp) { - mstate ms = (mstate)msp; - if (ok_magic(ms)) { - internal_malloc_stats(ms); - } - else { - USAGE_ERROR_ACTION(ms,ms); - } -} -#endif /* NO_MALLOC_STATS */ - -size_t mspace_footprint(mspace msp) { - size_t result = 0; - mstate ms = (mstate)msp; - if (ok_magic(ms)) { - result = ms->footprint; - } - else { - USAGE_ERROR_ACTION(ms,ms); - } - return result; -} - -size_t mspace_max_footprint(mspace msp) { - size_t result = 0; - mstate ms = (mstate)msp; - if (ok_magic(ms)) { - result = ms->max_footprint; - } - else { - USAGE_ERROR_ACTION(ms,ms); - } - return result; -} - -size_t mspace_footprint_limit(mspace msp) { - size_t result = 0; - mstate ms = (mstate)msp; - if (ok_magic(ms)) { - size_t maf = ms->footprint_limit; - result = (maf == 0) ? MAX_SIZE_T : maf; - } - else { - USAGE_ERROR_ACTION(ms,ms); - } - return result; -} - -size_t mspace_set_footprint_limit(mspace msp, size_t bytes) { - size_t result = 0; - mstate ms = (mstate)msp; - if (ok_magic(ms)) { - if (bytes == 0) - result = granularity_align(1); /* Use minimal size */ - if (bytes == MAX_SIZE_T) - result = 0; /* disable */ - else - result = granularity_align(bytes); - ms->footprint_limit = result; - } - else { - USAGE_ERROR_ACTION(ms,ms); - } - return result; -} - -#if !NO_MALLINFO -struct mallinfo mspace_mallinfo(mspace msp) { - mstate ms = (mstate)msp; - if (!ok_magic(ms)) { - USAGE_ERROR_ACTION(ms,ms); - } - return internal_mallinfo(ms); -} -#endif /* NO_MALLINFO */ - -size_t mspace_usable_size(void* mem) { - if (mem != 0) { - mchunkptr p = mem2chunk(mem); - if (is_inuse(p)) - return chunksize(p) - overhead_for(p); - } - return 0; -} - -int mspace_mallopt(int param_number, int value) { - return change_mparam(param_number, value); -} - -#endif /* MSPACES */ - - -/* -------------------- Alternative MORECORE functions ------------------- */ - -/* - Guidelines for creating a custom version of MORECORE: - - * For best performance, MORECORE should allocate in multiples of pagesize. - * MORECORE may allocate more memory than requested. (Or even less, - but this will usually result in a malloc failure.) - * MORECORE must not allocate memory when given argument zero, but - instead return one past the end address of memory from previous - nonzero call. - * For best performance, consecutive calls to MORECORE with positive - arguments should return increasing addresses, indicating that - space has been contiguously extended. - * Even though consecutive calls to MORECORE need not return contiguous - addresses, it must be OK for malloc'ed chunks to span multiple - regions in those cases where they do happen to be contiguous. - * MORECORE need not handle negative arguments -- it may instead - just return MFAIL when given negative arguments. - Negative arguments are always multiples of pagesize. MORECORE - must not misinterpret negative args as large positive unsigned - args. You can suppress all such calls from even occurring by defining - MORECORE_CANNOT_TRIM, - - As an example alternative MORECORE, here is a custom allocator - kindly contributed for pre-OSX macOS. It uses virtually but not - necessarily physically contiguous non-paged memory (locked in, - present and won't get swapped out). You can use it by uncommenting - this section, adding some #includes, and setting up the appropriate - defines above: - - #define MORECORE osMoreCore - - There is also a shutdown routine that should somehow be called for - cleanup upon program exit. - - #define MAX_POOL_ENTRIES 100 - #define MINIMUM_MORECORE_SIZE (64 * 1024U) - static int next_os_pool; - void *our_os_pools[MAX_POOL_ENTRIES]; - - void *osMoreCore(int size) - { - void *ptr = 0; - static void *sbrk_top = 0; - - if (size > 0) - { - if (size < MINIMUM_MORECORE_SIZE) - size = MINIMUM_MORECORE_SIZE; - if (CurrentExecutionLevel() == kTaskLevel) - ptr = PoolAllocateResident(size + RM_PAGE_SIZE, 0); - if (ptr == 0) - { - return (void *) MFAIL; - } - // save ptrs so they can be freed during cleanup - our_os_pools[next_os_pool] = ptr; - next_os_pool++; - ptr = (void *) ((((size_t) ptr) + RM_PAGE_MASK) & ~RM_PAGE_MASK); - sbrk_top = (char *) ptr + size; - return ptr; - } - else if (size < 0) - { - // we don't currently support shrink behavior - return (void *) MFAIL; - } - else - { - return sbrk_top; - } - } - - // cleanup any allocated memory pools - // called as last thing before shutting down driver - - void osCleanupMem(void) - { - void **ptr; - - for (ptr = our_os_pools; ptr < &our_os_pools[MAX_POOL_ENTRIES]; ptr++) - if (*ptr) - { - PoolDeallocate(*ptr); - *ptr = 0; - } - } - -*/ - - -/* ----------------------------------------------------------------------- -History: - v2.8.5 Sun May 22 10:26:02 2011 Doug Lea (dl at gee) - * Always perform unlink checks unless INSECURE - * Add posix_memalign. - * Improve realloc to expand in more cases; expose realloc_in_place. - Thanks to Peter Buhr for the suggestion. - * Add footprint_limit, inspect_all, bulk_free. Thanks - to Barry Hayes and others for the suggestions. - * Internal refactorings to avoid calls while holding locks - * Use non-reentrant locks by default. Thanks to Roland McGrath - for the suggestion. - * Small fixes to mspace_destroy, reset_on_error. - * Various configuration extensions/changes. Thanks - to all who contributed these. - - V2.8.4a Thu Apr 28 14:39:43 2011 (dl at gee.cs.oswego.edu) - * Update Creative Commons URL - - V2.8.4 Wed May 27 09:56:23 2009 Doug Lea (dl at gee) - * Use zeros instead of prev foot for is_mmapped - * Add mspace_track_large_chunks; thanks to Jean Brouwers - * Fix set_inuse in internal_realloc; thanks to Jean Brouwers - * Fix insufficient sys_alloc padding when using 16byte alignment - * Fix bad error check in mspace_footprint - * Adaptations for ptmalloc; thanks to Wolfram Gloger. - * Reentrant spin locks; thanks to Earl Chew and others - * Win32 improvements; thanks to Niall Douglas and Earl Chew - * Add NO_SEGMENT_TRAVERSAL and MAX_RELEASE_CHECK_RATE options - * Extension hook in malloc_state - * Various small adjustments to reduce warnings on some compilers - * Various configuration extensions/changes for more platforms. Thanks - to all who contributed these. - - V2.8.3 Thu Sep 22 11:16:32 2005 Doug Lea (dl at gee) - * Add max_footprint functions - * Ensure all appropriate literals are size_t - * Fix conditional compilation problem for some #define settings - * Avoid concatenating segments with the one provided - in create_mspace_with_base - * Rename some variables to avoid compiler shadowing warnings - * Use explicit lock initialization. - * Better handling of sbrk interference. - * Simplify and fix segment insertion, trimming and mspace_destroy - * Reinstate REALLOC_ZERO_BYTES_FREES option from 2.7.x - * Thanks especially to Dennis Flanagan for help on these. - - V2.8.2 Sun Jun 12 16:01:10 2005 Doug Lea (dl at gee) - * Fix memalign brace error. - - V2.8.1 Wed Jun 8 16:11:46 2005 Doug Lea (dl at gee) - * Fix improper #endif nesting in C++ - * Add explicit casts needed for C++ - - V2.8.0 Mon May 30 14:09:02 2005 Doug Lea (dl at gee) - * Use trees for large bins - * Support mspaces - * Use segments to unify sbrk-based and mmap-based system allocation, - removing need for emulation on most platforms without sbrk. - * Default safety checks - * Optional footer checks. Thanks to William Robertson for the idea. - * Internal code refactoring - * Incorporate suggestions and platform-specific changes. - Thanks to Dennis Flanagan, Colin Plumb, Niall Douglas, - Aaron Bachmann, Emery Berger, and others. - * Speed up non-fastbin processing enough to remove fastbins. - * Remove useless cfree() to avoid conflicts with other apps. - * Remove internal memcpy, memset. Compilers handle builtins better. - * Remove some options that no one ever used and rename others. - - V2.7.2 Sat Aug 17 09:07:30 2002 Doug Lea (dl at gee) - * Fix malloc_state bitmap array misdeclaration - - V2.7.1 Thu Jul 25 10:58:03 2002 Doug Lea (dl at gee) - * Allow tuning of FIRST_SORTED_BIN_SIZE - * Use PTR_UINT as type for all ptr->int casts. Thanks to John Belmonte. - * Better detection and support for non-contiguousness of MORECORE. - Thanks to Andreas Mueller, Conal Walsh, and Wolfram Gloger - * Bypass most of malloc if no frees. Thanks To Emery Berger. - * Fix freeing of old top non-contiguous chunk im sysmalloc. - * Raised default trim and map thresholds to 256K. - * Fix mmap-related #defines. Thanks to Lubos Lunak. - * Fix copy macros; added LACKS_FCNTL_H. Thanks to Neal Walfield. - * Branch-free bin calculation - * Default trim and mmap thresholds now 256K. - - V2.7.0 Sun Mar 11 14:14:06 2001 Doug Lea (dl at gee) - * Introduce independent_comalloc and independent_calloc. - Thanks to Michael Pachos for motivation and help. - * Make optional .h file available - * Allow > 2GB requests on 32bit systems. - * new WIN32 sbrk, mmap, munmap, lock code from . - Thanks also to Andreas Mueller , - and Anonymous. - * Allow override of MALLOC_ALIGNMENT (Thanks to Ruud Waij for - helping test this.) - * memalign: check alignment arg - * realloc: don't try to shift chunks backwards, since this - leads to more fragmentation in some programs and doesn't - seem to help in any others. - * Collect all cases in malloc requiring system memory into sysmalloc - * Use mmap as backup to sbrk - * Place all internal state in malloc_state - * Introduce fastbins (although similar to 2.5.1) - * Many minor tunings and cosmetic improvements - * Introduce USE_PUBLIC_MALLOC_WRAPPERS, USE_MALLOC_LOCK - * Introduce MALLOC_FAILURE_ACTION, MORECORE_CONTIGUOUS - Thanks to Tony E. Bennett and others. - * Include errno.h to support default failure action. - - V2.6.6 Sun Dec 5 07:42:19 1999 Doug Lea (dl at gee) - * return null for negative arguments - * Added Several WIN32 cleanups from Martin C. Fong - * Add 'LACKS_SYS_PARAM_H' for those systems without 'sys/param.h' - (e.g. WIN32 platforms) - * Cleanup header file inclusion for WIN32 platforms - * Cleanup code to avoid Microsoft Visual C++ compiler complaints - * Add 'USE_DL_PREFIX' to quickly allow co-existence with existing - memory allocation routines - * Set 'malloc_getpagesize' for WIN32 platforms (needs more work) - * Use 'assert' rather than 'ASSERT' in WIN32 code to conform to - usage of 'assert' in non-WIN32 code - * Improve WIN32 'sbrk()' emulation's 'findRegion()' routine to - avoid infinite loop - * Always call 'fREe()' rather than 'free()' - - V2.6.5 Wed Jun 17 15:57:31 1998 Doug Lea (dl at gee) - * Fixed ordering problem with boundary-stamping - - V2.6.3 Sun May 19 08:17:58 1996 Doug Lea (dl at gee) - * Added pvalloc, as recommended by H.J. Liu - * Added 64bit pointer support mainly from Wolfram Gloger - * Added anonymously donated WIN32 sbrk emulation - * Malloc, calloc, getpagesize: add optimizations from Raymond Nijssen - * malloc_extend_top: fix mask error that caused wastage after - foreign sbrks - * Add linux mremap support code from HJ Liu - - V2.6.2 Tue Dec 5 06:52:55 1995 Doug Lea (dl at gee) - * Integrated most documentation with the code. - * Add support for mmap, with help from - Wolfram Gloger (Gloger@lrz.uni-muenchen.de). - * Use last_remainder in more cases. - * Pack bins using idea from colin@nyx10.cs.du.edu - * Use ordered bins instead of best-fit threshhold - * Eliminate block-local decls to simplify tracing and debugging. - * Support another case of realloc via move into top - * Fix error occuring when initial sbrk_base not word-aligned. - * Rely on page size for units instead of SBRK_UNIT to - avoid surprises about sbrk alignment conventions. - * Add mallinfo, mallopt. Thanks to Raymond Nijssen - (raymond@es.ele.tue.nl) for the suggestion. - * Add `pad' argument to malloc_trim and top_pad mallopt parameter. - * More precautions for cases where other routines call sbrk, - courtesy of Wolfram Gloger (Gloger@lrz.uni-muenchen.de). - * Added macros etc., allowing use in linux libc from - H.J. Lu (hjl@gnu.ai.mit.edu) - * Inverted this history list - - V2.6.1 Sat Dec 2 14:10:57 1995 Doug Lea (dl at gee) - * Re-tuned and fixed to behave more nicely with V2.6.0 changes. - * Removed all preallocation code since under current scheme - the work required to undo bad preallocations exceeds - the work saved in good cases for most test programs. - * No longer use return list or unconsolidated bins since - no scheme using them consistently outperforms those that don't - given above changes. - * Use best fit for very large chunks to prevent some worst-cases. - * Added some support for debugging - - V2.6.0 Sat Nov 4 07:05:23 1995 Doug Lea (dl at gee) - * Removed footers when chunks are in use. Thanks to - Paul Wilson (wilson@cs.texas.edu) for the suggestion. - - V2.5.4 Wed Nov 1 07:54:51 1995 Doug Lea (dl at gee) - * Added malloc_trim, with help from Wolfram Gloger - (wmglo@Dent.MED.Uni-Muenchen.DE). - - V2.5.3 Tue Apr 26 10:16:01 1994 Doug Lea (dl at g) - - V2.5.2 Tue Apr 5 16:20:40 1994 Doug Lea (dl at g) - * realloc: try to expand in both directions - * malloc: swap order of clean-bin strategy; - * realloc: only conditionally expand backwards - * Try not to scavenge used bins - * Use bin counts as a guide to preallocation - * Occasionally bin return list chunks in first scan - * Add a few optimizations from colin@nyx10.cs.du.edu - - V2.5.1 Sat Aug 14 15:40:43 1993 Doug Lea (dl at g) - * faster bin computation & slightly different binning - * merged all consolidations to one part of malloc proper - (eliminating old malloc_find_space & malloc_clean_bin) - * Scan 2 returns chunks (not just 1) - * Propagate failure in realloc if malloc returns 0 - * Add stuff to allow compilation on non-ANSI compilers - from kpv@research.att.com - - V2.5 Sat Aug 7 07:41:59 1993 Doug Lea (dl at g.oswego.edu) - * removed potential for odd address access in prev_chunk - * removed dependency on getpagesize.h - * misc cosmetics and a bit more internal documentation - * anticosmetics: mangled names in macros to evade debugger strangeness - * tested on sparc, hp-700, dec-mips, rs6000 - with gcc & native cc (hp, dec only) allowing - Detlefs & Zorn comparison study (in SIGPLAN Notices.) - - Trial version Fri Aug 28 13:14:29 1992 Doug Lea (dl at g.oswego.edu) - * Based loosely on libg++-1.2X malloc. (It retains some of the overall - structure of old version, but most details differ.) - -*/ -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -/* TODO: TEST ME */ -int main( void ) -{ - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/_dlmalloc/dlmalloc.h b/waterbox/libc/functions/_dlmalloc/dlmalloc.h deleted file mode 100644 index e11bf4b3ab..0000000000 --- a/waterbox/libc/functions/_dlmalloc/dlmalloc.h +++ /dev/null @@ -1,50 +0,0 @@ -#include "_PDCLIB_glue.h" -#include - - -#undef WIN32 -#undef _WIN32 -#define DLMALLOC_EXPORT _PDCLIB_API -#define MALLOC_ALIGNMENT _PDCLIB_MALLOC_ALIGN -#define MSPACES 0 -#define USE_LOCKS 0 -#define USE_SPIN_LOCKS 0 -#define USE_RECURSIVE_LOCKS 0 -#undef NEED_GLOBAL_LOCK_INIT -#define FOOTERS 0 -#undef USE_DL_PREFIX -#define MALLOC_INSPECT_ALL 0 -#define ABORT abort() -#define PROCEED_ON_ERROR 0 -#define DEBUG 0 -#define ABORT_ON_ASSERT_FAILURE 1 -#define MALLOC_FAILURE_ACTION errno = ENOMEM -#define HAVE_MORECORE 1 -#define MORECORE _PDCLIB_sbrk -#define MORECORE_CONTIGUOUS 1 -#define MORECORE_CANNOT_TRIM 1 -#define NO_SEGMENT_TRAVERSAL 0 -#define HAVE_MMAP 0 -#define HAVE_MREMAP 0 -#define USE_BUILTIN_FFS 0 -#define malloc_getpagesize _PDCLIB_MALLOC_PAGESIZE -#define USE_DEV_RANDOM 0 -#define NO_MALLINFO 1 -#define MALLINFO_FIELD_TYPE size_t -#define NO_MALLOC_STATS 1 -#define DEFAULT_GRANULARITY _PDCLIB_MALLOC_GRANULARITY -#define DEFAULT_TRIM_THRESHOLD _PDCLIB_MALLOC_TRIM_THRESHOLD -#define DEFAULT_MMAP_THREHOLD _PDCLIB_MALLOC_MMAP_THRESHOLD -#define MAX_RELEASE_CHECK_RATE _PDCLIB_MALLOC_RELEASE_CHECK_RATE - -/* C standard says this is so */ -#define REALLOC_ZERO_BYTES_FREES 1 -#define LACKS_UNISTD_H -#define LACKS_FCNTL_H -#define LACKS_SYS_PARAM_H -#define LACKS_SYS_MMAN_H -#define LACKS_STRINGS_H -#define LACKS_SYS_TYPES_H -#define LACKS_SCHED_H -#include -#include diff --git a/waterbox/libc/functions/ctype/isalnum.c b/waterbox/libc/functions/ctype/isalnum.c deleted file mode 100644 index b081e9bfb8..0000000000 --- a/waterbox/libc/functions/ctype/isalnum.c +++ /dev/null @@ -1,36 +0,0 @@ -/* isalnum( int ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST -#include "_PDCLIB_locale.h" - -int isalnum( int c ) -{ - return ( _PDCLIB_threadlocale()->_CType[c].flags & ( _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_DIGIT ) ); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE( isalnum( 'a' ) ); - TESTCASE( isalnum( 'z' ) ); - TESTCASE( isalnum( 'A' ) ); - TESTCASE( isalnum( 'Z' ) ); - TESTCASE( isalnum( '0' ) ); - TESTCASE( isalnum( '9' ) ); - TESTCASE( ! isalnum( ' ' ) ); - TESTCASE( ! isalnum( '\n' ) ); - TESTCASE( ! isalnum( '@' ) ); - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/ctype/isalpha.c b/waterbox/libc/functions/ctype/isalpha.c deleted file mode 100644 index ce05b76d87..0000000000 --- a/waterbox/libc/functions/ctype/isalpha.c +++ /dev/null @@ -1,32 +0,0 @@ -/* isalpha( int ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST -#include "_PDCLIB_locale.h" - -int isalpha( int c ) -{ - return ( _PDCLIB_threadlocale()->_CType[c].flags & _PDCLIB_CTYPE_ALPHA ); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE( isalpha( 'a' ) ); - TESTCASE( isalpha( 'z' ) ); - TESTCASE( ! isalpha( ' ' ) ); - TESTCASE( ! isalpha( '1' ) ); - TESTCASE( ! isalpha( '@' ) ); - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/ctype/isascii.c b/waterbox/libc/functions/ctype/isascii.c deleted file mode 100644 index 2cdfa30d95..0000000000 --- a/waterbox/libc/functions/ctype/isascii.c +++ /dev/null @@ -1,6 +0,0 @@ -#include - -int isascii(int c) -{ - return (unsigned)c < 128; -} diff --git a/waterbox/libc/functions/ctype/isblank.c b/waterbox/libc/functions/ctype/isblank.c deleted file mode 100644 index 50d5663c18..0000000000 --- a/waterbox/libc/functions/ctype/isblank.c +++ /dev/null @@ -1,33 +0,0 @@ -/* isblank( int ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST -#include "_PDCLIB_locale.h" - -int isblank( int c ) -{ - return ( _PDCLIB_threadlocale()->_CType[c].flags & _PDCLIB_CTYPE_BLANK ); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE( isblank( ' ' ) ); - TESTCASE( isblank( '\t' ) ); - TESTCASE( ! isblank( '\v' ) ); - TESTCASE( ! isblank( '\r' ) ); - TESTCASE( ! isblank( 'x' ) ); - TESTCASE( ! isblank( '@' ) ); - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/ctype/iscntrl.c b/waterbox/libc/functions/ctype/iscntrl.c deleted file mode 100644 index 4542b6ff31..0000000000 --- a/waterbox/libc/functions/ctype/iscntrl.c +++ /dev/null @@ -1,31 +0,0 @@ -/* iscntrl( int ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST -#include "_PDCLIB_locale.h" - -int iscntrl( int c ) -{ - return ( _PDCLIB_threadlocale()->_CType[c].flags & _PDCLIB_CTYPE_CNTRL ); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE( iscntrl( '\a' ) ); - TESTCASE( iscntrl( '\b' ) ); - TESTCASE( iscntrl( '\n' ) ); - TESTCASE( ! iscntrl( ' ' ) ); - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/ctype/isdigit.c b/waterbox/libc/functions/ctype/isdigit.c deleted file mode 100644 index 00790677e8..0000000000 --- a/waterbox/libc/functions/ctype/isdigit.c +++ /dev/null @@ -1,32 +0,0 @@ -/* isdigit( int ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST -#include "_PDCLIB_locale.h" - -int isdigit( int c ) -{ - return ( _PDCLIB_threadlocale()->_CType[c].flags & _PDCLIB_CTYPE_DIGIT ); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE( isdigit( '0' ) ); - TESTCASE( isdigit( '9' ) ); - TESTCASE( ! isdigit( ' ' ) ); - TESTCASE( ! isdigit( 'a' ) ); - TESTCASE( ! isdigit( '@' ) ); - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/ctype/isgraph.c b/waterbox/libc/functions/ctype/isgraph.c deleted file mode 100644 index 1dac215545..0000000000 --- a/waterbox/libc/functions/ctype/isgraph.c +++ /dev/null @@ -1,35 +0,0 @@ -/* isgraph( int ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST -#include "_PDCLIB_locale.h" - -int isgraph( int c ) -{ - return ( _PDCLIB_threadlocale()->_CType[c].flags & _PDCLIB_CTYPE_GRAPH ); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE( isgraph( 'a' ) ); - TESTCASE( isgraph( 'z' ) ); - TESTCASE( isgraph( 'A' ) ); - TESTCASE( isgraph( 'Z' ) ); - TESTCASE( isgraph( '@' ) ); - TESTCASE( ! isgraph( '\t' ) ); - TESTCASE( ! isgraph( '\0' ) ); - TESTCASE( ! isgraph( ' ' ) ); - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/ctype/islower.c b/waterbox/libc/functions/ctype/islower.c deleted file mode 100644 index 435b3a993a..0000000000 --- a/waterbox/libc/functions/ctype/islower.c +++ /dev/null @@ -1,33 +0,0 @@ -/* islower( int ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST -#include "_PDCLIB_locale.h" - -int islower( int c ) -{ - return ( _PDCLIB_threadlocale()->_CType[c].flags & _PDCLIB_CTYPE_LOWER ); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE( islower( 'a' ) ); - TESTCASE( islower( 'z' ) ); - TESTCASE( ! islower( 'A' ) ); - TESTCASE( ! islower( 'Z' ) ); - TESTCASE( ! islower( ' ' ) ); - TESTCASE( ! islower( '@' ) ); - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/ctype/isprint.c b/waterbox/libc/functions/ctype/isprint.c deleted file mode 100644 index ca5733afbd..0000000000 --- a/waterbox/libc/functions/ctype/isprint.c +++ /dev/null @@ -1,35 +0,0 @@ -/* isprint( int ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST -#include "_PDCLIB_locale.h" - -int isprint( int c ) -{ - return ( _PDCLIB_threadlocale()->_CType[c].flags & _PDCLIB_CTYPE_GRAPH ) || ( c == ' ' ); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE( isprint( 'a' ) ); - TESTCASE( isprint( 'z' ) ); - TESTCASE( isprint( 'A' ) ); - TESTCASE( isprint( 'Z' ) ); - TESTCASE( isprint( '@' ) ); - TESTCASE( ! isprint( '\t' ) ); - TESTCASE( ! isprint( '\0' ) ); - TESTCASE( isprint( ' ' ) ); - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/ctype/ispunct.c b/waterbox/libc/functions/ctype/ispunct.c deleted file mode 100644 index 0fe668c373..0000000000 --- a/waterbox/libc/functions/ctype/ispunct.c +++ /dev/null @@ -1,36 +0,0 @@ -/* ispunct( int ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST -#include "_PDCLIB_locale.h" - -int ispunct( int c ) -{ - return ( _PDCLIB_threadlocale()->_CType[c].flags & _PDCLIB_CTYPE_PUNCT ); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE( ! ispunct( 'a' ) ); - TESTCASE( ! ispunct( 'z' ) ); - TESTCASE( ! ispunct( 'A' ) ); - TESTCASE( ! ispunct( 'Z' ) ); - TESTCASE( ispunct( '@' ) ); - TESTCASE( ispunct( '.' ) ); - TESTCASE( ! ispunct( '\t' ) ); - TESTCASE( ! ispunct( '\0' ) ); - TESTCASE( ! ispunct( ' ' ) ); - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/ctype/isspace.c b/waterbox/libc/functions/ctype/isspace.c deleted file mode 100644 index c40e89bdad..0000000000 --- a/waterbox/libc/functions/ctype/isspace.c +++ /dev/null @@ -1,34 +0,0 @@ -/* isspace( int ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST -#include "_PDCLIB_locale.h" - -int isspace( int c ) -{ - return ( _PDCLIB_threadlocale()->_CType[c].flags & _PDCLIB_CTYPE_SPACE ); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE( isspace( ' ' ) ); - TESTCASE( isspace( '\f' ) ); - TESTCASE( isspace( '\n' ) ); - TESTCASE( isspace( '\r' ) ); - TESTCASE( isspace( '\t' ) ); - TESTCASE( isspace( '\v' ) ); - TESTCASE( ! isspace( 'a' ) ); - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/ctype/isupper.c b/waterbox/libc/functions/ctype/isupper.c deleted file mode 100644 index 7201004d69..0000000000 --- a/waterbox/libc/functions/ctype/isupper.c +++ /dev/null @@ -1,33 +0,0 @@ -/* isupper( int ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST -#include "_PDCLIB_locale.h" - -int isupper( int c ) -{ - return ( _PDCLIB_threadlocale()->_CType[c].flags & _PDCLIB_CTYPE_UPPER ); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE( isupper( 'A' ) ); - TESTCASE( isupper( 'Z' ) ); - TESTCASE( ! isupper( 'a' ) ); - TESTCASE( ! isupper( 'z' ) ); - TESTCASE( ! isupper( ' ' ) ); - TESTCASE( ! isupper( '@' ) ); - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/ctype/isxdigit.c b/waterbox/libc/functions/ctype/isxdigit.c deleted file mode 100644 index 2b694d8eb7..0000000000 --- a/waterbox/libc/functions/ctype/isxdigit.c +++ /dev/null @@ -1,37 +0,0 @@ -/* isxdigit( int ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST -#include "_PDCLIB_locale.h" - -int isxdigit( int c ) -{ - return ( _PDCLIB_threadlocale()->_CType[c].flags & _PDCLIB_CTYPE_XDIGT ); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE( isxdigit( '0' ) ); - TESTCASE( isxdigit( '9' ) ); - TESTCASE( isxdigit( 'a' ) ); - TESTCASE( isxdigit( 'f' ) ); - TESTCASE( ! isxdigit( 'g' ) ); - TESTCASE( isxdigit( 'A' ) ); - TESTCASE( isxdigit( 'F' ) ); - TESTCASE( ! isxdigit( 'G' ) ); - TESTCASE( ! isxdigit( '@' ) ); - TESTCASE( ! isxdigit( ' ' ) ); - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/ctype/tolower.c b/waterbox/libc/functions/ctype/tolower.c deleted file mode 100644 index 779afb7290..0000000000 --- a/waterbox/libc/functions/ctype/tolower.c +++ /dev/null @@ -1,32 +0,0 @@ -/* tolower( int ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST -#include "_PDCLIB_locale.h" - -int tolower( int c ) -{ - return _PDCLIB_threadlocale()->_CType[c].lower; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE( tolower( 'A' ) == 'a' ); - TESTCASE( tolower( 'Z' ) == 'z' ); - TESTCASE( tolower( 'a' ) == 'a' ); - TESTCASE( tolower( 'z' ) == 'z' ); - TESTCASE( tolower( '@' ) == '@' ); - TESTCASE( tolower( '[' ) == '[' ); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/ctype/toupper.c b/waterbox/libc/functions/ctype/toupper.c deleted file mode 100644 index 16b981abf4..0000000000 --- a/waterbox/libc/functions/ctype/toupper.c +++ /dev/null @@ -1,32 +0,0 @@ -/* toupper( int ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST -#include "_PDCLIB_locale.h" - -int toupper( int c ) -{ - return _PDCLIB_threadlocale()->_CType[c].upper; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE( toupper( 'a' ) == 'A' ); - TESTCASE( toupper( 'z' ) == 'Z' ); - TESTCASE( toupper( 'A' ) == 'A' ); - TESTCASE( toupper( 'Z' ) == 'Z' ); - TESTCASE( toupper( '@' ) == '@' ); - TESTCASE( toupper( '[' ) == '[' ); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/errno/errno.c b/waterbox/libc/functions/errno/errno.c deleted file mode 100644 index 75a564fbfd..0000000000 --- a/waterbox/libc/functions/errno/errno.c +++ /dev/null @@ -1,37 +0,0 @@ -/* _PDCLIB_errno - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#ifndef REGTEST -#include - -/* Temporary */ - -static int _PDCLIB_errno = 0; - -int * _PDCLIB_errno_func() -{ - return &_PDCLIB_errno; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - errno = 0; - TESTCASE( errno == 0 ); - errno = EDOM; - TESTCASE( errno == EDOM ); - errno = ERANGE; - TESTCASE( errno == ERANGE ); - return TEST_RESULTS; -} - -#endif - diff --git a/waterbox/libc/functions/inttypes/imaxabs.c b/waterbox/libc/functions/inttypes/imaxabs.c deleted file mode 100644 index 79f3dd2ab8..0000000000 --- a/waterbox/libc/functions/inttypes/imaxabs.c +++ /dev/null @@ -1,30 +0,0 @@ -/* imaxabs( intmax_t ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -intmax_t imaxabs( intmax_t j ) -{ - return ( j >= 0 ) ? j : -j; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" -#include - -int main( void ) -{ - TESTCASE( imaxabs( (intmax_t)0 ) == 0 ); - TESTCASE( imaxabs( INTMAX_MAX ) == INTMAX_MAX ); - TESTCASE( imaxabs( INTMAX_MIN + 1 ) == -( INTMAX_MIN + 1 ) ); - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/inttypes/imaxdiv.c b/waterbox/libc/functions/inttypes/imaxdiv.c deleted file mode 100644 index 553f22e7fa..0000000000 --- a/waterbox/libc/functions/inttypes/imaxdiv.c +++ /dev/null @@ -1,38 +0,0 @@ -/* lldiv( long long int, long long int ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -imaxdiv_t imaxdiv( intmax_t numer, intmax_t denom ) -{ - imaxdiv_t rc; - rc.quot = numer / denom; - rc.rem = numer % denom; - return rc; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - imaxdiv_t result; - result = imaxdiv( (intmax_t)5, (intmax_t)2 ); - TESTCASE( result.quot == 2 && result.rem == 1 ); - result = imaxdiv( (intmax_t)-5, (intmax_t)2 ); - TESTCASE( result.quot == -2 && result.rem == -1 ); - result = imaxdiv( (intmax_t)5, (intmax_t)-2 ); - TESTCASE( result.quot == -2 && result.rem == 1 ); - TESTCASE( sizeof( result.quot ) == sizeof( intmax_t ) ); - TESTCASE( sizeof( result.rem ) == sizeof( intmax_t ) ); - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/inttypes/strtoimax.c b/waterbox/libc/functions/inttypes/strtoimax.c deleted file mode 100644 index f58a0be9f0..0000000000 --- a/waterbox/libc/functions/inttypes/strtoimax.c +++ /dev/null @@ -1,146 +0,0 @@ -/* strtoimax( const char *, char * *, int ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#include - -#ifndef REGTEST - -#include - -intmax_t strtoimax( const char * _PDCLIB_restrict nptr, char ** _PDCLIB_restrict endptr, int base ) -{ - intmax_t rc; - char sign = '+'; - const char * p = _PDCLIB_strtox_prelim( nptr, &sign, &base ); - if ( base < 2 || base > 36 ) return 0; - if ( sign == '+' ) - { - rc = (intmax_t)_PDCLIB_strtox_main( &p, (unsigned)base, (uintmax_t)INTMAX_MAX, (uintmax_t)( INTMAX_MAX / base ), (int)( INTMAX_MAX % base ), &sign ); - } - else - { - rc = (intmax_t)_PDCLIB_strtox_main( &p, (unsigned)base, (uintmax_t)INTMAX_MIN, (uintmax_t)( INTMAX_MIN / -base ), (int)( -( INTMAX_MIN % base ) ), &sign ); - } - if ( endptr != NULL ) *endptr = ( p != NULL ) ? (char *) p : (char *) nptr; - return ( sign == '+' ) ? rc : -rc; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -#include - -int main( void ) -{ - char * endptr; - /* this, to base 36, overflows even a 256 bit integer */ - char overflow[] = "-ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ_"; - /* tricky border case */ - char tricky[] = "+0xz"; - errno = 0; - /* basic functionality */ - TESTCASE( strtoimax( "123", NULL, 10 ) == 123 ); - /* proper detecting of default base 10 */ - TESTCASE( strtoimax( "456", NULL, 0 ) == 456 ); - /* proper functioning to smaller base */ - TESTCASE( strtoimax( "14", NULL, 8 ) == 12 ); - /* proper autodetecting of octal */ - TESTCASE( strtoimax( "016", NULL, 0 ) == 14 ); - /* proper autodetecting of hexadecimal, lowercase 'x' */ - TESTCASE( strtoimax( "0xFF", NULL, 0 ) == 255 ); - /* proper autodetecting of hexadecimal, uppercase 'X' */ - TESTCASE( strtoimax( "0Xa1", NULL, 0 ) == 161 ); - /* proper handling of border case: 0x followed by non-hexdigit */ - TESTCASE( strtoimax( tricky, &endptr, 0 ) == 0 ); - TESTCASE( endptr == tricky + 2 ); - /* proper handling of border case: 0 followed by non-octdigit */ - TESTCASE( strtoimax( tricky, &endptr, 8 ) == 0 ); - TESTCASE( endptr == tricky + 2 ); - /* errno should still be 0 */ - TESTCASE( errno == 0 ); - /* overflowing subject sequence must still return proper endptr */ - TESTCASE( strtoimax( overflow, &endptr, 36 ) == INTMAX_MIN ); - TESTCASE( errno == ERANGE ); - TESTCASE( ( endptr - overflow ) == 53 ); - /* same for positive */ - errno = 0; - TESTCASE( strtoimax( overflow + 1, &endptr, 36 ) == INTMAX_MAX ); - TESTCASE( errno == ERANGE ); - TESTCASE( ( endptr - overflow ) == 53 ); - /* testing skipping of leading whitespace */ - TESTCASE( strtoimax( " \n\v\t\f789", NULL, 0 ) == 789 ); - /* testing conversion failure */ - TESTCASE( strtoimax( overflow, &endptr, 10 ) == 0 ); - TESTCASE( endptr == overflow ); - endptr = NULL; - TESTCASE( strtoimax( overflow, &endptr, 0 ) == 0 ); - TESTCASE( endptr == overflow ); - /* These tests assume two-complement, but conversion should work for */ - /* one-complement and signed magnitude just as well. Anyone having a */ - /* platform to test this on? */ - errno = 0; -#if INTMAX_MAX >> 62 == 1 - /* testing "odd" overflow, i.e. base is not a power of two */ - TESTCASE( strtoimax( "9223372036854775807", NULL, 0 ) == INTMAX_MAX ); - TESTCASE( errno == 0 ); - TESTCASE( strtoimax( "9223372036854775808", NULL, 0 ) == INTMAX_MAX ); - TESTCASE( errno == ERANGE ); - errno = 0; - TESTCASE( strtoimax( "-9223372036854775807", NULL, 0 ) == (INTMAX_MIN + 1) ); - TESTCASE( errno == 0 ); - TESTCASE( strtoimax( "-9223372036854775808", NULL, 0 ) == INTMAX_MIN ); - TESTCASE( errno == 0 ); - TESTCASE( strtoimax( "-9223372036854775809", NULL, 0 ) == INTMAX_MIN ); - TESTCASE( errno == ERANGE ); - /* testing "even" overflow, i.e. base is power of two */ - errno = 0; - TESTCASE( strtoimax( "0x7fffffffffffffff", NULL, 0 ) == INTMAX_MAX ); - TESTCASE( errno == 0 ); - TESTCASE( strtoimax( "0x8000000000000000", NULL, 0 ) == INTMAX_MAX ); - TESTCASE( errno == ERANGE ); - errno = 0; - TESTCASE( strtoimax( "-0x7fffffffffffffff", NULL, 0 ) == (INTMAX_MIN + 1) ); - TESTCASE( errno == 0 ); - TESTCASE( strtoimax( "-0x8000000000000000", NULL, 0 ) == INTMAX_MIN ); - TESTCASE( errno == 0 ); - TESTCASE( strtoimax( "-0x8000000000000001", NULL, 0 ) == INTMAX_MIN ); - TESTCASE( errno == ERANGE ); -#elif LLONG_MAX >> 126 == 1 - /* testing "odd" overflow, i.e. base is not a power of two */ - TESTCASE( strtoimax( "170141183460469231731687303715884105728", NULL, 0 ) == INTMAX_MAX ); - TESTCASE( errno == 0 ); - TESTCASE( strtoimax( "170141183460469231731687303715884105729", NULL, 0 ) == INTMAX_MAX ); - TESTCASE( errno == ERANGE ); - errno = 0; - TESTCASE( strtoimax( "-170141183460469231731687303715884105728", NULL, 0 ) == (INTMAX_MIN + 1) ); - TESTCASE( errno == 0 ); - TESTCASE( strtoimax( "-170141183460469231731687303715884105729", NULL, 0 ) == INTMAX_MIN ); - TESTCASE( errno == 0 ); - TESTCASE( strtoimax( "-170141183460469231731687303715884105730", NULL, 0 ) == INTMAX_MIN ); - TESTCASE( errno == ERANGE ); - /* testing "even" overflow, i.e. base is power of two */ - errno = 0; - TESTCASE( strtoimax( "0x7fffffffffffffffffffffffffffffff", NULL, 0 ) == INTMAX_MAX ); - TESTCASE( errno == 0 ); - TESTCASE( strtoimax( "0x80000000000000000000000000000000", NULL, 0 ) == INTMAX_MAX ); - TESTCASE( errno == ERANGE ); - errno = 0; - TESTCASE( strtoimax( "-0x7fffffffffffffffffffffffffffffff", NULL, 0 ) == (INTMAX_MIN + 1) ); - TESTCASE( errno == 0 ); - TESTCASE( strtoimax( "-0x80000000000000000000000000000000", NULL, 0 ) == INTMAX_MIN ); - TESTCASE( errno == 0 ); - TESTCASE( strtoimax( "-0x80000000000000000000000000000001", NULL, 0 ) == INTMAX_MIN ); - TESTCASE( errno == ERANGE ); -#else -#error Unsupported width of 'intmax_t' (neither 64 nor 128 bit). -#endif - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/inttypes/strtoumax.c b/waterbox/libc/functions/inttypes/strtoumax.c deleted file mode 100644 index f998338bab..0000000000 --- a/waterbox/libc/functions/inttypes/strtoumax.c +++ /dev/null @@ -1,109 +0,0 @@ -/* strtoumax( const char *, char * *, int ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#include - -#ifndef REGTEST - -#include - -uintmax_t strtoumax( const char * _PDCLIB_restrict nptr, char ** _PDCLIB_restrict endptr, int base ) -{ - uintmax_t rc; - char sign = '+'; - const char * p = _PDCLIB_strtox_prelim( nptr, &sign, &base ); - if ( base < 2 || base > 36 ) return 0; - rc = _PDCLIB_strtox_main( &p, (unsigned)base, (uintmax_t)UINTMAX_MAX, (uintmax_t)( UINTMAX_MAX / base ), (int)( UINTMAX_MAX % base ), &sign ); - if ( endptr != NULL ) *endptr = ( p != NULL ) ? (char *) p : (char *) nptr; - return ( sign == '+' ) ? rc : -rc; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" -#include - -int main( void ) -{ - char * endptr; - /* this, to base 36, overflows even a 256 bit integer */ - char overflow[] = "-ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ_"; - /* tricky border case */ - char tricky[] = "+0xz"; - errno = 0; - /* basic functionality */ - TESTCASE( strtoumax( "123", NULL, 10 ) == 123 ); - /* proper detecting of default base 10 */ - TESTCASE( strtoumax( "456", NULL, 0 ) == 456 ); - /* proper functioning to smaller base */ - TESTCASE( strtoumax( "14", NULL, 8 ) == 12 ); - /* proper autodetecting of octal */ - TESTCASE( strtoumax( "016", NULL, 0 ) == 14 ); - /* proper autodetecting of hexadecimal, lowercase 'x' */ - TESTCASE( strtoumax( "0xFF", NULL, 0 ) == 255 ); - /* proper autodetecting of hexadecimal, uppercase 'X' */ - TESTCASE( strtoumax( "0Xa1", NULL, 0 ) == 161 ); - /* proper handling of border case: 0x followed by non-hexdigit */ - TESTCASE( strtoumax( tricky, &endptr, 0 ) == 0 ); - TESTCASE( endptr == tricky + 2 ); - /* proper handling of border case: 0 followed by non-octdigit */ - TESTCASE( strtoumax( tricky, &endptr, 8 ) == 0 ); - TESTCASE( endptr == tricky + 2 ); - /* errno should still be 0 */ - TESTCASE( errno == 0 ); - /* overflowing subject sequence must still return proper endptr */ - TESTCASE( strtoumax( overflow, &endptr, 36 ) == UINTMAX_MAX ); - TESTCASE( errno == ERANGE ); - TESTCASE( ( endptr - overflow ) == 53 ); - /* same for positive */ - errno = 0; - TESTCASE( strtoumax( overflow + 1, &endptr, 36 ) == UINTMAX_MAX ); - TESTCASE( errno == ERANGE ); - TESTCASE( ( endptr - overflow ) == 53 ); - /* testing skipping of leading whitespace */ - TESTCASE( strtoumax( " \n\v\t\f789", NULL, 0 ) == 789 ); - /* testing conversion failure */ - TESTCASE( strtoumax( overflow, &endptr, 10 ) == 0 ); - TESTCASE( endptr == overflow ); - endptr = NULL; - TESTCASE( strtoumax( overflow, &endptr, 0 ) == 0 ); - TESTCASE( endptr == overflow ); - errno = 0; -/* uintmax_t -> long long -> 64 bit */ -#if UINTMAX_MAX >> 63 == 1 - /* testing "odd" overflow, i.e. base is not power of two */ - TESTCASE( strtoumax( "18446744073709551615", NULL, 0 ) == UINTMAX_MAX ); - TESTCASE( errno == 0 ); - TESTCASE( strtoumax( "18446744073709551616", NULL, 0 ) == UINTMAX_MAX ); - TESTCASE( errno == ERANGE ); - /* testing "even" overflow, i.e. base is power of two */ - errno = 0; - TESTCASE( strtoumax( "0xFFFFFFFFFFFFFFFF", NULL, 0 ) == UINTMAX_MAX ); - TESTCASE( errno == 0 ); - TESTCASE( strtoumax( "0x10000000000000000", NULL, 0 ) == UINTMAX_MAX ); - TESTCASE( errno == ERANGE ); -/* uintmax_t -> long long -> 128 bit */ -#elif UINTMAX_MAX >> 127 == 1 - /* testing "odd" overflow, i.e. base is not power of two */ - TESTCASE( strtoumax( "340282366920938463463374607431768211455", NULL, 0 ) == UINTMAX_MAX ); - TESTCASE( errno == 0 ); - TESTCASE( strtoumax( "340282366920938463463374607431768211456", NULL, 0 ) == UINTMAX_MAX ); - TESTCASE( errno == ERANGE ); - /* testing "even" everflow, i.e. base is power of two */ - errno = 0; - TESTCASE( strtoumax( "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", NULL, 0 ) == UINTMAX_MAX ); - TESTCASE( errno == 0 ); - TESTCASE( strtoumax( "0x100000000000000000000000000000000", NULL, 0 ) == UINTMAX_MAX ); - TESTCASE( errno == ERANGE ); -#else -#error Unsupported width of 'uintmax_t' (neither 64 nor 128 bit). -#endif - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/locale/UnicodeData.py b/waterbox/libc/functions/locale/UnicodeData.py deleted file mode 100644 index e0f87e58c1..0000000000 --- a/waterbox/libc/functions/locale/UnicodeData.py +++ /dev/null @@ -1,194 +0,0 @@ -#!/usr/bin/python -# -*- coding: ascii -*- -# Unicode Data Converter -# -# This file is part of the Public Domain C Library (PDCLib). -# Permission is granted to use, modify, and / or redistribute at will. -""" -Converts the character information provdied by Unicode in the UnicodeData.txt -file from the Unicode character database into a table for use by PDCLib. - -Usage: Download the UnicodeData.txt file to the same directory as this script -and then run it. Both Python 2 and 3 are supported. - -Download the data from - ftp://ftp.unicode.org/Public/UNIDATA/UnicodeData.txt - -We do some simple "run" compression, because characters in the Unicode Data file -tend to come in groups with the same properties. -""" -import os - -# MUST BE KEPT SYNCHRONIZED WITH _PDCLIB_locale.h -BIT_ALPHA = 1 -BIT_BLANK = 2 -BIT_CNTRL = 4 -BIT_GRAPH = 8 -BIT_PUNCT = 16 -BIT_SPACE = 32 -BIT_LOWER = 64 -BIT_UPPER = 128 -BIT_DIGIT = 256 -BIT_XDIGT = 512 - -# Category to bitfield mapping -categories = { - 'Lu': BIT_ALPHA | BIT_GRAPH | BIT_UPPER, # Uppercase - 'Ll': BIT_ALPHA | BIT_GRAPH | BIT_LOWER, # Lowercase - 'Lt': BIT_ALPHA | BIT_GRAPH | BIT_UPPER, # Title case. Upper? - 'Lm': BIT_ALPHA | BIT_GRAPH, # Modifier. Case? - 'Lo': BIT_ALPHA | BIT_GRAPH, # "Other" letter (e.g. Ideograph) - 'Nd': BIT_DIGIT | BIT_GRAPH, # Decimal digit - 'Nl': BIT_GRAPH, # Letter-like numeric character - 'No': BIT_GRAPH, # Other numeric - 'Pc': BIT_PUNCT | BIT_GRAPH, # Connecting punctuation - 'Pd': BIT_PUNCT | BIT_GRAPH, # Dash punctuation - 'Ps': BIT_PUNCT | BIT_GRAPH, # Opening punctuation - 'Pe': BIT_PUNCT | BIT_GRAPH, # Closing punctuation - 'Pi': BIT_PUNCT | BIT_GRAPH, # Opening quote - 'Pf': BIT_PUNCT | BIT_GRAPH, # Closing quote - 'Po': BIT_PUNCT | BIT_GRAPH, # Other punctuation - 'Sm': BIT_GRAPH, # Mathematical symbol - 'Sc': BIT_GRAPH, # Currency symbol - 'Sk': BIT_GRAPH, # Non-letterlike modifier symbol - 'So': BIT_GRAPH, # Other symbol - 'Zs': BIT_SPACE, # Non-zero-width space character - 'Zl': BIT_SPACE, # Line separator - 'Zp': BIT_SPACE, # Paragraph separator - 'Cc': BIT_CNTRL, # C0/C1 control codes -} - -# Characters with special properties -special = { - # Blank characters - 0x0020: BIT_SPACE | BIT_BLANK, # space - 0x0009: BIT_SPACE | BIT_BLANK, # tab - - # Digits - 0x0030: BIT_XDIGT | BIT_DIGIT | BIT_GRAPH, - 0x0031: BIT_XDIGT | BIT_DIGIT | BIT_GRAPH, - 0x0032: BIT_XDIGT | BIT_DIGIT | BIT_GRAPH, - 0x0033: BIT_XDIGT | BIT_DIGIT | BIT_GRAPH, - 0x0034: BIT_XDIGT | BIT_DIGIT | BIT_GRAPH, - 0x0035: BIT_XDIGT | BIT_DIGIT | BIT_GRAPH, - 0x0036: BIT_XDIGT | BIT_DIGIT | BIT_GRAPH, - 0x0037: BIT_XDIGT | BIT_DIGIT | BIT_GRAPH, - 0x0038: BIT_XDIGT | BIT_DIGIT | BIT_GRAPH, - 0x0039: BIT_XDIGT | BIT_DIGIT | BIT_GRAPH, - - # A-F (hex uppercase) - 0x0041: BIT_XDIGT | BIT_ALPHA | BIT_GRAPH | BIT_UPPER, - 0x0042: BIT_XDIGT | BIT_ALPHA | BIT_GRAPH | BIT_UPPER, - 0x0043: BIT_XDIGT | BIT_ALPHA | BIT_GRAPH | BIT_UPPER, - 0x0044: BIT_XDIGT | BIT_ALPHA | BIT_GRAPH | BIT_UPPER, - 0x0045: BIT_XDIGT | BIT_ALPHA | BIT_GRAPH | BIT_UPPER, - 0x0046: BIT_XDIGT | BIT_ALPHA | BIT_GRAPH | BIT_UPPER, - - - # a-f (hex lowercase) - 0x0061: BIT_XDIGT | BIT_ALPHA | BIT_GRAPH | BIT_LOWER, - 0x0062: BIT_XDIGT | BIT_ALPHA | BIT_GRAPH | BIT_LOWER, - 0x0063: BIT_XDIGT | BIT_ALPHA | BIT_GRAPH | BIT_LOWER, - 0x0064: BIT_XDIGT | BIT_ALPHA | BIT_GRAPH | BIT_LOWER, - 0x0065: BIT_XDIGT | BIT_ALPHA | BIT_GRAPH | BIT_LOWER, - 0x0066: BIT_XDIGT | BIT_ALPHA | BIT_GRAPH | BIT_LOWER, -} - -class Group: - def __init__(self, start, flags, upper_delta, lower_delta): - self.start = start - self.flags = flags - self.upper_delta = upper_delta - self.lower_delta = lower_delta - self.chars = [] - - def add_char(self, num, label): - self.chars.append((num, label)) - - def write_to_file(self, f): - for char in self.chars: - f.write("// %x %s\n" % char) - f.write(" { 0x%X, \t0x%X, \t0x%X, \t%d, \t%d },\n" % - (self.start, len(self.chars), self.flags, self.lower_delta, self.upper_delta)) - - def next(self): - return self.start + len(self.chars) - -groups = [] - -def add_char(num, upper, lower, bits, label): - upper_delta = upper - num - lower_delta = lower - num - - if len(groups) != 0: - cur = groups[-1] - if num == cur.next() and cur.flags == bits and \ - cur.upper_delta == upper_delta and \ - cur.lower_delta == lower_delta: - cur.add_char(num, label) - return - - g = Group(num, bits, upper_delta, lower_delta) - g.add_char(num, label) - groups.append(g) - -in_file = open('UnicodeData.txt', 'r') -out_file = open('_PDCLIB_unicodedata.c', 'w') -try: - for line in in_file: - (num_hex, name, category, combining_class, bidi_class, decomposition, - numeric_type, numeric_digit, numeric_value, mirrored, u1name, iso_com, - upper_case_hex, lower_case_hex, title_case_hex) = line.split(";") - - num = int(num_hex, 16) - upper_case = int(upper_case_hex, 16) if len(upper_case_hex) else num - lower_case = int(lower_case_hex, 16) if len(lower_case_hex) else num - bits = special.get(num, categories.get(category, 0)) - - if upper_case == 0 and lower_case == 0 and bits == 0: - continue - - add_char(num, upper_case, lower_case, bits, name) - - out_file.write(""" -/* Unicode Character Information ** AUTOMATICALLY GENERATED FILE ** - * - * This file is part of the PDCLib public domain C Library, but is automatically - * generated from the Unicode character data information file found at - * ftp://ftp.unicode.org/Public/UNIDATA/UnicodeData.txt - * - * As a result, the licensing that applies to that file also applies to this - * file. The licensing which applies to the Unicode character data can be found - * in Exhibit 1 of the Unicode Terms of Use, found at - * http://www.unicode.org/copyright.html#Exhibit1 - */ - #ifndef REGTEST - #include <_PDCLIB_locale.h> - -const _PDCLIB_wcinfo_t _PDCLIB_wcinfo[] = { -// { value, \tlength, \tflags,\tlower,\tupper\t}, // name - """) - for g in groups: - g.write_to_file(out_file) - out_file.write('};\n\n') - out_file.write(""" -const size_t _PDCLIB_wcinfo_size = sizeof(_PDCLIB_wcinfo) / sizeof(_PDCLIB_wcinfo[0]); -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" -int main( void ) -{ - return TEST_RESULTS; -} -#endif - -""") -except: - in_file.close() - out_file.close() - os.remove('_PDCLIB_unicodedata.c') - raise -else: - in_file.close() - out_file.close() diff --git a/waterbox/libc/functions/locale/_PDCLIB_mb_cur_max.c b/waterbox/libc/functions/locale/_PDCLIB_mb_cur_max.c deleted file mode 100644 index e241b7482c..0000000000 --- a/waterbox/libc/functions/locale/_PDCLIB_mb_cur_max.c +++ /dev/null @@ -1,27 +0,0 @@ -/* _PDCLIB_mb_cur_max( void ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#ifndef REGTEST -#include "_PDCLIB_locale.h" -#include "_PDCLIB_encoding.h" - -size_t _PDCLIB_mb_cur_max( void ) -{ - return _PDCLIB_threadlocale()->_Codec->__mb_max; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE( NO_TESTDRIVER ); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/locale/_PDCLIB_unicodedata.c b/waterbox/libc/functions/locale/_PDCLIB_unicodedata.c deleted file mode 100644 index 927fdb8f6b..0000000000 --- a/waterbox/libc/functions/locale/_PDCLIB_unicodedata.c +++ /dev/null @@ -1,29890 +0,0 @@ - -/* Unicode Character Information ** AUTOMATICALLY GENERATED FILE ** - * - * This file is part of the PDCLib public domain C Library, but is automatically - * generated from the Unicode character data information file found at - * ftp://ftp.unicode.org/Public/UNIDATA/UnicodeData.txt - * - * As a result, the licensing that applies to that file also applies to this - * file. The licensing which applies to the Unicode character data can be found - * in Exhibit 1 of the Unicode Terms of Use, found at - * http://www.unicode.org/copyright.html#Exhibit1 - */ - #ifndef REGTEST - #include <_PDCLIB_locale.h> - -const _PDCLIB_wcinfo_t _PDCLIB_wcinfo[] = { -// { value, length, flags, lower, upper }, // name - // 0 -// 1 -// 2 -// 3 -// 4 -// 5 -// 6 -// 7 -// 8 - { 0x0, 0x9, 0x4, 0, 0 }, -// 9 - { 0x9, 0x1, 0x22, 0, 0 }, -// a -// b -// c -// d -// e -// f -// 10 -// 11 -// 12 -// 13 -// 14 -// 15 -// 16 -// 17 -// 18 -// 19 -// 1a -// 1b -// 1c -// 1d -// 1e -// 1f - { 0xA, 0x16, 0x4, 0, 0 }, -// 20 SPACE - { 0x20, 0x1, 0x22, 0, 0 }, -// 21 EXCLAMATION MARK -// 22 QUOTATION MARK -// 23 NUMBER SIGN - { 0x21, 0x3, 0x18, 0, 0 }, -// 24 DOLLAR SIGN - { 0x24, 0x1, 0x8, 0, 0 }, -// 25 PERCENT SIGN -// 26 AMPERSAND -// 27 APOSTROPHE -// 28 LEFT PARENTHESIS -// 29 RIGHT PARENTHESIS -// 2a ASTERISK - { 0x25, 0x6, 0x18, 0, 0 }, -// 2b PLUS SIGN - { 0x2B, 0x1, 0x8, 0, 0 }, -// 2c COMMA -// 2d HYPHEN-MINUS -// 2e FULL STOP -// 2f SOLIDUS - { 0x2C, 0x4, 0x18, 0, 0 }, -// 30 DIGIT ZERO -// 31 DIGIT ONE -// 32 DIGIT TWO -// 33 DIGIT THREE -// 34 DIGIT FOUR -// 35 DIGIT FIVE -// 36 DIGIT SIX -// 37 DIGIT SEVEN -// 38 DIGIT EIGHT -// 39 DIGIT NINE - { 0x30, 0xA, 0x308, 0, 0 }, -// 3a COLON -// 3b SEMICOLON - { 0x3A, 0x2, 0x18, 0, 0 }, -// 3c LESS-THAN SIGN -// 3d EQUALS SIGN -// 3e GREATER-THAN SIGN - { 0x3C, 0x3, 0x8, 0, 0 }, -// 3f QUESTION MARK -// 40 COMMERCIAL AT - { 0x3F, 0x2, 0x18, 0, 0 }, -// 41 LATIN CAPITAL LETTER A -// 42 LATIN CAPITAL LETTER B -// 43 LATIN CAPITAL LETTER C -// 44 LATIN CAPITAL LETTER D -// 45 LATIN CAPITAL LETTER E -// 46 LATIN CAPITAL LETTER F - { 0x41, 0x6, 0x289, 32, 0 }, -// 47 LATIN CAPITAL LETTER G -// 48 LATIN CAPITAL LETTER H -// 49 LATIN CAPITAL LETTER I -// 4a LATIN CAPITAL LETTER J -// 4b LATIN CAPITAL LETTER K -// 4c LATIN CAPITAL LETTER L -// 4d LATIN CAPITAL LETTER M -// 4e LATIN CAPITAL LETTER N -// 4f LATIN CAPITAL LETTER O -// 50 LATIN CAPITAL LETTER P -// 51 LATIN CAPITAL LETTER Q -// 52 LATIN CAPITAL LETTER R -// 53 LATIN CAPITAL LETTER S -// 54 LATIN CAPITAL LETTER T -// 55 LATIN CAPITAL LETTER U -// 56 LATIN CAPITAL LETTER V -// 57 LATIN CAPITAL LETTER W -// 58 LATIN CAPITAL LETTER X -// 59 LATIN CAPITAL LETTER Y -// 5a LATIN CAPITAL LETTER Z - { 0x47, 0x14, 0x89, 32, 0 }, -// 5b LEFT SQUARE BRACKET -// 5c REVERSE SOLIDUS -// 5d RIGHT SQUARE BRACKET - { 0x5B, 0x3, 0x18, 0, 0 }, -// 5e CIRCUMFLEX ACCENT - { 0x5E, 0x1, 0x8, 0, 0 }, -// 5f LOW LINE - { 0x5F, 0x1, 0x18, 0, 0 }, -// 60 GRAVE ACCENT - { 0x60, 0x1, 0x8, 0, 0 }, -// 61 LATIN SMALL LETTER A -// 62 LATIN SMALL LETTER B -// 63 LATIN SMALL LETTER C -// 64 LATIN SMALL LETTER D -// 65 LATIN SMALL LETTER E -// 66 LATIN SMALL LETTER F - { 0x61, 0x6, 0x249, 0, -32 }, -// 67 LATIN SMALL LETTER G -// 68 LATIN SMALL LETTER H -// 69 LATIN SMALL LETTER I -// 6a LATIN SMALL LETTER J -// 6b LATIN SMALL LETTER K -// 6c LATIN SMALL LETTER L -// 6d LATIN SMALL LETTER M -// 6e LATIN SMALL LETTER N -// 6f LATIN SMALL LETTER O -// 70 LATIN SMALL LETTER P -// 71 LATIN SMALL LETTER Q -// 72 LATIN SMALL LETTER R -// 73 LATIN SMALL LETTER S -// 74 LATIN SMALL LETTER T -// 75 LATIN SMALL LETTER U -// 76 LATIN SMALL LETTER V -// 77 LATIN SMALL LETTER W -// 78 LATIN SMALL LETTER X -// 79 LATIN SMALL LETTER Y -// 7a LATIN SMALL LETTER Z - { 0x67, 0x14, 0x49, 0, -32 }, -// 7b LEFT CURLY BRACKET - { 0x7B, 0x1, 0x18, 0, 0 }, -// 7c VERTICAL LINE - { 0x7C, 0x1, 0x8, 0, 0 }, -// 7d RIGHT CURLY BRACKET - { 0x7D, 0x1, 0x18, 0, 0 }, -// 7e TILDE - { 0x7E, 0x1, 0x8, 0, 0 }, -// 7f -// 80 -// 81 -// 82 -// 83 -// 84 -// 85 -// 86 -// 87 -// 88 -// 89 -// 8a -// 8b -// 8c -// 8d -// 8e -// 8f -// 90 -// 91 -// 92 -// 93 -// 94 -// 95 -// 96 -// 97 -// 98 -// 99 -// 9a -// 9b -// 9c -// 9d -// 9e -// 9f - { 0x7F, 0x21, 0x4, 0, 0 }, -// a0 NO-BREAK SPACE - { 0xA0, 0x1, 0x20, 0, 0 }, -// a1 INVERTED EXCLAMATION MARK - { 0xA1, 0x1, 0x18, 0, 0 }, -// a2 CENT SIGN -// a3 POUND SIGN -// a4 CURRENCY SIGN -// a5 YEN SIGN -// a6 BROKEN BAR - { 0xA2, 0x5, 0x8, 0, 0 }, -// a7 SECTION SIGN - { 0xA7, 0x1, 0x18, 0, 0 }, -// a8 DIAERESIS -// a9 COPYRIGHT SIGN - { 0xA8, 0x2, 0x8, 0, 0 }, -// aa FEMININE ORDINAL INDICATOR - { 0xAA, 0x1, 0x9, 0, 0 }, -// ab LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - { 0xAB, 0x1, 0x18, 0, 0 }, -// ac NOT SIGN - { 0xAC, 0x1, 0x8, 0, 0 }, -// ad SOFT HYPHEN - { 0xAD, 0x1, 0x0, 0, 0 }, -// ae REGISTERED SIGN -// af MACRON -// b0 DEGREE SIGN -// b1 PLUS-MINUS SIGN -// b2 SUPERSCRIPT TWO -// b3 SUPERSCRIPT THREE -// b4 ACUTE ACCENT - { 0xAE, 0x7, 0x8, 0, 0 }, -// b5 MICRO SIGN - { 0xB5, 0x1, 0x49, 0, 743 }, -// b6 PILCROW SIGN -// b7 MIDDLE DOT - { 0xB6, 0x2, 0x18, 0, 0 }, -// b8 CEDILLA -// b9 SUPERSCRIPT ONE - { 0xB8, 0x2, 0x8, 0, 0 }, -// ba MASCULINE ORDINAL INDICATOR - { 0xBA, 0x1, 0x9, 0, 0 }, -// bb RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - { 0xBB, 0x1, 0x18, 0, 0 }, -// bc VULGAR FRACTION ONE QUARTER -// bd VULGAR FRACTION ONE HALF -// be VULGAR FRACTION THREE QUARTERS - { 0xBC, 0x3, 0x8, 0, 0 }, -// bf INVERTED QUESTION MARK - { 0xBF, 0x1, 0x18, 0, 0 }, -// c0 LATIN CAPITAL LETTER A WITH GRAVE -// c1 LATIN CAPITAL LETTER A WITH ACUTE -// c2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX -// c3 LATIN CAPITAL LETTER A WITH TILDE -// c4 LATIN CAPITAL LETTER A WITH DIAERESIS -// c5 LATIN CAPITAL LETTER A WITH RING ABOVE -// c6 LATIN CAPITAL LETTER AE -// c7 LATIN CAPITAL LETTER C WITH CEDILLA -// c8 LATIN CAPITAL LETTER E WITH GRAVE -// c9 LATIN CAPITAL LETTER E WITH ACUTE -// ca LATIN CAPITAL LETTER E WITH CIRCUMFLEX -// cb LATIN CAPITAL LETTER E WITH DIAERESIS -// cc LATIN CAPITAL LETTER I WITH GRAVE -// cd LATIN CAPITAL LETTER I WITH ACUTE -// ce LATIN CAPITAL LETTER I WITH CIRCUMFLEX -// cf LATIN CAPITAL LETTER I WITH DIAERESIS -// d0 LATIN CAPITAL LETTER ETH -// d1 LATIN CAPITAL LETTER N WITH TILDE -// d2 LATIN CAPITAL LETTER O WITH GRAVE -// d3 LATIN CAPITAL LETTER O WITH ACUTE -// d4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX -// d5 LATIN CAPITAL LETTER O WITH TILDE -// d6 LATIN CAPITAL LETTER O WITH DIAERESIS - { 0xC0, 0x17, 0x89, 32, 0 }, -// d7 MULTIPLICATION SIGN - { 0xD7, 0x1, 0x8, 0, 0 }, -// d8 LATIN CAPITAL LETTER O WITH STROKE -// d9 LATIN CAPITAL LETTER U WITH GRAVE -// da LATIN CAPITAL LETTER U WITH ACUTE -// db LATIN CAPITAL LETTER U WITH CIRCUMFLEX -// dc LATIN CAPITAL LETTER U WITH DIAERESIS -// dd LATIN CAPITAL LETTER Y WITH ACUTE -// de LATIN CAPITAL LETTER THORN - { 0xD8, 0x7, 0x89, 32, 0 }, -// df LATIN SMALL LETTER SHARP S - { 0xDF, 0x1, 0x49, 0, 0 }, -// e0 LATIN SMALL LETTER A WITH GRAVE -// e1 LATIN SMALL LETTER A WITH ACUTE -// e2 LATIN SMALL LETTER A WITH CIRCUMFLEX -// e3 LATIN SMALL LETTER A WITH TILDE -// e4 LATIN SMALL LETTER A WITH DIAERESIS -// e5 LATIN SMALL LETTER A WITH RING ABOVE -// e6 LATIN SMALL LETTER AE -// e7 LATIN SMALL LETTER C WITH CEDILLA -// e8 LATIN SMALL LETTER E WITH GRAVE -// e9 LATIN SMALL LETTER E WITH ACUTE -// ea LATIN SMALL LETTER E WITH CIRCUMFLEX -// eb LATIN SMALL LETTER E WITH DIAERESIS -// ec LATIN SMALL LETTER I WITH GRAVE -// ed LATIN SMALL LETTER I WITH ACUTE -// ee LATIN SMALL LETTER I WITH CIRCUMFLEX -// ef LATIN SMALL LETTER I WITH DIAERESIS -// f0 LATIN SMALL LETTER ETH -// f1 LATIN SMALL LETTER N WITH TILDE -// f2 LATIN SMALL LETTER O WITH GRAVE -// f3 LATIN SMALL LETTER O WITH ACUTE -// f4 LATIN SMALL LETTER O WITH CIRCUMFLEX -// f5 LATIN SMALL LETTER O WITH TILDE -// f6 LATIN SMALL LETTER O WITH DIAERESIS - { 0xE0, 0x17, 0x49, 0, -32 }, -// f7 DIVISION SIGN - { 0xF7, 0x1, 0x8, 0, 0 }, -// f8 LATIN SMALL LETTER O WITH STROKE -// f9 LATIN SMALL LETTER U WITH GRAVE -// fa LATIN SMALL LETTER U WITH ACUTE -// fb LATIN SMALL LETTER U WITH CIRCUMFLEX -// fc LATIN SMALL LETTER U WITH DIAERESIS -// fd LATIN SMALL LETTER Y WITH ACUTE -// fe LATIN SMALL LETTER THORN - { 0xF8, 0x7, 0x49, 0, -32 }, -// ff LATIN SMALL LETTER Y WITH DIAERESIS - { 0xFF, 0x1, 0x49, 0, 121 }, -// 100 LATIN CAPITAL LETTER A WITH MACRON - { 0x100, 0x1, 0x89, 1, 0 }, -// 101 LATIN SMALL LETTER A WITH MACRON - { 0x101, 0x1, 0x49, 0, -1 }, -// 102 LATIN CAPITAL LETTER A WITH BREVE - { 0x102, 0x1, 0x89, 1, 0 }, -// 103 LATIN SMALL LETTER A WITH BREVE - { 0x103, 0x1, 0x49, 0, -1 }, -// 104 LATIN CAPITAL LETTER A WITH OGONEK - { 0x104, 0x1, 0x89, 1, 0 }, -// 105 LATIN SMALL LETTER A WITH OGONEK - { 0x105, 0x1, 0x49, 0, -1 }, -// 106 LATIN CAPITAL LETTER C WITH ACUTE - { 0x106, 0x1, 0x89, 1, 0 }, -// 107 LATIN SMALL LETTER C WITH ACUTE - { 0x107, 0x1, 0x49, 0, -1 }, -// 108 LATIN CAPITAL LETTER C WITH CIRCUMFLEX - { 0x108, 0x1, 0x89, 1, 0 }, -// 109 LATIN SMALL LETTER C WITH CIRCUMFLEX - { 0x109, 0x1, 0x49, 0, -1 }, -// 10a LATIN CAPITAL LETTER C WITH DOT ABOVE - { 0x10A, 0x1, 0x89, 1, 0 }, -// 10b LATIN SMALL LETTER C WITH DOT ABOVE - { 0x10B, 0x1, 0x49, 0, -1 }, -// 10c LATIN CAPITAL LETTER C WITH CARON - { 0x10C, 0x1, 0x89, 1, 0 }, -// 10d LATIN SMALL LETTER C WITH CARON - { 0x10D, 0x1, 0x49, 0, -1 }, -// 10e LATIN CAPITAL LETTER D WITH CARON - { 0x10E, 0x1, 0x89, 1, 0 }, -// 10f LATIN SMALL LETTER D WITH CARON - { 0x10F, 0x1, 0x49, 0, -1 }, -// 110 LATIN CAPITAL LETTER D WITH STROKE - { 0x110, 0x1, 0x89, 1, 0 }, -// 111 LATIN SMALL LETTER D WITH STROKE - { 0x111, 0x1, 0x49, 0, -1 }, -// 112 LATIN CAPITAL LETTER E WITH MACRON - { 0x112, 0x1, 0x89, 1, 0 }, -// 113 LATIN SMALL LETTER E WITH MACRON - { 0x113, 0x1, 0x49, 0, -1 }, -// 114 LATIN CAPITAL LETTER E WITH BREVE - { 0x114, 0x1, 0x89, 1, 0 }, -// 115 LATIN SMALL LETTER E WITH BREVE - { 0x115, 0x1, 0x49, 0, -1 }, -// 116 LATIN CAPITAL LETTER E WITH DOT ABOVE - { 0x116, 0x1, 0x89, 1, 0 }, -// 117 LATIN SMALL LETTER E WITH DOT ABOVE - { 0x117, 0x1, 0x49, 0, -1 }, -// 118 LATIN CAPITAL LETTER E WITH OGONEK - { 0x118, 0x1, 0x89, 1, 0 }, -// 119 LATIN SMALL LETTER E WITH OGONEK - { 0x119, 0x1, 0x49, 0, -1 }, -// 11a LATIN CAPITAL LETTER E WITH CARON - { 0x11A, 0x1, 0x89, 1, 0 }, -// 11b LATIN SMALL LETTER E WITH CARON - { 0x11B, 0x1, 0x49, 0, -1 }, -// 11c LATIN CAPITAL LETTER G WITH CIRCUMFLEX - { 0x11C, 0x1, 0x89, 1, 0 }, -// 11d LATIN SMALL LETTER G WITH CIRCUMFLEX - { 0x11D, 0x1, 0x49, 0, -1 }, -// 11e LATIN CAPITAL LETTER G WITH BREVE - { 0x11E, 0x1, 0x89, 1, 0 }, -// 11f LATIN SMALL LETTER G WITH BREVE - { 0x11F, 0x1, 0x49, 0, -1 }, -// 120 LATIN CAPITAL LETTER G WITH DOT ABOVE - { 0x120, 0x1, 0x89, 1, 0 }, -// 121 LATIN SMALL LETTER G WITH DOT ABOVE - { 0x121, 0x1, 0x49, 0, -1 }, -// 122 LATIN CAPITAL LETTER G WITH CEDILLA - { 0x122, 0x1, 0x89, 1, 0 }, -// 123 LATIN SMALL LETTER G WITH CEDILLA - { 0x123, 0x1, 0x49, 0, -1 }, -// 124 LATIN CAPITAL LETTER H WITH CIRCUMFLEX - { 0x124, 0x1, 0x89, 1, 0 }, -// 125 LATIN SMALL LETTER H WITH CIRCUMFLEX - { 0x125, 0x1, 0x49, 0, -1 }, -// 126 LATIN CAPITAL LETTER H WITH STROKE - { 0x126, 0x1, 0x89, 1, 0 }, -// 127 LATIN SMALL LETTER H WITH STROKE - { 0x127, 0x1, 0x49, 0, -1 }, -// 128 LATIN CAPITAL LETTER I WITH TILDE - { 0x128, 0x1, 0x89, 1, 0 }, -// 129 LATIN SMALL LETTER I WITH TILDE - { 0x129, 0x1, 0x49, 0, -1 }, -// 12a LATIN CAPITAL LETTER I WITH MACRON - { 0x12A, 0x1, 0x89, 1, 0 }, -// 12b LATIN SMALL LETTER I WITH MACRON - { 0x12B, 0x1, 0x49, 0, -1 }, -// 12c LATIN CAPITAL LETTER I WITH BREVE - { 0x12C, 0x1, 0x89, 1, 0 }, -// 12d LATIN SMALL LETTER I WITH BREVE - { 0x12D, 0x1, 0x49, 0, -1 }, -// 12e LATIN CAPITAL LETTER I WITH OGONEK - { 0x12E, 0x1, 0x89, 1, 0 }, -// 12f LATIN SMALL LETTER I WITH OGONEK - { 0x12F, 0x1, 0x49, 0, -1 }, -// 130 LATIN CAPITAL LETTER I WITH DOT ABOVE - { 0x130, 0x1, 0x89, -199, 0 }, -// 131 LATIN SMALL LETTER DOTLESS I - { 0x131, 0x1, 0x49, 0, -232 }, -// 132 LATIN CAPITAL LIGATURE IJ - { 0x132, 0x1, 0x89, 1, 0 }, -// 133 LATIN SMALL LIGATURE IJ - { 0x133, 0x1, 0x49, 0, -1 }, -// 134 LATIN CAPITAL LETTER J WITH CIRCUMFLEX - { 0x134, 0x1, 0x89, 1, 0 }, -// 135 LATIN SMALL LETTER J WITH CIRCUMFLEX - { 0x135, 0x1, 0x49, 0, -1 }, -// 136 LATIN CAPITAL LETTER K WITH CEDILLA - { 0x136, 0x1, 0x89, 1, 0 }, -// 137 LATIN SMALL LETTER K WITH CEDILLA - { 0x137, 0x1, 0x49, 0, -1 }, -// 138 LATIN SMALL LETTER KRA - { 0x138, 0x1, 0x49, 0, 0 }, -// 139 LATIN CAPITAL LETTER L WITH ACUTE - { 0x139, 0x1, 0x89, 1, 0 }, -// 13a LATIN SMALL LETTER L WITH ACUTE - { 0x13A, 0x1, 0x49, 0, -1 }, -// 13b LATIN CAPITAL LETTER L WITH CEDILLA - { 0x13B, 0x1, 0x89, 1, 0 }, -// 13c LATIN SMALL LETTER L WITH CEDILLA - { 0x13C, 0x1, 0x49, 0, -1 }, -// 13d LATIN CAPITAL LETTER L WITH CARON - { 0x13D, 0x1, 0x89, 1, 0 }, -// 13e LATIN SMALL LETTER L WITH CARON - { 0x13E, 0x1, 0x49, 0, -1 }, -// 13f LATIN CAPITAL LETTER L WITH MIDDLE DOT - { 0x13F, 0x1, 0x89, 1, 0 }, -// 140 LATIN SMALL LETTER L WITH MIDDLE DOT - { 0x140, 0x1, 0x49, 0, -1 }, -// 141 LATIN CAPITAL LETTER L WITH STROKE - { 0x141, 0x1, 0x89, 1, 0 }, -// 142 LATIN SMALL LETTER L WITH STROKE - { 0x142, 0x1, 0x49, 0, -1 }, -// 143 LATIN CAPITAL LETTER N WITH ACUTE - { 0x143, 0x1, 0x89, 1, 0 }, -// 144 LATIN SMALL LETTER N WITH ACUTE - { 0x144, 0x1, 0x49, 0, -1 }, -// 145 LATIN CAPITAL LETTER N WITH CEDILLA - { 0x145, 0x1, 0x89, 1, 0 }, -// 146 LATIN SMALL LETTER N WITH CEDILLA - { 0x146, 0x1, 0x49, 0, -1 }, -// 147 LATIN CAPITAL LETTER N WITH CARON - { 0x147, 0x1, 0x89, 1, 0 }, -// 148 LATIN SMALL LETTER N WITH CARON - { 0x148, 0x1, 0x49, 0, -1 }, -// 149 LATIN SMALL LETTER N PRECEDED BY APOSTROPHE - { 0x149, 0x1, 0x49, 0, 0 }, -// 14a LATIN CAPITAL LETTER ENG - { 0x14A, 0x1, 0x89, 1, 0 }, -// 14b LATIN SMALL LETTER ENG - { 0x14B, 0x1, 0x49, 0, -1 }, -// 14c LATIN CAPITAL LETTER O WITH MACRON - { 0x14C, 0x1, 0x89, 1, 0 }, -// 14d LATIN SMALL LETTER O WITH MACRON - { 0x14D, 0x1, 0x49, 0, -1 }, -// 14e LATIN CAPITAL LETTER O WITH BREVE - { 0x14E, 0x1, 0x89, 1, 0 }, -// 14f LATIN SMALL LETTER O WITH BREVE - { 0x14F, 0x1, 0x49, 0, -1 }, -// 150 LATIN CAPITAL LETTER O WITH DOUBLE ACUTE - { 0x150, 0x1, 0x89, 1, 0 }, -// 151 LATIN SMALL LETTER O WITH DOUBLE ACUTE - { 0x151, 0x1, 0x49, 0, -1 }, -// 152 LATIN CAPITAL LIGATURE OE - { 0x152, 0x1, 0x89, 1, 0 }, -// 153 LATIN SMALL LIGATURE OE - { 0x153, 0x1, 0x49, 0, -1 }, -// 154 LATIN CAPITAL LETTER R WITH ACUTE - { 0x154, 0x1, 0x89, 1, 0 }, -// 155 LATIN SMALL LETTER R WITH ACUTE - { 0x155, 0x1, 0x49, 0, -1 }, -// 156 LATIN CAPITAL LETTER R WITH CEDILLA - { 0x156, 0x1, 0x89, 1, 0 }, -// 157 LATIN SMALL LETTER R WITH CEDILLA - { 0x157, 0x1, 0x49, 0, -1 }, -// 158 LATIN CAPITAL LETTER R WITH CARON - { 0x158, 0x1, 0x89, 1, 0 }, -// 159 LATIN SMALL LETTER R WITH CARON - { 0x159, 0x1, 0x49, 0, -1 }, -// 15a LATIN CAPITAL LETTER S WITH ACUTE - { 0x15A, 0x1, 0x89, 1, 0 }, -// 15b LATIN SMALL LETTER S WITH ACUTE - { 0x15B, 0x1, 0x49, 0, -1 }, -// 15c LATIN CAPITAL LETTER S WITH CIRCUMFLEX - { 0x15C, 0x1, 0x89, 1, 0 }, -// 15d LATIN SMALL LETTER S WITH CIRCUMFLEX - { 0x15D, 0x1, 0x49, 0, -1 }, -// 15e LATIN CAPITAL LETTER S WITH CEDILLA - { 0x15E, 0x1, 0x89, 1, 0 }, -// 15f LATIN SMALL LETTER S WITH CEDILLA - { 0x15F, 0x1, 0x49, 0, -1 }, -// 160 LATIN CAPITAL LETTER S WITH CARON - { 0x160, 0x1, 0x89, 1, 0 }, -// 161 LATIN SMALL LETTER S WITH CARON - { 0x161, 0x1, 0x49, 0, -1 }, -// 162 LATIN CAPITAL LETTER T WITH CEDILLA - { 0x162, 0x1, 0x89, 1, 0 }, -// 163 LATIN SMALL LETTER T WITH CEDILLA - { 0x163, 0x1, 0x49, 0, -1 }, -// 164 LATIN CAPITAL LETTER T WITH CARON - { 0x164, 0x1, 0x89, 1, 0 }, -// 165 LATIN SMALL LETTER T WITH CARON - { 0x165, 0x1, 0x49, 0, -1 }, -// 166 LATIN CAPITAL LETTER T WITH STROKE - { 0x166, 0x1, 0x89, 1, 0 }, -// 167 LATIN SMALL LETTER T WITH STROKE - { 0x167, 0x1, 0x49, 0, -1 }, -// 168 LATIN CAPITAL LETTER U WITH TILDE - { 0x168, 0x1, 0x89, 1, 0 }, -// 169 LATIN SMALL LETTER U WITH TILDE - { 0x169, 0x1, 0x49, 0, -1 }, -// 16a LATIN CAPITAL LETTER U WITH MACRON - { 0x16A, 0x1, 0x89, 1, 0 }, -// 16b LATIN SMALL LETTER U WITH MACRON - { 0x16B, 0x1, 0x49, 0, -1 }, -// 16c LATIN CAPITAL LETTER U WITH BREVE - { 0x16C, 0x1, 0x89, 1, 0 }, -// 16d LATIN SMALL LETTER U WITH BREVE - { 0x16D, 0x1, 0x49, 0, -1 }, -// 16e LATIN CAPITAL LETTER U WITH RING ABOVE - { 0x16E, 0x1, 0x89, 1, 0 }, -// 16f LATIN SMALL LETTER U WITH RING ABOVE - { 0x16F, 0x1, 0x49, 0, -1 }, -// 170 LATIN CAPITAL LETTER U WITH DOUBLE ACUTE - { 0x170, 0x1, 0x89, 1, 0 }, -// 171 LATIN SMALL LETTER U WITH DOUBLE ACUTE - { 0x171, 0x1, 0x49, 0, -1 }, -// 172 LATIN CAPITAL LETTER U WITH OGONEK - { 0x172, 0x1, 0x89, 1, 0 }, -// 173 LATIN SMALL LETTER U WITH OGONEK - { 0x173, 0x1, 0x49, 0, -1 }, -// 174 LATIN CAPITAL LETTER W WITH CIRCUMFLEX - { 0x174, 0x1, 0x89, 1, 0 }, -// 175 LATIN SMALL LETTER W WITH CIRCUMFLEX - { 0x175, 0x1, 0x49, 0, -1 }, -// 176 LATIN CAPITAL LETTER Y WITH CIRCUMFLEX - { 0x176, 0x1, 0x89, 1, 0 }, -// 177 LATIN SMALL LETTER Y WITH CIRCUMFLEX - { 0x177, 0x1, 0x49, 0, -1 }, -// 178 LATIN CAPITAL LETTER Y WITH DIAERESIS - { 0x178, 0x1, 0x89, -121, 0 }, -// 179 LATIN CAPITAL LETTER Z WITH ACUTE - { 0x179, 0x1, 0x89, 1, 0 }, -// 17a LATIN SMALL LETTER Z WITH ACUTE - { 0x17A, 0x1, 0x49, 0, -1 }, -// 17b LATIN CAPITAL LETTER Z WITH DOT ABOVE - { 0x17B, 0x1, 0x89, 1, 0 }, -// 17c LATIN SMALL LETTER Z WITH DOT ABOVE - { 0x17C, 0x1, 0x49, 0, -1 }, -// 17d LATIN CAPITAL LETTER Z WITH CARON - { 0x17D, 0x1, 0x89, 1, 0 }, -// 17e LATIN SMALL LETTER Z WITH CARON - { 0x17E, 0x1, 0x49, 0, -1 }, -// 17f LATIN SMALL LETTER LONG S - { 0x17F, 0x1, 0x49, 0, -300 }, -// 180 LATIN SMALL LETTER B WITH STROKE - { 0x180, 0x1, 0x49, 0, 195 }, -// 181 LATIN CAPITAL LETTER B WITH HOOK - { 0x181, 0x1, 0x89, 210, 0 }, -// 182 LATIN CAPITAL LETTER B WITH TOPBAR - { 0x182, 0x1, 0x89, 1, 0 }, -// 183 LATIN SMALL LETTER B WITH TOPBAR - { 0x183, 0x1, 0x49, 0, -1 }, -// 184 LATIN CAPITAL LETTER TONE SIX - { 0x184, 0x1, 0x89, 1, 0 }, -// 185 LATIN SMALL LETTER TONE SIX - { 0x185, 0x1, 0x49, 0, -1 }, -// 186 LATIN CAPITAL LETTER OPEN O - { 0x186, 0x1, 0x89, 206, 0 }, -// 187 LATIN CAPITAL LETTER C WITH HOOK - { 0x187, 0x1, 0x89, 1, 0 }, -// 188 LATIN SMALL LETTER C WITH HOOK - { 0x188, 0x1, 0x49, 0, -1 }, -// 189 LATIN CAPITAL LETTER AFRICAN D -// 18a LATIN CAPITAL LETTER D WITH HOOK - { 0x189, 0x2, 0x89, 205, 0 }, -// 18b LATIN CAPITAL LETTER D WITH TOPBAR - { 0x18B, 0x1, 0x89, 1, 0 }, -// 18c LATIN SMALL LETTER D WITH TOPBAR - { 0x18C, 0x1, 0x49, 0, -1 }, -// 18d LATIN SMALL LETTER TURNED DELTA - { 0x18D, 0x1, 0x49, 0, 0 }, -// 18e LATIN CAPITAL LETTER REVERSED E - { 0x18E, 0x1, 0x89, 79, 0 }, -// 18f LATIN CAPITAL LETTER SCHWA - { 0x18F, 0x1, 0x89, 202, 0 }, -// 190 LATIN CAPITAL LETTER OPEN E - { 0x190, 0x1, 0x89, 203, 0 }, -// 191 LATIN CAPITAL LETTER F WITH HOOK - { 0x191, 0x1, 0x89, 1, 0 }, -// 192 LATIN SMALL LETTER F WITH HOOK - { 0x192, 0x1, 0x49, 0, -1 }, -// 193 LATIN CAPITAL LETTER G WITH HOOK - { 0x193, 0x1, 0x89, 205, 0 }, -// 194 LATIN CAPITAL LETTER GAMMA - { 0x194, 0x1, 0x89, 207, 0 }, -// 195 LATIN SMALL LETTER HV - { 0x195, 0x1, 0x49, 0, 97 }, -// 196 LATIN CAPITAL LETTER IOTA - { 0x196, 0x1, 0x89, 211, 0 }, -// 197 LATIN CAPITAL LETTER I WITH STROKE - { 0x197, 0x1, 0x89, 209, 0 }, -// 198 LATIN CAPITAL LETTER K WITH HOOK - { 0x198, 0x1, 0x89, 1, 0 }, -// 199 LATIN SMALL LETTER K WITH HOOK - { 0x199, 0x1, 0x49, 0, -1 }, -// 19a LATIN SMALL LETTER L WITH BAR - { 0x19A, 0x1, 0x49, 0, 163 }, -// 19b LATIN SMALL LETTER LAMBDA WITH STROKE - { 0x19B, 0x1, 0x49, 0, 0 }, -// 19c LATIN CAPITAL LETTER TURNED M - { 0x19C, 0x1, 0x89, 211, 0 }, -// 19d LATIN CAPITAL LETTER N WITH LEFT HOOK - { 0x19D, 0x1, 0x89, 213, 0 }, -// 19e LATIN SMALL LETTER N WITH LONG RIGHT LEG - { 0x19E, 0x1, 0x49, 0, 130 }, -// 19f LATIN CAPITAL LETTER O WITH MIDDLE TILDE - { 0x19F, 0x1, 0x89, 214, 0 }, -// 1a0 LATIN CAPITAL LETTER O WITH HORN - { 0x1A0, 0x1, 0x89, 1, 0 }, -// 1a1 LATIN SMALL LETTER O WITH HORN - { 0x1A1, 0x1, 0x49, 0, -1 }, -// 1a2 LATIN CAPITAL LETTER OI - { 0x1A2, 0x1, 0x89, 1, 0 }, -// 1a3 LATIN SMALL LETTER OI - { 0x1A3, 0x1, 0x49, 0, -1 }, -// 1a4 LATIN CAPITAL LETTER P WITH HOOK - { 0x1A4, 0x1, 0x89, 1, 0 }, -// 1a5 LATIN SMALL LETTER P WITH HOOK - { 0x1A5, 0x1, 0x49, 0, -1 }, -// 1a6 LATIN LETTER YR - { 0x1A6, 0x1, 0x89, 218, 0 }, -// 1a7 LATIN CAPITAL LETTER TONE TWO - { 0x1A7, 0x1, 0x89, 1, 0 }, -// 1a8 LATIN SMALL LETTER TONE TWO - { 0x1A8, 0x1, 0x49, 0, -1 }, -// 1a9 LATIN CAPITAL LETTER ESH - { 0x1A9, 0x1, 0x89, 218, 0 }, -// 1aa LATIN LETTER REVERSED ESH LOOP -// 1ab LATIN SMALL LETTER T WITH PALATAL HOOK - { 0x1AA, 0x2, 0x49, 0, 0 }, -// 1ac LATIN CAPITAL LETTER T WITH HOOK - { 0x1AC, 0x1, 0x89, 1, 0 }, -// 1ad LATIN SMALL LETTER T WITH HOOK - { 0x1AD, 0x1, 0x49, 0, -1 }, -// 1ae LATIN CAPITAL LETTER T WITH RETROFLEX HOOK - { 0x1AE, 0x1, 0x89, 218, 0 }, -// 1af LATIN CAPITAL LETTER U WITH HORN - { 0x1AF, 0x1, 0x89, 1, 0 }, -// 1b0 LATIN SMALL LETTER U WITH HORN - { 0x1B0, 0x1, 0x49, 0, -1 }, -// 1b1 LATIN CAPITAL LETTER UPSILON -// 1b2 LATIN CAPITAL LETTER V WITH HOOK - { 0x1B1, 0x2, 0x89, 217, 0 }, -// 1b3 LATIN CAPITAL LETTER Y WITH HOOK - { 0x1B3, 0x1, 0x89, 1, 0 }, -// 1b4 LATIN SMALL LETTER Y WITH HOOK - { 0x1B4, 0x1, 0x49, 0, -1 }, -// 1b5 LATIN CAPITAL LETTER Z WITH STROKE - { 0x1B5, 0x1, 0x89, 1, 0 }, -// 1b6 LATIN SMALL LETTER Z WITH STROKE - { 0x1B6, 0x1, 0x49, 0, -1 }, -// 1b7 LATIN CAPITAL LETTER EZH - { 0x1B7, 0x1, 0x89, 219, 0 }, -// 1b8 LATIN CAPITAL LETTER EZH REVERSED - { 0x1B8, 0x1, 0x89, 1, 0 }, -// 1b9 LATIN SMALL LETTER EZH REVERSED - { 0x1B9, 0x1, 0x49, 0, -1 }, -// 1ba LATIN SMALL LETTER EZH WITH TAIL - { 0x1BA, 0x1, 0x49, 0, 0 }, -// 1bb LATIN LETTER TWO WITH STROKE - { 0x1BB, 0x1, 0x9, 0, 0 }, -// 1bc LATIN CAPITAL LETTER TONE FIVE - { 0x1BC, 0x1, 0x89, 1, 0 }, -// 1bd LATIN SMALL LETTER TONE FIVE - { 0x1BD, 0x1, 0x49, 0, -1 }, -// 1be LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE - { 0x1BE, 0x1, 0x49, 0, 0 }, -// 1bf LATIN LETTER WYNN - { 0x1BF, 0x1, 0x49, 0, 56 }, -// 1c0 LATIN LETTER DENTAL CLICK -// 1c1 LATIN LETTER LATERAL CLICK -// 1c2 LATIN LETTER ALVEOLAR CLICK -// 1c3 LATIN LETTER RETROFLEX CLICK - { 0x1C0, 0x4, 0x9, 0, 0 }, -// 1c4 LATIN CAPITAL LETTER DZ WITH CARON - { 0x1C4, 0x1, 0x89, 2, 0 }, -// 1c5 LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON - { 0x1C5, 0x1, 0x89, 1, -1 }, -// 1c6 LATIN SMALL LETTER DZ WITH CARON - { 0x1C6, 0x1, 0x49, 0, -2 }, -// 1c7 LATIN CAPITAL LETTER LJ - { 0x1C7, 0x1, 0x89, 2, 0 }, -// 1c8 LATIN CAPITAL LETTER L WITH SMALL LETTER J - { 0x1C8, 0x1, 0x89, 1, -1 }, -// 1c9 LATIN SMALL LETTER LJ - { 0x1C9, 0x1, 0x49, 0, -2 }, -// 1ca LATIN CAPITAL LETTER NJ - { 0x1CA, 0x1, 0x89, 2, 0 }, -// 1cb LATIN CAPITAL LETTER N WITH SMALL LETTER J - { 0x1CB, 0x1, 0x89, 1, -1 }, -// 1cc LATIN SMALL LETTER NJ - { 0x1CC, 0x1, 0x49, 0, -2 }, -// 1cd LATIN CAPITAL LETTER A WITH CARON - { 0x1CD, 0x1, 0x89, 1, 0 }, -// 1ce LATIN SMALL LETTER A WITH CARON - { 0x1CE, 0x1, 0x49, 0, -1 }, -// 1cf LATIN CAPITAL LETTER I WITH CARON - { 0x1CF, 0x1, 0x89, 1, 0 }, -// 1d0 LATIN SMALL LETTER I WITH CARON - { 0x1D0, 0x1, 0x49, 0, -1 }, -// 1d1 LATIN CAPITAL LETTER O WITH CARON - { 0x1D1, 0x1, 0x89, 1, 0 }, -// 1d2 LATIN SMALL LETTER O WITH CARON - { 0x1D2, 0x1, 0x49, 0, -1 }, -// 1d3 LATIN CAPITAL LETTER U WITH CARON - { 0x1D3, 0x1, 0x89, 1, 0 }, -// 1d4 LATIN SMALL LETTER U WITH CARON - { 0x1D4, 0x1, 0x49, 0, -1 }, -// 1d5 LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON - { 0x1D5, 0x1, 0x89, 1, 0 }, -// 1d6 LATIN SMALL LETTER U WITH DIAERESIS AND MACRON - { 0x1D6, 0x1, 0x49, 0, -1 }, -// 1d7 LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE - { 0x1D7, 0x1, 0x89, 1, 0 }, -// 1d8 LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE - { 0x1D8, 0x1, 0x49, 0, -1 }, -// 1d9 LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON - { 0x1D9, 0x1, 0x89, 1, 0 }, -// 1da LATIN SMALL LETTER U WITH DIAERESIS AND CARON - { 0x1DA, 0x1, 0x49, 0, -1 }, -// 1db LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE - { 0x1DB, 0x1, 0x89, 1, 0 }, -// 1dc LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE - { 0x1DC, 0x1, 0x49, 0, -1 }, -// 1dd LATIN SMALL LETTER TURNED E - { 0x1DD, 0x1, 0x49, 0, -79 }, -// 1de LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON - { 0x1DE, 0x1, 0x89, 1, 0 }, -// 1df LATIN SMALL LETTER A WITH DIAERESIS AND MACRON - { 0x1DF, 0x1, 0x49, 0, -1 }, -// 1e0 LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON - { 0x1E0, 0x1, 0x89, 1, 0 }, -// 1e1 LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON - { 0x1E1, 0x1, 0x49, 0, -1 }, -// 1e2 LATIN CAPITAL LETTER AE WITH MACRON - { 0x1E2, 0x1, 0x89, 1, 0 }, -// 1e3 LATIN SMALL LETTER AE WITH MACRON - { 0x1E3, 0x1, 0x49, 0, -1 }, -// 1e4 LATIN CAPITAL LETTER G WITH STROKE - { 0x1E4, 0x1, 0x89, 1, 0 }, -// 1e5 LATIN SMALL LETTER G WITH STROKE - { 0x1E5, 0x1, 0x49, 0, -1 }, -// 1e6 LATIN CAPITAL LETTER G WITH CARON - { 0x1E6, 0x1, 0x89, 1, 0 }, -// 1e7 LATIN SMALL LETTER G WITH CARON - { 0x1E7, 0x1, 0x49, 0, -1 }, -// 1e8 LATIN CAPITAL LETTER K WITH CARON - { 0x1E8, 0x1, 0x89, 1, 0 }, -// 1e9 LATIN SMALL LETTER K WITH CARON - { 0x1E9, 0x1, 0x49, 0, -1 }, -// 1ea LATIN CAPITAL LETTER O WITH OGONEK - { 0x1EA, 0x1, 0x89, 1, 0 }, -// 1eb LATIN SMALL LETTER O WITH OGONEK - { 0x1EB, 0x1, 0x49, 0, -1 }, -// 1ec LATIN CAPITAL LETTER O WITH OGONEK AND MACRON - { 0x1EC, 0x1, 0x89, 1, 0 }, -// 1ed LATIN SMALL LETTER O WITH OGONEK AND MACRON - { 0x1ED, 0x1, 0x49, 0, -1 }, -// 1ee LATIN CAPITAL LETTER EZH WITH CARON - { 0x1EE, 0x1, 0x89, 1, 0 }, -// 1ef LATIN SMALL LETTER EZH WITH CARON - { 0x1EF, 0x1, 0x49, 0, -1 }, -// 1f0 LATIN SMALL LETTER J WITH CARON - { 0x1F0, 0x1, 0x49, 0, 0 }, -// 1f1 LATIN CAPITAL LETTER DZ - { 0x1F1, 0x1, 0x89, 2, 0 }, -// 1f2 LATIN CAPITAL LETTER D WITH SMALL LETTER Z - { 0x1F2, 0x1, 0x89, 1, -1 }, -// 1f3 LATIN SMALL LETTER DZ - { 0x1F3, 0x1, 0x49, 0, -2 }, -// 1f4 LATIN CAPITAL LETTER G WITH ACUTE - { 0x1F4, 0x1, 0x89, 1, 0 }, -// 1f5 LATIN SMALL LETTER G WITH ACUTE - { 0x1F5, 0x1, 0x49, 0, -1 }, -// 1f6 LATIN CAPITAL LETTER HWAIR - { 0x1F6, 0x1, 0x89, -97, 0 }, -// 1f7 LATIN CAPITAL LETTER WYNN - { 0x1F7, 0x1, 0x89, -56, 0 }, -// 1f8 LATIN CAPITAL LETTER N WITH GRAVE - { 0x1F8, 0x1, 0x89, 1, 0 }, -// 1f9 LATIN SMALL LETTER N WITH GRAVE - { 0x1F9, 0x1, 0x49, 0, -1 }, -// 1fa LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE - { 0x1FA, 0x1, 0x89, 1, 0 }, -// 1fb LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE - { 0x1FB, 0x1, 0x49, 0, -1 }, -// 1fc LATIN CAPITAL LETTER AE WITH ACUTE - { 0x1FC, 0x1, 0x89, 1, 0 }, -// 1fd LATIN SMALL LETTER AE WITH ACUTE - { 0x1FD, 0x1, 0x49, 0, -1 }, -// 1fe LATIN CAPITAL LETTER O WITH STROKE AND ACUTE - { 0x1FE, 0x1, 0x89, 1, 0 }, -// 1ff LATIN SMALL LETTER O WITH STROKE AND ACUTE - { 0x1FF, 0x1, 0x49, 0, -1 }, -// 200 LATIN CAPITAL LETTER A WITH DOUBLE GRAVE - { 0x200, 0x1, 0x89, 1, 0 }, -// 201 LATIN SMALL LETTER A WITH DOUBLE GRAVE - { 0x201, 0x1, 0x49, 0, -1 }, -// 202 LATIN CAPITAL LETTER A WITH INVERTED BREVE - { 0x202, 0x1, 0x89, 1, 0 }, -// 203 LATIN SMALL LETTER A WITH INVERTED BREVE - { 0x203, 0x1, 0x49, 0, -1 }, -// 204 LATIN CAPITAL LETTER E WITH DOUBLE GRAVE - { 0x204, 0x1, 0x89, 1, 0 }, -// 205 LATIN SMALL LETTER E WITH DOUBLE GRAVE - { 0x205, 0x1, 0x49, 0, -1 }, -// 206 LATIN CAPITAL LETTER E WITH INVERTED BREVE - { 0x206, 0x1, 0x89, 1, 0 }, -// 207 LATIN SMALL LETTER E WITH INVERTED BREVE - { 0x207, 0x1, 0x49, 0, -1 }, -// 208 LATIN CAPITAL LETTER I WITH DOUBLE GRAVE - { 0x208, 0x1, 0x89, 1, 0 }, -// 209 LATIN SMALL LETTER I WITH DOUBLE GRAVE - { 0x209, 0x1, 0x49, 0, -1 }, -// 20a LATIN CAPITAL LETTER I WITH INVERTED BREVE - { 0x20A, 0x1, 0x89, 1, 0 }, -// 20b LATIN SMALL LETTER I WITH INVERTED BREVE - { 0x20B, 0x1, 0x49, 0, -1 }, -// 20c LATIN CAPITAL LETTER O WITH DOUBLE GRAVE - { 0x20C, 0x1, 0x89, 1, 0 }, -// 20d LATIN SMALL LETTER O WITH DOUBLE GRAVE - { 0x20D, 0x1, 0x49, 0, -1 }, -// 20e LATIN CAPITAL LETTER O WITH INVERTED BREVE - { 0x20E, 0x1, 0x89, 1, 0 }, -// 20f LATIN SMALL LETTER O WITH INVERTED BREVE - { 0x20F, 0x1, 0x49, 0, -1 }, -// 210 LATIN CAPITAL LETTER R WITH DOUBLE GRAVE - { 0x210, 0x1, 0x89, 1, 0 }, -// 211 LATIN SMALL LETTER R WITH DOUBLE GRAVE - { 0x211, 0x1, 0x49, 0, -1 }, -// 212 LATIN CAPITAL LETTER R WITH INVERTED BREVE - { 0x212, 0x1, 0x89, 1, 0 }, -// 213 LATIN SMALL LETTER R WITH INVERTED BREVE - { 0x213, 0x1, 0x49, 0, -1 }, -// 214 LATIN CAPITAL LETTER U WITH DOUBLE GRAVE - { 0x214, 0x1, 0x89, 1, 0 }, -// 215 LATIN SMALL LETTER U WITH DOUBLE GRAVE - { 0x215, 0x1, 0x49, 0, -1 }, -// 216 LATIN CAPITAL LETTER U WITH INVERTED BREVE - { 0x216, 0x1, 0x89, 1, 0 }, -// 217 LATIN SMALL LETTER U WITH INVERTED BREVE - { 0x217, 0x1, 0x49, 0, -1 }, -// 218 LATIN CAPITAL LETTER S WITH COMMA BELOW - { 0x218, 0x1, 0x89, 1, 0 }, -// 219 LATIN SMALL LETTER S WITH COMMA BELOW - { 0x219, 0x1, 0x49, 0, -1 }, -// 21a LATIN CAPITAL LETTER T WITH COMMA BELOW - { 0x21A, 0x1, 0x89, 1, 0 }, -// 21b LATIN SMALL LETTER T WITH COMMA BELOW - { 0x21B, 0x1, 0x49, 0, -1 }, -// 21c LATIN CAPITAL LETTER YOGH - { 0x21C, 0x1, 0x89, 1, 0 }, -// 21d LATIN SMALL LETTER YOGH - { 0x21D, 0x1, 0x49, 0, -1 }, -// 21e LATIN CAPITAL LETTER H WITH CARON - { 0x21E, 0x1, 0x89, 1, 0 }, -// 21f LATIN SMALL LETTER H WITH CARON - { 0x21F, 0x1, 0x49, 0, -1 }, -// 220 LATIN CAPITAL LETTER N WITH LONG RIGHT LEG - { 0x220, 0x1, 0x89, -130, 0 }, -// 221 LATIN SMALL LETTER D WITH CURL - { 0x221, 0x1, 0x49, 0, 0 }, -// 222 LATIN CAPITAL LETTER OU - { 0x222, 0x1, 0x89, 1, 0 }, -// 223 LATIN SMALL LETTER OU - { 0x223, 0x1, 0x49, 0, -1 }, -// 224 LATIN CAPITAL LETTER Z WITH HOOK - { 0x224, 0x1, 0x89, 1, 0 }, -// 225 LATIN SMALL LETTER Z WITH HOOK - { 0x225, 0x1, 0x49, 0, -1 }, -// 226 LATIN CAPITAL LETTER A WITH DOT ABOVE - { 0x226, 0x1, 0x89, 1, 0 }, -// 227 LATIN SMALL LETTER A WITH DOT ABOVE - { 0x227, 0x1, 0x49, 0, -1 }, -// 228 LATIN CAPITAL LETTER E WITH CEDILLA - { 0x228, 0x1, 0x89, 1, 0 }, -// 229 LATIN SMALL LETTER E WITH CEDILLA - { 0x229, 0x1, 0x49, 0, -1 }, -// 22a LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON - { 0x22A, 0x1, 0x89, 1, 0 }, -// 22b LATIN SMALL LETTER O WITH DIAERESIS AND MACRON - { 0x22B, 0x1, 0x49, 0, -1 }, -// 22c LATIN CAPITAL LETTER O WITH TILDE AND MACRON - { 0x22C, 0x1, 0x89, 1, 0 }, -// 22d LATIN SMALL LETTER O WITH TILDE AND MACRON - { 0x22D, 0x1, 0x49, 0, -1 }, -// 22e LATIN CAPITAL LETTER O WITH DOT ABOVE - { 0x22E, 0x1, 0x89, 1, 0 }, -// 22f LATIN SMALL LETTER O WITH DOT ABOVE - { 0x22F, 0x1, 0x49, 0, -1 }, -// 230 LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON - { 0x230, 0x1, 0x89, 1, 0 }, -// 231 LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON - { 0x231, 0x1, 0x49, 0, -1 }, -// 232 LATIN CAPITAL LETTER Y WITH MACRON - { 0x232, 0x1, 0x89, 1, 0 }, -// 233 LATIN SMALL LETTER Y WITH MACRON - { 0x233, 0x1, 0x49, 0, -1 }, -// 234 LATIN SMALL LETTER L WITH CURL -// 235 LATIN SMALL LETTER N WITH CURL -// 236 LATIN SMALL LETTER T WITH CURL -// 237 LATIN SMALL LETTER DOTLESS J -// 238 LATIN SMALL LETTER DB DIGRAPH -// 239 LATIN SMALL LETTER QP DIGRAPH - { 0x234, 0x6, 0x49, 0, 0 }, -// 23a LATIN CAPITAL LETTER A WITH STROKE - { 0x23A, 0x1, 0x89, 10795, 0 }, -// 23b LATIN CAPITAL LETTER C WITH STROKE - { 0x23B, 0x1, 0x89, 1, 0 }, -// 23c LATIN SMALL LETTER C WITH STROKE - { 0x23C, 0x1, 0x49, 0, -1 }, -// 23d LATIN CAPITAL LETTER L WITH BAR - { 0x23D, 0x1, 0x89, -163, 0 }, -// 23e LATIN CAPITAL LETTER T WITH DIAGONAL STROKE - { 0x23E, 0x1, 0x89, 10792, 0 }, -// 23f LATIN SMALL LETTER S WITH SWASH TAIL -// 240 LATIN SMALL LETTER Z WITH SWASH TAIL - { 0x23F, 0x2, 0x49, 0, 10815 }, -// 241 LATIN CAPITAL LETTER GLOTTAL STOP - { 0x241, 0x1, 0x89, 1, 0 }, -// 242 LATIN SMALL LETTER GLOTTAL STOP - { 0x242, 0x1, 0x49, 0, -1 }, -// 243 LATIN CAPITAL LETTER B WITH STROKE - { 0x243, 0x1, 0x89, -195, 0 }, -// 244 LATIN CAPITAL LETTER U BAR - { 0x244, 0x1, 0x89, 69, 0 }, -// 245 LATIN CAPITAL LETTER TURNED V - { 0x245, 0x1, 0x89, 71, 0 }, -// 246 LATIN CAPITAL LETTER E WITH STROKE - { 0x246, 0x1, 0x89, 1, 0 }, -// 247 LATIN SMALL LETTER E WITH STROKE - { 0x247, 0x1, 0x49, 0, -1 }, -// 248 LATIN CAPITAL LETTER J WITH STROKE - { 0x248, 0x1, 0x89, 1, 0 }, -// 249 LATIN SMALL LETTER J WITH STROKE - { 0x249, 0x1, 0x49, 0, -1 }, -// 24a LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL - { 0x24A, 0x1, 0x89, 1, 0 }, -// 24b LATIN SMALL LETTER Q WITH HOOK TAIL - { 0x24B, 0x1, 0x49, 0, -1 }, -// 24c LATIN CAPITAL LETTER R WITH STROKE - { 0x24C, 0x1, 0x89, 1, 0 }, -// 24d LATIN SMALL LETTER R WITH STROKE - { 0x24D, 0x1, 0x49, 0, -1 }, -// 24e LATIN CAPITAL LETTER Y WITH STROKE - { 0x24E, 0x1, 0x89, 1, 0 }, -// 24f LATIN SMALL LETTER Y WITH STROKE - { 0x24F, 0x1, 0x49, 0, -1 }, -// 250 LATIN SMALL LETTER TURNED A - { 0x250, 0x1, 0x49, 0, 10783 }, -// 251 LATIN SMALL LETTER ALPHA - { 0x251, 0x1, 0x49, 0, 10780 }, -// 252 LATIN SMALL LETTER TURNED ALPHA - { 0x252, 0x1, 0x49, 0, 10782 }, -// 253 LATIN SMALL LETTER B WITH HOOK - { 0x253, 0x1, 0x49, 0, -210 }, -// 254 LATIN SMALL LETTER OPEN O - { 0x254, 0x1, 0x49, 0, -206 }, -// 255 LATIN SMALL LETTER C WITH CURL - { 0x255, 0x1, 0x49, 0, 0 }, -// 256 LATIN SMALL LETTER D WITH TAIL -// 257 LATIN SMALL LETTER D WITH HOOK - { 0x256, 0x2, 0x49, 0, -205 }, -// 258 LATIN SMALL LETTER REVERSED E - { 0x258, 0x1, 0x49, 0, 0 }, -// 259 LATIN SMALL LETTER SCHWA - { 0x259, 0x1, 0x49, 0, -202 }, -// 25a LATIN SMALL LETTER SCHWA WITH HOOK - { 0x25A, 0x1, 0x49, 0, 0 }, -// 25b LATIN SMALL LETTER OPEN E - { 0x25B, 0x1, 0x49, 0, -203 }, -// 25c LATIN SMALL LETTER REVERSED OPEN E - { 0x25C, 0x1, 0x49, 0, 42319 }, -// 25d LATIN SMALL LETTER REVERSED OPEN E WITH HOOK -// 25e LATIN SMALL LETTER CLOSED REVERSED OPEN E -// 25f LATIN SMALL LETTER DOTLESS J WITH STROKE - { 0x25D, 0x3, 0x49, 0, 0 }, -// 260 LATIN SMALL LETTER G WITH HOOK - { 0x260, 0x1, 0x49, 0, -205 }, -// 261 LATIN SMALL LETTER SCRIPT G - { 0x261, 0x1, 0x49, 0, 42315 }, -// 262 LATIN LETTER SMALL CAPITAL G - { 0x262, 0x1, 0x49, 0, 0 }, -// 263 LATIN SMALL LETTER GAMMA - { 0x263, 0x1, 0x49, 0, -207 }, -// 264 LATIN SMALL LETTER RAMS HORN - { 0x264, 0x1, 0x49, 0, 0 }, -// 265 LATIN SMALL LETTER TURNED H - { 0x265, 0x1, 0x49, 0, 42280 }, -// 266 LATIN SMALL LETTER H WITH HOOK - { 0x266, 0x1, 0x49, 0, 42308 }, -// 267 LATIN SMALL LETTER HENG WITH HOOK - { 0x267, 0x1, 0x49, 0, 0 }, -// 268 LATIN SMALL LETTER I WITH STROKE - { 0x268, 0x1, 0x49, 0, -209 }, -// 269 LATIN SMALL LETTER IOTA - { 0x269, 0x1, 0x49, 0, -211 }, -// 26a LATIN LETTER SMALL CAPITAL I - { 0x26A, 0x1, 0x49, 0, 0 }, -// 26b LATIN SMALL LETTER L WITH MIDDLE TILDE - { 0x26B, 0x1, 0x49, 0, 10743 }, -// 26c LATIN SMALL LETTER L WITH BELT - { 0x26C, 0x1, 0x49, 0, 42305 }, -// 26d LATIN SMALL LETTER L WITH RETROFLEX HOOK -// 26e LATIN SMALL LETTER LEZH - { 0x26D, 0x2, 0x49, 0, 0 }, -// 26f LATIN SMALL LETTER TURNED M - { 0x26F, 0x1, 0x49, 0, -211 }, -// 270 LATIN SMALL LETTER TURNED M WITH LONG LEG - { 0x270, 0x1, 0x49, 0, 0 }, -// 271 LATIN SMALL LETTER M WITH HOOK - { 0x271, 0x1, 0x49, 0, 10749 }, -// 272 LATIN SMALL LETTER N WITH LEFT HOOK - { 0x272, 0x1, 0x49, 0, -213 }, -// 273 LATIN SMALL LETTER N WITH RETROFLEX HOOK -// 274 LATIN LETTER SMALL CAPITAL N - { 0x273, 0x2, 0x49, 0, 0 }, -// 275 LATIN SMALL LETTER BARRED O - { 0x275, 0x1, 0x49, 0, -214 }, -// 276 LATIN LETTER SMALL CAPITAL OE -// 277 LATIN SMALL LETTER CLOSED OMEGA -// 278 LATIN SMALL LETTER PHI -// 279 LATIN SMALL LETTER TURNED R -// 27a LATIN SMALL LETTER TURNED R WITH LONG LEG -// 27b LATIN SMALL LETTER TURNED R WITH HOOK -// 27c LATIN SMALL LETTER R WITH LONG LEG - { 0x276, 0x7, 0x49, 0, 0 }, -// 27d LATIN SMALL LETTER R WITH TAIL - { 0x27D, 0x1, 0x49, 0, 10727 }, -// 27e LATIN SMALL LETTER R WITH FISHHOOK -// 27f LATIN SMALL LETTER REVERSED R WITH FISHHOOK - { 0x27E, 0x2, 0x49, 0, 0 }, -// 280 LATIN LETTER SMALL CAPITAL R - { 0x280, 0x1, 0x49, 0, -218 }, -// 281 LATIN LETTER SMALL CAPITAL INVERTED R -// 282 LATIN SMALL LETTER S WITH HOOK - { 0x281, 0x2, 0x49, 0, 0 }, -// 283 LATIN SMALL LETTER ESH - { 0x283, 0x1, 0x49, 0, -218 }, -// 284 LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK -// 285 LATIN SMALL LETTER SQUAT REVERSED ESH -// 286 LATIN SMALL LETTER ESH WITH CURL - { 0x284, 0x3, 0x49, 0, 0 }, -// 287 LATIN SMALL LETTER TURNED T - { 0x287, 0x1, 0x49, 0, 42282 }, -// 288 LATIN SMALL LETTER T WITH RETROFLEX HOOK - { 0x288, 0x1, 0x49, 0, -218 }, -// 289 LATIN SMALL LETTER U BAR - { 0x289, 0x1, 0x49, 0, -69 }, -// 28a LATIN SMALL LETTER UPSILON -// 28b LATIN SMALL LETTER V WITH HOOK - { 0x28A, 0x2, 0x49, 0, -217 }, -// 28c LATIN SMALL LETTER TURNED V - { 0x28C, 0x1, 0x49, 0, -71 }, -// 28d LATIN SMALL LETTER TURNED W -// 28e LATIN SMALL LETTER TURNED Y -// 28f LATIN LETTER SMALL CAPITAL Y -// 290 LATIN SMALL LETTER Z WITH RETROFLEX HOOK -// 291 LATIN SMALL LETTER Z WITH CURL - { 0x28D, 0x5, 0x49, 0, 0 }, -// 292 LATIN SMALL LETTER EZH - { 0x292, 0x1, 0x49, 0, -219 }, -// 293 LATIN SMALL LETTER EZH WITH CURL - { 0x293, 0x1, 0x49, 0, 0 }, -// 294 LATIN LETTER GLOTTAL STOP - { 0x294, 0x1, 0x9, 0, 0 }, -// 295 LATIN LETTER PHARYNGEAL VOICED FRICATIVE -// 296 LATIN LETTER INVERTED GLOTTAL STOP -// 297 LATIN LETTER STRETCHED C -// 298 LATIN LETTER BILABIAL CLICK -// 299 LATIN LETTER SMALL CAPITAL B -// 29a LATIN SMALL LETTER CLOSED OPEN E -// 29b LATIN LETTER SMALL CAPITAL G WITH HOOK -// 29c LATIN LETTER SMALL CAPITAL H -// 29d LATIN SMALL LETTER J WITH CROSSED-TAIL - { 0x295, 0x9, 0x49, 0, 0 }, -// 29e LATIN SMALL LETTER TURNED K - { 0x29E, 0x1, 0x49, 0, 42258 }, -// 29f LATIN LETTER SMALL CAPITAL L -// 2a0 LATIN SMALL LETTER Q WITH HOOK -// 2a1 LATIN LETTER GLOTTAL STOP WITH STROKE -// 2a2 LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE -// 2a3 LATIN SMALL LETTER DZ DIGRAPH -// 2a4 LATIN SMALL LETTER DEZH DIGRAPH -// 2a5 LATIN SMALL LETTER DZ DIGRAPH WITH CURL -// 2a6 LATIN SMALL LETTER TS DIGRAPH -// 2a7 LATIN SMALL LETTER TESH DIGRAPH -// 2a8 LATIN SMALL LETTER TC DIGRAPH WITH CURL -// 2a9 LATIN SMALL LETTER FENG DIGRAPH -// 2aa LATIN SMALL LETTER LS DIGRAPH -// 2ab LATIN SMALL LETTER LZ DIGRAPH -// 2ac LATIN LETTER BILABIAL PERCUSSIVE -// 2ad LATIN LETTER BIDENTAL PERCUSSIVE -// 2ae LATIN SMALL LETTER TURNED H WITH FISHHOOK -// 2af LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL - { 0x29F, 0x11, 0x49, 0, 0 }, -// 2b0 MODIFIER LETTER SMALL H -// 2b1 MODIFIER LETTER SMALL H WITH HOOK -// 2b2 MODIFIER LETTER SMALL J -// 2b3 MODIFIER LETTER SMALL R -// 2b4 MODIFIER LETTER SMALL TURNED R -// 2b5 MODIFIER LETTER SMALL TURNED R WITH HOOK -// 2b6 MODIFIER LETTER SMALL CAPITAL INVERTED R -// 2b7 MODIFIER LETTER SMALL W -// 2b8 MODIFIER LETTER SMALL Y -// 2b9 MODIFIER LETTER PRIME -// 2ba MODIFIER LETTER DOUBLE PRIME -// 2bb MODIFIER LETTER TURNED COMMA -// 2bc MODIFIER LETTER APOSTROPHE -// 2bd MODIFIER LETTER REVERSED COMMA -// 2be MODIFIER LETTER RIGHT HALF RING -// 2bf MODIFIER LETTER LEFT HALF RING -// 2c0 MODIFIER LETTER GLOTTAL STOP -// 2c1 MODIFIER LETTER REVERSED GLOTTAL STOP - { 0x2B0, 0x12, 0x9, 0, 0 }, -// 2c2 MODIFIER LETTER LEFT ARROWHEAD -// 2c3 MODIFIER LETTER RIGHT ARROWHEAD -// 2c4 MODIFIER LETTER UP ARROWHEAD -// 2c5 MODIFIER LETTER DOWN ARROWHEAD - { 0x2C2, 0x4, 0x8, 0, 0 }, -// 2c6 MODIFIER LETTER CIRCUMFLEX ACCENT -// 2c7 CARON -// 2c8 MODIFIER LETTER VERTICAL LINE -// 2c9 MODIFIER LETTER MACRON -// 2ca MODIFIER LETTER ACUTE ACCENT -// 2cb MODIFIER LETTER GRAVE ACCENT -// 2cc MODIFIER LETTER LOW VERTICAL LINE -// 2cd MODIFIER LETTER LOW MACRON -// 2ce MODIFIER LETTER LOW GRAVE ACCENT -// 2cf MODIFIER LETTER LOW ACUTE ACCENT -// 2d0 MODIFIER LETTER TRIANGULAR COLON -// 2d1 MODIFIER LETTER HALF TRIANGULAR COLON - { 0x2C6, 0xC, 0x9, 0, 0 }, -// 2d2 MODIFIER LETTER CENTRED RIGHT HALF RING -// 2d3 MODIFIER LETTER CENTRED LEFT HALF RING -// 2d4 MODIFIER LETTER UP TACK -// 2d5 MODIFIER LETTER DOWN TACK -// 2d6 MODIFIER LETTER PLUS SIGN -// 2d7 MODIFIER LETTER MINUS SIGN -// 2d8 BREVE -// 2d9 DOT ABOVE -// 2da RING ABOVE -// 2db OGONEK -// 2dc SMALL TILDE -// 2dd DOUBLE ACUTE ACCENT -// 2de MODIFIER LETTER RHOTIC HOOK -// 2df MODIFIER LETTER CROSS ACCENT - { 0x2D2, 0xE, 0x8, 0, 0 }, -// 2e0 MODIFIER LETTER SMALL GAMMA -// 2e1 MODIFIER LETTER SMALL L -// 2e2 MODIFIER LETTER SMALL S -// 2e3 MODIFIER LETTER SMALL X -// 2e4 MODIFIER LETTER SMALL REVERSED GLOTTAL STOP - { 0x2E0, 0x5, 0x9, 0, 0 }, -// 2e5 MODIFIER LETTER EXTRA-HIGH TONE BAR -// 2e6 MODIFIER LETTER HIGH TONE BAR -// 2e7 MODIFIER LETTER MID TONE BAR -// 2e8 MODIFIER LETTER LOW TONE BAR -// 2e9 MODIFIER LETTER EXTRA-LOW TONE BAR -// 2ea MODIFIER LETTER YIN DEPARTING TONE MARK -// 2eb MODIFIER LETTER YANG DEPARTING TONE MARK - { 0x2E5, 0x7, 0x8, 0, 0 }, -// 2ec MODIFIER LETTER VOICING - { 0x2EC, 0x1, 0x9, 0, 0 }, -// 2ed MODIFIER LETTER UNASPIRATED - { 0x2ED, 0x1, 0x8, 0, 0 }, -// 2ee MODIFIER LETTER DOUBLE APOSTROPHE - { 0x2EE, 0x1, 0x9, 0, 0 }, -// 2ef MODIFIER LETTER LOW DOWN ARROWHEAD -// 2f0 MODIFIER LETTER LOW UP ARROWHEAD -// 2f1 MODIFIER LETTER LOW LEFT ARROWHEAD -// 2f2 MODIFIER LETTER LOW RIGHT ARROWHEAD -// 2f3 MODIFIER LETTER LOW RING -// 2f4 MODIFIER LETTER MIDDLE GRAVE ACCENT -// 2f5 MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT -// 2f6 MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT -// 2f7 MODIFIER LETTER LOW TILDE -// 2f8 MODIFIER LETTER RAISED COLON -// 2f9 MODIFIER LETTER BEGIN HIGH TONE -// 2fa MODIFIER LETTER END HIGH TONE -// 2fb MODIFIER LETTER BEGIN LOW TONE -// 2fc MODIFIER LETTER END LOW TONE -// 2fd MODIFIER LETTER SHELF -// 2fe MODIFIER LETTER OPEN SHELF -// 2ff MODIFIER LETTER LOW LEFT ARROW - { 0x2EF, 0x11, 0x8, 0, 0 }, -// 300 COMBINING GRAVE ACCENT -// 301 COMBINING ACUTE ACCENT -// 302 COMBINING CIRCUMFLEX ACCENT -// 303 COMBINING TILDE -// 304 COMBINING MACRON -// 305 COMBINING OVERLINE -// 306 COMBINING BREVE -// 307 COMBINING DOT ABOVE -// 308 COMBINING DIAERESIS -// 309 COMBINING HOOK ABOVE -// 30a COMBINING RING ABOVE -// 30b COMBINING DOUBLE ACUTE ACCENT -// 30c COMBINING CARON -// 30d COMBINING VERTICAL LINE ABOVE -// 30e COMBINING DOUBLE VERTICAL LINE ABOVE -// 30f COMBINING DOUBLE GRAVE ACCENT -// 310 COMBINING CANDRABINDU -// 311 COMBINING INVERTED BREVE -// 312 COMBINING TURNED COMMA ABOVE -// 313 COMBINING COMMA ABOVE -// 314 COMBINING REVERSED COMMA ABOVE -// 315 COMBINING COMMA ABOVE RIGHT -// 316 COMBINING GRAVE ACCENT BELOW -// 317 COMBINING ACUTE ACCENT BELOW -// 318 COMBINING LEFT TACK BELOW -// 319 COMBINING RIGHT TACK BELOW -// 31a COMBINING LEFT ANGLE ABOVE -// 31b COMBINING HORN -// 31c COMBINING LEFT HALF RING BELOW -// 31d COMBINING UP TACK BELOW -// 31e COMBINING DOWN TACK BELOW -// 31f COMBINING PLUS SIGN BELOW -// 320 COMBINING MINUS SIGN BELOW -// 321 COMBINING PALATALIZED HOOK BELOW -// 322 COMBINING RETROFLEX HOOK BELOW -// 323 COMBINING DOT BELOW -// 324 COMBINING DIAERESIS BELOW -// 325 COMBINING RING BELOW -// 326 COMBINING COMMA BELOW -// 327 COMBINING CEDILLA -// 328 COMBINING OGONEK -// 329 COMBINING VERTICAL LINE BELOW -// 32a COMBINING BRIDGE BELOW -// 32b COMBINING INVERTED DOUBLE ARCH BELOW -// 32c COMBINING CARON BELOW -// 32d COMBINING CIRCUMFLEX ACCENT BELOW -// 32e COMBINING BREVE BELOW -// 32f COMBINING INVERTED BREVE BELOW -// 330 COMBINING TILDE BELOW -// 331 COMBINING MACRON BELOW -// 332 COMBINING LOW LINE -// 333 COMBINING DOUBLE LOW LINE -// 334 COMBINING TILDE OVERLAY -// 335 COMBINING SHORT STROKE OVERLAY -// 336 COMBINING LONG STROKE OVERLAY -// 337 COMBINING SHORT SOLIDUS OVERLAY -// 338 COMBINING LONG SOLIDUS OVERLAY -// 339 COMBINING RIGHT HALF RING BELOW -// 33a COMBINING INVERTED BRIDGE BELOW -// 33b COMBINING SQUARE BELOW -// 33c COMBINING SEAGULL BELOW -// 33d COMBINING X ABOVE -// 33e COMBINING VERTICAL TILDE -// 33f COMBINING DOUBLE OVERLINE -// 340 COMBINING GRAVE TONE MARK -// 341 COMBINING ACUTE TONE MARK -// 342 COMBINING GREEK PERISPOMENI -// 343 COMBINING GREEK KORONIS -// 344 COMBINING GREEK DIALYTIKA TONOS - { 0x300, 0x45, 0x0, 0, 0 }, -// 345 COMBINING GREEK YPOGEGRAMMENI - { 0x345, 0x1, 0x0, 0, 84 }, -// 346 COMBINING BRIDGE ABOVE -// 347 COMBINING EQUALS SIGN BELOW -// 348 COMBINING DOUBLE VERTICAL LINE BELOW -// 349 COMBINING LEFT ANGLE BELOW -// 34a COMBINING NOT TILDE ABOVE -// 34b COMBINING HOMOTHETIC ABOVE -// 34c COMBINING ALMOST EQUAL TO ABOVE -// 34d COMBINING LEFT RIGHT ARROW BELOW -// 34e COMBINING UPWARDS ARROW BELOW -// 34f COMBINING GRAPHEME JOINER -// 350 COMBINING RIGHT ARROWHEAD ABOVE -// 351 COMBINING LEFT HALF RING ABOVE -// 352 COMBINING FERMATA -// 353 COMBINING X BELOW -// 354 COMBINING LEFT ARROWHEAD BELOW -// 355 COMBINING RIGHT ARROWHEAD BELOW -// 356 COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW -// 357 COMBINING RIGHT HALF RING ABOVE -// 358 COMBINING DOT ABOVE RIGHT -// 359 COMBINING ASTERISK BELOW -// 35a COMBINING DOUBLE RING BELOW -// 35b COMBINING ZIGZAG ABOVE -// 35c COMBINING DOUBLE BREVE BELOW -// 35d COMBINING DOUBLE BREVE -// 35e COMBINING DOUBLE MACRON -// 35f COMBINING DOUBLE MACRON BELOW -// 360 COMBINING DOUBLE TILDE -// 361 COMBINING DOUBLE INVERTED BREVE -// 362 COMBINING DOUBLE RIGHTWARDS ARROW BELOW -// 363 COMBINING LATIN SMALL LETTER A -// 364 COMBINING LATIN SMALL LETTER E -// 365 COMBINING LATIN SMALL LETTER I -// 366 COMBINING LATIN SMALL LETTER O -// 367 COMBINING LATIN SMALL LETTER U -// 368 COMBINING LATIN SMALL LETTER C -// 369 COMBINING LATIN SMALL LETTER D -// 36a COMBINING LATIN SMALL LETTER H -// 36b COMBINING LATIN SMALL LETTER M -// 36c COMBINING LATIN SMALL LETTER R -// 36d COMBINING LATIN SMALL LETTER T -// 36e COMBINING LATIN SMALL LETTER V -// 36f COMBINING LATIN SMALL LETTER X - { 0x346, 0x2A, 0x0, 0, 0 }, -// 370 GREEK CAPITAL LETTER HETA - { 0x370, 0x1, 0x89, 1, 0 }, -// 371 GREEK SMALL LETTER HETA - { 0x371, 0x1, 0x49, 0, -1 }, -// 372 GREEK CAPITAL LETTER ARCHAIC SAMPI - { 0x372, 0x1, 0x89, 1, 0 }, -// 373 GREEK SMALL LETTER ARCHAIC SAMPI - { 0x373, 0x1, 0x49, 0, -1 }, -// 374 GREEK NUMERAL SIGN - { 0x374, 0x1, 0x9, 0, 0 }, -// 375 GREEK LOWER NUMERAL SIGN - { 0x375, 0x1, 0x8, 0, 0 }, -// 376 GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA - { 0x376, 0x1, 0x89, 1, 0 }, -// 377 GREEK SMALL LETTER PAMPHYLIAN DIGAMMA - { 0x377, 0x1, 0x49, 0, -1 }, -// 37a GREEK YPOGEGRAMMENI - { 0x37A, 0x1, 0x9, 0, 0 }, -// 37b GREEK SMALL REVERSED LUNATE SIGMA SYMBOL -// 37c GREEK SMALL DOTTED LUNATE SIGMA SYMBOL -// 37d GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL - { 0x37B, 0x3, 0x49, 0, 130 }, -// 37e GREEK QUESTION MARK - { 0x37E, 0x1, 0x18, 0, 0 }, -// 37f GREEK CAPITAL LETTER YOT - { 0x37F, 0x1, 0x89, 116, 0 }, -// 384 GREEK TONOS -// 385 GREEK DIALYTIKA TONOS - { 0x384, 0x2, 0x8, 0, 0 }, -// 386 GREEK CAPITAL LETTER ALPHA WITH TONOS - { 0x386, 0x1, 0x89, 38, 0 }, -// 387 GREEK ANO TELEIA - { 0x387, 0x1, 0x18, 0, 0 }, -// 388 GREEK CAPITAL LETTER EPSILON WITH TONOS -// 389 GREEK CAPITAL LETTER ETA WITH TONOS -// 38a GREEK CAPITAL LETTER IOTA WITH TONOS - { 0x388, 0x3, 0x89, 37, 0 }, -// 38c GREEK CAPITAL LETTER OMICRON WITH TONOS - { 0x38C, 0x1, 0x89, 64, 0 }, -// 38e GREEK CAPITAL LETTER UPSILON WITH TONOS -// 38f GREEK CAPITAL LETTER OMEGA WITH TONOS - { 0x38E, 0x2, 0x89, 63, 0 }, -// 390 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS - { 0x390, 0x1, 0x49, 0, 0 }, -// 391 GREEK CAPITAL LETTER ALPHA -// 392 GREEK CAPITAL LETTER BETA -// 393 GREEK CAPITAL LETTER GAMMA -// 394 GREEK CAPITAL LETTER DELTA -// 395 GREEK CAPITAL LETTER EPSILON -// 396 GREEK CAPITAL LETTER ZETA -// 397 GREEK CAPITAL LETTER ETA -// 398 GREEK CAPITAL LETTER THETA -// 399 GREEK CAPITAL LETTER IOTA -// 39a GREEK CAPITAL LETTER KAPPA -// 39b GREEK CAPITAL LETTER LAMDA -// 39c GREEK CAPITAL LETTER MU -// 39d GREEK CAPITAL LETTER NU -// 39e GREEK CAPITAL LETTER XI -// 39f GREEK CAPITAL LETTER OMICRON -// 3a0 GREEK CAPITAL LETTER PI -// 3a1 GREEK CAPITAL LETTER RHO - { 0x391, 0x11, 0x89, 32, 0 }, -// 3a3 GREEK CAPITAL LETTER SIGMA -// 3a4 GREEK CAPITAL LETTER TAU -// 3a5 GREEK CAPITAL LETTER UPSILON -// 3a6 GREEK CAPITAL LETTER PHI -// 3a7 GREEK CAPITAL LETTER CHI -// 3a8 GREEK CAPITAL LETTER PSI -// 3a9 GREEK CAPITAL LETTER OMEGA -// 3aa GREEK CAPITAL LETTER IOTA WITH DIALYTIKA -// 3ab GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA - { 0x3A3, 0x9, 0x89, 32, 0 }, -// 3ac GREEK SMALL LETTER ALPHA WITH TONOS - { 0x3AC, 0x1, 0x49, 0, -38 }, -// 3ad GREEK SMALL LETTER EPSILON WITH TONOS -// 3ae GREEK SMALL LETTER ETA WITH TONOS -// 3af GREEK SMALL LETTER IOTA WITH TONOS - { 0x3AD, 0x3, 0x49, 0, -37 }, -// 3b0 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS - { 0x3B0, 0x1, 0x49, 0, 0 }, -// 3b1 GREEK SMALL LETTER ALPHA -// 3b2 GREEK SMALL LETTER BETA -// 3b3 GREEK SMALL LETTER GAMMA -// 3b4 GREEK SMALL LETTER DELTA -// 3b5 GREEK SMALL LETTER EPSILON -// 3b6 GREEK SMALL LETTER ZETA -// 3b7 GREEK SMALL LETTER ETA -// 3b8 GREEK SMALL LETTER THETA -// 3b9 GREEK SMALL LETTER IOTA -// 3ba GREEK SMALL LETTER KAPPA -// 3bb GREEK SMALL LETTER LAMDA -// 3bc GREEK SMALL LETTER MU -// 3bd GREEK SMALL LETTER NU -// 3be GREEK SMALL LETTER XI -// 3bf GREEK SMALL LETTER OMICRON -// 3c0 GREEK SMALL LETTER PI -// 3c1 GREEK SMALL LETTER RHO - { 0x3B1, 0x11, 0x49, 0, -32 }, -// 3c2 GREEK SMALL LETTER FINAL SIGMA - { 0x3C2, 0x1, 0x49, 0, -31 }, -// 3c3 GREEK SMALL LETTER SIGMA -// 3c4 GREEK SMALL LETTER TAU -// 3c5 GREEK SMALL LETTER UPSILON -// 3c6 GREEK SMALL LETTER PHI -// 3c7 GREEK SMALL LETTER CHI -// 3c8 GREEK SMALL LETTER PSI -// 3c9 GREEK SMALL LETTER OMEGA -// 3ca GREEK SMALL LETTER IOTA WITH DIALYTIKA -// 3cb GREEK SMALL LETTER UPSILON WITH DIALYTIKA - { 0x3C3, 0x9, 0x49, 0, -32 }, -// 3cc GREEK SMALL LETTER OMICRON WITH TONOS - { 0x3CC, 0x1, 0x49, 0, -64 }, -// 3cd GREEK SMALL LETTER UPSILON WITH TONOS -// 3ce GREEK SMALL LETTER OMEGA WITH TONOS - { 0x3CD, 0x2, 0x49, 0, -63 }, -// 3cf GREEK CAPITAL KAI SYMBOL - { 0x3CF, 0x1, 0x89, 8, 0 }, -// 3d0 GREEK BETA SYMBOL - { 0x3D0, 0x1, 0x49, 0, -62 }, -// 3d1 GREEK THETA SYMBOL - { 0x3D1, 0x1, 0x49, 0, -57 }, -// 3d2 GREEK UPSILON WITH HOOK SYMBOL -// 3d3 GREEK UPSILON WITH ACUTE AND HOOK SYMBOL -// 3d4 GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL - { 0x3D2, 0x3, 0x89, 0, 0 }, -// 3d5 GREEK PHI SYMBOL - { 0x3D5, 0x1, 0x49, 0, -47 }, -// 3d6 GREEK PI SYMBOL - { 0x3D6, 0x1, 0x49, 0, -54 }, -// 3d7 GREEK KAI SYMBOL - { 0x3D7, 0x1, 0x49, 0, -8 }, -// 3d8 GREEK LETTER ARCHAIC KOPPA - { 0x3D8, 0x1, 0x89, 1, 0 }, -// 3d9 GREEK SMALL LETTER ARCHAIC KOPPA - { 0x3D9, 0x1, 0x49, 0, -1 }, -// 3da GREEK LETTER STIGMA - { 0x3DA, 0x1, 0x89, 1, 0 }, -// 3db GREEK SMALL LETTER STIGMA - { 0x3DB, 0x1, 0x49, 0, -1 }, -// 3dc GREEK LETTER DIGAMMA - { 0x3DC, 0x1, 0x89, 1, 0 }, -// 3dd GREEK SMALL LETTER DIGAMMA - { 0x3DD, 0x1, 0x49, 0, -1 }, -// 3de GREEK LETTER KOPPA - { 0x3DE, 0x1, 0x89, 1, 0 }, -// 3df GREEK SMALL LETTER KOPPA - { 0x3DF, 0x1, 0x49, 0, -1 }, -// 3e0 GREEK LETTER SAMPI - { 0x3E0, 0x1, 0x89, 1, 0 }, -// 3e1 GREEK SMALL LETTER SAMPI - { 0x3E1, 0x1, 0x49, 0, -1 }, -// 3e2 COPTIC CAPITAL LETTER SHEI - { 0x3E2, 0x1, 0x89, 1, 0 }, -// 3e3 COPTIC SMALL LETTER SHEI - { 0x3E3, 0x1, 0x49, 0, -1 }, -// 3e4 COPTIC CAPITAL LETTER FEI - { 0x3E4, 0x1, 0x89, 1, 0 }, -// 3e5 COPTIC SMALL LETTER FEI - { 0x3E5, 0x1, 0x49, 0, -1 }, -// 3e6 COPTIC CAPITAL LETTER KHEI - { 0x3E6, 0x1, 0x89, 1, 0 }, -// 3e7 COPTIC SMALL LETTER KHEI - { 0x3E7, 0x1, 0x49, 0, -1 }, -// 3e8 COPTIC CAPITAL LETTER HORI - { 0x3E8, 0x1, 0x89, 1, 0 }, -// 3e9 COPTIC SMALL LETTER HORI - { 0x3E9, 0x1, 0x49, 0, -1 }, -// 3ea COPTIC CAPITAL LETTER GANGIA - { 0x3EA, 0x1, 0x89, 1, 0 }, -// 3eb COPTIC SMALL LETTER GANGIA - { 0x3EB, 0x1, 0x49, 0, -1 }, -// 3ec COPTIC CAPITAL LETTER SHIMA - { 0x3EC, 0x1, 0x89, 1, 0 }, -// 3ed COPTIC SMALL LETTER SHIMA - { 0x3ED, 0x1, 0x49, 0, -1 }, -// 3ee COPTIC CAPITAL LETTER DEI - { 0x3EE, 0x1, 0x89, 1, 0 }, -// 3ef COPTIC SMALL LETTER DEI - { 0x3EF, 0x1, 0x49, 0, -1 }, -// 3f0 GREEK KAPPA SYMBOL - { 0x3F0, 0x1, 0x49, 0, -86 }, -// 3f1 GREEK RHO SYMBOL - { 0x3F1, 0x1, 0x49, 0, -80 }, -// 3f2 GREEK LUNATE SIGMA SYMBOL - { 0x3F2, 0x1, 0x49, 0, 7 }, -// 3f3 GREEK LETTER YOT - { 0x3F3, 0x1, 0x49, 0, -116 }, -// 3f4 GREEK CAPITAL THETA SYMBOL - { 0x3F4, 0x1, 0x89, -60, 0 }, -// 3f5 GREEK LUNATE EPSILON SYMBOL - { 0x3F5, 0x1, 0x49, 0, -96 }, -// 3f6 GREEK REVERSED LUNATE EPSILON SYMBOL - { 0x3F6, 0x1, 0x8, 0, 0 }, -// 3f7 GREEK CAPITAL LETTER SHO - { 0x3F7, 0x1, 0x89, 1, 0 }, -// 3f8 GREEK SMALL LETTER SHO - { 0x3F8, 0x1, 0x49, 0, -1 }, -// 3f9 GREEK CAPITAL LUNATE SIGMA SYMBOL - { 0x3F9, 0x1, 0x89, -7, 0 }, -// 3fa GREEK CAPITAL LETTER SAN - { 0x3FA, 0x1, 0x89, 1, 0 }, -// 3fb GREEK SMALL LETTER SAN - { 0x3FB, 0x1, 0x49, 0, -1 }, -// 3fc GREEK RHO WITH STROKE SYMBOL - { 0x3FC, 0x1, 0x49, 0, 0 }, -// 3fd GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL -// 3fe GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL -// 3ff GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL - { 0x3FD, 0x3, 0x89, -130, 0 }, -// 400 CYRILLIC CAPITAL LETTER IE WITH GRAVE -// 401 CYRILLIC CAPITAL LETTER IO -// 402 CYRILLIC CAPITAL LETTER DJE -// 403 CYRILLIC CAPITAL LETTER GJE -// 404 CYRILLIC CAPITAL LETTER UKRAINIAN IE -// 405 CYRILLIC CAPITAL LETTER DZE -// 406 CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I -// 407 CYRILLIC CAPITAL LETTER YI -// 408 CYRILLIC CAPITAL LETTER JE -// 409 CYRILLIC CAPITAL LETTER LJE -// 40a CYRILLIC CAPITAL LETTER NJE -// 40b CYRILLIC CAPITAL LETTER TSHE -// 40c CYRILLIC CAPITAL LETTER KJE -// 40d CYRILLIC CAPITAL LETTER I WITH GRAVE -// 40e CYRILLIC CAPITAL LETTER SHORT U -// 40f CYRILLIC CAPITAL LETTER DZHE - { 0x400, 0x10, 0x89, 80, 0 }, -// 410 CYRILLIC CAPITAL LETTER A -// 411 CYRILLIC CAPITAL LETTER BE -// 412 CYRILLIC CAPITAL LETTER VE -// 413 CYRILLIC CAPITAL LETTER GHE -// 414 CYRILLIC CAPITAL LETTER DE -// 415 CYRILLIC CAPITAL LETTER IE -// 416 CYRILLIC CAPITAL LETTER ZHE -// 417 CYRILLIC CAPITAL LETTER ZE -// 418 CYRILLIC CAPITAL LETTER I -// 419 CYRILLIC CAPITAL LETTER SHORT I -// 41a CYRILLIC CAPITAL LETTER KA -// 41b CYRILLIC CAPITAL LETTER EL -// 41c CYRILLIC CAPITAL LETTER EM -// 41d CYRILLIC CAPITAL LETTER EN -// 41e CYRILLIC CAPITAL LETTER O -// 41f CYRILLIC CAPITAL LETTER PE -// 420 CYRILLIC CAPITAL LETTER ER -// 421 CYRILLIC CAPITAL LETTER ES -// 422 CYRILLIC CAPITAL LETTER TE -// 423 CYRILLIC CAPITAL LETTER U -// 424 CYRILLIC CAPITAL LETTER EF -// 425 CYRILLIC CAPITAL LETTER HA -// 426 CYRILLIC CAPITAL LETTER TSE -// 427 CYRILLIC CAPITAL LETTER CHE -// 428 CYRILLIC CAPITAL LETTER SHA -// 429 CYRILLIC CAPITAL LETTER SHCHA -// 42a CYRILLIC CAPITAL LETTER HARD SIGN -// 42b CYRILLIC CAPITAL LETTER YERU -// 42c CYRILLIC CAPITAL LETTER SOFT SIGN -// 42d CYRILLIC CAPITAL LETTER E -// 42e CYRILLIC CAPITAL LETTER YU -// 42f CYRILLIC CAPITAL LETTER YA - { 0x410, 0x20, 0x89, 32, 0 }, -// 430 CYRILLIC SMALL LETTER A -// 431 CYRILLIC SMALL LETTER BE -// 432 CYRILLIC SMALL LETTER VE -// 433 CYRILLIC SMALL LETTER GHE -// 434 CYRILLIC SMALL LETTER DE -// 435 CYRILLIC SMALL LETTER IE -// 436 CYRILLIC SMALL LETTER ZHE -// 437 CYRILLIC SMALL LETTER ZE -// 438 CYRILLIC SMALL LETTER I -// 439 CYRILLIC SMALL LETTER SHORT I -// 43a CYRILLIC SMALL LETTER KA -// 43b CYRILLIC SMALL LETTER EL -// 43c CYRILLIC SMALL LETTER EM -// 43d CYRILLIC SMALL LETTER EN -// 43e CYRILLIC SMALL LETTER O -// 43f CYRILLIC SMALL LETTER PE -// 440 CYRILLIC SMALL LETTER ER -// 441 CYRILLIC SMALL LETTER ES -// 442 CYRILLIC SMALL LETTER TE -// 443 CYRILLIC SMALL LETTER U -// 444 CYRILLIC SMALL LETTER EF -// 445 CYRILLIC SMALL LETTER HA -// 446 CYRILLIC SMALL LETTER TSE -// 447 CYRILLIC SMALL LETTER CHE -// 448 CYRILLIC SMALL LETTER SHA -// 449 CYRILLIC SMALL LETTER SHCHA -// 44a CYRILLIC SMALL LETTER HARD SIGN -// 44b CYRILLIC SMALL LETTER YERU -// 44c CYRILLIC SMALL LETTER SOFT SIGN -// 44d CYRILLIC SMALL LETTER E -// 44e CYRILLIC SMALL LETTER YU -// 44f CYRILLIC SMALL LETTER YA - { 0x430, 0x20, 0x49, 0, -32 }, -// 450 CYRILLIC SMALL LETTER IE WITH GRAVE -// 451 CYRILLIC SMALL LETTER IO -// 452 CYRILLIC SMALL LETTER DJE -// 453 CYRILLIC SMALL LETTER GJE -// 454 CYRILLIC SMALL LETTER UKRAINIAN IE -// 455 CYRILLIC SMALL LETTER DZE -// 456 CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I -// 457 CYRILLIC SMALL LETTER YI -// 458 CYRILLIC SMALL LETTER JE -// 459 CYRILLIC SMALL LETTER LJE -// 45a CYRILLIC SMALL LETTER NJE -// 45b CYRILLIC SMALL LETTER TSHE -// 45c CYRILLIC SMALL LETTER KJE -// 45d CYRILLIC SMALL LETTER I WITH GRAVE -// 45e CYRILLIC SMALL LETTER SHORT U -// 45f CYRILLIC SMALL LETTER DZHE - { 0x450, 0x10, 0x49, 0, -80 }, -// 460 CYRILLIC CAPITAL LETTER OMEGA - { 0x460, 0x1, 0x89, 1, 0 }, -// 461 CYRILLIC SMALL LETTER OMEGA - { 0x461, 0x1, 0x49, 0, -1 }, -// 462 CYRILLIC CAPITAL LETTER YAT - { 0x462, 0x1, 0x89, 1, 0 }, -// 463 CYRILLIC SMALL LETTER YAT - { 0x463, 0x1, 0x49, 0, -1 }, -// 464 CYRILLIC CAPITAL LETTER IOTIFIED E - { 0x464, 0x1, 0x89, 1, 0 }, -// 465 CYRILLIC SMALL LETTER IOTIFIED E - { 0x465, 0x1, 0x49, 0, -1 }, -// 466 CYRILLIC CAPITAL LETTER LITTLE YUS - { 0x466, 0x1, 0x89, 1, 0 }, -// 467 CYRILLIC SMALL LETTER LITTLE YUS - { 0x467, 0x1, 0x49, 0, -1 }, -// 468 CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS - { 0x468, 0x1, 0x89, 1, 0 }, -// 469 CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS - { 0x469, 0x1, 0x49, 0, -1 }, -// 46a CYRILLIC CAPITAL LETTER BIG YUS - { 0x46A, 0x1, 0x89, 1, 0 }, -// 46b CYRILLIC SMALL LETTER BIG YUS - { 0x46B, 0x1, 0x49, 0, -1 }, -// 46c CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS - { 0x46C, 0x1, 0x89, 1, 0 }, -// 46d CYRILLIC SMALL LETTER IOTIFIED BIG YUS - { 0x46D, 0x1, 0x49, 0, -1 }, -// 46e CYRILLIC CAPITAL LETTER KSI - { 0x46E, 0x1, 0x89, 1, 0 }, -// 46f CYRILLIC SMALL LETTER KSI - { 0x46F, 0x1, 0x49, 0, -1 }, -// 470 CYRILLIC CAPITAL LETTER PSI - { 0x470, 0x1, 0x89, 1, 0 }, -// 471 CYRILLIC SMALL LETTER PSI - { 0x471, 0x1, 0x49, 0, -1 }, -// 472 CYRILLIC CAPITAL LETTER FITA - { 0x472, 0x1, 0x89, 1, 0 }, -// 473 CYRILLIC SMALL LETTER FITA - { 0x473, 0x1, 0x49, 0, -1 }, -// 474 CYRILLIC CAPITAL LETTER IZHITSA - { 0x474, 0x1, 0x89, 1, 0 }, -// 475 CYRILLIC SMALL LETTER IZHITSA - { 0x475, 0x1, 0x49, 0, -1 }, -// 476 CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT - { 0x476, 0x1, 0x89, 1, 0 }, -// 477 CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT - { 0x477, 0x1, 0x49, 0, -1 }, -// 478 CYRILLIC CAPITAL LETTER UK - { 0x478, 0x1, 0x89, 1, 0 }, -// 479 CYRILLIC SMALL LETTER UK - { 0x479, 0x1, 0x49, 0, -1 }, -// 47a CYRILLIC CAPITAL LETTER ROUND OMEGA - { 0x47A, 0x1, 0x89, 1, 0 }, -// 47b CYRILLIC SMALL LETTER ROUND OMEGA - { 0x47B, 0x1, 0x49, 0, -1 }, -// 47c CYRILLIC CAPITAL LETTER OMEGA WITH TITLO - { 0x47C, 0x1, 0x89, 1, 0 }, -// 47d CYRILLIC SMALL LETTER OMEGA WITH TITLO - { 0x47D, 0x1, 0x49, 0, -1 }, -// 47e CYRILLIC CAPITAL LETTER OT - { 0x47E, 0x1, 0x89, 1, 0 }, -// 47f CYRILLIC SMALL LETTER OT - { 0x47F, 0x1, 0x49, 0, -1 }, -// 480 CYRILLIC CAPITAL LETTER KOPPA - { 0x480, 0x1, 0x89, 1, 0 }, -// 481 CYRILLIC SMALL LETTER KOPPA - { 0x481, 0x1, 0x49, 0, -1 }, -// 482 CYRILLIC THOUSANDS SIGN - { 0x482, 0x1, 0x8, 0, 0 }, -// 483 COMBINING CYRILLIC TITLO -// 484 COMBINING CYRILLIC PALATALIZATION -// 485 COMBINING CYRILLIC DASIA PNEUMATA -// 486 COMBINING CYRILLIC PSILI PNEUMATA -// 487 COMBINING CYRILLIC POKRYTIE -// 488 COMBINING CYRILLIC HUNDRED THOUSANDS SIGN -// 489 COMBINING CYRILLIC MILLIONS SIGN - { 0x483, 0x7, 0x0, 0, 0 }, -// 48a CYRILLIC CAPITAL LETTER SHORT I WITH TAIL - { 0x48A, 0x1, 0x89, 1, 0 }, -// 48b CYRILLIC SMALL LETTER SHORT I WITH TAIL - { 0x48B, 0x1, 0x49, 0, -1 }, -// 48c CYRILLIC CAPITAL LETTER SEMISOFT SIGN - { 0x48C, 0x1, 0x89, 1, 0 }, -// 48d CYRILLIC SMALL LETTER SEMISOFT SIGN - { 0x48D, 0x1, 0x49, 0, -1 }, -// 48e CYRILLIC CAPITAL LETTER ER WITH TICK - { 0x48E, 0x1, 0x89, 1, 0 }, -// 48f CYRILLIC SMALL LETTER ER WITH TICK - { 0x48F, 0x1, 0x49, 0, -1 }, -// 490 CYRILLIC CAPITAL LETTER GHE WITH UPTURN - { 0x490, 0x1, 0x89, 1, 0 }, -// 491 CYRILLIC SMALL LETTER GHE WITH UPTURN - { 0x491, 0x1, 0x49, 0, -1 }, -// 492 CYRILLIC CAPITAL LETTER GHE WITH STROKE - { 0x492, 0x1, 0x89, 1, 0 }, -// 493 CYRILLIC SMALL LETTER GHE WITH STROKE - { 0x493, 0x1, 0x49, 0, -1 }, -// 494 CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK - { 0x494, 0x1, 0x89, 1, 0 }, -// 495 CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK - { 0x495, 0x1, 0x49, 0, -1 }, -// 496 CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER - { 0x496, 0x1, 0x89, 1, 0 }, -// 497 CYRILLIC SMALL LETTER ZHE WITH DESCENDER - { 0x497, 0x1, 0x49, 0, -1 }, -// 498 CYRILLIC CAPITAL LETTER ZE WITH DESCENDER - { 0x498, 0x1, 0x89, 1, 0 }, -// 499 CYRILLIC SMALL LETTER ZE WITH DESCENDER - { 0x499, 0x1, 0x49, 0, -1 }, -// 49a CYRILLIC CAPITAL LETTER KA WITH DESCENDER - { 0x49A, 0x1, 0x89, 1, 0 }, -// 49b CYRILLIC SMALL LETTER KA WITH DESCENDER - { 0x49B, 0x1, 0x49, 0, -1 }, -// 49c CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE - { 0x49C, 0x1, 0x89, 1, 0 }, -// 49d CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE - { 0x49D, 0x1, 0x49, 0, -1 }, -// 49e CYRILLIC CAPITAL LETTER KA WITH STROKE - { 0x49E, 0x1, 0x89, 1, 0 }, -// 49f CYRILLIC SMALL LETTER KA WITH STROKE - { 0x49F, 0x1, 0x49, 0, -1 }, -// 4a0 CYRILLIC CAPITAL LETTER BASHKIR KA - { 0x4A0, 0x1, 0x89, 1, 0 }, -// 4a1 CYRILLIC SMALL LETTER BASHKIR KA - { 0x4A1, 0x1, 0x49, 0, -1 }, -// 4a2 CYRILLIC CAPITAL LETTER EN WITH DESCENDER - { 0x4A2, 0x1, 0x89, 1, 0 }, -// 4a3 CYRILLIC SMALL LETTER EN WITH DESCENDER - { 0x4A3, 0x1, 0x49, 0, -1 }, -// 4a4 CYRILLIC CAPITAL LIGATURE EN GHE - { 0x4A4, 0x1, 0x89, 1, 0 }, -// 4a5 CYRILLIC SMALL LIGATURE EN GHE - { 0x4A5, 0x1, 0x49, 0, -1 }, -// 4a6 CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK - { 0x4A6, 0x1, 0x89, 1, 0 }, -// 4a7 CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK - { 0x4A7, 0x1, 0x49, 0, -1 }, -// 4a8 CYRILLIC CAPITAL LETTER ABKHASIAN HA - { 0x4A8, 0x1, 0x89, 1, 0 }, -// 4a9 CYRILLIC SMALL LETTER ABKHASIAN HA - { 0x4A9, 0x1, 0x49, 0, -1 }, -// 4aa CYRILLIC CAPITAL LETTER ES WITH DESCENDER - { 0x4AA, 0x1, 0x89, 1, 0 }, -// 4ab CYRILLIC SMALL LETTER ES WITH DESCENDER - { 0x4AB, 0x1, 0x49, 0, -1 }, -// 4ac CYRILLIC CAPITAL LETTER TE WITH DESCENDER - { 0x4AC, 0x1, 0x89, 1, 0 }, -// 4ad CYRILLIC SMALL LETTER TE WITH DESCENDER - { 0x4AD, 0x1, 0x49, 0, -1 }, -// 4ae CYRILLIC CAPITAL LETTER STRAIGHT U - { 0x4AE, 0x1, 0x89, 1, 0 }, -// 4af CYRILLIC SMALL LETTER STRAIGHT U - { 0x4AF, 0x1, 0x49, 0, -1 }, -// 4b0 CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE - { 0x4B0, 0x1, 0x89, 1, 0 }, -// 4b1 CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE - { 0x4B1, 0x1, 0x49, 0, -1 }, -// 4b2 CYRILLIC CAPITAL LETTER HA WITH DESCENDER - { 0x4B2, 0x1, 0x89, 1, 0 }, -// 4b3 CYRILLIC SMALL LETTER HA WITH DESCENDER - { 0x4B3, 0x1, 0x49, 0, -1 }, -// 4b4 CYRILLIC CAPITAL LIGATURE TE TSE - { 0x4B4, 0x1, 0x89, 1, 0 }, -// 4b5 CYRILLIC SMALL LIGATURE TE TSE - { 0x4B5, 0x1, 0x49, 0, -1 }, -// 4b6 CYRILLIC CAPITAL LETTER CHE WITH DESCENDER - { 0x4B6, 0x1, 0x89, 1, 0 }, -// 4b7 CYRILLIC SMALL LETTER CHE WITH DESCENDER - { 0x4B7, 0x1, 0x49, 0, -1 }, -// 4b8 CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE - { 0x4B8, 0x1, 0x89, 1, 0 }, -// 4b9 CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE - { 0x4B9, 0x1, 0x49, 0, -1 }, -// 4ba CYRILLIC CAPITAL LETTER SHHA - { 0x4BA, 0x1, 0x89, 1, 0 }, -// 4bb CYRILLIC SMALL LETTER SHHA - { 0x4BB, 0x1, 0x49, 0, -1 }, -// 4bc CYRILLIC CAPITAL LETTER ABKHASIAN CHE - { 0x4BC, 0x1, 0x89, 1, 0 }, -// 4bd CYRILLIC SMALL LETTER ABKHASIAN CHE - { 0x4BD, 0x1, 0x49, 0, -1 }, -// 4be CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER - { 0x4BE, 0x1, 0x89, 1, 0 }, -// 4bf CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER - { 0x4BF, 0x1, 0x49, 0, -1 }, -// 4c0 CYRILLIC LETTER PALOCHKA - { 0x4C0, 0x1, 0x89, 15, 0 }, -// 4c1 CYRILLIC CAPITAL LETTER ZHE WITH BREVE - { 0x4C1, 0x1, 0x89, 1, 0 }, -// 4c2 CYRILLIC SMALL LETTER ZHE WITH BREVE - { 0x4C2, 0x1, 0x49, 0, -1 }, -// 4c3 CYRILLIC CAPITAL LETTER KA WITH HOOK - { 0x4C3, 0x1, 0x89, 1, 0 }, -// 4c4 CYRILLIC SMALL LETTER KA WITH HOOK - { 0x4C4, 0x1, 0x49, 0, -1 }, -// 4c5 CYRILLIC CAPITAL LETTER EL WITH TAIL - { 0x4C5, 0x1, 0x89, 1, 0 }, -// 4c6 CYRILLIC SMALL LETTER EL WITH TAIL - { 0x4C6, 0x1, 0x49, 0, -1 }, -// 4c7 CYRILLIC CAPITAL LETTER EN WITH HOOK - { 0x4C7, 0x1, 0x89, 1, 0 }, -// 4c8 CYRILLIC SMALL LETTER EN WITH HOOK - { 0x4C8, 0x1, 0x49, 0, -1 }, -// 4c9 CYRILLIC CAPITAL LETTER EN WITH TAIL - { 0x4C9, 0x1, 0x89, 1, 0 }, -// 4ca CYRILLIC SMALL LETTER EN WITH TAIL - { 0x4CA, 0x1, 0x49, 0, -1 }, -// 4cb CYRILLIC CAPITAL LETTER KHAKASSIAN CHE - { 0x4CB, 0x1, 0x89, 1, 0 }, -// 4cc CYRILLIC SMALL LETTER KHAKASSIAN CHE - { 0x4CC, 0x1, 0x49, 0, -1 }, -// 4cd CYRILLIC CAPITAL LETTER EM WITH TAIL - { 0x4CD, 0x1, 0x89, 1, 0 }, -// 4ce CYRILLIC SMALL LETTER EM WITH TAIL - { 0x4CE, 0x1, 0x49, 0, -1 }, -// 4cf CYRILLIC SMALL LETTER PALOCHKA - { 0x4CF, 0x1, 0x49, 0, -15 }, -// 4d0 CYRILLIC CAPITAL LETTER A WITH BREVE - { 0x4D0, 0x1, 0x89, 1, 0 }, -// 4d1 CYRILLIC SMALL LETTER A WITH BREVE - { 0x4D1, 0x1, 0x49, 0, -1 }, -// 4d2 CYRILLIC CAPITAL LETTER A WITH DIAERESIS - { 0x4D2, 0x1, 0x89, 1, 0 }, -// 4d3 CYRILLIC SMALL LETTER A WITH DIAERESIS - { 0x4D3, 0x1, 0x49, 0, -1 }, -// 4d4 CYRILLIC CAPITAL LIGATURE A IE - { 0x4D4, 0x1, 0x89, 1, 0 }, -// 4d5 CYRILLIC SMALL LIGATURE A IE - { 0x4D5, 0x1, 0x49, 0, -1 }, -// 4d6 CYRILLIC CAPITAL LETTER IE WITH BREVE - { 0x4D6, 0x1, 0x89, 1, 0 }, -// 4d7 CYRILLIC SMALL LETTER IE WITH BREVE - { 0x4D7, 0x1, 0x49, 0, -1 }, -// 4d8 CYRILLIC CAPITAL LETTER SCHWA - { 0x4D8, 0x1, 0x89, 1, 0 }, -// 4d9 CYRILLIC SMALL LETTER SCHWA - { 0x4D9, 0x1, 0x49, 0, -1 }, -// 4da CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS - { 0x4DA, 0x1, 0x89, 1, 0 }, -// 4db CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS - { 0x4DB, 0x1, 0x49, 0, -1 }, -// 4dc CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS - { 0x4DC, 0x1, 0x89, 1, 0 }, -// 4dd CYRILLIC SMALL LETTER ZHE WITH DIAERESIS - { 0x4DD, 0x1, 0x49, 0, -1 }, -// 4de CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS - { 0x4DE, 0x1, 0x89, 1, 0 }, -// 4df CYRILLIC SMALL LETTER ZE WITH DIAERESIS - { 0x4DF, 0x1, 0x49, 0, -1 }, -// 4e0 CYRILLIC CAPITAL LETTER ABKHASIAN DZE - { 0x4E0, 0x1, 0x89, 1, 0 }, -// 4e1 CYRILLIC SMALL LETTER ABKHASIAN DZE - { 0x4E1, 0x1, 0x49, 0, -1 }, -// 4e2 CYRILLIC CAPITAL LETTER I WITH MACRON - { 0x4E2, 0x1, 0x89, 1, 0 }, -// 4e3 CYRILLIC SMALL LETTER I WITH MACRON - { 0x4E3, 0x1, 0x49, 0, -1 }, -// 4e4 CYRILLIC CAPITAL LETTER I WITH DIAERESIS - { 0x4E4, 0x1, 0x89, 1, 0 }, -// 4e5 CYRILLIC SMALL LETTER I WITH DIAERESIS - { 0x4E5, 0x1, 0x49, 0, -1 }, -// 4e6 CYRILLIC CAPITAL LETTER O WITH DIAERESIS - { 0x4E6, 0x1, 0x89, 1, 0 }, -// 4e7 CYRILLIC SMALL LETTER O WITH DIAERESIS - { 0x4E7, 0x1, 0x49, 0, -1 }, -// 4e8 CYRILLIC CAPITAL LETTER BARRED O - { 0x4E8, 0x1, 0x89, 1, 0 }, -// 4e9 CYRILLIC SMALL LETTER BARRED O - { 0x4E9, 0x1, 0x49, 0, -1 }, -// 4ea CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS - { 0x4EA, 0x1, 0x89, 1, 0 }, -// 4eb CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS - { 0x4EB, 0x1, 0x49, 0, -1 }, -// 4ec CYRILLIC CAPITAL LETTER E WITH DIAERESIS - { 0x4EC, 0x1, 0x89, 1, 0 }, -// 4ed CYRILLIC SMALL LETTER E WITH DIAERESIS - { 0x4ED, 0x1, 0x49, 0, -1 }, -// 4ee CYRILLIC CAPITAL LETTER U WITH MACRON - { 0x4EE, 0x1, 0x89, 1, 0 }, -// 4ef CYRILLIC SMALL LETTER U WITH MACRON - { 0x4EF, 0x1, 0x49, 0, -1 }, -// 4f0 CYRILLIC CAPITAL LETTER U WITH DIAERESIS - { 0x4F0, 0x1, 0x89, 1, 0 }, -// 4f1 CYRILLIC SMALL LETTER U WITH DIAERESIS - { 0x4F1, 0x1, 0x49, 0, -1 }, -// 4f2 CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE - { 0x4F2, 0x1, 0x89, 1, 0 }, -// 4f3 CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE - { 0x4F3, 0x1, 0x49, 0, -1 }, -// 4f4 CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS - { 0x4F4, 0x1, 0x89, 1, 0 }, -// 4f5 CYRILLIC SMALL LETTER CHE WITH DIAERESIS - { 0x4F5, 0x1, 0x49, 0, -1 }, -// 4f6 CYRILLIC CAPITAL LETTER GHE WITH DESCENDER - { 0x4F6, 0x1, 0x89, 1, 0 }, -// 4f7 CYRILLIC SMALL LETTER GHE WITH DESCENDER - { 0x4F7, 0x1, 0x49, 0, -1 }, -// 4f8 CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS - { 0x4F8, 0x1, 0x89, 1, 0 }, -// 4f9 CYRILLIC SMALL LETTER YERU WITH DIAERESIS - { 0x4F9, 0x1, 0x49, 0, -1 }, -// 4fa CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK - { 0x4FA, 0x1, 0x89, 1, 0 }, -// 4fb CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK - { 0x4FB, 0x1, 0x49, 0, -1 }, -// 4fc CYRILLIC CAPITAL LETTER HA WITH HOOK - { 0x4FC, 0x1, 0x89, 1, 0 }, -// 4fd CYRILLIC SMALL LETTER HA WITH HOOK - { 0x4FD, 0x1, 0x49, 0, -1 }, -// 4fe CYRILLIC CAPITAL LETTER HA WITH STROKE - { 0x4FE, 0x1, 0x89, 1, 0 }, -// 4ff CYRILLIC SMALL LETTER HA WITH STROKE - { 0x4FF, 0x1, 0x49, 0, -1 }, -// 500 CYRILLIC CAPITAL LETTER KOMI DE - { 0x500, 0x1, 0x89, 1, 0 }, -// 501 CYRILLIC SMALL LETTER KOMI DE - { 0x501, 0x1, 0x49, 0, -1 }, -// 502 CYRILLIC CAPITAL LETTER KOMI DJE - { 0x502, 0x1, 0x89, 1, 0 }, -// 503 CYRILLIC SMALL LETTER KOMI DJE - { 0x503, 0x1, 0x49, 0, -1 }, -// 504 CYRILLIC CAPITAL LETTER KOMI ZJE - { 0x504, 0x1, 0x89, 1, 0 }, -// 505 CYRILLIC SMALL LETTER KOMI ZJE - { 0x505, 0x1, 0x49, 0, -1 }, -// 506 CYRILLIC CAPITAL LETTER KOMI DZJE - { 0x506, 0x1, 0x89, 1, 0 }, -// 507 CYRILLIC SMALL LETTER KOMI DZJE - { 0x507, 0x1, 0x49, 0, -1 }, -// 508 CYRILLIC CAPITAL LETTER KOMI LJE - { 0x508, 0x1, 0x89, 1, 0 }, -// 509 CYRILLIC SMALL LETTER KOMI LJE - { 0x509, 0x1, 0x49, 0, -1 }, -// 50a CYRILLIC CAPITAL LETTER KOMI NJE - { 0x50A, 0x1, 0x89, 1, 0 }, -// 50b CYRILLIC SMALL LETTER KOMI NJE - { 0x50B, 0x1, 0x49, 0, -1 }, -// 50c CYRILLIC CAPITAL LETTER KOMI SJE - { 0x50C, 0x1, 0x89, 1, 0 }, -// 50d CYRILLIC SMALL LETTER KOMI SJE - { 0x50D, 0x1, 0x49, 0, -1 }, -// 50e CYRILLIC CAPITAL LETTER KOMI TJE - { 0x50E, 0x1, 0x89, 1, 0 }, -// 50f CYRILLIC SMALL LETTER KOMI TJE - { 0x50F, 0x1, 0x49, 0, -1 }, -// 510 CYRILLIC CAPITAL LETTER REVERSED ZE - { 0x510, 0x1, 0x89, 1, 0 }, -// 511 CYRILLIC SMALL LETTER REVERSED ZE - { 0x511, 0x1, 0x49, 0, -1 }, -// 512 CYRILLIC CAPITAL LETTER EL WITH HOOK - { 0x512, 0x1, 0x89, 1, 0 }, -// 513 CYRILLIC SMALL LETTER EL WITH HOOK - { 0x513, 0x1, 0x49, 0, -1 }, -// 514 CYRILLIC CAPITAL LETTER LHA - { 0x514, 0x1, 0x89, 1, 0 }, -// 515 CYRILLIC SMALL LETTER LHA - { 0x515, 0x1, 0x49, 0, -1 }, -// 516 CYRILLIC CAPITAL LETTER RHA - { 0x516, 0x1, 0x89, 1, 0 }, -// 517 CYRILLIC SMALL LETTER RHA - { 0x517, 0x1, 0x49, 0, -1 }, -// 518 CYRILLIC CAPITAL LETTER YAE - { 0x518, 0x1, 0x89, 1, 0 }, -// 519 CYRILLIC SMALL LETTER YAE - { 0x519, 0x1, 0x49, 0, -1 }, -// 51a CYRILLIC CAPITAL LETTER QA - { 0x51A, 0x1, 0x89, 1, 0 }, -// 51b CYRILLIC SMALL LETTER QA - { 0x51B, 0x1, 0x49, 0, -1 }, -// 51c CYRILLIC CAPITAL LETTER WE - { 0x51C, 0x1, 0x89, 1, 0 }, -// 51d CYRILLIC SMALL LETTER WE - { 0x51D, 0x1, 0x49, 0, -1 }, -// 51e CYRILLIC CAPITAL LETTER ALEUT KA - { 0x51E, 0x1, 0x89, 1, 0 }, -// 51f CYRILLIC SMALL LETTER ALEUT KA - { 0x51F, 0x1, 0x49, 0, -1 }, -// 520 CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK - { 0x520, 0x1, 0x89, 1, 0 }, -// 521 CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK - { 0x521, 0x1, 0x49, 0, -1 }, -// 522 CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK - { 0x522, 0x1, 0x89, 1, 0 }, -// 523 CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK - { 0x523, 0x1, 0x49, 0, -1 }, -// 524 CYRILLIC CAPITAL LETTER PE WITH DESCENDER - { 0x524, 0x1, 0x89, 1, 0 }, -// 525 CYRILLIC SMALL LETTER PE WITH DESCENDER - { 0x525, 0x1, 0x49, 0, -1 }, -// 526 CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER - { 0x526, 0x1, 0x89, 1, 0 }, -// 527 CYRILLIC SMALL LETTER SHHA WITH DESCENDER - { 0x527, 0x1, 0x49, 0, -1 }, -// 528 CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK - { 0x528, 0x1, 0x89, 1, 0 }, -// 529 CYRILLIC SMALL LETTER EN WITH LEFT HOOK - { 0x529, 0x1, 0x49, 0, -1 }, -// 52a CYRILLIC CAPITAL LETTER DZZHE - { 0x52A, 0x1, 0x89, 1, 0 }, -// 52b CYRILLIC SMALL LETTER DZZHE - { 0x52B, 0x1, 0x49, 0, -1 }, -// 52c CYRILLIC CAPITAL LETTER DCHE - { 0x52C, 0x1, 0x89, 1, 0 }, -// 52d CYRILLIC SMALL LETTER DCHE - { 0x52D, 0x1, 0x49, 0, -1 }, -// 52e CYRILLIC CAPITAL LETTER EL WITH DESCENDER - { 0x52E, 0x1, 0x89, 1, 0 }, -// 52f CYRILLIC SMALL LETTER EL WITH DESCENDER - { 0x52F, 0x1, 0x49, 0, -1 }, -// 531 ARMENIAN CAPITAL LETTER AYB -// 532 ARMENIAN CAPITAL LETTER BEN -// 533 ARMENIAN CAPITAL LETTER GIM -// 534 ARMENIAN CAPITAL LETTER DA -// 535 ARMENIAN CAPITAL LETTER ECH -// 536 ARMENIAN CAPITAL LETTER ZA -// 537 ARMENIAN CAPITAL LETTER EH -// 538 ARMENIAN CAPITAL LETTER ET -// 539 ARMENIAN CAPITAL LETTER TO -// 53a ARMENIAN CAPITAL LETTER ZHE -// 53b ARMENIAN CAPITAL LETTER INI -// 53c ARMENIAN CAPITAL LETTER LIWN -// 53d ARMENIAN CAPITAL LETTER XEH -// 53e ARMENIAN CAPITAL LETTER CA -// 53f ARMENIAN CAPITAL LETTER KEN -// 540 ARMENIAN CAPITAL LETTER HO -// 541 ARMENIAN CAPITAL LETTER JA -// 542 ARMENIAN CAPITAL LETTER GHAD -// 543 ARMENIAN CAPITAL LETTER CHEH -// 544 ARMENIAN CAPITAL LETTER MEN -// 545 ARMENIAN CAPITAL LETTER YI -// 546 ARMENIAN CAPITAL LETTER NOW -// 547 ARMENIAN CAPITAL LETTER SHA -// 548 ARMENIAN CAPITAL LETTER VO -// 549 ARMENIAN CAPITAL LETTER CHA -// 54a ARMENIAN CAPITAL LETTER PEH -// 54b ARMENIAN CAPITAL LETTER JHEH -// 54c ARMENIAN CAPITAL LETTER RA -// 54d ARMENIAN CAPITAL LETTER SEH -// 54e ARMENIAN CAPITAL LETTER VEW -// 54f ARMENIAN CAPITAL LETTER TIWN -// 550 ARMENIAN CAPITAL LETTER REH -// 551 ARMENIAN CAPITAL LETTER CO -// 552 ARMENIAN CAPITAL LETTER YIWN -// 553 ARMENIAN CAPITAL LETTER PIWR -// 554 ARMENIAN CAPITAL LETTER KEH -// 555 ARMENIAN CAPITAL LETTER OH -// 556 ARMENIAN CAPITAL LETTER FEH - { 0x531, 0x26, 0x89, 48, 0 }, -// 559 ARMENIAN MODIFIER LETTER LEFT HALF RING - { 0x559, 0x1, 0x9, 0, 0 }, -// 55a ARMENIAN APOSTROPHE -// 55b ARMENIAN EMPHASIS MARK -// 55c ARMENIAN EXCLAMATION MARK -// 55d ARMENIAN COMMA -// 55e ARMENIAN QUESTION MARK -// 55f ARMENIAN ABBREVIATION MARK - { 0x55A, 0x6, 0x18, 0, 0 }, -// 561 ARMENIAN SMALL LETTER AYB -// 562 ARMENIAN SMALL LETTER BEN -// 563 ARMENIAN SMALL LETTER GIM -// 564 ARMENIAN SMALL LETTER DA -// 565 ARMENIAN SMALL LETTER ECH -// 566 ARMENIAN SMALL LETTER ZA -// 567 ARMENIAN SMALL LETTER EH -// 568 ARMENIAN SMALL LETTER ET -// 569 ARMENIAN SMALL LETTER TO -// 56a ARMENIAN SMALL LETTER ZHE -// 56b ARMENIAN SMALL LETTER INI -// 56c ARMENIAN SMALL LETTER LIWN -// 56d ARMENIAN SMALL LETTER XEH -// 56e ARMENIAN SMALL LETTER CA -// 56f ARMENIAN SMALL LETTER KEN -// 570 ARMENIAN SMALL LETTER HO -// 571 ARMENIAN SMALL LETTER JA -// 572 ARMENIAN SMALL LETTER GHAD -// 573 ARMENIAN SMALL LETTER CHEH -// 574 ARMENIAN SMALL LETTER MEN -// 575 ARMENIAN SMALL LETTER YI -// 576 ARMENIAN SMALL LETTER NOW -// 577 ARMENIAN SMALL LETTER SHA -// 578 ARMENIAN SMALL LETTER VO -// 579 ARMENIAN SMALL LETTER CHA -// 57a ARMENIAN SMALL LETTER PEH -// 57b ARMENIAN SMALL LETTER JHEH -// 57c ARMENIAN SMALL LETTER RA -// 57d ARMENIAN SMALL LETTER SEH -// 57e ARMENIAN SMALL LETTER VEW -// 57f ARMENIAN SMALL LETTER TIWN -// 580 ARMENIAN SMALL LETTER REH -// 581 ARMENIAN SMALL LETTER CO -// 582 ARMENIAN SMALL LETTER YIWN -// 583 ARMENIAN SMALL LETTER PIWR -// 584 ARMENIAN SMALL LETTER KEH -// 585 ARMENIAN SMALL LETTER OH -// 586 ARMENIAN SMALL LETTER FEH - { 0x561, 0x26, 0x49, 0, -48 }, -// 587 ARMENIAN SMALL LIGATURE ECH YIWN - { 0x587, 0x1, 0x49, 0, 0 }, -// 589 ARMENIAN FULL STOP -// 58a ARMENIAN HYPHEN - { 0x589, 0x2, 0x18, 0, 0 }, -// 58d RIGHT-FACING ARMENIAN ETERNITY SIGN -// 58e LEFT-FACING ARMENIAN ETERNITY SIGN -// 58f ARMENIAN DRAM SIGN - { 0x58D, 0x3, 0x8, 0, 0 }, -// 591 HEBREW ACCENT ETNAHTA -// 592 HEBREW ACCENT SEGOL -// 593 HEBREW ACCENT SHALSHELET -// 594 HEBREW ACCENT ZAQEF QATAN -// 595 HEBREW ACCENT ZAQEF GADOL -// 596 HEBREW ACCENT TIPEHA -// 597 HEBREW ACCENT REVIA -// 598 HEBREW ACCENT ZARQA -// 599 HEBREW ACCENT PASHTA -// 59a HEBREW ACCENT YETIV -// 59b HEBREW ACCENT TEVIR -// 59c HEBREW ACCENT GERESH -// 59d HEBREW ACCENT GERESH MUQDAM -// 59e HEBREW ACCENT GERSHAYIM -// 59f HEBREW ACCENT QARNEY PARA -// 5a0 HEBREW ACCENT TELISHA GEDOLA -// 5a1 HEBREW ACCENT PAZER -// 5a2 HEBREW ACCENT ATNAH HAFUKH -// 5a3 HEBREW ACCENT MUNAH -// 5a4 HEBREW ACCENT MAHAPAKH -// 5a5 HEBREW ACCENT MERKHA -// 5a6 HEBREW ACCENT MERKHA KEFULA -// 5a7 HEBREW ACCENT DARGA -// 5a8 HEBREW ACCENT QADMA -// 5a9 HEBREW ACCENT TELISHA QETANA -// 5aa HEBREW ACCENT YERAH BEN YOMO -// 5ab HEBREW ACCENT OLE -// 5ac HEBREW ACCENT ILUY -// 5ad HEBREW ACCENT DEHI -// 5ae HEBREW ACCENT ZINOR -// 5af HEBREW MARK MASORA CIRCLE -// 5b0 HEBREW POINT SHEVA -// 5b1 HEBREW POINT HATAF SEGOL -// 5b2 HEBREW POINT HATAF PATAH -// 5b3 HEBREW POINT HATAF QAMATS -// 5b4 HEBREW POINT HIRIQ -// 5b5 HEBREW POINT TSERE -// 5b6 HEBREW POINT SEGOL -// 5b7 HEBREW POINT PATAH -// 5b8 HEBREW POINT QAMATS -// 5b9 HEBREW POINT HOLAM -// 5ba HEBREW POINT HOLAM HASER FOR VAV -// 5bb HEBREW POINT QUBUTS -// 5bc HEBREW POINT DAGESH OR MAPIQ -// 5bd HEBREW POINT METEG - { 0x591, 0x2D, 0x0, 0, 0 }, -// 5be HEBREW PUNCTUATION MAQAF - { 0x5BE, 0x1, 0x18, 0, 0 }, -// 5bf HEBREW POINT RAFE - { 0x5BF, 0x1, 0x0, 0, 0 }, -// 5c0 HEBREW PUNCTUATION PASEQ - { 0x5C0, 0x1, 0x18, 0, 0 }, -// 5c1 HEBREW POINT SHIN DOT -// 5c2 HEBREW POINT SIN DOT - { 0x5C1, 0x2, 0x0, 0, 0 }, -// 5c3 HEBREW PUNCTUATION SOF PASUQ - { 0x5C3, 0x1, 0x18, 0, 0 }, -// 5c4 HEBREW MARK UPPER DOT -// 5c5 HEBREW MARK LOWER DOT - { 0x5C4, 0x2, 0x0, 0, 0 }, -// 5c6 HEBREW PUNCTUATION NUN HAFUKHA - { 0x5C6, 0x1, 0x18, 0, 0 }, -// 5c7 HEBREW POINT QAMATS QATAN - { 0x5C7, 0x1, 0x0, 0, 0 }, -// 5d0 HEBREW LETTER ALEF -// 5d1 HEBREW LETTER BET -// 5d2 HEBREW LETTER GIMEL -// 5d3 HEBREW LETTER DALET -// 5d4 HEBREW LETTER HE -// 5d5 HEBREW LETTER VAV -// 5d6 HEBREW LETTER ZAYIN -// 5d7 HEBREW LETTER HET -// 5d8 HEBREW LETTER TET -// 5d9 HEBREW LETTER YOD -// 5da HEBREW LETTER FINAL KAF -// 5db HEBREW LETTER KAF -// 5dc HEBREW LETTER LAMED -// 5dd HEBREW LETTER FINAL MEM -// 5de HEBREW LETTER MEM -// 5df HEBREW LETTER FINAL NUN -// 5e0 HEBREW LETTER NUN -// 5e1 HEBREW LETTER SAMEKH -// 5e2 HEBREW LETTER AYIN -// 5e3 HEBREW LETTER FINAL PE -// 5e4 HEBREW LETTER PE -// 5e5 HEBREW LETTER FINAL TSADI -// 5e6 HEBREW LETTER TSADI -// 5e7 HEBREW LETTER QOF -// 5e8 HEBREW LETTER RESH -// 5e9 HEBREW LETTER SHIN -// 5ea HEBREW LETTER TAV - { 0x5D0, 0x1B, 0x9, 0, 0 }, -// 5f0 HEBREW LIGATURE YIDDISH DOUBLE VAV -// 5f1 HEBREW LIGATURE YIDDISH VAV YOD -// 5f2 HEBREW LIGATURE YIDDISH DOUBLE YOD - { 0x5F0, 0x3, 0x9, 0, 0 }, -// 5f3 HEBREW PUNCTUATION GERESH -// 5f4 HEBREW PUNCTUATION GERSHAYIM - { 0x5F3, 0x2, 0x18, 0, 0 }, -// 600 ARABIC NUMBER SIGN -// 601 ARABIC SIGN SANAH -// 602 ARABIC FOOTNOTE MARKER -// 603 ARABIC SIGN SAFHA -// 604 ARABIC SIGN SAMVAT -// 605 ARABIC NUMBER MARK ABOVE - { 0x600, 0x6, 0x0, 0, 0 }, -// 606 ARABIC-INDIC CUBE ROOT -// 607 ARABIC-INDIC FOURTH ROOT -// 608 ARABIC RAY - { 0x606, 0x3, 0x8, 0, 0 }, -// 609 ARABIC-INDIC PER MILLE SIGN -// 60a ARABIC-INDIC PER TEN THOUSAND SIGN - { 0x609, 0x2, 0x18, 0, 0 }, -// 60b AFGHANI SIGN - { 0x60B, 0x1, 0x8, 0, 0 }, -// 60c ARABIC COMMA -// 60d ARABIC DATE SEPARATOR - { 0x60C, 0x2, 0x18, 0, 0 }, -// 60e ARABIC POETIC VERSE SIGN -// 60f ARABIC SIGN MISRA - { 0x60E, 0x2, 0x8, 0, 0 }, -// 610 ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM -// 611 ARABIC SIGN ALAYHE ASSALLAM -// 612 ARABIC SIGN RAHMATULLAH ALAYHE -// 613 ARABIC SIGN RADI ALLAHOU ANHU -// 614 ARABIC SIGN TAKHALLUS -// 615 ARABIC SMALL HIGH TAH -// 616 ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH -// 617 ARABIC SMALL HIGH ZAIN -// 618 ARABIC SMALL FATHA -// 619 ARABIC SMALL DAMMA -// 61a ARABIC SMALL KASRA - { 0x610, 0xB, 0x0, 0, 0 }, -// 61b ARABIC SEMICOLON - { 0x61B, 0x1, 0x18, 0, 0 }, -// 61c ARABIC LETTER MARK - { 0x61C, 0x1, 0x0, 0, 0 }, -// 61e ARABIC TRIPLE DOT PUNCTUATION MARK -// 61f ARABIC QUESTION MARK - { 0x61E, 0x2, 0x18, 0, 0 }, -// 620 ARABIC LETTER KASHMIRI YEH -// 621 ARABIC LETTER HAMZA -// 622 ARABIC LETTER ALEF WITH MADDA ABOVE -// 623 ARABIC LETTER ALEF WITH HAMZA ABOVE -// 624 ARABIC LETTER WAW WITH HAMZA ABOVE -// 625 ARABIC LETTER ALEF WITH HAMZA BELOW -// 626 ARABIC LETTER YEH WITH HAMZA ABOVE -// 627 ARABIC LETTER ALEF -// 628 ARABIC LETTER BEH -// 629 ARABIC LETTER TEH MARBUTA -// 62a ARABIC LETTER TEH -// 62b ARABIC LETTER THEH -// 62c ARABIC LETTER JEEM -// 62d ARABIC LETTER HAH -// 62e ARABIC LETTER KHAH -// 62f ARABIC LETTER DAL -// 630 ARABIC LETTER THAL -// 631 ARABIC LETTER REH -// 632 ARABIC LETTER ZAIN -// 633 ARABIC LETTER SEEN -// 634 ARABIC LETTER SHEEN -// 635 ARABIC LETTER SAD -// 636 ARABIC LETTER DAD -// 637 ARABIC LETTER TAH -// 638 ARABIC LETTER ZAH -// 639 ARABIC LETTER AIN -// 63a ARABIC LETTER GHAIN -// 63b ARABIC LETTER KEHEH WITH TWO DOTS ABOVE -// 63c ARABIC LETTER KEHEH WITH THREE DOTS BELOW -// 63d ARABIC LETTER FARSI YEH WITH INVERTED V -// 63e ARABIC LETTER FARSI YEH WITH TWO DOTS ABOVE -// 63f ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE -// 640 ARABIC TATWEEL -// 641 ARABIC LETTER FEH -// 642 ARABIC LETTER QAF -// 643 ARABIC LETTER KAF -// 644 ARABIC LETTER LAM -// 645 ARABIC LETTER MEEM -// 646 ARABIC LETTER NOON -// 647 ARABIC LETTER HEH -// 648 ARABIC LETTER WAW -// 649 ARABIC LETTER ALEF MAKSURA -// 64a ARABIC LETTER YEH - { 0x620, 0x2B, 0x9, 0, 0 }, -// 64b ARABIC FATHATAN -// 64c ARABIC DAMMATAN -// 64d ARABIC KASRATAN -// 64e ARABIC FATHA -// 64f ARABIC DAMMA -// 650 ARABIC KASRA -// 651 ARABIC SHADDA -// 652 ARABIC SUKUN -// 653 ARABIC MADDAH ABOVE -// 654 ARABIC HAMZA ABOVE -// 655 ARABIC HAMZA BELOW -// 656 ARABIC SUBSCRIPT ALEF -// 657 ARABIC INVERTED DAMMA -// 658 ARABIC MARK NOON GHUNNA -// 659 ARABIC ZWARAKAY -// 65a ARABIC VOWEL SIGN SMALL V ABOVE -// 65b ARABIC VOWEL SIGN INVERTED SMALL V ABOVE -// 65c ARABIC VOWEL SIGN DOT BELOW -// 65d ARABIC REVERSED DAMMA -// 65e ARABIC FATHA WITH TWO DOTS -// 65f ARABIC WAVY HAMZA BELOW - { 0x64B, 0x15, 0x0, 0, 0 }, -// 660 ARABIC-INDIC DIGIT ZERO -// 661 ARABIC-INDIC DIGIT ONE -// 662 ARABIC-INDIC DIGIT TWO -// 663 ARABIC-INDIC DIGIT THREE -// 664 ARABIC-INDIC DIGIT FOUR -// 665 ARABIC-INDIC DIGIT FIVE -// 666 ARABIC-INDIC DIGIT SIX -// 667 ARABIC-INDIC DIGIT SEVEN -// 668 ARABIC-INDIC DIGIT EIGHT -// 669 ARABIC-INDIC DIGIT NINE - { 0x660, 0xA, 0x108, 0, 0 }, -// 66a ARABIC PERCENT SIGN -// 66b ARABIC DECIMAL SEPARATOR -// 66c ARABIC THOUSANDS SEPARATOR -// 66d ARABIC FIVE POINTED STAR - { 0x66A, 0x4, 0x18, 0, 0 }, -// 66e ARABIC LETTER DOTLESS BEH -// 66f ARABIC LETTER DOTLESS QAF - { 0x66E, 0x2, 0x9, 0, 0 }, -// 670 ARABIC LETTER SUPERSCRIPT ALEF - { 0x670, 0x1, 0x0, 0, 0 }, -// 671 ARABIC LETTER ALEF WASLA -// 672 ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE -// 673 ARABIC LETTER ALEF WITH WAVY HAMZA BELOW -// 674 ARABIC LETTER HIGH HAMZA -// 675 ARABIC LETTER HIGH HAMZA ALEF -// 676 ARABIC LETTER HIGH HAMZA WAW -// 677 ARABIC LETTER U WITH HAMZA ABOVE -// 678 ARABIC LETTER HIGH HAMZA YEH -// 679 ARABIC LETTER TTEH -// 67a ARABIC LETTER TTEHEH -// 67b ARABIC LETTER BEEH -// 67c ARABIC LETTER TEH WITH RING -// 67d ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS -// 67e ARABIC LETTER PEH -// 67f ARABIC LETTER TEHEH -// 680 ARABIC LETTER BEHEH -// 681 ARABIC LETTER HAH WITH HAMZA ABOVE -// 682 ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE -// 683 ARABIC LETTER NYEH -// 684 ARABIC LETTER DYEH -// 685 ARABIC LETTER HAH WITH THREE DOTS ABOVE -// 686 ARABIC LETTER TCHEH -// 687 ARABIC LETTER TCHEHEH -// 688 ARABIC LETTER DDAL -// 689 ARABIC LETTER DAL WITH RING -// 68a ARABIC LETTER DAL WITH DOT BELOW -// 68b ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH -// 68c ARABIC LETTER DAHAL -// 68d ARABIC LETTER DDAHAL -// 68e ARABIC LETTER DUL -// 68f ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS -// 690 ARABIC LETTER DAL WITH FOUR DOTS ABOVE -// 691 ARABIC LETTER RREH -// 692 ARABIC LETTER REH WITH SMALL V -// 693 ARABIC LETTER REH WITH RING -// 694 ARABIC LETTER REH WITH DOT BELOW -// 695 ARABIC LETTER REH WITH SMALL V BELOW -// 696 ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE -// 697 ARABIC LETTER REH WITH TWO DOTS ABOVE -// 698 ARABIC LETTER JEH -// 699 ARABIC LETTER REH WITH FOUR DOTS ABOVE -// 69a ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE -// 69b ARABIC LETTER SEEN WITH THREE DOTS BELOW -// 69c ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE -// 69d ARABIC LETTER SAD WITH TWO DOTS BELOW -// 69e ARABIC LETTER SAD WITH THREE DOTS ABOVE -// 69f ARABIC LETTER TAH WITH THREE DOTS ABOVE -// 6a0 ARABIC LETTER AIN WITH THREE DOTS ABOVE -// 6a1 ARABIC LETTER DOTLESS FEH -// 6a2 ARABIC LETTER FEH WITH DOT MOVED BELOW -// 6a3 ARABIC LETTER FEH WITH DOT BELOW -// 6a4 ARABIC LETTER VEH -// 6a5 ARABIC LETTER FEH WITH THREE DOTS BELOW -// 6a6 ARABIC LETTER PEHEH -// 6a7 ARABIC LETTER QAF WITH DOT ABOVE -// 6a8 ARABIC LETTER QAF WITH THREE DOTS ABOVE -// 6a9 ARABIC LETTER KEHEH -// 6aa ARABIC LETTER SWASH KAF -// 6ab ARABIC LETTER KAF WITH RING -// 6ac ARABIC LETTER KAF WITH DOT ABOVE -// 6ad ARABIC LETTER NG -// 6ae ARABIC LETTER KAF WITH THREE DOTS BELOW -// 6af ARABIC LETTER GAF -// 6b0 ARABIC LETTER GAF WITH RING -// 6b1 ARABIC LETTER NGOEH -// 6b2 ARABIC LETTER GAF WITH TWO DOTS BELOW -// 6b3 ARABIC LETTER GUEH -// 6b4 ARABIC LETTER GAF WITH THREE DOTS ABOVE -// 6b5 ARABIC LETTER LAM WITH SMALL V -// 6b6 ARABIC LETTER LAM WITH DOT ABOVE -// 6b7 ARABIC LETTER LAM WITH THREE DOTS ABOVE -// 6b8 ARABIC LETTER LAM WITH THREE DOTS BELOW -// 6b9 ARABIC LETTER NOON WITH DOT BELOW -// 6ba ARABIC LETTER NOON GHUNNA -// 6bb ARABIC LETTER RNOON -// 6bc ARABIC LETTER NOON WITH RING -// 6bd ARABIC LETTER NOON WITH THREE DOTS ABOVE -// 6be ARABIC LETTER HEH DOACHASHMEE -// 6bf ARABIC LETTER TCHEH WITH DOT ABOVE -// 6c0 ARABIC LETTER HEH WITH YEH ABOVE -// 6c1 ARABIC LETTER HEH GOAL -// 6c2 ARABIC LETTER HEH GOAL WITH HAMZA ABOVE -// 6c3 ARABIC LETTER TEH MARBUTA GOAL -// 6c4 ARABIC LETTER WAW WITH RING -// 6c5 ARABIC LETTER KIRGHIZ OE -// 6c6 ARABIC LETTER OE -// 6c7 ARABIC LETTER U -// 6c8 ARABIC LETTER YU -// 6c9 ARABIC LETTER KIRGHIZ YU -// 6ca ARABIC LETTER WAW WITH TWO DOTS ABOVE -// 6cb ARABIC LETTER VE -// 6cc ARABIC LETTER FARSI YEH -// 6cd ARABIC LETTER YEH WITH TAIL -// 6ce ARABIC LETTER YEH WITH SMALL V -// 6cf ARABIC LETTER WAW WITH DOT ABOVE -// 6d0 ARABIC LETTER E -// 6d1 ARABIC LETTER YEH WITH THREE DOTS BELOW -// 6d2 ARABIC LETTER YEH BARREE -// 6d3 ARABIC LETTER YEH BARREE WITH HAMZA ABOVE - { 0x671, 0x63, 0x9, 0, 0 }, -// 6d4 ARABIC FULL STOP - { 0x6D4, 0x1, 0x18, 0, 0 }, -// 6d5 ARABIC LETTER AE - { 0x6D5, 0x1, 0x9, 0, 0 }, -// 6d6 ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA -// 6d7 ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA -// 6d8 ARABIC SMALL HIGH MEEM INITIAL FORM -// 6d9 ARABIC SMALL HIGH LAM ALEF -// 6da ARABIC SMALL HIGH JEEM -// 6db ARABIC SMALL HIGH THREE DOTS -// 6dc ARABIC SMALL HIGH SEEN -// 6dd ARABIC END OF AYAH - { 0x6D6, 0x8, 0x0, 0, 0 }, -// 6de ARABIC START OF RUB EL HIZB - { 0x6DE, 0x1, 0x8, 0, 0 }, -// 6df ARABIC SMALL HIGH ROUNDED ZERO -// 6e0 ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO -// 6e1 ARABIC SMALL HIGH DOTLESS HEAD OF KHAH -// 6e2 ARABIC SMALL HIGH MEEM ISOLATED FORM -// 6e3 ARABIC SMALL LOW SEEN -// 6e4 ARABIC SMALL HIGH MADDA - { 0x6DF, 0x6, 0x0, 0, 0 }, -// 6e5 ARABIC SMALL WAW -// 6e6 ARABIC SMALL YEH - { 0x6E5, 0x2, 0x9, 0, 0 }, -// 6e7 ARABIC SMALL HIGH YEH -// 6e8 ARABIC SMALL HIGH NOON - { 0x6E7, 0x2, 0x0, 0, 0 }, -// 6e9 ARABIC PLACE OF SAJDAH - { 0x6E9, 0x1, 0x8, 0, 0 }, -// 6ea ARABIC EMPTY CENTRE LOW STOP -// 6eb ARABIC EMPTY CENTRE HIGH STOP -// 6ec ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE -// 6ed ARABIC SMALL LOW MEEM - { 0x6EA, 0x4, 0x0, 0, 0 }, -// 6ee ARABIC LETTER DAL WITH INVERTED V -// 6ef ARABIC LETTER REH WITH INVERTED V - { 0x6EE, 0x2, 0x9, 0, 0 }, -// 6f0 EXTENDED ARABIC-INDIC DIGIT ZERO -// 6f1 EXTENDED ARABIC-INDIC DIGIT ONE -// 6f2 EXTENDED ARABIC-INDIC DIGIT TWO -// 6f3 EXTENDED ARABIC-INDIC DIGIT THREE -// 6f4 EXTENDED ARABIC-INDIC DIGIT FOUR -// 6f5 EXTENDED ARABIC-INDIC DIGIT FIVE -// 6f6 EXTENDED ARABIC-INDIC DIGIT SIX -// 6f7 EXTENDED ARABIC-INDIC DIGIT SEVEN -// 6f8 EXTENDED ARABIC-INDIC DIGIT EIGHT -// 6f9 EXTENDED ARABIC-INDIC DIGIT NINE - { 0x6F0, 0xA, 0x108, 0, 0 }, -// 6fa ARABIC LETTER SHEEN WITH DOT BELOW -// 6fb ARABIC LETTER DAD WITH DOT BELOW -// 6fc ARABIC LETTER GHAIN WITH DOT BELOW - { 0x6FA, 0x3, 0x9, 0, 0 }, -// 6fd ARABIC SIGN SINDHI AMPERSAND -// 6fe ARABIC SIGN SINDHI POSTPOSITION MEN - { 0x6FD, 0x2, 0x8, 0, 0 }, -// 6ff ARABIC LETTER HEH WITH INVERTED V - { 0x6FF, 0x1, 0x9, 0, 0 }, -// 700 SYRIAC END OF PARAGRAPH -// 701 SYRIAC SUPRALINEAR FULL STOP -// 702 SYRIAC SUBLINEAR FULL STOP -// 703 SYRIAC SUPRALINEAR COLON -// 704 SYRIAC SUBLINEAR COLON -// 705 SYRIAC HORIZONTAL COLON -// 706 SYRIAC COLON SKEWED LEFT -// 707 SYRIAC COLON SKEWED RIGHT -// 708 SYRIAC SUPRALINEAR COLON SKEWED LEFT -// 709 SYRIAC SUBLINEAR COLON SKEWED RIGHT -// 70a SYRIAC CONTRACTION -// 70b SYRIAC HARKLEAN OBELUS -// 70c SYRIAC HARKLEAN METOBELUS -// 70d SYRIAC HARKLEAN ASTERISCUS - { 0x700, 0xE, 0x18, 0, 0 }, -// 70f SYRIAC ABBREVIATION MARK - { 0x70F, 0x1, 0x0, 0, 0 }, -// 710 SYRIAC LETTER ALAPH - { 0x710, 0x1, 0x9, 0, 0 }, -// 711 SYRIAC LETTER SUPERSCRIPT ALAPH - { 0x711, 0x1, 0x0, 0, 0 }, -// 712 SYRIAC LETTER BETH -// 713 SYRIAC LETTER GAMAL -// 714 SYRIAC LETTER GAMAL GARSHUNI -// 715 SYRIAC LETTER DALATH -// 716 SYRIAC LETTER DOTLESS DALATH RISH -// 717 SYRIAC LETTER HE -// 718 SYRIAC LETTER WAW -// 719 SYRIAC LETTER ZAIN -// 71a SYRIAC LETTER HETH -// 71b SYRIAC LETTER TETH -// 71c SYRIAC LETTER TETH GARSHUNI -// 71d SYRIAC LETTER YUDH -// 71e SYRIAC LETTER YUDH HE -// 71f SYRIAC LETTER KAPH -// 720 SYRIAC LETTER LAMADH -// 721 SYRIAC LETTER MIM -// 722 SYRIAC LETTER NUN -// 723 SYRIAC LETTER SEMKATH -// 724 SYRIAC LETTER FINAL SEMKATH -// 725 SYRIAC LETTER E -// 726 SYRIAC LETTER PE -// 727 SYRIAC LETTER REVERSED PE -// 728 SYRIAC LETTER SADHE -// 729 SYRIAC LETTER QAPH -// 72a SYRIAC LETTER RISH -// 72b SYRIAC LETTER SHIN -// 72c SYRIAC LETTER TAW -// 72d SYRIAC LETTER PERSIAN BHETH -// 72e SYRIAC LETTER PERSIAN GHAMAL -// 72f SYRIAC LETTER PERSIAN DHALATH - { 0x712, 0x1E, 0x9, 0, 0 }, -// 730 SYRIAC PTHAHA ABOVE -// 731 SYRIAC PTHAHA BELOW -// 732 SYRIAC PTHAHA DOTTED -// 733 SYRIAC ZQAPHA ABOVE -// 734 SYRIAC ZQAPHA BELOW -// 735 SYRIAC ZQAPHA DOTTED -// 736 SYRIAC RBASA ABOVE -// 737 SYRIAC RBASA BELOW -// 738 SYRIAC DOTTED ZLAMA HORIZONTAL -// 739 SYRIAC DOTTED ZLAMA ANGULAR -// 73a SYRIAC HBASA ABOVE -// 73b SYRIAC HBASA BELOW -// 73c SYRIAC HBASA-ESASA DOTTED -// 73d SYRIAC ESASA ABOVE -// 73e SYRIAC ESASA BELOW -// 73f SYRIAC RWAHA -// 740 SYRIAC FEMININE DOT -// 741 SYRIAC QUSHSHAYA -// 742 SYRIAC RUKKAKHA -// 743 SYRIAC TWO VERTICAL DOTS ABOVE -// 744 SYRIAC TWO VERTICAL DOTS BELOW -// 745 SYRIAC THREE DOTS ABOVE -// 746 SYRIAC THREE DOTS BELOW -// 747 SYRIAC OBLIQUE LINE ABOVE -// 748 SYRIAC OBLIQUE LINE BELOW -// 749 SYRIAC MUSIC -// 74a SYRIAC BARREKH - { 0x730, 0x1B, 0x0, 0, 0 }, -// 74d SYRIAC LETTER SOGDIAN ZHAIN -// 74e SYRIAC LETTER SOGDIAN KHAPH -// 74f SYRIAC LETTER SOGDIAN FE -// 750 ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW -// 751 ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE -// 752 ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW -// 753 ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE -// 754 ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE -// 755 ARABIC LETTER BEH WITH INVERTED SMALL V BELOW -// 756 ARABIC LETTER BEH WITH SMALL V -// 757 ARABIC LETTER HAH WITH TWO DOTS ABOVE -// 758 ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW -// 759 ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH -// 75a ARABIC LETTER DAL WITH INVERTED SMALL V BELOW -// 75b ARABIC LETTER REH WITH STROKE -// 75c ARABIC LETTER SEEN WITH FOUR DOTS ABOVE -// 75d ARABIC LETTER AIN WITH TWO DOTS ABOVE -// 75e ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE -// 75f ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE -// 760 ARABIC LETTER FEH WITH TWO DOTS BELOW -// 761 ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW -// 762 ARABIC LETTER KEHEH WITH DOT ABOVE -// 763 ARABIC LETTER KEHEH WITH THREE DOTS ABOVE -// 764 ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW -// 765 ARABIC LETTER MEEM WITH DOT ABOVE -// 766 ARABIC LETTER MEEM WITH DOT BELOW -// 767 ARABIC LETTER NOON WITH TWO DOTS BELOW -// 768 ARABIC LETTER NOON WITH SMALL TAH -// 769 ARABIC LETTER NOON WITH SMALL V -// 76a ARABIC LETTER LAM WITH BAR -// 76b ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE -// 76c ARABIC LETTER REH WITH HAMZA ABOVE -// 76d ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE -// 76e ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH BELOW -// 76f ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH AND TWO DOTS -// 770 ARABIC LETTER SEEN WITH SMALL ARABIC LETTER TAH AND TWO DOTS -// 771 ARABIC LETTER REH WITH SMALL ARABIC LETTER TAH AND TWO DOTS -// 772 ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH ABOVE -// 773 ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE -// 774 ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE -// 775 ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE -// 776 ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE -// 777 ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW -// 778 ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE -// 779 ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE -// 77a ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE -// 77b ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE -// 77c ARABIC LETTER HAH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW -// 77d ARABIC LETTER SEEN WITH EXTENDED ARABIC-INDIC DIGIT FOUR ABOVE -// 77e ARABIC LETTER SEEN WITH INVERTED V -// 77f ARABIC LETTER KAF WITH TWO DOTS ABOVE -// 780 THAANA LETTER HAA -// 781 THAANA LETTER SHAVIYANI -// 782 THAANA LETTER NOONU -// 783 THAANA LETTER RAA -// 784 THAANA LETTER BAA -// 785 THAANA LETTER LHAVIYANI -// 786 THAANA LETTER KAAFU -// 787 THAANA LETTER ALIFU -// 788 THAANA LETTER VAAVU -// 789 THAANA LETTER MEEMU -// 78a THAANA LETTER FAAFU -// 78b THAANA LETTER DHAALU -// 78c THAANA LETTER THAA -// 78d THAANA LETTER LAAMU -// 78e THAANA LETTER GAAFU -// 78f THAANA LETTER GNAVIYANI -// 790 THAANA LETTER SEENU -// 791 THAANA LETTER DAVIYANI -// 792 THAANA LETTER ZAVIYANI -// 793 THAANA LETTER TAVIYANI -// 794 THAANA LETTER YAA -// 795 THAANA LETTER PAVIYANI -// 796 THAANA LETTER JAVIYANI -// 797 THAANA LETTER CHAVIYANI -// 798 THAANA LETTER TTAA -// 799 THAANA LETTER HHAA -// 79a THAANA LETTER KHAA -// 79b THAANA LETTER THAALU -// 79c THAANA LETTER ZAA -// 79d THAANA LETTER SHEENU -// 79e THAANA LETTER SAADHU -// 79f THAANA LETTER DAADHU -// 7a0 THAANA LETTER TO -// 7a1 THAANA LETTER ZO -// 7a2 THAANA LETTER AINU -// 7a3 THAANA LETTER GHAINU -// 7a4 THAANA LETTER QAAFU -// 7a5 THAANA LETTER WAAVU - { 0x74D, 0x59, 0x9, 0, 0 }, -// 7a6 THAANA ABAFILI -// 7a7 THAANA AABAAFILI -// 7a8 THAANA IBIFILI -// 7a9 THAANA EEBEEFILI -// 7aa THAANA UBUFILI -// 7ab THAANA OOBOOFILI -// 7ac THAANA EBEFILI -// 7ad THAANA EYBEYFILI -// 7ae THAANA OBOFILI -// 7af THAANA OABOAFILI -// 7b0 THAANA SUKUN - { 0x7A6, 0xB, 0x0, 0, 0 }, -// 7b1 THAANA LETTER NAA - { 0x7B1, 0x1, 0x9, 0, 0 }, -// 7c0 NKO DIGIT ZERO -// 7c1 NKO DIGIT ONE -// 7c2 NKO DIGIT TWO -// 7c3 NKO DIGIT THREE -// 7c4 NKO DIGIT FOUR -// 7c5 NKO DIGIT FIVE -// 7c6 NKO DIGIT SIX -// 7c7 NKO DIGIT SEVEN -// 7c8 NKO DIGIT EIGHT -// 7c9 NKO DIGIT NINE - { 0x7C0, 0xA, 0x108, 0, 0 }, -// 7ca NKO LETTER A -// 7cb NKO LETTER EE -// 7cc NKO LETTER I -// 7cd NKO LETTER E -// 7ce NKO LETTER U -// 7cf NKO LETTER OO -// 7d0 NKO LETTER O -// 7d1 NKO LETTER DAGBASINNA -// 7d2 NKO LETTER N -// 7d3 NKO LETTER BA -// 7d4 NKO LETTER PA -// 7d5 NKO LETTER TA -// 7d6 NKO LETTER JA -// 7d7 NKO LETTER CHA -// 7d8 NKO LETTER DA -// 7d9 NKO LETTER RA -// 7da NKO LETTER RRA -// 7db NKO LETTER SA -// 7dc NKO LETTER GBA -// 7dd NKO LETTER FA -// 7de NKO LETTER KA -// 7df NKO LETTER LA -// 7e0 NKO LETTER NA WOLOSO -// 7e1 NKO LETTER MA -// 7e2 NKO LETTER NYA -// 7e3 NKO LETTER NA -// 7e4 NKO LETTER HA -// 7e5 NKO LETTER WA -// 7e6 NKO LETTER YA -// 7e7 NKO LETTER NYA WOLOSO -// 7e8 NKO LETTER JONA JA -// 7e9 NKO LETTER JONA CHA -// 7ea NKO LETTER JONA RA - { 0x7CA, 0x21, 0x9, 0, 0 }, -// 7eb NKO COMBINING SHORT HIGH TONE -// 7ec NKO COMBINING SHORT LOW TONE -// 7ed NKO COMBINING SHORT RISING TONE -// 7ee NKO COMBINING LONG DESCENDING TONE -// 7ef NKO COMBINING LONG HIGH TONE -// 7f0 NKO COMBINING LONG LOW TONE -// 7f1 NKO COMBINING LONG RISING TONE -// 7f2 NKO COMBINING NASALIZATION MARK -// 7f3 NKO COMBINING DOUBLE DOT ABOVE - { 0x7EB, 0x9, 0x0, 0, 0 }, -// 7f4 NKO HIGH TONE APOSTROPHE -// 7f5 NKO LOW TONE APOSTROPHE - { 0x7F4, 0x2, 0x9, 0, 0 }, -// 7f6 NKO SYMBOL OO DENNEN - { 0x7F6, 0x1, 0x8, 0, 0 }, -// 7f7 NKO SYMBOL GBAKURUNEN -// 7f8 NKO COMMA -// 7f9 NKO EXCLAMATION MARK - { 0x7F7, 0x3, 0x18, 0, 0 }, -// 7fa NKO LAJANYALAN - { 0x7FA, 0x1, 0x9, 0, 0 }, -// 800 SAMARITAN LETTER ALAF -// 801 SAMARITAN LETTER BIT -// 802 SAMARITAN LETTER GAMAN -// 803 SAMARITAN LETTER DALAT -// 804 SAMARITAN LETTER IY -// 805 SAMARITAN LETTER BAA -// 806 SAMARITAN LETTER ZEN -// 807 SAMARITAN LETTER IT -// 808 SAMARITAN LETTER TIT -// 809 SAMARITAN LETTER YUT -// 80a SAMARITAN LETTER KAAF -// 80b SAMARITAN LETTER LABAT -// 80c SAMARITAN LETTER MIM -// 80d SAMARITAN LETTER NUN -// 80e SAMARITAN LETTER SINGAAT -// 80f SAMARITAN LETTER IN -// 810 SAMARITAN LETTER FI -// 811 SAMARITAN LETTER TSAADIY -// 812 SAMARITAN LETTER QUF -// 813 SAMARITAN LETTER RISH -// 814 SAMARITAN LETTER SHAN -// 815 SAMARITAN LETTER TAAF - { 0x800, 0x16, 0x9, 0, 0 }, -// 816 SAMARITAN MARK IN -// 817 SAMARITAN MARK IN-ALAF -// 818 SAMARITAN MARK OCCLUSION -// 819 SAMARITAN MARK DAGESH - { 0x816, 0x4, 0x0, 0, 0 }, -// 81a SAMARITAN MODIFIER LETTER EPENTHETIC YUT - { 0x81A, 0x1, 0x9, 0, 0 }, -// 81b SAMARITAN MARK EPENTHETIC YUT -// 81c SAMARITAN VOWEL SIGN LONG E -// 81d SAMARITAN VOWEL SIGN E -// 81e SAMARITAN VOWEL SIGN OVERLONG AA -// 81f SAMARITAN VOWEL SIGN LONG AA -// 820 SAMARITAN VOWEL SIGN AA -// 821 SAMARITAN VOWEL SIGN OVERLONG A -// 822 SAMARITAN VOWEL SIGN LONG A -// 823 SAMARITAN VOWEL SIGN A - { 0x81B, 0x9, 0x0, 0, 0 }, -// 824 SAMARITAN MODIFIER LETTER SHORT A - { 0x824, 0x1, 0x9, 0, 0 }, -// 825 SAMARITAN VOWEL SIGN SHORT A -// 826 SAMARITAN VOWEL SIGN LONG U -// 827 SAMARITAN VOWEL SIGN U - { 0x825, 0x3, 0x0, 0, 0 }, -// 828 SAMARITAN MODIFIER LETTER I - { 0x828, 0x1, 0x9, 0, 0 }, -// 829 SAMARITAN VOWEL SIGN LONG I -// 82a SAMARITAN VOWEL SIGN I -// 82b SAMARITAN VOWEL SIGN O -// 82c SAMARITAN VOWEL SIGN SUKUN -// 82d SAMARITAN MARK NEQUDAA - { 0x829, 0x5, 0x0, 0, 0 }, -// 830 SAMARITAN PUNCTUATION NEQUDAA -// 831 SAMARITAN PUNCTUATION AFSAAQ -// 832 SAMARITAN PUNCTUATION ANGED -// 833 SAMARITAN PUNCTUATION BAU -// 834 SAMARITAN PUNCTUATION ATMAAU -// 835 SAMARITAN PUNCTUATION SHIYYAALAA -// 836 SAMARITAN ABBREVIATION MARK -// 837 SAMARITAN PUNCTUATION MELODIC QITSA -// 838 SAMARITAN PUNCTUATION ZIQAA -// 839 SAMARITAN PUNCTUATION QITSA -// 83a SAMARITAN PUNCTUATION ZAEF -// 83b SAMARITAN PUNCTUATION TURU -// 83c SAMARITAN PUNCTUATION ARKAANU -// 83d SAMARITAN PUNCTUATION SOF MASHFAAT -// 83e SAMARITAN PUNCTUATION ANNAAU - { 0x830, 0xF, 0x18, 0, 0 }, -// 840 MANDAIC LETTER HALQA -// 841 MANDAIC LETTER AB -// 842 MANDAIC LETTER AG -// 843 MANDAIC LETTER AD -// 844 MANDAIC LETTER AH -// 845 MANDAIC LETTER USHENNA -// 846 MANDAIC LETTER AZ -// 847 MANDAIC LETTER IT -// 848 MANDAIC LETTER ATT -// 849 MANDAIC LETTER AKSA -// 84a MANDAIC LETTER AK -// 84b MANDAIC LETTER AL -// 84c MANDAIC LETTER AM -// 84d MANDAIC LETTER AN -// 84e MANDAIC LETTER AS -// 84f MANDAIC LETTER IN -// 850 MANDAIC LETTER AP -// 851 MANDAIC LETTER ASZ -// 852 MANDAIC LETTER AQ -// 853 MANDAIC LETTER AR -// 854 MANDAIC LETTER ASH -// 855 MANDAIC LETTER AT -// 856 MANDAIC LETTER DUSHENNA -// 857 MANDAIC LETTER KAD -// 858 MANDAIC LETTER AIN - { 0x840, 0x19, 0x9, 0, 0 }, -// 859 MANDAIC AFFRICATION MARK -// 85a MANDAIC VOCALIZATION MARK -// 85b MANDAIC GEMINATION MARK - { 0x859, 0x3, 0x0, 0, 0 }, -// 85e MANDAIC PUNCTUATION - { 0x85E, 0x1, 0x18, 0, 0 }, -// 8a0 ARABIC LETTER BEH WITH SMALL V BELOW -// 8a1 ARABIC LETTER BEH WITH HAMZA ABOVE -// 8a2 ARABIC LETTER JEEM WITH TWO DOTS ABOVE -// 8a3 ARABIC LETTER TAH WITH TWO DOTS ABOVE -// 8a4 ARABIC LETTER FEH WITH DOT BELOW AND THREE DOTS ABOVE -// 8a5 ARABIC LETTER QAF WITH DOT BELOW -// 8a6 ARABIC LETTER LAM WITH DOUBLE BAR -// 8a7 ARABIC LETTER MEEM WITH THREE DOTS ABOVE -// 8a8 ARABIC LETTER YEH WITH TWO DOTS BELOW AND HAMZA ABOVE -// 8a9 ARABIC LETTER YEH WITH TWO DOTS BELOW AND DOT ABOVE -// 8aa ARABIC LETTER REH WITH LOOP -// 8ab ARABIC LETTER WAW WITH DOT WITHIN -// 8ac ARABIC LETTER ROHINGYA YEH -// 8ad ARABIC LETTER LOW ALEF -// 8ae ARABIC LETTER DAL WITH THREE DOTS BELOW -// 8af ARABIC LETTER SAD WITH THREE DOTS BELOW -// 8b0 ARABIC LETTER GAF WITH INVERTED STROKE -// 8b1 ARABIC LETTER STRAIGHT WAW -// 8b2 ARABIC LETTER ZAIN WITH INVERTED V ABOVE - { 0x8A0, 0x13, 0x9, 0, 0 }, -// 8e4 ARABIC CURLY FATHA -// 8e5 ARABIC CURLY DAMMA -// 8e6 ARABIC CURLY KASRA -// 8e7 ARABIC CURLY FATHATAN -// 8e8 ARABIC CURLY DAMMATAN -// 8e9 ARABIC CURLY KASRATAN -// 8ea ARABIC TONE ONE DOT ABOVE -// 8eb ARABIC TONE TWO DOTS ABOVE -// 8ec ARABIC TONE LOOP ABOVE -// 8ed ARABIC TONE ONE DOT BELOW -// 8ee ARABIC TONE TWO DOTS BELOW -// 8ef ARABIC TONE LOOP BELOW -// 8f0 ARABIC OPEN FATHATAN -// 8f1 ARABIC OPEN DAMMATAN -// 8f2 ARABIC OPEN KASRATAN -// 8f3 ARABIC SMALL HIGH WAW -// 8f4 ARABIC FATHA WITH RING -// 8f5 ARABIC FATHA WITH DOT ABOVE -// 8f6 ARABIC KASRA WITH DOT BELOW -// 8f7 ARABIC LEFT ARROWHEAD ABOVE -// 8f8 ARABIC RIGHT ARROWHEAD ABOVE -// 8f9 ARABIC LEFT ARROWHEAD BELOW -// 8fa ARABIC RIGHT ARROWHEAD BELOW -// 8fb ARABIC DOUBLE RIGHT ARROWHEAD ABOVE -// 8fc ARABIC DOUBLE RIGHT ARROWHEAD ABOVE WITH DOT -// 8fd ARABIC RIGHT ARROWHEAD ABOVE WITH DOT -// 8fe ARABIC DAMMA WITH DOT -// 8ff ARABIC MARK SIDEWAYS NOON GHUNNA -// 900 DEVANAGARI SIGN INVERTED CANDRABINDU -// 901 DEVANAGARI SIGN CANDRABINDU -// 902 DEVANAGARI SIGN ANUSVARA -// 903 DEVANAGARI SIGN VISARGA - { 0x8E4, 0x20, 0x0, 0, 0 }, -// 904 DEVANAGARI LETTER SHORT A -// 905 DEVANAGARI LETTER A -// 906 DEVANAGARI LETTER AA -// 907 DEVANAGARI LETTER I -// 908 DEVANAGARI LETTER II -// 909 DEVANAGARI LETTER U -// 90a DEVANAGARI LETTER UU -// 90b DEVANAGARI LETTER VOCALIC R -// 90c DEVANAGARI LETTER VOCALIC L -// 90d DEVANAGARI LETTER CANDRA E -// 90e DEVANAGARI LETTER SHORT E -// 90f DEVANAGARI LETTER E -// 910 DEVANAGARI LETTER AI -// 911 DEVANAGARI LETTER CANDRA O -// 912 DEVANAGARI LETTER SHORT O -// 913 DEVANAGARI LETTER O -// 914 DEVANAGARI LETTER AU -// 915 DEVANAGARI LETTER KA -// 916 DEVANAGARI LETTER KHA -// 917 DEVANAGARI LETTER GA -// 918 DEVANAGARI LETTER GHA -// 919 DEVANAGARI LETTER NGA -// 91a DEVANAGARI LETTER CA -// 91b DEVANAGARI LETTER CHA -// 91c DEVANAGARI LETTER JA -// 91d DEVANAGARI LETTER JHA -// 91e DEVANAGARI LETTER NYA -// 91f DEVANAGARI LETTER TTA -// 920 DEVANAGARI LETTER TTHA -// 921 DEVANAGARI LETTER DDA -// 922 DEVANAGARI LETTER DDHA -// 923 DEVANAGARI LETTER NNA -// 924 DEVANAGARI LETTER TA -// 925 DEVANAGARI LETTER THA -// 926 DEVANAGARI LETTER DA -// 927 DEVANAGARI LETTER DHA -// 928 DEVANAGARI LETTER NA -// 929 DEVANAGARI LETTER NNNA -// 92a DEVANAGARI LETTER PA -// 92b DEVANAGARI LETTER PHA -// 92c DEVANAGARI LETTER BA -// 92d DEVANAGARI LETTER BHA -// 92e DEVANAGARI LETTER MA -// 92f DEVANAGARI LETTER YA -// 930 DEVANAGARI LETTER RA -// 931 DEVANAGARI LETTER RRA -// 932 DEVANAGARI LETTER LA -// 933 DEVANAGARI LETTER LLA -// 934 DEVANAGARI LETTER LLLA -// 935 DEVANAGARI LETTER VA -// 936 DEVANAGARI LETTER SHA -// 937 DEVANAGARI LETTER SSA -// 938 DEVANAGARI LETTER SA -// 939 DEVANAGARI LETTER HA - { 0x904, 0x36, 0x9, 0, 0 }, -// 93a DEVANAGARI VOWEL SIGN OE -// 93b DEVANAGARI VOWEL SIGN OOE -// 93c DEVANAGARI SIGN NUKTA - { 0x93A, 0x3, 0x0, 0, 0 }, -// 93d DEVANAGARI SIGN AVAGRAHA - { 0x93D, 0x1, 0x9, 0, 0 }, -// 93e DEVANAGARI VOWEL SIGN AA -// 93f DEVANAGARI VOWEL SIGN I -// 940 DEVANAGARI VOWEL SIGN II -// 941 DEVANAGARI VOWEL SIGN U -// 942 DEVANAGARI VOWEL SIGN UU -// 943 DEVANAGARI VOWEL SIGN VOCALIC R -// 944 DEVANAGARI VOWEL SIGN VOCALIC RR -// 945 DEVANAGARI VOWEL SIGN CANDRA E -// 946 DEVANAGARI VOWEL SIGN SHORT E -// 947 DEVANAGARI VOWEL SIGN E -// 948 DEVANAGARI VOWEL SIGN AI -// 949 DEVANAGARI VOWEL SIGN CANDRA O -// 94a DEVANAGARI VOWEL SIGN SHORT O -// 94b DEVANAGARI VOWEL SIGN O -// 94c DEVANAGARI VOWEL SIGN AU -// 94d DEVANAGARI SIGN VIRAMA -// 94e DEVANAGARI VOWEL SIGN PRISHTHAMATRA E -// 94f DEVANAGARI VOWEL SIGN AW - { 0x93E, 0x12, 0x0, 0, 0 }, -// 950 DEVANAGARI OM - { 0x950, 0x1, 0x9, 0, 0 }, -// 951 DEVANAGARI STRESS SIGN UDATTA -// 952 DEVANAGARI STRESS SIGN ANUDATTA -// 953 DEVANAGARI GRAVE ACCENT -// 954 DEVANAGARI ACUTE ACCENT -// 955 DEVANAGARI VOWEL SIGN CANDRA LONG E -// 956 DEVANAGARI VOWEL SIGN UE -// 957 DEVANAGARI VOWEL SIGN UUE - { 0x951, 0x7, 0x0, 0, 0 }, -// 958 DEVANAGARI LETTER QA -// 959 DEVANAGARI LETTER KHHA -// 95a DEVANAGARI LETTER GHHA -// 95b DEVANAGARI LETTER ZA -// 95c DEVANAGARI LETTER DDDHA -// 95d DEVANAGARI LETTER RHA -// 95e DEVANAGARI LETTER FA -// 95f DEVANAGARI LETTER YYA -// 960 DEVANAGARI LETTER VOCALIC RR -// 961 DEVANAGARI LETTER VOCALIC LL - { 0x958, 0xA, 0x9, 0, 0 }, -// 962 DEVANAGARI VOWEL SIGN VOCALIC L -// 963 DEVANAGARI VOWEL SIGN VOCALIC LL - { 0x962, 0x2, 0x0, 0, 0 }, -// 964 DEVANAGARI DANDA -// 965 DEVANAGARI DOUBLE DANDA - { 0x964, 0x2, 0x18, 0, 0 }, -// 966 DEVANAGARI DIGIT ZERO -// 967 DEVANAGARI DIGIT ONE -// 968 DEVANAGARI DIGIT TWO -// 969 DEVANAGARI DIGIT THREE -// 96a DEVANAGARI DIGIT FOUR -// 96b DEVANAGARI DIGIT FIVE -// 96c DEVANAGARI DIGIT SIX -// 96d DEVANAGARI DIGIT SEVEN -// 96e DEVANAGARI DIGIT EIGHT -// 96f DEVANAGARI DIGIT NINE - { 0x966, 0xA, 0x108, 0, 0 }, -// 970 DEVANAGARI ABBREVIATION SIGN - { 0x970, 0x1, 0x18, 0, 0 }, -// 971 DEVANAGARI SIGN HIGH SPACING DOT -// 972 DEVANAGARI LETTER CANDRA A -// 973 DEVANAGARI LETTER OE -// 974 DEVANAGARI LETTER OOE -// 975 DEVANAGARI LETTER AW -// 976 DEVANAGARI LETTER UE -// 977 DEVANAGARI LETTER UUE -// 978 DEVANAGARI LETTER MARWARI DDA -// 979 DEVANAGARI LETTER ZHA -// 97a DEVANAGARI LETTER HEAVY YA -// 97b DEVANAGARI LETTER GGA -// 97c DEVANAGARI LETTER JJA -// 97d DEVANAGARI LETTER GLOTTAL STOP -// 97e DEVANAGARI LETTER DDDA -// 97f DEVANAGARI LETTER BBA -// 980 BENGALI ANJI - { 0x971, 0x10, 0x9, 0, 0 }, -// 981 BENGALI SIGN CANDRABINDU -// 982 BENGALI SIGN ANUSVARA -// 983 BENGALI SIGN VISARGA - { 0x981, 0x3, 0x0, 0, 0 }, -// 985 BENGALI LETTER A -// 986 BENGALI LETTER AA -// 987 BENGALI LETTER I -// 988 BENGALI LETTER II -// 989 BENGALI LETTER U -// 98a BENGALI LETTER UU -// 98b BENGALI LETTER VOCALIC R -// 98c BENGALI LETTER VOCALIC L - { 0x985, 0x8, 0x9, 0, 0 }, -// 98f BENGALI LETTER E -// 990 BENGALI LETTER AI - { 0x98F, 0x2, 0x9, 0, 0 }, -// 993 BENGALI LETTER O -// 994 BENGALI LETTER AU -// 995 BENGALI LETTER KA -// 996 BENGALI LETTER KHA -// 997 BENGALI LETTER GA -// 998 BENGALI LETTER GHA -// 999 BENGALI LETTER NGA -// 99a BENGALI LETTER CA -// 99b BENGALI LETTER CHA -// 99c BENGALI LETTER JA -// 99d BENGALI LETTER JHA -// 99e BENGALI LETTER NYA -// 99f BENGALI LETTER TTA -// 9a0 BENGALI LETTER TTHA -// 9a1 BENGALI LETTER DDA -// 9a2 BENGALI LETTER DDHA -// 9a3 BENGALI LETTER NNA -// 9a4 BENGALI LETTER TA -// 9a5 BENGALI LETTER THA -// 9a6 BENGALI LETTER DA -// 9a7 BENGALI LETTER DHA -// 9a8 BENGALI LETTER NA - { 0x993, 0x16, 0x9, 0, 0 }, -// 9aa BENGALI LETTER PA -// 9ab BENGALI LETTER PHA -// 9ac BENGALI LETTER BA -// 9ad BENGALI LETTER BHA -// 9ae BENGALI LETTER MA -// 9af BENGALI LETTER YA -// 9b0 BENGALI LETTER RA - { 0x9AA, 0x7, 0x9, 0, 0 }, -// 9b2 BENGALI LETTER LA - { 0x9B2, 0x1, 0x9, 0, 0 }, -// 9b6 BENGALI LETTER SHA -// 9b7 BENGALI LETTER SSA -// 9b8 BENGALI LETTER SA -// 9b9 BENGALI LETTER HA - { 0x9B6, 0x4, 0x9, 0, 0 }, -// 9bc BENGALI SIGN NUKTA - { 0x9BC, 0x1, 0x0, 0, 0 }, -// 9bd BENGALI SIGN AVAGRAHA - { 0x9BD, 0x1, 0x9, 0, 0 }, -// 9be BENGALI VOWEL SIGN AA -// 9bf BENGALI VOWEL SIGN I -// 9c0 BENGALI VOWEL SIGN II -// 9c1 BENGALI VOWEL SIGN U -// 9c2 BENGALI VOWEL SIGN UU -// 9c3 BENGALI VOWEL SIGN VOCALIC R -// 9c4 BENGALI VOWEL SIGN VOCALIC RR - { 0x9BE, 0x7, 0x0, 0, 0 }, -// 9c7 BENGALI VOWEL SIGN E -// 9c8 BENGALI VOWEL SIGN AI - { 0x9C7, 0x2, 0x0, 0, 0 }, -// 9cb BENGALI VOWEL SIGN O -// 9cc BENGALI VOWEL SIGN AU -// 9cd BENGALI SIGN VIRAMA - { 0x9CB, 0x3, 0x0, 0, 0 }, -// 9ce BENGALI LETTER KHANDA TA - { 0x9CE, 0x1, 0x9, 0, 0 }, -// 9d7 BENGALI AU LENGTH MARK - { 0x9D7, 0x1, 0x0, 0, 0 }, -// 9dc BENGALI LETTER RRA -// 9dd BENGALI LETTER RHA - { 0x9DC, 0x2, 0x9, 0, 0 }, -// 9df BENGALI LETTER YYA -// 9e0 BENGALI LETTER VOCALIC RR -// 9e1 BENGALI LETTER VOCALIC LL - { 0x9DF, 0x3, 0x9, 0, 0 }, -// 9e2 BENGALI VOWEL SIGN VOCALIC L -// 9e3 BENGALI VOWEL SIGN VOCALIC LL - { 0x9E2, 0x2, 0x0, 0, 0 }, -// 9e6 BENGALI DIGIT ZERO -// 9e7 BENGALI DIGIT ONE -// 9e8 BENGALI DIGIT TWO -// 9e9 BENGALI DIGIT THREE -// 9ea BENGALI DIGIT FOUR -// 9eb BENGALI DIGIT FIVE -// 9ec BENGALI DIGIT SIX -// 9ed BENGALI DIGIT SEVEN -// 9ee BENGALI DIGIT EIGHT -// 9ef BENGALI DIGIT NINE - { 0x9E6, 0xA, 0x108, 0, 0 }, -// 9f0 BENGALI LETTER RA WITH MIDDLE DIAGONAL -// 9f1 BENGALI LETTER RA WITH LOWER DIAGONAL - { 0x9F0, 0x2, 0x9, 0, 0 }, -// 9f2 BENGALI RUPEE MARK -// 9f3 BENGALI RUPEE SIGN -// 9f4 BENGALI CURRENCY NUMERATOR ONE -// 9f5 BENGALI CURRENCY NUMERATOR TWO -// 9f6 BENGALI CURRENCY NUMERATOR THREE -// 9f7 BENGALI CURRENCY NUMERATOR FOUR -// 9f8 BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR -// 9f9 BENGALI CURRENCY DENOMINATOR SIXTEEN -// 9fa BENGALI ISSHAR -// 9fb BENGALI GANDA MARK - { 0x9F2, 0xA, 0x8, 0, 0 }, -// a01 GURMUKHI SIGN ADAK BINDI -// a02 GURMUKHI SIGN BINDI -// a03 GURMUKHI SIGN VISARGA - { 0xA01, 0x3, 0x0, 0, 0 }, -// a05 GURMUKHI LETTER A -// a06 GURMUKHI LETTER AA -// a07 GURMUKHI LETTER I -// a08 GURMUKHI LETTER II -// a09 GURMUKHI LETTER U -// a0a GURMUKHI LETTER UU - { 0xA05, 0x6, 0x9, 0, 0 }, -// a0f GURMUKHI LETTER EE -// a10 GURMUKHI LETTER AI - { 0xA0F, 0x2, 0x9, 0, 0 }, -// a13 GURMUKHI LETTER OO -// a14 GURMUKHI LETTER AU -// a15 GURMUKHI LETTER KA -// a16 GURMUKHI LETTER KHA -// a17 GURMUKHI LETTER GA -// a18 GURMUKHI LETTER GHA -// a19 GURMUKHI LETTER NGA -// a1a GURMUKHI LETTER CA -// a1b GURMUKHI LETTER CHA -// a1c GURMUKHI LETTER JA -// a1d GURMUKHI LETTER JHA -// a1e GURMUKHI LETTER NYA -// a1f GURMUKHI LETTER TTA -// a20 GURMUKHI LETTER TTHA -// a21 GURMUKHI LETTER DDA -// a22 GURMUKHI LETTER DDHA -// a23 GURMUKHI LETTER NNA -// a24 GURMUKHI LETTER TA -// a25 GURMUKHI LETTER THA -// a26 GURMUKHI LETTER DA -// a27 GURMUKHI LETTER DHA -// a28 GURMUKHI LETTER NA - { 0xA13, 0x16, 0x9, 0, 0 }, -// a2a GURMUKHI LETTER PA -// a2b GURMUKHI LETTER PHA -// a2c GURMUKHI LETTER BA -// a2d GURMUKHI LETTER BHA -// a2e GURMUKHI LETTER MA -// a2f GURMUKHI LETTER YA -// a30 GURMUKHI LETTER RA - { 0xA2A, 0x7, 0x9, 0, 0 }, -// a32 GURMUKHI LETTER LA -// a33 GURMUKHI LETTER LLA - { 0xA32, 0x2, 0x9, 0, 0 }, -// a35 GURMUKHI LETTER VA -// a36 GURMUKHI LETTER SHA - { 0xA35, 0x2, 0x9, 0, 0 }, -// a38 GURMUKHI LETTER SA -// a39 GURMUKHI LETTER HA - { 0xA38, 0x2, 0x9, 0, 0 }, -// a3c GURMUKHI SIGN NUKTA - { 0xA3C, 0x1, 0x0, 0, 0 }, -// a3e GURMUKHI VOWEL SIGN AA -// a3f GURMUKHI VOWEL SIGN I -// a40 GURMUKHI VOWEL SIGN II -// a41 GURMUKHI VOWEL SIGN U -// a42 GURMUKHI VOWEL SIGN UU - { 0xA3E, 0x5, 0x0, 0, 0 }, -// a47 GURMUKHI VOWEL SIGN EE -// a48 GURMUKHI VOWEL SIGN AI - { 0xA47, 0x2, 0x0, 0, 0 }, -// a4b GURMUKHI VOWEL SIGN OO -// a4c GURMUKHI VOWEL SIGN AU -// a4d GURMUKHI SIGN VIRAMA - { 0xA4B, 0x3, 0x0, 0, 0 }, -// a51 GURMUKHI SIGN UDAAT - { 0xA51, 0x1, 0x0, 0, 0 }, -// a59 GURMUKHI LETTER KHHA -// a5a GURMUKHI LETTER GHHA -// a5b GURMUKHI LETTER ZA -// a5c GURMUKHI LETTER RRA - { 0xA59, 0x4, 0x9, 0, 0 }, -// a5e GURMUKHI LETTER FA - { 0xA5E, 0x1, 0x9, 0, 0 }, -// a66 GURMUKHI DIGIT ZERO -// a67 GURMUKHI DIGIT ONE -// a68 GURMUKHI DIGIT TWO -// a69 GURMUKHI DIGIT THREE -// a6a GURMUKHI DIGIT FOUR -// a6b GURMUKHI DIGIT FIVE -// a6c GURMUKHI DIGIT SIX -// a6d GURMUKHI DIGIT SEVEN -// a6e GURMUKHI DIGIT EIGHT -// a6f GURMUKHI DIGIT NINE - { 0xA66, 0xA, 0x108, 0, 0 }, -// a70 GURMUKHI TIPPI -// a71 GURMUKHI ADDAK - { 0xA70, 0x2, 0x0, 0, 0 }, -// a72 GURMUKHI IRI -// a73 GURMUKHI URA -// a74 GURMUKHI EK ONKAR - { 0xA72, 0x3, 0x9, 0, 0 }, -// a75 GURMUKHI SIGN YAKASH - { 0xA75, 0x1, 0x0, 0, 0 }, -// a81 GUJARATI SIGN CANDRABINDU -// a82 GUJARATI SIGN ANUSVARA -// a83 GUJARATI SIGN VISARGA - { 0xA81, 0x3, 0x0, 0, 0 }, -// a85 GUJARATI LETTER A -// a86 GUJARATI LETTER AA -// a87 GUJARATI LETTER I -// a88 GUJARATI LETTER II -// a89 GUJARATI LETTER U -// a8a GUJARATI LETTER UU -// a8b GUJARATI LETTER VOCALIC R -// a8c GUJARATI LETTER VOCALIC L -// a8d GUJARATI VOWEL CANDRA E - { 0xA85, 0x9, 0x9, 0, 0 }, -// a8f GUJARATI LETTER E -// a90 GUJARATI LETTER AI -// a91 GUJARATI VOWEL CANDRA O - { 0xA8F, 0x3, 0x9, 0, 0 }, -// a93 GUJARATI LETTER O -// a94 GUJARATI LETTER AU -// a95 GUJARATI LETTER KA -// a96 GUJARATI LETTER KHA -// a97 GUJARATI LETTER GA -// a98 GUJARATI LETTER GHA -// a99 GUJARATI LETTER NGA -// a9a GUJARATI LETTER CA -// a9b GUJARATI LETTER CHA -// a9c GUJARATI LETTER JA -// a9d GUJARATI LETTER JHA -// a9e GUJARATI LETTER NYA -// a9f GUJARATI LETTER TTA -// aa0 GUJARATI LETTER TTHA -// aa1 GUJARATI LETTER DDA -// aa2 GUJARATI LETTER DDHA -// aa3 GUJARATI LETTER NNA -// aa4 GUJARATI LETTER TA -// aa5 GUJARATI LETTER THA -// aa6 GUJARATI LETTER DA -// aa7 GUJARATI LETTER DHA -// aa8 GUJARATI LETTER NA - { 0xA93, 0x16, 0x9, 0, 0 }, -// aaa GUJARATI LETTER PA -// aab GUJARATI LETTER PHA -// aac GUJARATI LETTER BA -// aad GUJARATI LETTER BHA -// aae GUJARATI LETTER MA -// aaf GUJARATI LETTER YA -// ab0 GUJARATI LETTER RA - { 0xAAA, 0x7, 0x9, 0, 0 }, -// ab2 GUJARATI LETTER LA -// ab3 GUJARATI LETTER LLA - { 0xAB2, 0x2, 0x9, 0, 0 }, -// ab5 GUJARATI LETTER VA -// ab6 GUJARATI LETTER SHA -// ab7 GUJARATI LETTER SSA -// ab8 GUJARATI LETTER SA -// ab9 GUJARATI LETTER HA - { 0xAB5, 0x5, 0x9, 0, 0 }, -// abc GUJARATI SIGN NUKTA - { 0xABC, 0x1, 0x0, 0, 0 }, -// abd GUJARATI SIGN AVAGRAHA - { 0xABD, 0x1, 0x9, 0, 0 }, -// abe GUJARATI VOWEL SIGN AA -// abf GUJARATI VOWEL SIGN I -// ac0 GUJARATI VOWEL SIGN II -// ac1 GUJARATI VOWEL SIGN U -// ac2 GUJARATI VOWEL SIGN UU -// ac3 GUJARATI VOWEL SIGN VOCALIC R -// ac4 GUJARATI VOWEL SIGN VOCALIC RR -// ac5 GUJARATI VOWEL SIGN CANDRA E - { 0xABE, 0x8, 0x0, 0, 0 }, -// ac7 GUJARATI VOWEL SIGN E -// ac8 GUJARATI VOWEL SIGN AI -// ac9 GUJARATI VOWEL SIGN CANDRA O - { 0xAC7, 0x3, 0x0, 0, 0 }, -// acb GUJARATI VOWEL SIGN O -// acc GUJARATI VOWEL SIGN AU -// acd GUJARATI SIGN VIRAMA - { 0xACB, 0x3, 0x0, 0, 0 }, -// ad0 GUJARATI OM - { 0xAD0, 0x1, 0x9, 0, 0 }, -// ae0 GUJARATI LETTER VOCALIC RR -// ae1 GUJARATI LETTER VOCALIC LL - { 0xAE0, 0x2, 0x9, 0, 0 }, -// ae2 GUJARATI VOWEL SIGN VOCALIC L -// ae3 GUJARATI VOWEL SIGN VOCALIC LL - { 0xAE2, 0x2, 0x0, 0, 0 }, -// ae6 GUJARATI DIGIT ZERO -// ae7 GUJARATI DIGIT ONE -// ae8 GUJARATI DIGIT TWO -// ae9 GUJARATI DIGIT THREE -// aea GUJARATI DIGIT FOUR -// aeb GUJARATI DIGIT FIVE -// aec GUJARATI DIGIT SIX -// aed GUJARATI DIGIT SEVEN -// aee GUJARATI DIGIT EIGHT -// aef GUJARATI DIGIT NINE - { 0xAE6, 0xA, 0x108, 0, 0 }, -// af0 GUJARATI ABBREVIATION SIGN - { 0xAF0, 0x1, 0x18, 0, 0 }, -// af1 GUJARATI RUPEE SIGN - { 0xAF1, 0x1, 0x8, 0, 0 }, -// b01 ORIYA SIGN CANDRABINDU -// b02 ORIYA SIGN ANUSVARA -// b03 ORIYA SIGN VISARGA - { 0xB01, 0x3, 0x0, 0, 0 }, -// b05 ORIYA LETTER A -// b06 ORIYA LETTER AA -// b07 ORIYA LETTER I -// b08 ORIYA LETTER II -// b09 ORIYA LETTER U -// b0a ORIYA LETTER UU -// b0b ORIYA LETTER VOCALIC R -// b0c ORIYA LETTER VOCALIC L - { 0xB05, 0x8, 0x9, 0, 0 }, -// b0f ORIYA LETTER E -// b10 ORIYA LETTER AI - { 0xB0F, 0x2, 0x9, 0, 0 }, -// b13 ORIYA LETTER O -// b14 ORIYA LETTER AU -// b15 ORIYA LETTER KA -// b16 ORIYA LETTER KHA -// b17 ORIYA LETTER GA -// b18 ORIYA LETTER GHA -// b19 ORIYA LETTER NGA -// b1a ORIYA LETTER CA -// b1b ORIYA LETTER CHA -// b1c ORIYA LETTER JA -// b1d ORIYA LETTER JHA -// b1e ORIYA LETTER NYA -// b1f ORIYA LETTER TTA -// b20 ORIYA LETTER TTHA -// b21 ORIYA LETTER DDA -// b22 ORIYA LETTER DDHA -// b23 ORIYA LETTER NNA -// b24 ORIYA LETTER TA -// b25 ORIYA LETTER THA -// b26 ORIYA LETTER DA -// b27 ORIYA LETTER DHA -// b28 ORIYA LETTER NA - { 0xB13, 0x16, 0x9, 0, 0 }, -// b2a ORIYA LETTER PA -// b2b ORIYA LETTER PHA -// b2c ORIYA LETTER BA -// b2d ORIYA LETTER BHA -// b2e ORIYA LETTER MA -// b2f ORIYA LETTER YA -// b30 ORIYA LETTER RA - { 0xB2A, 0x7, 0x9, 0, 0 }, -// b32 ORIYA LETTER LA -// b33 ORIYA LETTER LLA - { 0xB32, 0x2, 0x9, 0, 0 }, -// b35 ORIYA LETTER VA -// b36 ORIYA LETTER SHA -// b37 ORIYA LETTER SSA -// b38 ORIYA LETTER SA -// b39 ORIYA LETTER HA - { 0xB35, 0x5, 0x9, 0, 0 }, -// b3c ORIYA SIGN NUKTA - { 0xB3C, 0x1, 0x0, 0, 0 }, -// b3d ORIYA SIGN AVAGRAHA - { 0xB3D, 0x1, 0x9, 0, 0 }, -// b3e ORIYA VOWEL SIGN AA -// b3f ORIYA VOWEL SIGN I -// b40 ORIYA VOWEL SIGN II -// b41 ORIYA VOWEL SIGN U -// b42 ORIYA VOWEL SIGN UU -// b43 ORIYA VOWEL SIGN VOCALIC R -// b44 ORIYA VOWEL SIGN VOCALIC RR - { 0xB3E, 0x7, 0x0, 0, 0 }, -// b47 ORIYA VOWEL SIGN E -// b48 ORIYA VOWEL SIGN AI - { 0xB47, 0x2, 0x0, 0, 0 }, -// b4b ORIYA VOWEL SIGN O -// b4c ORIYA VOWEL SIGN AU -// b4d ORIYA SIGN VIRAMA - { 0xB4B, 0x3, 0x0, 0, 0 }, -// b56 ORIYA AI LENGTH MARK -// b57 ORIYA AU LENGTH MARK - { 0xB56, 0x2, 0x0, 0, 0 }, -// b5c ORIYA LETTER RRA -// b5d ORIYA LETTER RHA - { 0xB5C, 0x2, 0x9, 0, 0 }, -// b5f ORIYA LETTER YYA -// b60 ORIYA LETTER VOCALIC RR -// b61 ORIYA LETTER VOCALIC LL - { 0xB5F, 0x3, 0x9, 0, 0 }, -// b62 ORIYA VOWEL SIGN VOCALIC L -// b63 ORIYA VOWEL SIGN VOCALIC LL - { 0xB62, 0x2, 0x0, 0, 0 }, -// b66 ORIYA DIGIT ZERO -// b67 ORIYA DIGIT ONE -// b68 ORIYA DIGIT TWO -// b69 ORIYA DIGIT THREE -// b6a ORIYA DIGIT FOUR -// b6b ORIYA DIGIT FIVE -// b6c ORIYA DIGIT SIX -// b6d ORIYA DIGIT SEVEN -// b6e ORIYA DIGIT EIGHT -// b6f ORIYA DIGIT NINE - { 0xB66, 0xA, 0x108, 0, 0 }, -// b70 ORIYA ISSHAR - { 0xB70, 0x1, 0x8, 0, 0 }, -// b71 ORIYA LETTER WA - { 0xB71, 0x1, 0x9, 0, 0 }, -// b72 ORIYA FRACTION ONE QUARTER -// b73 ORIYA FRACTION ONE HALF -// b74 ORIYA FRACTION THREE QUARTERS -// b75 ORIYA FRACTION ONE SIXTEENTH -// b76 ORIYA FRACTION ONE EIGHTH -// b77 ORIYA FRACTION THREE SIXTEENTHS - { 0xB72, 0x6, 0x8, 0, 0 }, -// b82 TAMIL SIGN ANUSVARA - { 0xB82, 0x1, 0x0, 0, 0 }, -// b83 TAMIL SIGN VISARGA - { 0xB83, 0x1, 0x9, 0, 0 }, -// b85 TAMIL LETTER A -// b86 TAMIL LETTER AA -// b87 TAMIL LETTER I -// b88 TAMIL LETTER II -// b89 TAMIL LETTER U -// b8a TAMIL LETTER UU - { 0xB85, 0x6, 0x9, 0, 0 }, -// b8e TAMIL LETTER E -// b8f TAMIL LETTER EE -// b90 TAMIL LETTER AI - { 0xB8E, 0x3, 0x9, 0, 0 }, -// b92 TAMIL LETTER O -// b93 TAMIL LETTER OO -// b94 TAMIL LETTER AU -// b95 TAMIL LETTER KA - { 0xB92, 0x4, 0x9, 0, 0 }, -// b99 TAMIL LETTER NGA -// b9a TAMIL LETTER CA - { 0xB99, 0x2, 0x9, 0, 0 }, -// b9c TAMIL LETTER JA - { 0xB9C, 0x1, 0x9, 0, 0 }, -// b9e TAMIL LETTER NYA -// b9f TAMIL LETTER TTA - { 0xB9E, 0x2, 0x9, 0, 0 }, -// ba3 TAMIL LETTER NNA -// ba4 TAMIL LETTER TA - { 0xBA3, 0x2, 0x9, 0, 0 }, -// ba8 TAMIL LETTER NA -// ba9 TAMIL LETTER NNNA -// baa TAMIL LETTER PA - { 0xBA8, 0x3, 0x9, 0, 0 }, -// bae TAMIL LETTER MA -// baf TAMIL LETTER YA -// bb0 TAMIL LETTER RA -// bb1 TAMIL LETTER RRA -// bb2 TAMIL LETTER LA -// bb3 TAMIL LETTER LLA -// bb4 TAMIL LETTER LLLA -// bb5 TAMIL LETTER VA -// bb6 TAMIL LETTER SHA -// bb7 TAMIL LETTER SSA -// bb8 TAMIL LETTER SA -// bb9 TAMIL LETTER HA - { 0xBAE, 0xC, 0x9, 0, 0 }, -// bbe TAMIL VOWEL SIGN AA -// bbf TAMIL VOWEL SIGN I -// bc0 TAMIL VOWEL SIGN II -// bc1 TAMIL VOWEL SIGN U -// bc2 TAMIL VOWEL SIGN UU - { 0xBBE, 0x5, 0x0, 0, 0 }, -// bc6 TAMIL VOWEL SIGN E -// bc7 TAMIL VOWEL SIGN EE -// bc8 TAMIL VOWEL SIGN AI - { 0xBC6, 0x3, 0x0, 0, 0 }, -// bca TAMIL VOWEL SIGN O -// bcb TAMIL VOWEL SIGN OO -// bcc TAMIL VOWEL SIGN AU -// bcd TAMIL SIGN VIRAMA - { 0xBCA, 0x4, 0x0, 0, 0 }, -// bd0 TAMIL OM - { 0xBD0, 0x1, 0x9, 0, 0 }, -// bd7 TAMIL AU LENGTH MARK - { 0xBD7, 0x1, 0x0, 0, 0 }, -// be6 TAMIL DIGIT ZERO -// be7 TAMIL DIGIT ONE -// be8 TAMIL DIGIT TWO -// be9 TAMIL DIGIT THREE -// bea TAMIL DIGIT FOUR -// beb TAMIL DIGIT FIVE -// bec TAMIL DIGIT SIX -// bed TAMIL DIGIT SEVEN -// bee TAMIL DIGIT EIGHT -// bef TAMIL DIGIT NINE - { 0xBE6, 0xA, 0x108, 0, 0 }, -// bf0 TAMIL NUMBER TEN -// bf1 TAMIL NUMBER ONE HUNDRED -// bf2 TAMIL NUMBER ONE THOUSAND -// bf3 TAMIL DAY SIGN -// bf4 TAMIL MONTH SIGN -// bf5 TAMIL YEAR SIGN -// bf6 TAMIL DEBIT SIGN -// bf7 TAMIL CREDIT SIGN -// bf8 TAMIL AS ABOVE SIGN -// bf9 TAMIL RUPEE SIGN -// bfa TAMIL NUMBER SIGN - { 0xBF0, 0xB, 0x8, 0, 0 }, -// c00 TELUGU SIGN COMBINING CANDRABINDU ABOVE -// c01 TELUGU SIGN CANDRABINDU -// c02 TELUGU SIGN ANUSVARA -// c03 TELUGU SIGN VISARGA - { 0xC00, 0x4, 0x0, 0, 0 }, -// c05 TELUGU LETTER A -// c06 TELUGU LETTER AA -// c07 TELUGU LETTER I -// c08 TELUGU LETTER II -// c09 TELUGU LETTER U -// c0a TELUGU LETTER UU -// c0b TELUGU LETTER VOCALIC R -// c0c TELUGU LETTER VOCALIC L - { 0xC05, 0x8, 0x9, 0, 0 }, -// c0e TELUGU LETTER E -// c0f TELUGU LETTER EE -// c10 TELUGU LETTER AI - { 0xC0E, 0x3, 0x9, 0, 0 }, -// c12 TELUGU LETTER O -// c13 TELUGU LETTER OO -// c14 TELUGU LETTER AU -// c15 TELUGU LETTER KA -// c16 TELUGU LETTER KHA -// c17 TELUGU LETTER GA -// c18 TELUGU LETTER GHA -// c19 TELUGU LETTER NGA -// c1a TELUGU LETTER CA -// c1b TELUGU LETTER CHA -// c1c TELUGU LETTER JA -// c1d TELUGU LETTER JHA -// c1e TELUGU LETTER NYA -// c1f TELUGU LETTER TTA -// c20 TELUGU LETTER TTHA -// c21 TELUGU LETTER DDA -// c22 TELUGU LETTER DDHA -// c23 TELUGU LETTER NNA -// c24 TELUGU LETTER TA -// c25 TELUGU LETTER THA -// c26 TELUGU LETTER DA -// c27 TELUGU LETTER DHA -// c28 TELUGU LETTER NA - { 0xC12, 0x17, 0x9, 0, 0 }, -// c2a TELUGU LETTER PA -// c2b TELUGU LETTER PHA -// c2c TELUGU LETTER BA -// c2d TELUGU LETTER BHA -// c2e TELUGU LETTER MA -// c2f TELUGU LETTER YA -// c30 TELUGU LETTER RA -// c31 TELUGU LETTER RRA -// c32 TELUGU LETTER LA -// c33 TELUGU LETTER LLA -// c34 TELUGU LETTER LLLA -// c35 TELUGU LETTER VA -// c36 TELUGU LETTER SHA -// c37 TELUGU LETTER SSA -// c38 TELUGU LETTER SA -// c39 TELUGU LETTER HA - { 0xC2A, 0x10, 0x9, 0, 0 }, -// c3d TELUGU SIGN AVAGRAHA - { 0xC3D, 0x1, 0x9, 0, 0 }, -// c3e TELUGU VOWEL SIGN AA -// c3f TELUGU VOWEL SIGN I -// c40 TELUGU VOWEL SIGN II -// c41 TELUGU VOWEL SIGN U -// c42 TELUGU VOWEL SIGN UU -// c43 TELUGU VOWEL SIGN VOCALIC R -// c44 TELUGU VOWEL SIGN VOCALIC RR - { 0xC3E, 0x7, 0x0, 0, 0 }, -// c46 TELUGU VOWEL SIGN E -// c47 TELUGU VOWEL SIGN EE -// c48 TELUGU VOWEL SIGN AI - { 0xC46, 0x3, 0x0, 0, 0 }, -// c4a TELUGU VOWEL SIGN O -// c4b TELUGU VOWEL SIGN OO -// c4c TELUGU VOWEL SIGN AU -// c4d TELUGU SIGN VIRAMA - { 0xC4A, 0x4, 0x0, 0, 0 }, -// c55 TELUGU LENGTH MARK -// c56 TELUGU AI LENGTH MARK - { 0xC55, 0x2, 0x0, 0, 0 }, -// c58 TELUGU LETTER TSA -// c59 TELUGU LETTER DZA - { 0xC58, 0x2, 0x9, 0, 0 }, -// c60 TELUGU LETTER VOCALIC RR -// c61 TELUGU LETTER VOCALIC LL - { 0xC60, 0x2, 0x9, 0, 0 }, -// c62 TELUGU VOWEL SIGN VOCALIC L -// c63 TELUGU VOWEL SIGN VOCALIC LL - { 0xC62, 0x2, 0x0, 0, 0 }, -// c66 TELUGU DIGIT ZERO -// c67 TELUGU DIGIT ONE -// c68 TELUGU DIGIT TWO -// c69 TELUGU DIGIT THREE -// c6a TELUGU DIGIT FOUR -// c6b TELUGU DIGIT FIVE -// c6c TELUGU DIGIT SIX -// c6d TELUGU DIGIT SEVEN -// c6e TELUGU DIGIT EIGHT -// c6f TELUGU DIGIT NINE - { 0xC66, 0xA, 0x108, 0, 0 }, -// c78 TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR -// c79 TELUGU FRACTION DIGIT ONE FOR ODD POWERS OF FOUR -// c7a TELUGU FRACTION DIGIT TWO FOR ODD POWERS OF FOUR -// c7b TELUGU FRACTION DIGIT THREE FOR ODD POWERS OF FOUR -// c7c TELUGU FRACTION DIGIT ONE FOR EVEN POWERS OF FOUR -// c7d TELUGU FRACTION DIGIT TWO FOR EVEN POWERS OF FOUR -// c7e TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR -// c7f TELUGU SIGN TUUMU - { 0xC78, 0x8, 0x8, 0, 0 }, -// c81 KANNADA SIGN CANDRABINDU -// c82 KANNADA SIGN ANUSVARA -// c83 KANNADA SIGN VISARGA - { 0xC81, 0x3, 0x0, 0, 0 }, -// c85 KANNADA LETTER A -// c86 KANNADA LETTER AA -// c87 KANNADA LETTER I -// c88 KANNADA LETTER II -// c89 KANNADA LETTER U -// c8a KANNADA LETTER UU -// c8b KANNADA LETTER VOCALIC R -// c8c KANNADA LETTER VOCALIC L - { 0xC85, 0x8, 0x9, 0, 0 }, -// c8e KANNADA LETTER E -// c8f KANNADA LETTER EE -// c90 KANNADA LETTER AI - { 0xC8E, 0x3, 0x9, 0, 0 }, -// c92 KANNADA LETTER O -// c93 KANNADA LETTER OO -// c94 KANNADA LETTER AU -// c95 KANNADA LETTER KA -// c96 KANNADA LETTER KHA -// c97 KANNADA LETTER GA -// c98 KANNADA LETTER GHA -// c99 KANNADA LETTER NGA -// c9a KANNADA LETTER CA -// c9b KANNADA LETTER CHA -// c9c KANNADA LETTER JA -// c9d KANNADA LETTER JHA -// c9e KANNADA LETTER NYA -// c9f KANNADA LETTER TTA -// ca0 KANNADA LETTER TTHA -// ca1 KANNADA LETTER DDA -// ca2 KANNADA LETTER DDHA -// ca3 KANNADA LETTER NNA -// ca4 KANNADA LETTER TA -// ca5 KANNADA LETTER THA -// ca6 KANNADA LETTER DA -// ca7 KANNADA LETTER DHA -// ca8 KANNADA LETTER NA - { 0xC92, 0x17, 0x9, 0, 0 }, -// caa KANNADA LETTER PA -// cab KANNADA LETTER PHA -// cac KANNADA LETTER BA -// cad KANNADA LETTER BHA -// cae KANNADA LETTER MA -// caf KANNADA LETTER YA -// cb0 KANNADA LETTER RA -// cb1 KANNADA LETTER RRA -// cb2 KANNADA LETTER LA -// cb3 KANNADA LETTER LLA - { 0xCAA, 0xA, 0x9, 0, 0 }, -// cb5 KANNADA LETTER VA -// cb6 KANNADA LETTER SHA -// cb7 KANNADA LETTER SSA -// cb8 KANNADA LETTER SA -// cb9 KANNADA LETTER HA - { 0xCB5, 0x5, 0x9, 0, 0 }, -// cbc KANNADA SIGN NUKTA - { 0xCBC, 0x1, 0x0, 0, 0 }, -// cbd KANNADA SIGN AVAGRAHA - { 0xCBD, 0x1, 0x9, 0, 0 }, -// cbe KANNADA VOWEL SIGN AA -// cbf KANNADA VOWEL SIGN I -// cc0 KANNADA VOWEL SIGN II -// cc1 KANNADA VOWEL SIGN U -// cc2 KANNADA VOWEL SIGN UU -// cc3 KANNADA VOWEL SIGN VOCALIC R -// cc4 KANNADA VOWEL SIGN VOCALIC RR - { 0xCBE, 0x7, 0x0, 0, 0 }, -// cc6 KANNADA VOWEL SIGN E -// cc7 KANNADA VOWEL SIGN EE -// cc8 KANNADA VOWEL SIGN AI - { 0xCC6, 0x3, 0x0, 0, 0 }, -// cca KANNADA VOWEL SIGN O -// ccb KANNADA VOWEL SIGN OO -// ccc KANNADA VOWEL SIGN AU -// ccd KANNADA SIGN VIRAMA - { 0xCCA, 0x4, 0x0, 0, 0 }, -// cd5 KANNADA LENGTH MARK -// cd6 KANNADA AI LENGTH MARK - { 0xCD5, 0x2, 0x0, 0, 0 }, -// cde KANNADA LETTER FA - { 0xCDE, 0x1, 0x9, 0, 0 }, -// ce0 KANNADA LETTER VOCALIC RR -// ce1 KANNADA LETTER VOCALIC LL - { 0xCE0, 0x2, 0x9, 0, 0 }, -// ce2 KANNADA VOWEL SIGN VOCALIC L -// ce3 KANNADA VOWEL SIGN VOCALIC LL - { 0xCE2, 0x2, 0x0, 0, 0 }, -// ce6 KANNADA DIGIT ZERO -// ce7 KANNADA DIGIT ONE -// ce8 KANNADA DIGIT TWO -// ce9 KANNADA DIGIT THREE -// cea KANNADA DIGIT FOUR -// ceb KANNADA DIGIT FIVE -// cec KANNADA DIGIT SIX -// ced KANNADA DIGIT SEVEN -// cee KANNADA DIGIT EIGHT -// cef KANNADA DIGIT NINE - { 0xCE6, 0xA, 0x108, 0, 0 }, -// cf1 KANNADA SIGN JIHVAMULIYA -// cf2 KANNADA SIGN UPADHMANIYA - { 0xCF1, 0x2, 0x9, 0, 0 }, -// d01 MALAYALAM SIGN CANDRABINDU -// d02 MALAYALAM SIGN ANUSVARA -// d03 MALAYALAM SIGN VISARGA - { 0xD01, 0x3, 0x0, 0, 0 }, -// d05 MALAYALAM LETTER A -// d06 MALAYALAM LETTER AA -// d07 MALAYALAM LETTER I -// d08 MALAYALAM LETTER II -// d09 MALAYALAM LETTER U -// d0a MALAYALAM LETTER UU -// d0b MALAYALAM LETTER VOCALIC R -// d0c MALAYALAM LETTER VOCALIC L - { 0xD05, 0x8, 0x9, 0, 0 }, -// d0e MALAYALAM LETTER E -// d0f MALAYALAM LETTER EE -// d10 MALAYALAM LETTER AI - { 0xD0E, 0x3, 0x9, 0, 0 }, -// d12 MALAYALAM LETTER O -// d13 MALAYALAM LETTER OO -// d14 MALAYALAM LETTER AU -// d15 MALAYALAM LETTER KA -// d16 MALAYALAM LETTER KHA -// d17 MALAYALAM LETTER GA -// d18 MALAYALAM LETTER GHA -// d19 MALAYALAM LETTER NGA -// d1a MALAYALAM LETTER CA -// d1b MALAYALAM LETTER CHA -// d1c MALAYALAM LETTER JA -// d1d MALAYALAM LETTER JHA -// d1e MALAYALAM LETTER NYA -// d1f MALAYALAM LETTER TTA -// d20 MALAYALAM LETTER TTHA -// d21 MALAYALAM LETTER DDA -// d22 MALAYALAM LETTER DDHA -// d23 MALAYALAM LETTER NNA -// d24 MALAYALAM LETTER TA -// d25 MALAYALAM LETTER THA -// d26 MALAYALAM LETTER DA -// d27 MALAYALAM LETTER DHA -// d28 MALAYALAM LETTER NA -// d29 MALAYALAM LETTER NNNA -// d2a MALAYALAM LETTER PA -// d2b MALAYALAM LETTER PHA -// d2c MALAYALAM LETTER BA -// d2d MALAYALAM LETTER BHA -// d2e MALAYALAM LETTER MA -// d2f MALAYALAM LETTER YA -// d30 MALAYALAM LETTER RA -// d31 MALAYALAM LETTER RRA -// d32 MALAYALAM LETTER LA -// d33 MALAYALAM LETTER LLA -// d34 MALAYALAM LETTER LLLA -// d35 MALAYALAM LETTER VA -// d36 MALAYALAM LETTER SHA -// d37 MALAYALAM LETTER SSA -// d38 MALAYALAM LETTER SA -// d39 MALAYALAM LETTER HA -// d3a MALAYALAM LETTER TTTA - { 0xD12, 0x29, 0x9, 0, 0 }, -// d3d MALAYALAM SIGN AVAGRAHA - { 0xD3D, 0x1, 0x9, 0, 0 }, -// d3e MALAYALAM VOWEL SIGN AA -// d3f MALAYALAM VOWEL SIGN I -// d40 MALAYALAM VOWEL SIGN II -// d41 MALAYALAM VOWEL SIGN U -// d42 MALAYALAM VOWEL SIGN UU -// d43 MALAYALAM VOWEL SIGN VOCALIC R -// d44 MALAYALAM VOWEL SIGN VOCALIC RR - { 0xD3E, 0x7, 0x0, 0, 0 }, -// d46 MALAYALAM VOWEL SIGN E -// d47 MALAYALAM VOWEL SIGN EE -// d48 MALAYALAM VOWEL SIGN AI - { 0xD46, 0x3, 0x0, 0, 0 }, -// d4a MALAYALAM VOWEL SIGN O -// d4b MALAYALAM VOWEL SIGN OO -// d4c MALAYALAM VOWEL SIGN AU -// d4d MALAYALAM SIGN VIRAMA - { 0xD4A, 0x4, 0x0, 0, 0 }, -// d4e MALAYALAM LETTER DOT REPH - { 0xD4E, 0x1, 0x9, 0, 0 }, -// d57 MALAYALAM AU LENGTH MARK - { 0xD57, 0x1, 0x0, 0, 0 }, -// d60 MALAYALAM LETTER VOCALIC RR -// d61 MALAYALAM LETTER VOCALIC LL - { 0xD60, 0x2, 0x9, 0, 0 }, -// d62 MALAYALAM VOWEL SIGN VOCALIC L -// d63 MALAYALAM VOWEL SIGN VOCALIC LL - { 0xD62, 0x2, 0x0, 0, 0 }, -// d66 MALAYALAM DIGIT ZERO -// d67 MALAYALAM DIGIT ONE -// d68 MALAYALAM DIGIT TWO -// d69 MALAYALAM DIGIT THREE -// d6a MALAYALAM DIGIT FOUR -// d6b MALAYALAM DIGIT FIVE -// d6c MALAYALAM DIGIT SIX -// d6d MALAYALAM DIGIT SEVEN -// d6e MALAYALAM DIGIT EIGHT -// d6f MALAYALAM DIGIT NINE - { 0xD66, 0xA, 0x108, 0, 0 }, -// d70 MALAYALAM NUMBER TEN -// d71 MALAYALAM NUMBER ONE HUNDRED -// d72 MALAYALAM NUMBER ONE THOUSAND -// d73 MALAYALAM FRACTION ONE QUARTER -// d74 MALAYALAM FRACTION ONE HALF -// d75 MALAYALAM FRACTION THREE QUARTERS - { 0xD70, 0x6, 0x8, 0, 0 }, -// d79 MALAYALAM DATE MARK - { 0xD79, 0x1, 0x8, 0, 0 }, -// d7a MALAYALAM LETTER CHILLU NN -// d7b MALAYALAM LETTER CHILLU N -// d7c MALAYALAM LETTER CHILLU RR -// d7d MALAYALAM LETTER CHILLU L -// d7e MALAYALAM LETTER CHILLU LL -// d7f MALAYALAM LETTER CHILLU K - { 0xD7A, 0x6, 0x9, 0, 0 }, -// d82 SINHALA SIGN ANUSVARAYA -// d83 SINHALA SIGN VISARGAYA - { 0xD82, 0x2, 0x0, 0, 0 }, -// d85 SINHALA LETTER AYANNA -// d86 SINHALA LETTER AAYANNA -// d87 SINHALA LETTER AEYANNA -// d88 SINHALA LETTER AEEYANNA -// d89 SINHALA LETTER IYANNA -// d8a SINHALA LETTER IIYANNA -// d8b SINHALA LETTER UYANNA -// d8c SINHALA LETTER UUYANNA -// d8d SINHALA LETTER IRUYANNA -// d8e SINHALA LETTER IRUUYANNA -// d8f SINHALA LETTER ILUYANNA -// d90 SINHALA LETTER ILUUYANNA -// d91 SINHALA LETTER EYANNA -// d92 SINHALA LETTER EEYANNA -// d93 SINHALA LETTER AIYANNA -// d94 SINHALA LETTER OYANNA -// d95 SINHALA LETTER OOYANNA -// d96 SINHALA LETTER AUYANNA - { 0xD85, 0x12, 0x9, 0, 0 }, -// d9a SINHALA LETTER ALPAPRAANA KAYANNA -// d9b SINHALA LETTER MAHAAPRAANA KAYANNA -// d9c SINHALA LETTER ALPAPRAANA GAYANNA -// d9d SINHALA LETTER MAHAAPRAANA GAYANNA -// d9e SINHALA LETTER KANTAJA NAASIKYAYA -// d9f SINHALA LETTER SANYAKA GAYANNA -// da0 SINHALA LETTER ALPAPRAANA CAYANNA -// da1 SINHALA LETTER MAHAAPRAANA CAYANNA -// da2 SINHALA LETTER ALPAPRAANA JAYANNA -// da3 SINHALA LETTER MAHAAPRAANA JAYANNA -// da4 SINHALA LETTER TAALUJA NAASIKYAYA -// da5 SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA -// da6 SINHALA LETTER SANYAKA JAYANNA -// da7 SINHALA LETTER ALPAPRAANA TTAYANNA -// da8 SINHALA LETTER MAHAAPRAANA TTAYANNA -// da9 SINHALA LETTER ALPAPRAANA DDAYANNA -// daa SINHALA LETTER MAHAAPRAANA DDAYANNA -// dab SINHALA LETTER MUURDHAJA NAYANNA -// dac SINHALA LETTER SANYAKA DDAYANNA -// dad SINHALA LETTER ALPAPRAANA TAYANNA -// dae SINHALA LETTER MAHAAPRAANA TAYANNA -// daf SINHALA LETTER ALPAPRAANA DAYANNA -// db0 SINHALA LETTER MAHAAPRAANA DAYANNA -// db1 SINHALA LETTER DANTAJA NAYANNA - { 0xD9A, 0x18, 0x9, 0, 0 }, -// db3 SINHALA LETTER SANYAKA DAYANNA -// db4 SINHALA LETTER ALPAPRAANA PAYANNA -// db5 SINHALA LETTER MAHAAPRAANA PAYANNA -// db6 SINHALA LETTER ALPAPRAANA BAYANNA -// db7 SINHALA LETTER MAHAAPRAANA BAYANNA -// db8 SINHALA LETTER MAYANNA -// db9 SINHALA LETTER AMBA BAYANNA -// dba SINHALA LETTER YAYANNA -// dbb SINHALA LETTER RAYANNA - { 0xDB3, 0x9, 0x9, 0, 0 }, -// dbd SINHALA LETTER DANTAJA LAYANNA - { 0xDBD, 0x1, 0x9, 0, 0 }, -// dc0 SINHALA LETTER VAYANNA -// dc1 SINHALA LETTER TAALUJA SAYANNA -// dc2 SINHALA LETTER MUURDHAJA SAYANNA -// dc3 SINHALA LETTER DANTAJA SAYANNA -// dc4 SINHALA LETTER HAYANNA -// dc5 SINHALA LETTER MUURDHAJA LAYANNA -// dc6 SINHALA LETTER FAYANNA - { 0xDC0, 0x7, 0x9, 0, 0 }, -// dca SINHALA SIGN AL-LAKUNA - { 0xDCA, 0x1, 0x0, 0, 0 }, -// dcf SINHALA VOWEL SIGN AELA-PILLA -// dd0 SINHALA VOWEL SIGN KETTI AEDA-PILLA -// dd1 SINHALA VOWEL SIGN DIGA AEDA-PILLA -// dd2 SINHALA VOWEL SIGN KETTI IS-PILLA -// dd3 SINHALA VOWEL SIGN DIGA IS-PILLA -// dd4 SINHALA VOWEL SIGN KETTI PAA-PILLA - { 0xDCF, 0x6, 0x0, 0, 0 }, -// dd6 SINHALA VOWEL SIGN DIGA PAA-PILLA - { 0xDD6, 0x1, 0x0, 0, 0 }, -// dd8 SINHALA VOWEL SIGN GAETTA-PILLA -// dd9 SINHALA VOWEL SIGN KOMBUVA -// dda SINHALA VOWEL SIGN DIGA KOMBUVA -// ddb SINHALA VOWEL SIGN KOMBU DEKA -// ddc SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA -// ddd SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA -// dde SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA -// ddf SINHALA VOWEL SIGN GAYANUKITTA - { 0xDD8, 0x8, 0x0, 0, 0 }, -// de6 SINHALA LITH DIGIT ZERO -// de7 SINHALA LITH DIGIT ONE -// de8 SINHALA LITH DIGIT TWO -// de9 SINHALA LITH DIGIT THREE -// dea SINHALA LITH DIGIT FOUR -// deb SINHALA LITH DIGIT FIVE -// dec SINHALA LITH DIGIT SIX -// ded SINHALA LITH DIGIT SEVEN -// dee SINHALA LITH DIGIT EIGHT -// def SINHALA LITH DIGIT NINE - { 0xDE6, 0xA, 0x108, 0, 0 }, -// df2 SINHALA VOWEL SIGN DIGA GAETTA-PILLA -// df3 SINHALA VOWEL SIGN DIGA GAYANUKITTA - { 0xDF2, 0x2, 0x0, 0, 0 }, -// df4 SINHALA PUNCTUATION KUNDDALIYA - { 0xDF4, 0x1, 0x18, 0, 0 }, -// e01 THAI CHARACTER KO KAI -// e02 THAI CHARACTER KHO KHAI -// e03 THAI CHARACTER KHO KHUAT -// e04 THAI CHARACTER KHO KHWAI -// e05 THAI CHARACTER KHO KHON -// e06 THAI CHARACTER KHO RAKHANG -// e07 THAI CHARACTER NGO NGU -// e08 THAI CHARACTER CHO CHAN -// e09 THAI CHARACTER CHO CHING -// e0a THAI CHARACTER CHO CHANG -// e0b THAI CHARACTER SO SO -// e0c THAI CHARACTER CHO CHOE -// e0d THAI CHARACTER YO YING -// e0e THAI CHARACTER DO CHADA -// e0f THAI CHARACTER TO PATAK -// e10 THAI CHARACTER THO THAN -// e11 THAI CHARACTER THO NANGMONTHO -// e12 THAI CHARACTER THO PHUTHAO -// e13 THAI CHARACTER NO NEN -// e14 THAI CHARACTER DO DEK -// e15 THAI CHARACTER TO TAO -// e16 THAI CHARACTER THO THUNG -// e17 THAI CHARACTER THO THAHAN -// e18 THAI CHARACTER THO THONG -// e19 THAI CHARACTER NO NU -// e1a THAI CHARACTER BO BAIMAI -// e1b THAI CHARACTER PO PLA -// e1c THAI CHARACTER PHO PHUNG -// e1d THAI CHARACTER FO FA -// e1e THAI CHARACTER PHO PHAN -// e1f THAI CHARACTER FO FAN -// e20 THAI CHARACTER PHO SAMPHAO -// e21 THAI CHARACTER MO MA -// e22 THAI CHARACTER YO YAK -// e23 THAI CHARACTER RO RUA -// e24 THAI CHARACTER RU -// e25 THAI CHARACTER LO LING -// e26 THAI CHARACTER LU -// e27 THAI CHARACTER WO WAEN -// e28 THAI CHARACTER SO SALA -// e29 THAI CHARACTER SO RUSI -// e2a THAI CHARACTER SO SUA -// e2b THAI CHARACTER HO HIP -// e2c THAI CHARACTER LO CHULA -// e2d THAI CHARACTER O ANG -// e2e THAI CHARACTER HO NOKHUK -// e2f THAI CHARACTER PAIYANNOI -// e30 THAI CHARACTER SARA A - { 0xE01, 0x30, 0x9, 0, 0 }, -// e31 THAI CHARACTER MAI HAN-AKAT - { 0xE31, 0x1, 0x0, 0, 0 }, -// e32 THAI CHARACTER SARA AA -// e33 THAI CHARACTER SARA AM - { 0xE32, 0x2, 0x9, 0, 0 }, -// e34 THAI CHARACTER SARA I -// e35 THAI CHARACTER SARA II -// e36 THAI CHARACTER SARA UE -// e37 THAI CHARACTER SARA UEE -// e38 THAI CHARACTER SARA U -// e39 THAI CHARACTER SARA UU -// e3a THAI CHARACTER PHINTHU - { 0xE34, 0x7, 0x0, 0, 0 }, -// e3f THAI CURRENCY SYMBOL BAHT - { 0xE3F, 0x1, 0x8, 0, 0 }, -// e40 THAI CHARACTER SARA E -// e41 THAI CHARACTER SARA AE -// e42 THAI CHARACTER SARA O -// e43 THAI CHARACTER SARA AI MAIMUAN -// e44 THAI CHARACTER SARA AI MAIMALAI -// e45 THAI CHARACTER LAKKHANGYAO -// e46 THAI CHARACTER MAIYAMOK - { 0xE40, 0x7, 0x9, 0, 0 }, -// e47 THAI CHARACTER MAITAIKHU -// e48 THAI CHARACTER MAI EK -// e49 THAI CHARACTER MAI THO -// e4a THAI CHARACTER MAI TRI -// e4b THAI CHARACTER MAI CHATTAWA -// e4c THAI CHARACTER THANTHAKHAT -// e4d THAI CHARACTER NIKHAHIT -// e4e THAI CHARACTER YAMAKKAN - { 0xE47, 0x8, 0x0, 0, 0 }, -// e4f THAI CHARACTER FONGMAN - { 0xE4F, 0x1, 0x18, 0, 0 }, -// e50 THAI DIGIT ZERO -// e51 THAI DIGIT ONE -// e52 THAI DIGIT TWO -// e53 THAI DIGIT THREE -// e54 THAI DIGIT FOUR -// e55 THAI DIGIT FIVE -// e56 THAI DIGIT SIX -// e57 THAI DIGIT SEVEN -// e58 THAI DIGIT EIGHT -// e59 THAI DIGIT NINE - { 0xE50, 0xA, 0x108, 0, 0 }, -// e5a THAI CHARACTER ANGKHANKHU -// e5b THAI CHARACTER KHOMUT - { 0xE5A, 0x2, 0x18, 0, 0 }, -// e81 LAO LETTER KO -// e82 LAO LETTER KHO SUNG - { 0xE81, 0x2, 0x9, 0, 0 }, -// e84 LAO LETTER KHO TAM - { 0xE84, 0x1, 0x9, 0, 0 }, -// e87 LAO LETTER NGO -// e88 LAO LETTER CO - { 0xE87, 0x2, 0x9, 0, 0 }, -// e8a LAO LETTER SO TAM - { 0xE8A, 0x1, 0x9, 0, 0 }, -// e8d LAO LETTER NYO - { 0xE8D, 0x1, 0x9, 0, 0 }, -// e94 LAO LETTER DO -// e95 LAO LETTER TO -// e96 LAO LETTER THO SUNG -// e97 LAO LETTER THO TAM - { 0xE94, 0x4, 0x9, 0, 0 }, -// e99 LAO LETTER NO -// e9a LAO LETTER BO -// e9b LAO LETTER PO -// e9c LAO LETTER PHO SUNG -// e9d LAO LETTER FO TAM -// e9e LAO LETTER PHO TAM -// e9f LAO LETTER FO SUNG - { 0xE99, 0x7, 0x9, 0, 0 }, -// ea1 LAO LETTER MO -// ea2 LAO LETTER YO -// ea3 LAO LETTER LO LING - { 0xEA1, 0x3, 0x9, 0, 0 }, -// ea5 LAO LETTER LO LOOT - { 0xEA5, 0x1, 0x9, 0, 0 }, -// ea7 LAO LETTER WO - { 0xEA7, 0x1, 0x9, 0, 0 }, -// eaa LAO LETTER SO SUNG -// eab LAO LETTER HO SUNG - { 0xEAA, 0x2, 0x9, 0, 0 }, -// ead LAO LETTER O -// eae LAO LETTER HO TAM -// eaf LAO ELLIPSIS -// eb0 LAO VOWEL SIGN A - { 0xEAD, 0x4, 0x9, 0, 0 }, -// eb1 LAO VOWEL SIGN MAI KAN - { 0xEB1, 0x1, 0x0, 0, 0 }, -// eb2 LAO VOWEL SIGN AA -// eb3 LAO VOWEL SIGN AM - { 0xEB2, 0x2, 0x9, 0, 0 }, -// eb4 LAO VOWEL SIGN I -// eb5 LAO VOWEL SIGN II -// eb6 LAO VOWEL SIGN Y -// eb7 LAO VOWEL SIGN YY -// eb8 LAO VOWEL SIGN U -// eb9 LAO VOWEL SIGN UU - { 0xEB4, 0x6, 0x0, 0, 0 }, -// ebb LAO VOWEL SIGN MAI KON -// ebc LAO SEMIVOWEL SIGN LO - { 0xEBB, 0x2, 0x0, 0, 0 }, -// ebd LAO SEMIVOWEL SIGN NYO - { 0xEBD, 0x1, 0x9, 0, 0 }, -// ec0 LAO VOWEL SIGN E -// ec1 LAO VOWEL SIGN EI -// ec2 LAO VOWEL SIGN O -// ec3 LAO VOWEL SIGN AY -// ec4 LAO VOWEL SIGN AI - { 0xEC0, 0x5, 0x9, 0, 0 }, -// ec6 LAO KO LA - { 0xEC6, 0x1, 0x9, 0, 0 }, -// ec8 LAO TONE MAI EK -// ec9 LAO TONE MAI THO -// eca LAO TONE MAI TI -// ecb LAO TONE MAI CATAWA -// ecc LAO CANCELLATION MARK -// ecd LAO NIGGAHITA - { 0xEC8, 0x6, 0x0, 0, 0 }, -// ed0 LAO DIGIT ZERO -// ed1 LAO DIGIT ONE -// ed2 LAO DIGIT TWO -// ed3 LAO DIGIT THREE -// ed4 LAO DIGIT FOUR -// ed5 LAO DIGIT FIVE -// ed6 LAO DIGIT SIX -// ed7 LAO DIGIT SEVEN -// ed8 LAO DIGIT EIGHT -// ed9 LAO DIGIT NINE - { 0xED0, 0xA, 0x108, 0, 0 }, -// edc LAO HO NO -// edd LAO HO MO -// ede LAO LETTER KHMU GO -// edf LAO LETTER KHMU NYO - { 0xEDC, 0x4, 0x9, 0, 0 }, -// f00 TIBETAN SYLLABLE OM - { 0xF00, 0x1, 0x9, 0, 0 }, -// f01 TIBETAN MARK GTER YIG MGO TRUNCATED A -// f02 TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA -// f03 TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA - { 0xF01, 0x3, 0x8, 0, 0 }, -// f04 TIBETAN MARK INITIAL YIG MGO MDUN MA -// f05 TIBETAN MARK CLOSING YIG MGO SGAB MA -// f06 TIBETAN MARK CARET YIG MGO PHUR SHAD MA -// f07 TIBETAN MARK YIG MGO TSHEG SHAD MA -// f08 TIBETAN MARK SBRUL SHAD -// f09 TIBETAN MARK BSKUR YIG MGO -// f0a TIBETAN MARK BKA- SHOG YIG MGO -// f0b TIBETAN MARK INTERSYLLABIC TSHEG -// f0c TIBETAN MARK DELIMITER TSHEG BSTAR -// f0d TIBETAN MARK SHAD -// f0e TIBETAN MARK NYIS SHAD -// f0f TIBETAN MARK TSHEG SHAD -// f10 TIBETAN MARK NYIS TSHEG SHAD -// f11 TIBETAN MARK RIN CHEN SPUNGS SHAD -// f12 TIBETAN MARK RGYA GRAM SHAD - { 0xF04, 0xF, 0x18, 0, 0 }, -// f13 TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN - { 0xF13, 0x1, 0x8, 0, 0 }, -// f14 TIBETAN MARK GTER TSHEG - { 0xF14, 0x1, 0x18, 0, 0 }, -// f15 TIBETAN LOGOTYPE SIGN CHAD RTAGS -// f16 TIBETAN LOGOTYPE SIGN LHAG RTAGS -// f17 TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS - { 0xF15, 0x3, 0x8, 0, 0 }, -// f18 TIBETAN ASTROLOGICAL SIGN -KHYUD PA -// f19 TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS - { 0xF18, 0x2, 0x0, 0, 0 }, -// f1a TIBETAN SIGN RDEL DKAR GCIG -// f1b TIBETAN SIGN RDEL DKAR GNYIS -// f1c TIBETAN SIGN RDEL DKAR GSUM -// f1d TIBETAN SIGN RDEL NAG GCIG -// f1e TIBETAN SIGN RDEL NAG GNYIS -// f1f TIBETAN SIGN RDEL DKAR RDEL NAG - { 0xF1A, 0x6, 0x8, 0, 0 }, -// f20 TIBETAN DIGIT ZERO -// f21 TIBETAN DIGIT ONE -// f22 TIBETAN DIGIT TWO -// f23 TIBETAN DIGIT THREE -// f24 TIBETAN DIGIT FOUR -// f25 TIBETAN DIGIT FIVE -// f26 TIBETAN DIGIT SIX -// f27 TIBETAN DIGIT SEVEN -// f28 TIBETAN DIGIT EIGHT -// f29 TIBETAN DIGIT NINE - { 0xF20, 0xA, 0x108, 0, 0 }, -// f2a TIBETAN DIGIT HALF ONE -// f2b TIBETAN DIGIT HALF TWO -// f2c TIBETAN DIGIT HALF THREE -// f2d TIBETAN DIGIT HALF FOUR -// f2e TIBETAN DIGIT HALF FIVE -// f2f TIBETAN DIGIT HALF SIX -// f30 TIBETAN DIGIT HALF SEVEN -// f31 TIBETAN DIGIT HALF EIGHT -// f32 TIBETAN DIGIT HALF NINE -// f33 TIBETAN DIGIT HALF ZERO -// f34 TIBETAN MARK BSDUS RTAGS - { 0xF2A, 0xB, 0x8, 0, 0 }, -// f35 TIBETAN MARK NGAS BZUNG NYI ZLA - { 0xF35, 0x1, 0x0, 0, 0 }, -// f36 TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN - { 0xF36, 0x1, 0x8, 0, 0 }, -// f37 TIBETAN MARK NGAS BZUNG SGOR RTAGS - { 0xF37, 0x1, 0x0, 0, 0 }, -// f38 TIBETAN MARK CHE MGO - { 0xF38, 0x1, 0x8, 0, 0 }, -// f39 TIBETAN MARK TSA -PHRU - { 0xF39, 0x1, 0x0, 0, 0 }, -// f3a TIBETAN MARK GUG RTAGS GYON -// f3b TIBETAN MARK GUG RTAGS GYAS -// f3c TIBETAN MARK ANG KHANG GYON -// f3d TIBETAN MARK ANG KHANG GYAS - { 0xF3A, 0x4, 0x18, 0, 0 }, -// f3e TIBETAN SIGN YAR TSHES -// f3f TIBETAN SIGN MAR TSHES - { 0xF3E, 0x2, 0x0, 0, 0 }, -// f40 TIBETAN LETTER KA -// f41 TIBETAN LETTER KHA -// f42 TIBETAN LETTER GA -// f43 TIBETAN LETTER GHA -// f44 TIBETAN LETTER NGA -// f45 TIBETAN LETTER CA -// f46 TIBETAN LETTER CHA -// f47 TIBETAN LETTER JA - { 0xF40, 0x8, 0x9, 0, 0 }, -// f49 TIBETAN LETTER NYA -// f4a TIBETAN LETTER TTA -// f4b TIBETAN LETTER TTHA -// f4c TIBETAN LETTER DDA -// f4d TIBETAN LETTER DDHA -// f4e TIBETAN LETTER NNA -// f4f TIBETAN LETTER TA -// f50 TIBETAN LETTER THA -// f51 TIBETAN LETTER DA -// f52 TIBETAN LETTER DHA -// f53 TIBETAN LETTER NA -// f54 TIBETAN LETTER PA -// f55 TIBETAN LETTER PHA -// f56 TIBETAN LETTER BA -// f57 TIBETAN LETTER BHA -// f58 TIBETAN LETTER MA -// f59 TIBETAN LETTER TSA -// f5a TIBETAN LETTER TSHA -// f5b TIBETAN LETTER DZA -// f5c TIBETAN LETTER DZHA -// f5d TIBETAN LETTER WA -// f5e TIBETAN LETTER ZHA -// f5f TIBETAN LETTER ZA -// f60 TIBETAN LETTER -A -// f61 TIBETAN LETTER YA -// f62 TIBETAN LETTER RA -// f63 TIBETAN LETTER LA -// f64 TIBETAN LETTER SHA -// f65 TIBETAN LETTER SSA -// f66 TIBETAN LETTER SA -// f67 TIBETAN LETTER HA -// f68 TIBETAN LETTER A -// f69 TIBETAN LETTER KSSA -// f6a TIBETAN LETTER FIXED-FORM RA -// f6b TIBETAN LETTER KKA -// f6c TIBETAN LETTER RRA - { 0xF49, 0x24, 0x9, 0, 0 }, -// f71 TIBETAN VOWEL SIGN AA -// f72 TIBETAN VOWEL SIGN I -// f73 TIBETAN VOWEL SIGN II -// f74 TIBETAN VOWEL SIGN U -// f75 TIBETAN VOWEL SIGN UU -// f76 TIBETAN VOWEL SIGN VOCALIC R -// f77 TIBETAN VOWEL SIGN VOCALIC RR -// f78 TIBETAN VOWEL SIGN VOCALIC L -// f79 TIBETAN VOWEL SIGN VOCALIC LL -// f7a TIBETAN VOWEL SIGN E -// f7b TIBETAN VOWEL SIGN EE -// f7c TIBETAN VOWEL SIGN O -// f7d TIBETAN VOWEL SIGN OO -// f7e TIBETAN SIGN RJES SU NGA RO -// f7f TIBETAN SIGN RNAM BCAD -// f80 TIBETAN VOWEL SIGN REVERSED I -// f81 TIBETAN VOWEL SIGN REVERSED II -// f82 TIBETAN SIGN NYI ZLA NAA DA -// f83 TIBETAN SIGN SNA LDAN -// f84 TIBETAN MARK HALANTA - { 0xF71, 0x14, 0x0, 0, 0 }, -// f85 TIBETAN MARK PALUTA - { 0xF85, 0x1, 0x18, 0, 0 }, -// f86 TIBETAN SIGN LCI RTAGS -// f87 TIBETAN SIGN YANG RTAGS - { 0xF86, 0x2, 0x0, 0, 0 }, -// f88 TIBETAN SIGN LCE TSA CAN -// f89 TIBETAN SIGN MCHU CAN -// f8a TIBETAN SIGN GRU CAN RGYINGS -// f8b TIBETAN SIGN GRU MED RGYINGS -// f8c TIBETAN SIGN INVERTED MCHU CAN - { 0xF88, 0x5, 0x9, 0, 0 }, -// f8d TIBETAN SUBJOINED SIGN LCE TSA CAN -// f8e TIBETAN SUBJOINED SIGN MCHU CAN -// f8f TIBETAN SUBJOINED SIGN INVERTED MCHU CAN -// f90 TIBETAN SUBJOINED LETTER KA -// f91 TIBETAN SUBJOINED LETTER KHA -// f92 TIBETAN SUBJOINED LETTER GA -// f93 TIBETAN SUBJOINED LETTER GHA -// f94 TIBETAN SUBJOINED LETTER NGA -// f95 TIBETAN SUBJOINED LETTER CA -// f96 TIBETAN SUBJOINED LETTER CHA -// f97 TIBETAN SUBJOINED LETTER JA - { 0xF8D, 0xB, 0x0, 0, 0 }, -// f99 TIBETAN SUBJOINED LETTER NYA -// f9a TIBETAN SUBJOINED LETTER TTA -// f9b TIBETAN SUBJOINED LETTER TTHA -// f9c TIBETAN SUBJOINED LETTER DDA -// f9d TIBETAN SUBJOINED LETTER DDHA -// f9e TIBETAN SUBJOINED LETTER NNA -// f9f TIBETAN SUBJOINED LETTER TA -// fa0 TIBETAN SUBJOINED LETTER THA -// fa1 TIBETAN SUBJOINED LETTER DA -// fa2 TIBETAN SUBJOINED LETTER DHA -// fa3 TIBETAN SUBJOINED LETTER NA -// fa4 TIBETAN SUBJOINED LETTER PA -// fa5 TIBETAN SUBJOINED LETTER PHA -// fa6 TIBETAN SUBJOINED LETTER BA -// fa7 TIBETAN SUBJOINED LETTER BHA -// fa8 TIBETAN SUBJOINED LETTER MA -// fa9 TIBETAN SUBJOINED LETTER TSA -// faa TIBETAN SUBJOINED LETTER TSHA -// fab TIBETAN SUBJOINED LETTER DZA -// fac TIBETAN SUBJOINED LETTER DZHA -// fad TIBETAN SUBJOINED LETTER WA -// fae TIBETAN SUBJOINED LETTER ZHA -// faf TIBETAN SUBJOINED LETTER ZA -// fb0 TIBETAN SUBJOINED LETTER -A -// fb1 TIBETAN SUBJOINED LETTER YA -// fb2 TIBETAN SUBJOINED LETTER RA -// fb3 TIBETAN SUBJOINED LETTER LA -// fb4 TIBETAN SUBJOINED LETTER SHA -// fb5 TIBETAN SUBJOINED LETTER SSA -// fb6 TIBETAN SUBJOINED LETTER SA -// fb7 TIBETAN SUBJOINED LETTER HA -// fb8 TIBETAN SUBJOINED LETTER A -// fb9 TIBETAN SUBJOINED LETTER KSSA -// fba TIBETAN SUBJOINED LETTER FIXED-FORM WA -// fbb TIBETAN SUBJOINED LETTER FIXED-FORM YA -// fbc TIBETAN SUBJOINED LETTER FIXED-FORM RA - { 0xF99, 0x24, 0x0, 0, 0 }, -// fbe TIBETAN KU RU KHA -// fbf TIBETAN KU RU KHA BZHI MIG CAN -// fc0 TIBETAN CANTILLATION SIGN HEAVY BEAT -// fc1 TIBETAN CANTILLATION SIGN LIGHT BEAT -// fc2 TIBETAN CANTILLATION SIGN CANG TE-U -// fc3 TIBETAN CANTILLATION SIGN SBUB -CHAL -// fc4 TIBETAN SYMBOL DRIL BU -// fc5 TIBETAN SYMBOL RDO RJE - { 0xFBE, 0x8, 0x8, 0, 0 }, -// fc6 TIBETAN SYMBOL PADMA GDAN - { 0xFC6, 0x1, 0x0, 0, 0 }, -// fc7 TIBETAN SYMBOL RDO RJE RGYA GRAM -// fc8 TIBETAN SYMBOL PHUR PA -// fc9 TIBETAN SYMBOL NOR BU -// fca TIBETAN SYMBOL NOR BU NYIS -KHYIL -// fcb TIBETAN SYMBOL NOR BU GSUM -KHYIL -// fcc TIBETAN SYMBOL NOR BU BZHI -KHYIL - { 0xFC7, 0x6, 0x8, 0, 0 }, -// fce TIBETAN SIGN RDEL NAG RDEL DKAR -// fcf TIBETAN SIGN RDEL NAG GSUM - { 0xFCE, 0x2, 0x8, 0, 0 }, -// fd0 TIBETAN MARK BSKA- SHOG GI MGO RGYAN -// fd1 TIBETAN MARK MNYAM YIG GI MGO RGYAN -// fd2 TIBETAN MARK NYIS TSHEG -// fd3 TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA -// fd4 TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA - { 0xFD0, 0x5, 0x18, 0, 0 }, -// fd5 RIGHT-FACING SVASTI SIGN -// fd6 LEFT-FACING SVASTI SIGN -// fd7 RIGHT-FACING SVASTI SIGN WITH DOTS -// fd8 LEFT-FACING SVASTI SIGN WITH DOTS - { 0xFD5, 0x4, 0x8, 0, 0 }, -// fd9 TIBETAN MARK LEADING MCHAN RTAGS -// fda TIBETAN MARK TRAILING MCHAN RTAGS - { 0xFD9, 0x2, 0x18, 0, 0 }, -// 1000 MYANMAR LETTER KA -// 1001 MYANMAR LETTER KHA -// 1002 MYANMAR LETTER GA -// 1003 MYANMAR LETTER GHA -// 1004 MYANMAR LETTER NGA -// 1005 MYANMAR LETTER CA -// 1006 MYANMAR LETTER CHA -// 1007 MYANMAR LETTER JA -// 1008 MYANMAR LETTER JHA -// 1009 MYANMAR LETTER NYA -// 100a MYANMAR LETTER NNYA -// 100b MYANMAR LETTER TTA -// 100c MYANMAR LETTER TTHA -// 100d MYANMAR LETTER DDA -// 100e MYANMAR LETTER DDHA -// 100f MYANMAR LETTER NNA -// 1010 MYANMAR LETTER TA -// 1011 MYANMAR LETTER THA -// 1012 MYANMAR LETTER DA -// 1013 MYANMAR LETTER DHA -// 1014 MYANMAR LETTER NA -// 1015 MYANMAR LETTER PA -// 1016 MYANMAR LETTER PHA -// 1017 MYANMAR LETTER BA -// 1018 MYANMAR LETTER BHA -// 1019 MYANMAR LETTER MA -// 101a MYANMAR LETTER YA -// 101b MYANMAR LETTER RA -// 101c MYANMAR LETTER LA -// 101d MYANMAR LETTER WA -// 101e MYANMAR LETTER SA -// 101f MYANMAR LETTER HA -// 1020 MYANMAR LETTER LLA -// 1021 MYANMAR LETTER A -// 1022 MYANMAR LETTER SHAN A -// 1023 MYANMAR LETTER I -// 1024 MYANMAR LETTER II -// 1025 MYANMAR LETTER U -// 1026 MYANMAR LETTER UU -// 1027 MYANMAR LETTER E -// 1028 MYANMAR LETTER MON E -// 1029 MYANMAR LETTER O -// 102a MYANMAR LETTER AU - { 0x1000, 0x2B, 0x9, 0, 0 }, -// 102b MYANMAR VOWEL SIGN TALL AA -// 102c MYANMAR VOWEL SIGN AA -// 102d MYANMAR VOWEL SIGN I -// 102e MYANMAR VOWEL SIGN II -// 102f MYANMAR VOWEL SIGN U -// 1030 MYANMAR VOWEL SIGN UU -// 1031 MYANMAR VOWEL SIGN E -// 1032 MYANMAR VOWEL SIGN AI -// 1033 MYANMAR VOWEL SIGN MON II -// 1034 MYANMAR VOWEL SIGN MON O -// 1035 MYANMAR VOWEL SIGN E ABOVE -// 1036 MYANMAR SIGN ANUSVARA -// 1037 MYANMAR SIGN DOT BELOW -// 1038 MYANMAR SIGN VISARGA -// 1039 MYANMAR SIGN VIRAMA -// 103a MYANMAR SIGN ASAT -// 103b MYANMAR CONSONANT SIGN MEDIAL YA -// 103c MYANMAR CONSONANT SIGN MEDIAL RA -// 103d MYANMAR CONSONANT SIGN MEDIAL WA -// 103e MYANMAR CONSONANT SIGN MEDIAL HA - { 0x102B, 0x14, 0x0, 0, 0 }, -// 103f MYANMAR LETTER GREAT SA - { 0x103F, 0x1, 0x9, 0, 0 }, -// 1040 MYANMAR DIGIT ZERO -// 1041 MYANMAR DIGIT ONE -// 1042 MYANMAR DIGIT TWO -// 1043 MYANMAR DIGIT THREE -// 1044 MYANMAR DIGIT FOUR -// 1045 MYANMAR DIGIT FIVE -// 1046 MYANMAR DIGIT SIX -// 1047 MYANMAR DIGIT SEVEN -// 1048 MYANMAR DIGIT EIGHT -// 1049 MYANMAR DIGIT NINE - { 0x1040, 0xA, 0x108, 0, 0 }, -// 104a MYANMAR SIGN LITTLE SECTION -// 104b MYANMAR SIGN SECTION -// 104c MYANMAR SYMBOL LOCATIVE -// 104d MYANMAR SYMBOL COMPLETED -// 104e MYANMAR SYMBOL AFOREMENTIONED -// 104f MYANMAR SYMBOL GENITIVE - { 0x104A, 0x6, 0x18, 0, 0 }, -// 1050 MYANMAR LETTER SHA -// 1051 MYANMAR LETTER SSA -// 1052 MYANMAR LETTER VOCALIC R -// 1053 MYANMAR LETTER VOCALIC RR -// 1054 MYANMAR LETTER VOCALIC L -// 1055 MYANMAR LETTER VOCALIC LL - { 0x1050, 0x6, 0x9, 0, 0 }, -// 1056 MYANMAR VOWEL SIGN VOCALIC R -// 1057 MYANMAR VOWEL SIGN VOCALIC RR -// 1058 MYANMAR VOWEL SIGN VOCALIC L -// 1059 MYANMAR VOWEL SIGN VOCALIC LL - { 0x1056, 0x4, 0x0, 0, 0 }, -// 105a MYANMAR LETTER MON NGA -// 105b MYANMAR LETTER MON JHA -// 105c MYANMAR LETTER MON BBA -// 105d MYANMAR LETTER MON BBE - { 0x105A, 0x4, 0x9, 0, 0 }, -// 105e MYANMAR CONSONANT SIGN MON MEDIAL NA -// 105f MYANMAR CONSONANT SIGN MON MEDIAL MA -// 1060 MYANMAR CONSONANT SIGN MON MEDIAL LA - { 0x105E, 0x3, 0x0, 0, 0 }, -// 1061 MYANMAR LETTER SGAW KAREN SHA - { 0x1061, 0x1, 0x9, 0, 0 }, -// 1062 MYANMAR VOWEL SIGN SGAW KAREN EU -// 1063 MYANMAR TONE MARK SGAW KAREN HATHI -// 1064 MYANMAR TONE MARK SGAW KAREN KE PHO - { 0x1062, 0x3, 0x0, 0, 0 }, -// 1065 MYANMAR LETTER WESTERN PWO KAREN THA -// 1066 MYANMAR LETTER WESTERN PWO KAREN PWA - { 0x1065, 0x2, 0x9, 0, 0 }, -// 1067 MYANMAR VOWEL SIGN WESTERN PWO KAREN EU -// 1068 MYANMAR VOWEL SIGN WESTERN PWO KAREN UE -// 1069 MYANMAR SIGN WESTERN PWO KAREN TONE-1 -// 106a MYANMAR SIGN WESTERN PWO KAREN TONE-2 -// 106b MYANMAR SIGN WESTERN PWO KAREN TONE-3 -// 106c MYANMAR SIGN WESTERN PWO KAREN TONE-4 -// 106d MYANMAR SIGN WESTERN PWO KAREN TONE-5 - { 0x1067, 0x7, 0x0, 0, 0 }, -// 106e MYANMAR LETTER EASTERN PWO KAREN NNA -// 106f MYANMAR LETTER EASTERN PWO KAREN YWA -// 1070 MYANMAR LETTER EASTERN PWO KAREN GHWA - { 0x106E, 0x3, 0x9, 0, 0 }, -// 1071 MYANMAR VOWEL SIGN GEBA KAREN I -// 1072 MYANMAR VOWEL SIGN KAYAH OE -// 1073 MYANMAR VOWEL SIGN KAYAH U -// 1074 MYANMAR VOWEL SIGN KAYAH EE - { 0x1071, 0x4, 0x0, 0, 0 }, -// 1075 MYANMAR LETTER SHAN KA -// 1076 MYANMAR LETTER SHAN KHA -// 1077 MYANMAR LETTER SHAN GA -// 1078 MYANMAR LETTER SHAN CA -// 1079 MYANMAR LETTER SHAN ZA -// 107a MYANMAR LETTER SHAN NYA -// 107b MYANMAR LETTER SHAN DA -// 107c MYANMAR LETTER SHAN NA -// 107d MYANMAR LETTER SHAN PHA -// 107e MYANMAR LETTER SHAN FA -// 107f MYANMAR LETTER SHAN BA -// 1080 MYANMAR LETTER SHAN THA -// 1081 MYANMAR LETTER SHAN HA - { 0x1075, 0xD, 0x9, 0, 0 }, -// 1082 MYANMAR CONSONANT SIGN SHAN MEDIAL WA -// 1083 MYANMAR VOWEL SIGN SHAN AA -// 1084 MYANMAR VOWEL SIGN SHAN E -// 1085 MYANMAR VOWEL SIGN SHAN E ABOVE -// 1086 MYANMAR VOWEL SIGN SHAN FINAL Y -// 1087 MYANMAR SIGN SHAN TONE-2 -// 1088 MYANMAR SIGN SHAN TONE-3 -// 1089 MYANMAR SIGN SHAN TONE-5 -// 108a MYANMAR SIGN SHAN TONE-6 -// 108b MYANMAR SIGN SHAN COUNCIL TONE-2 -// 108c MYANMAR SIGN SHAN COUNCIL TONE-3 -// 108d MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE - { 0x1082, 0xC, 0x0, 0, 0 }, -// 108e MYANMAR LETTER RUMAI PALAUNG FA - { 0x108E, 0x1, 0x9, 0, 0 }, -// 108f MYANMAR SIGN RUMAI PALAUNG TONE-5 - { 0x108F, 0x1, 0x0, 0, 0 }, -// 1090 MYANMAR SHAN DIGIT ZERO -// 1091 MYANMAR SHAN DIGIT ONE -// 1092 MYANMAR SHAN DIGIT TWO -// 1093 MYANMAR SHAN DIGIT THREE -// 1094 MYANMAR SHAN DIGIT FOUR -// 1095 MYANMAR SHAN DIGIT FIVE -// 1096 MYANMAR SHAN DIGIT SIX -// 1097 MYANMAR SHAN DIGIT SEVEN -// 1098 MYANMAR SHAN DIGIT EIGHT -// 1099 MYANMAR SHAN DIGIT NINE - { 0x1090, 0xA, 0x108, 0, 0 }, -// 109a MYANMAR SIGN KHAMTI TONE-1 -// 109b MYANMAR SIGN KHAMTI TONE-3 -// 109c MYANMAR VOWEL SIGN AITON A -// 109d MYANMAR VOWEL SIGN AITON AI - { 0x109A, 0x4, 0x0, 0, 0 }, -// 109e MYANMAR SYMBOL SHAN ONE -// 109f MYANMAR SYMBOL SHAN EXCLAMATION - { 0x109E, 0x2, 0x8, 0, 0 }, -// 10a0 GEORGIAN CAPITAL LETTER AN -// 10a1 GEORGIAN CAPITAL LETTER BAN -// 10a2 GEORGIAN CAPITAL LETTER GAN -// 10a3 GEORGIAN CAPITAL LETTER DON -// 10a4 GEORGIAN CAPITAL LETTER EN -// 10a5 GEORGIAN CAPITAL LETTER VIN -// 10a6 GEORGIAN CAPITAL LETTER ZEN -// 10a7 GEORGIAN CAPITAL LETTER TAN -// 10a8 GEORGIAN CAPITAL LETTER IN -// 10a9 GEORGIAN CAPITAL LETTER KAN -// 10aa GEORGIAN CAPITAL LETTER LAS -// 10ab GEORGIAN CAPITAL LETTER MAN -// 10ac GEORGIAN CAPITAL LETTER NAR -// 10ad GEORGIAN CAPITAL LETTER ON -// 10ae GEORGIAN CAPITAL LETTER PAR -// 10af GEORGIAN CAPITAL LETTER ZHAR -// 10b0 GEORGIAN CAPITAL LETTER RAE -// 10b1 GEORGIAN CAPITAL LETTER SAN -// 10b2 GEORGIAN CAPITAL LETTER TAR -// 10b3 GEORGIAN CAPITAL LETTER UN -// 10b4 GEORGIAN CAPITAL LETTER PHAR -// 10b5 GEORGIAN CAPITAL LETTER KHAR -// 10b6 GEORGIAN CAPITAL LETTER GHAN -// 10b7 GEORGIAN CAPITAL LETTER QAR -// 10b8 GEORGIAN CAPITAL LETTER SHIN -// 10b9 GEORGIAN CAPITAL LETTER CHIN -// 10ba GEORGIAN CAPITAL LETTER CAN -// 10bb GEORGIAN CAPITAL LETTER JIL -// 10bc GEORGIAN CAPITAL LETTER CIL -// 10bd GEORGIAN CAPITAL LETTER CHAR -// 10be GEORGIAN CAPITAL LETTER XAN -// 10bf GEORGIAN CAPITAL LETTER JHAN -// 10c0 GEORGIAN CAPITAL LETTER HAE -// 10c1 GEORGIAN CAPITAL LETTER HE -// 10c2 GEORGIAN CAPITAL LETTER HIE -// 10c3 GEORGIAN CAPITAL LETTER WE -// 10c4 GEORGIAN CAPITAL LETTER HAR -// 10c5 GEORGIAN CAPITAL LETTER HOE - { 0x10A0, 0x26, 0x89, 7264, 0 }, -// 10c7 GEORGIAN CAPITAL LETTER YN - { 0x10C7, 0x1, 0x89, 7264, 0 }, -// 10cd GEORGIAN CAPITAL LETTER AEN - { 0x10CD, 0x1, 0x89, 7264, 0 }, -// 10d0 GEORGIAN LETTER AN -// 10d1 GEORGIAN LETTER BAN -// 10d2 GEORGIAN LETTER GAN -// 10d3 GEORGIAN LETTER DON -// 10d4 GEORGIAN LETTER EN -// 10d5 GEORGIAN LETTER VIN -// 10d6 GEORGIAN LETTER ZEN -// 10d7 GEORGIAN LETTER TAN -// 10d8 GEORGIAN LETTER IN -// 10d9 GEORGIAN LETTER KAN -// 10da GEORGIAN LETTER LAS -// 10db GEORGIAN LETTER MAN -// 10dc GEORGIAN LETTER NAR -// 10dd GEORGIAN LETTER ON -// 10de GEORGIAN LETTER PAR -// 10df GEORGIAN LETTER ZHAR -// 10e0 GEORGIAN LETTER RAE -// 10e1 GEORGIAN LETTER SAN -// 10e2 GEORGIAN LETTER TAR -// 10e3 GEORGIAN LETTER UN -// 10e4 GEORGIAN LETTER PHAR -// 10e5 GEORGIAN LETTER KHAR -// 10e6 GEORGIAN LETTER GHAN -// 10e7 GEORGIAN LETTER QAR -// 10e8 GEORGIAN LETTER SHIN -// 10e9 GEORGIAN LETTER CHIN -// 10ea GEORGIAN LETTER CAN -// 10eb GEORGIAN LETTER JIL -// 10ec GEORGIAN LETTER CIL -// 10ed GEORGIAN LETTER CHAR -// 10ee GEORGIAN LETTER XAN -// 10ef GEORGIAN LETTER JHAN -// 10f0 GEORGIAN LETTER HAE -// 10f1 GEORGIAN LETTER HE -// 10f2 GEORGIAN LETTER HIE -// 10f3 GEORGIAN LETTER WE -// 10f4 GEORGIAN LETTER HAR -// 10f5 GEORGIAN LETTER HOE -// 10f6 GEORGIAN LETTER FI -// 10f7 GEORGIAN LETTER YN -// 10f8 GEORGIAN LETTER ELIFI -// 10f9 GEORGIAN LETTER TURNED GAN -// 10fa GEORGIAN LETTER AIN - { 0x10D0, 0x2B, 0x9, 0, 0 }, -// 10fb GEORGIAN PARAGRAPH SEPARATOR - { 0x10FB, 0x1, 0x18, 0, 0 }, -// 10fc MODIFIER LETTER GEORGIAN NAR -// 10fd GEORGIAN LETTER AEN -// 10fe GEORGIAN LETTER HARD SIGN -// 10ff GEORGIAN LETTER LABIAL SIGN -// 1100 HANGUL CHOSEONG KIYEOK -// 1101 HANGUL CHOSEONG SSANGKIYEOK -// 1102 HANGUL CHOSEONG NIEUN -// 1103 HANGUL CHOSEONG TIKEUT -// 1104 HANGUL CHOSEONG SSANGTIKEUT -// 1105 HANGUL CHOSEONG RIEUL -// 1106 HANGUL CHOSEONG MIEUM -// 1107 HANGUL CHOSEONG PIEUP -// 1108 HANGUL CHOSEONG SSANGPIEUP -// 1109 HANGUL CHOSEONG SIOS -// 110a HANGUL CHOSEONG SSANGSIOS -// 110b HANGUL CHOSEONG IEUNG -// 110c HANGUL CHOSEONG CIEUC -// 110d HANGUL CHOSEONG SSANGCIEUC -// 110e HANGUL CHOSEONG CHIEUCH -// 110f HANGUL CHOSEONG KHIEUKH -// 1110 HANGUL CHOSEONG THIEUTH -// 1111 HANGUL CHOSEONG PHIEUPH -// 1112 HANGUL CHOSEONG HIEUH -// 1113 HANGUL CHOSEONG NIEUN-KIYEOK -// 1114 HANGUL CHOSEONG SSANGNIEUN -// 1115 HANGUL CHOSEONG NIEUN-TIKEUT -// 1116 HANGUL CHOSEONG NIEUN-PIEUP -// 1117 HANGUL CHOSEONG TIKEUT-KIYEOK -// 1118 HANGUL CHOSEONG RIEUL-NIEUN -// 1119 HANGUL CHOSEONG SSANGRIEUL -// 111a HANGUL CHOSEONG RIEUL-HIEUH -// 111b HANGUL CHOSEONG KAPYEOUNRIEUL -// 111c HANGUL CHOSEONG MIEUM-PIEUP -// 111d HANGUL CHOSEONG KAPYEOUNMIEUM -// 111e HANGUL CHOSEONG PIEUP-KIYEOK -// 111f HANGUL CHOSEONG PIEUP-NIEUN -// 1120 HANGUL CHOSEONG PIEUP-TIKEUT -// 1121 HANGUL CHOSEONG PIEUP-SIOS -// 1122 HANGUL CHOSEONG PIEUP-SIOS-KIYEOK -// 1123 HANGUL CHOSEONG PIEUP-SIOS-TIKEUT -// 1124 HANGUL CHOSEONG PIEUP-SIOS-PIEUP -// 1125 HANGUL CHOSEONG PIEUP-SSANGSIOS -// 1126 HANGUL CHOSEONG PIEUP-SIOS-CIEUC -// 1127 HANGUL CHOSEONG PIEUP-CIEUC -// 1128 HANGUL CHOSEONG PIEUP-CHIEUCH -// 1129 HANGUL CHOSEONG PIEUP-THIEUTH -// 112a HANGUL CHOSEONG PIEUP-PHIEUPH -// 112b HANGUL CHOSEONG KAPYEOUNPIEUP -// 112c HANGUL CHOSEONG KAPYEOUNSSANGPIEUP -// 112d HANGUL CHOSEONG SIOS-KIYEOK -// 112e HANGUL CHOSEONG SIOS-NIEUN -// 112f HANGUL CHOSEONG SIOS-TIKEUT -// 1130 HANGUL CHOSEONG SIOS-RIEUL -// 1131 HANGUL CHOSEONG SIOS-MIEUM -// 1132 HANGUL CHOSEONG SIOS-PIEUP -// 1133 HANGUL CHOSEONG SIOS-PIEUP-KIYEOK -// 1134 HANGUL CHOSEONG SIOS-SSANGSIOS -// 1135 HANGUL CHOSEONG SIOS-IEUNG -// 1136 HANGUL CHOSEONG SIOS-CIEUC -// 1137 HANGUL CHOSEONG SIOS-CHIEUCH -// 1138 HANGUL CHOSEONG SIOS-KHIEUKH -// 1139 HANGUL CHOSEONG SIOS-THIEUTH -// 113a HANGUL CHOSEONG SIOS-PHIEUPH -// 113b HANGUL CHOSEONG SIOS-HIEUH -// 113c HANGUL CHOSEONG CHITUEUMSIOS -// 113d HANGUL CHOSEONG CHITUEUMSSANGSIOS -// 113e HANGUL CHOSEONG CEONGCHIEUMSIOS -// 113f HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS -// 1140 HANGUL CHOSEONG PANSIOS -// 1141 HANGUL CHOSEONG IEUNG-KIYEOK -// 1142 HANGUL CHOSEONG IEUNG-TIKEUT -// 1143 HANGUL CHOSEONG IEUNG-MIEUM -// 1144 HANGUL CHOSEONG IEUNG-PIEUP -// 1145 HANGUL CHOSEONG IEUNG-SIOS -// 1146 HANGUL CHOSEONG IEUNG-PANSIOS -// 1147 HANGUL CHOSEONG SSANGIEUNG -// 1148 HANGUL CHOSEONG IEUNG-CIEUC -// 1149 HANGUL CHOSEONG IEUNG-CHIEUCH -// 114a HANGUL CHOSEONG IEUNG-THIEUTH -// 114b HANGUL CHOSEONG IEUNG-PHIEUPH -// 114c HANGUL CHOSEONG YESIEUNG -// 114d HANGUL CHOSEONG CIEUC-IEUNG -// 114e HANGUL CHOSEONG CHITUEUMCIEUC -// 114f HANGUL CHOSEONG CHITUEUMSSANGCIEUC -// 1150 HANGUL CHOSEONG CEONGCHIEUMCIEUC -// 1151 HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC -// 1152 HANGUL CHOSEONG CHIEUCH-KHIEUKH -// 1153 HANGUL CHOSEONG CHIEUCH-HIEUH -// 1154 HANGUL CHOSEONG CHITUEUMCHIEUCH -// 1155 HANGUL CHOSEONG CEONGCHIEUMCHIEUCH -// 1156 HANGUL CHOSEONG PHIEUPH-PIEUP -// 1157 HANGUL CHOSEONG KAPYEOUNPHIEUPH -// 1158 HANGUL CHOSEONG SSANGHIEUH -// 1159 HANGUL CHOSEONG YEORINHIEUH -// 115a HANGUL CHOSEONG KIYEOK-TIKEUT -// 115b HANGUL CHOSEONG NIEUN-SIOS -// 115c HANGUL CHOSEONG NIEUN-CIEUC -// 115d HANGUL CHOSEONG NIEUN-HIEUH -// 115e HANGUL CHOSEONG TIKEUT-RIEUL -// 115f HANGUL CHOSEONG FILLER -// 1160 HANGUL JUNGSEONG FILLER -// 1161 HANGUL JUNGSEONG A -// 1162 HANGUL JUNGSEONG AE -// 1163 HANGUL JUNGSEONG YA -// 1164 HANGUL JUNGSEONG YAE -// 1165 HANGUL JUNGSEONG EO -// 1166 HANGUL JUNGSEONG E -// 1167 HANGUL JUNGSEONG YEO -// 1168 HANGUL JUNGSEONG YE -// 1169 HANGUL JUNGSEONG O -// 116a HANGUL JUNGSEONG WA -// 116b HANGUL JUNGSEONG WAE -// 116c HANGUL JUNGSEONG OE -// 116d HANGUL JUNGSEONG YO -// 116e HANGUL JUNGSEONG U -// 116f HANGUL JUNGSEONG WEO -// 1170 HANGUL JUNGSEONG WE -// 1171 HANGUL JUNGSEONG WI -// 1172 HANGUL JUNGSEONG YU -// 1173 HANGUL JUNGSEONG EU -// 1174 HANGUL JUNGSEONG YI -// 1175 HANGUL JUNGSEONG I -// 1176 HANGUL JUNGSEONG A-O -// 1177 HANGUL JUNGSEONG A-U -// 1178 HANGUL JUNGSEONG YA-O -// 1179 HANGUL JUNGSEONG YA-YO -// 117a HANGUL JUNGSEONG EO-O -// 117b HANGUL JUNGSEONG EO-U -// 117c HANGUL JUNGSEONG EO-EU -// 117d HANGUL JUNGSEONG YEO-O -// 117e HANGUL JUNGSEONG YEO-U -// 117f HANGUL JUNGSEONG O-EO -// 1180 HANGUL JUNGSEONG O-E -// 1181 HANGUL JUNGSEONG O-YE -// 1182 HANGUL JUNGSEONG O-O -// 1183 HANGUL JUNGSEONG O-U -// 1184 HANGUL JUNGSEONG YO-YA -// 1185 HANGUL JUNGSEONG YO-YAE -// 1186 HANGUL JUNGSEONG YO-YEO -// 1187 HANGUL JUNGSEONG YO-O -// 1188 HANGUL JUNGSEONG YO-I -// 1189 HANGUL JUNGSEONG U-A -// 118a HANGUL JUNGSEONG U-AE -// 118b HANGUL JUNGSEONG U-EO-EU -// 118c HANGUL JUNGSEONG U-YE -// 118d HANGUL JUNGSEONG U-U -// 118e HANGUL JUNGSEONG YU-A -// 118f HANGUL JUNGSEONG YU-EO -// 1190 HANGUL JUNGSEONG YU-E -// 1191 HANGUL JUNGSEONG YU-YEO -// 1192 HANGUL JUNGSEONG YU-YE -// 1193 HANGUL JUNGSEONG YU-U -// 1194 HANGUL JUNGSEONG YU-I -// 1195 HANGUL JUNGSEONG EU-U -// 1196 HANGUL JUNGSEONG EU-EU -// 1197 HANGUL JUNGSEONG YI-U -// 1198 HANGUL JUNGSEONG I-A -// 1199 HANGUL JUNGSEONG I-YA -// 119a HANGUL JUNGSEONG I-O -// 119b HANGUL JUNGSEONG I-U -// 119c HANGUL JUNGSEONG I-EU -// 119d HANGUL JUNGSEONG I-ARAEA -// 119e HANGUL JUNGSEONG ARAEA -// 119f HANGUL JUNGSEONG ARAEA-EO -// 11a0 HANGUL JUNGSEONG ARAEA-U -// 11a1 HANGUL JUNGSEONG ARAEA-I -// 11a2 HANGUL JUNGSEONG SSANGARAEA -// 11a3 HANGUL JUNGSEONG A-EU -// 11a4 HANGUL JUNGSEONG YA-U -// 11a5 HANGUL JUNGSEONG YEO-YA -// 11a6 HANGUL JUNGSEONG O-YA -// 11a7 HANGUL JUNGSEONG O-YAE -// 11a8 HANGUL JONGSEONG KIYEOK -// 11a9 HANGUL JONGSEONG SSANGKIYEOK -// 11aa HANGUL JONGSEONG KIYEOK-SIOS -// 11ab HANGUL JONGSEONG NIEUN -// 11ac HANGUL JONGSEONG NIEUN-CIEUC -// 11ad HANGUL JONGSEONG NIEUN-HIEUH -// 11ae HANGUL JONGSEONG TIKEUT -// 11af HANGUL JONGSEONG RIEUL -// 11b0 HANGUL JONGSEONG RIEUL-KIYEOK -// 11b1 HANGUL JONGSEONG RIEUL-MIEUM -// 11b2 HANGUL JONGSEONG RIEUL-PIEUP -// 11b3 HANGUL JONGSEONG RIEUL-SIOS -// 11b4 HANGUL JONGSEONG RIEUL-THIEUTH -// 11b5 HANGUL JONGSEONG RIEUL-PHIEUPH -// 11b6 HANGUL JONGSEONG RIEUL-HIEUH -// 11b7 HANGUL JONGSEONG MIEUM -// 11b8 HANGUL JONGSEONG PIEUP -// 11b9 HANGUL JONGSEONG PIEUP-SIOS -// 11ba HANGUL JONGSEONG SIOS -// 11bb HANGUL JONGSEONG SSANGSIOS -// 11bc HANGUL JONGSEONG IEUNG -// 11bd HANGUL JONGSEONG CIEUC -// 11be HANGUL JONGSEONG CHIEUCH -// 11bf HANGUL JONGSEONG KHIEUKH -// 11c0 HANGUL JONGSEONG THIEUTH -// 11c1 HANGUL JONGSEONG PHIEUPH -// 11c2 HANGUL JONGSEONG HIEUH -// 11c3 HANGUL JONGSEONG KIYEOK-RIEUL -// 11c4 HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK -// 11c5 HANGUL JONGSEONG NIEUN-KIYEOK -// 11c6 HANGUL JONGSEONG NIEUN-TIKEUT -// 11c7 HANGUL JONGSEONG NIEUN-SIOS -// 11c8 HANGUL JONGSEONG NIEUN-PANSIOS -// 11c9 HANGUL JONGSEONG NIEUN-THIEUTH -// 11ca HANGUL JONGSEONG TIKEUT-KIYEOK -// 11cb HANGUL JONGSEONG TIKEUT-RIEUL -// 11cc HANGUL JONGSEONG RIEUL-KIYEOK-SIOS -// 11cd HANGUL JONGSEONG RIEUL-NIEUN -// 11ce HANGUL JONGSEONG RIEUL-TIKEUT -// 11cf HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH -// 11d0 HANGUL JONGSEONG SSANGRIEUL -// 11d1 HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK -// 11d2 HANGUL JONGSEONG RIEUL-MIEUM-SIOS -// 11d3 HANGUL JONGSEONG RIEUL-PIEUP-SIOS -// 11d4 HANGUL JONGSEONG RIEUL-PIEUP-HIEUH -// 11d5 HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP -// 11d6 HANGUL JONGSEONG RIEUL-SSANGSIOS -// 11d7 HANGUL JONGSEONG RIEUL-PANSIOS -// 11d8 HANGUL JONGSEONG RIEUL-KHIEUKH -// 11d9 HANGUL JONGSEONG RIEUL-YEORINHIEUH -// 11da HANGUL JONGSEONG MIEUM-KIYEOK -// 11db HANGUL JONGSEONG MIEUM-RIEUL -// 11dc HANGUL JONGSEONG MIEUM-PIEUP -// 11dd HANGUL JONGSEONG MIEUM-SIOS -// 11de HANGUL JONGSEONG MIEUM-SSANGSIOS -// 11df HANGUL JONGSEONG MIEUM-PANSIOS -// 11e0 HANGUL JONGSEONG MIEUM-CHIEUCH -// 11e1 HANGUL JONGSEONG MIEUM-HIEUH -// 11e2 HANGUL JONGSEONG KAPYEOUNMIEUM -// 11e3 HANGUL JONGSEONG PIEUP-RIEUL -// 11e4 HANGUL JONGSEONG PIEUP-PHIEUPH -// 11e5 HANGUL JONGSEONG PIEUP-HIEUH -// 11e6 HANGUL JONGSEONG KAPYEOUNPIEUP -// 11e7 HANGUL JONGSEONG SIOS-KIYEOK -// 11e8 HANGUL JONGSEONG SIOS-TIKEUT -// 11e9 HANGUL JONGSEONG SIOS-RIEUL -// 11ea HANGUL JONGSEONG SIOS-PIEUP -// 11eb HANGUL JONGSEONG PANSIOS -// 11ec HANGUL JONGSEONG IEUNG-KIYEOK -// 11ed HANGUL JONGSEONG IEUNG-SSANGKIYEOK -// 11ee HANGUL JONGSEONG SSANGIEUNG -// 11ef HANGUL JONGSEONG IEUNG-KHIEUKH -// 11f0 HANGUL JONGSEONG YESIEUNG -// 11f1 HANGUL JONGSEONG YESIEUNG-SIOS -// 11f2 HANGUL JONGSEONG YESIEUNG-PANSIOS -// 11f3 HANGUL JONGSEONG PHIEUPH-PIEUP -// 11f4 HANGUL JONGSEONG KAPYEOUNPHIEUPH -// 11f5 HANGUL JONGSEONG HIEUH-NIEUN -// 11f6 HANGUL JONGSEONG HIEUH-RIEUL -// 11f7 HANGUL JONGSEONG HIEUH-MIEUM -// 11f8 HANGUL JONGSEONG HIEUH-PIEUP -// 11f9 HANGUL JONGSEONG YEORINHIEUH -// 11fa HANGUL JONGSEONG KIYEOK-NIEUN -// 11fb HANGUL JONGSEONG KIYEOK-PIEUP -// 11fc HANGUL JONGSEONG KIYEOK-CHIEUCH -// 11fd HANGUL JONGSEONG KIYEOK-KHIEUKH -// 11fe HANGUL JONGSEONG KIYEOK-HIEUH -// 11ff HANGUL JONGSEONG SSANGNIEUN -// 1200 ETHIOPIC SYLLABLE HA -// 1201 ETHIOPIC SYLLABLE HU -// 1202 ETHIOPIC SYLLABLE HI -// 1203 ETHIOPIC SYLLABLE HAA -// 1204 ETHIOPIC SYLLABLE HEE -// 1205 ETHIOPIC SYLLABLE HE -// 1206 ETHIOPIC SYLLABLE HO -// 1207 ETHIOPIC SYLLABLE HOA -// 1208 ETHIOPIC SYLLABLE LA -// 1209 ETHIOPIC SYLLABLE LU -// 120a ETHIOPIC SYLLABLE LI -// 120b ETHIOPIC SYLLABLE LAA -// 120c ETHIOPIC SYLLABLE LEE -// 120d ETHIOPIC SYLLABLE LE -// 120e ETHIOPIC SYLLABLE LO -// 120f ETHIOPIC SYLLABLE LWA -// 1210 ETHIOPIC SYLLABLE HHA -// 1211 ETHIOPIC SYLLABLE HHU -// 1212 ETHIOPIC SYLLABLE HHI -// 1213 ETHIOPIC SYLLABLE HHAA -// 1214 ETHIOPIC SYLLABLE HHEE -// 1215 ETHIOPIC SYLLABLE HHE -// 1216 ETHIOPIC SYLLABLE HHO -// 1217 ETHIOPIC SYLLABLE HHWA -// 1218 ETHIOPIC SYLLABLE MA -// 1219 ETHIOPIC SYLLABLE MU -// 121a ETHIOPIC SYLLABLE MI -// 121b ETHIOPIC SYLLABLE MAA -// 121c ETHIOPIC SYLLABLE MEE -// 121d ETHIOPIC SYLLABLE ME -// 121e ETHIOPIC SYLLABLE MO -// 121f ETHIOPIC SYLLABLE MWA -// 1220 ETHIOPIC SYLLABLE SZA -// 1221 ETHIOPIC SYLLABLE SZU -// 1222 ETHIOPIC SYLLABLE SZI -// 1223 ETHIOPIC SYLLABLE SZAA -// 1224 ETHIOPIC SYLLABLE SZEE -// 1225 ETHIOPIC SYLLABLE SZE -// 1226 ETHIOPIC SYLLABLE SZO -// 1227 ETHIOPIC SYLLABLE SZWA -// 1228 ETHIOPIC SYLLABLE RA -// 1229 ETHIOPIC SYLLABLE RU -// 122a ETHIOPIC SYLLABLE RI -// 122b ETHIOPIC SYLLABLE RAA -// 122c ETHIOPIC SYLLABLE REE -// 122d ETHIOPIC SYLLABLE RE -// 122e ETHIOPIC SYLLABLE RO -// 122f ETHIOPIC SYLLABLE RWA -// 1230 ETHIOPIC SYLLABLE SA -// 1231 ETHIOPIC SYLLABLE SU -// 1232 ETHIOPIC SYLLABLE SI -// 1233 ETHIOPIC SYLLABLE SAA -// 1234 ETHIOPIC SYLLABLE SEE -// 1235 ETHIOPIC SYLLABLE SE -// 1236 ETHIOPIC SYLLABLE SO -// 1237 ETHIOPIC SYLLABLE SWA -// 1238 ETHIOPIC SYLLABLE SHA -// 1239 ETHIOPIC SYLLABLE SHU -// 123a ETHIOPIC SYLLABLE SHI -// 123b ETHIOPIC SYLLABLE SHAA -// 123c ETHIOPIC SYLLABLE SHEE -// 123d ETHIOPIC SYLLABLE SHE -// 123e ETHIOPIC SYLLABLE SHO -// 123f ETHIOPIC SYLLABLE SHWA -// 1240 ETHIOPIC SYLLABLE QA -// 1241 ETHIOPIC SYLLABLE QU -// 1242 ETHIOPIC SYLLABLE QI -// 1243 ETHIOPIC SYLLABLE QAA -// 1244 ETHIOPIC SYLLABLE QEE -// 1245 ETHIOPIC SYLLABLE QE -// 1246 ETHIOPIC SYLLABLE QO -// 1247 ETHIOPIC SYLLABLE QOA -// 1248 ETHIOPIC SYLLABLE QWA - { 0x10FC, 0x14D, 0x9, 0, 0 }, -// 124a ETHIOPIC SYLLABLE QWI -// 124b ETHIOPIC SYLLABLE QWAA -// 124c ETHIOPIC SYLLABLE QWEE -// 124d ETHIOPIC SYLLABLE QWE - { 0x124A, 0x4, 0x9, 0, 0 }, -// 1250 ETHIOPIC SYLLABLE QHA -// 1251 ETHIOPIC SYLLABLE QHU -// 1252 ETHIOPIC SYLLABLE QHI -// 1253 ETHIOPIC SYLLABLE QHAA -// 1254 ETHIOPIC SYLLABLE QHEE -// 1255 ETHIOPIC SYLLABLE QHE -// 1256 ETHIOPIC SYLLABLE QHO - { 0x1250, 0x7, 0x9, 0, 0 }, -// 1258 ETHIOPIC SYLLABLE QHWA - { 0x1258, 0x1, 0x9, 0, 0 }, -// 125a ETHIOPIC SYLLABLE QHWI -// 125b ETHIOPIC SYLLABLE QHWAA -// 125c ETHIOPIC SYLLABLE QHWEE -// 125d ETHIOPIC SYLLABLE QHWE - { 0x125A, 0x4, 0x9, 0, 0 }, -// 1260 ETHIOPIC SYLLABLE BA -// 1261 ETHIOPIC SYLLABLE BU -// 1262 ETHIOPIC SYLLABLE BI -// 1263 ETHIOPIC SYLLABLE BAA -// 1264 ETHIOPIC SYLLABLE BEE -// 1265 ETHIOPIC SYLLABLE BE -// 1266 ETHIOPIC SYLLABLE BO -// 1267 ETHIOPIC SYLLABLE BWA -// 1268 ETHIOPIC SYLLABLE VA -// 1269 ETHIOPIC SYLLABLE VU -// 126a ETHIOPIC SYLLABLE VI -// 126b ETHIOPIC SYLLABLE VAA -// 126c ETHIOPIC SYLLABLE VEE -// 126d ETHIOPIC SYLLABLE VE -// 126e ETHIOPIC SYLLABLE VO -// 126f ETHIOPIC SYLLABLE VWA -// 1270 ETHIOPIC SYLLABLE TA -// 1271 ETHIOPIC SYLLABLE TU -// 1272 ETHIOPIC SYLLABLE TI -// 1273 ETHIOPIC SYLLABLE TAA -// 1274 ETHIOPIC SYLLABLE TEE -// 1275 ETHIOPIC SYLLABLE TE -// 1276 ETHIOPIC SYLLABLE TO -// 1277 ETHIOPIC SYLLABLE TWA -// 1278 ETHIOPIC SYLLABLE CA -// 1279 ETHIOPIC SYLLABLE CU -// 127a ETHIOPIC SYLLABLE CI -// 127b ETHIOPIC SYLLABLE CAA -// 127c ETHIOPIC SYLLABLE CEE -// 127d ETHIOPIC SYLLABLE CE -// 127e ETHIOPIC SYLLABLE CO -// 127f ETHIOPIC SYLLABLE CWA -// 1280 ETHIOPIC SYLLABLE XA -// 1281 ETHIOPIC SYLLABLE XU -// 1282 ETHIOPIC SYLLABLE XI -// 1283 ETHIOPIC SYLLABLE XAA -// 1284 ETHIOPIC SYLLABLE XEE -// 1285 ETHIOPIC SYLLABLE XE -// 1286 ETHIOPIC SYLLABLE XO -// 1287 ETHIOPIC SYLLABLE XOA -// 1288 ETHIOPIC SYLLABLE XWA - { 0x1260, 0x29, 0x9, 0, 0 }, -// 128a ETHIOPIC SYLLABLE XWI -// 128b ETHIOPIC SYLLABLE XWAA -// 128c ETHIOPIC SYLLABLE XWEE -// 128d ETHIOPIC SYLLABLE XWE - { 0x128A, 0x4, 0x9, 0, 0 }, -// 1290 ETHIOPIC SYLLABLE NA -// 1291 ETHIOPIC SYLLABLE NU -// 1292 ETHIOPIC SYLLABLE NI -// 1293 ETHIOPIC SYLLABLE NAA -// 1294 ETHIOPIC SYLLABLE NEE -// 1295 ETHIOPIC SYLLABLE NE -// 1296 ETHIOPIC SYLLABLE NO -// 1297 ETHIOPIC SYLLABLE NWA -// 1298 ETHIOPIC SYLLABLE NYA -// 1299 ETHIOPIC SYLLABLE NYU -// 129a ETHIOPIC SYLLABLE NYI -// 129b ETHIOPIC SYLLABLE NYAA -// 129c ETHIOPIC SYLLABLE NYEE -// 129d ETHIOPIC SYLLABLE NYE -// 129e ETHIOPIC SYLLABLE NYO -// 129f ETHIOPIC SYLLABLE NYWA -// 12a0 ETHIOPIC SYLLABLE GLOTTAL A -// 12a1 ETHIOPIC SYLLABLE GLOTTAL U -// 12a2 ETHIOPIC SYLLABLE GLOTTAL I -// 12a3 ETHIOPIC SYLLABLE GLOTTAL AA -// 12a4 ETHIOPIC SYLLABLE GLOTTAL EE -// 12a5 ETHIOPIC SYLLABLE GLOTTAL E -// 12a6 ETHIOPIC SYLLABLE GLOTTAL O -// 12a7 ETHIOPIC SYLLABLE GLOTTAL WA -// 12a8 ETHIOPIC SYLLABLE KA -// 12a9 ETHIOPIC SYLLABLE KU -// 12aa ETHIOPIC SYLLABLE KI -// 12ab ETHIOPIC SYLLABLE KAA -// 12ac ETHIOPIC SYLLABLE KEE -// 12ad ETHIOPIC SYLLABLE KE -// 12ae ETHIOPIC SYLLABLE KO -// 12af ETHIOPIC SYLLABLE KOA -// 12b0 ETHIOPIC SYLLABLE KWA - { 0x1290, 0x21, 0x9, 0, 0 }, -// 12b2 ETHIOPIC SYLLABLE KWI -// 12b3 ETHIOPIC SYLLABLE KWAA -// 12b4 ETHIOPIC SYLLABLE KWEE -// 12b5 ETHIOPIC SYLLABLE KWE - { 0x12B2, 0x4, 0x9, 0, 0 }, -// 12b8 ETHIOPIC SYLLABLE KXA -// 12b9 ETHIOPIC SYLLABLE KXU -// 12ba ETHIOPIC SYLLABLE KXI -// 12bb ETHIOPIC SYLLABLE KXAA -// 12bc ETHIOPIC SYLLABLE KXEE -// 12bd ETHIOPIC SYLLABLE KXE -// 12be ETHIOPIC SYLLABLE KXO - { 0x12B8, 0x7, 0x9, 0, 0 }, -// 12c0 ETHIOPIC SYLLABLE KXWA - { 0x12C0, 0x1, 0x9, 0, 0 }, -// 12c2 ETHIOPIC SYLLABLE KXWI -// 12c3 ETHIOPIC SYLLABLE KXWAA -// 12c4 ETHIOPIC SYLLABLE KXWEE -// 12c5 ETHIOPIC SYLLABLE KXWE - { 0x12C2, 0x4, 0x9, 0, 0 }, -// 12c8 ETHIOPIC SYLLABLE WA -// 12c9 ETHIOPIC SYLLABLE WU -// 12ca ETHIOPIC SYLLABLE WI -// 12cb ETHIOPIC SYLLABLE WAA -// 12cc ETHIOPIC SYLLABLE WEE -// 12cd ETHIOPIC SYLLABLE WE -// 12ce ETHIOPIC SYLLABLE WO -// 12cf ETHIOPIC SYLLABLE WOA -// 12d0 ETHIOPIC SYLLABLE PHARYNGEAL A -// 12d1 ETHIOPIC SYLLABLE PHARYNGEAL U -// 12d2 ETHIOPIC SYLLABLE PHARYNGEAL I -// 12d3 ETHIOPIC SYLLABLE PHARYNGEAL AA -// 12d4 ETHIOPIC SYLLABLE PHARYNGEAL EE -// 12d5 ETHIOPIC SYLLABLE PHARYNGEAL E -// 12d6 ETHIOPIC SYLLABLE PHARYNGEAL O - { 0x12C8, 0xF, 0x9, 0, 0 }, -// 12d8 ETHIOPIC SYLLABLE ZA -// 12d9 ETHIOPIC SYLLABLE ZU -// 12da ETHIOPIC SYLLABLE ZI -// 12db ETHIOPIC SYLLABLE ZAA -// 12dc ETHIOPIC SYLLABLE ZEE -// 12dd ETHIOPIC SYLLABLE ZE -// 12de ETHIOPIC SYLLABLE ZO -// 12df ETHIOPIC SYLLABLE ZWA -// 12e0 ETHIOPIC SYLLABLE ZHA -// 12e1 ETHIOPIC SYLLABLE ZHU -// 12e2 ETHIOPIC SYLLABLE ZHI -// 12e3 ETHIOPIC SYLLABLE ZHAA -// 12e4 ETHIOPIC SYLLABLE ZHEE -// 12e5 ETHIOPIC SYLLABLE ZHE -// 12e6 ETHIOPIC SYLLABLE ZHO -// 12e7 ETHIOPIC SYLLABLE ZHWA -// 12e8 ETHIOPIC SYLLABLE YA -// 12e9 ETHIOPIC SYLLABLE YU -// 12ea ETHIOPIC SYLLABLE YI -// 12eb ETHIOPIC SYLLABLE YAA -// 12ec ETHIOPIC SYLLABLE YEE -// 12ed ETHIOPIC SYLLABLE YE -// 12ee ETHIOPIC SYLLABLE YO -// 12ef ETHIOPIC SYLLABLE YOA -// 12f0 ETHIOPIC SYLLABLE DA -// 12f1 ETHIOPIC SYLLABLE DU -// 12f2 ETHIOPIC SYLLABLE DI -// 12f3 ETHIOPIC SYLLABLE DAA -// 12f4 ETHIOPIC SYLLABLE DEE -// 12f5 ETHIOPIC SYLLABLE DE -// 12f6 ETHIOPIC SYLLABLE DO -// 12f7 ETHIOPIC SYLLABLE DWA -// 12f8 ETHIOPIC SYLLABLE DDA -// 12f9 ETHIOPIC SYLLABLE DDU -// 12fa ETHIOPIC SYLLABLE DDI -// 12fb ETHIOPIC SYLLABLE DDAA -// 12fc ETHIOPIC SYLLABLE DDEE -// 12fd ETHIOPIC SYLLABLE DDE -// 12fe ETHIOPIC SYLLABLE DDO -// 12ff ETHIOPIC SYLLABLE DDWA -// 1300 ETHIOPIC SYLLABLE JA -// 1301 ETHIOPIC SYLLABLE JU -// 1302 ETHIOPIC SYLLABLE JI -// 1303 ETHIOPIC SYLLABLE JAA -// 1304 ETHIOPIC SYLLABLE JEE -// 1305 ETHIOPIC SYLLABLE JE -// 1306 ETHIOPIC SYLLABLE JO -// 1307 ETHIOPIC SYLLABLE JWA -// 1308 ETHIOPIC SYLLABLE GA -// 1309 ETHIOPIC SYLLABLE GU -// 130a ETHIOPIC SYLLABLE GI -// 130b ETHIOPIC SYLLABLE GAA -// 130c ETHIOPIC SYLLABLE GEE -// 130d ETHIOPIC SYLLABLE GE -// 130e ETHIOPIC SYLLABLE GO -// 130f ETHIOPIC SYLLABLE GOA -// 1310 ETHIOPIC SYLLABLE GWA - { 0x12D8, 0x39, 0x9, 0, 0 }, -// 1312 ETHIOPIC SYLLABLE GWI -// 1313 ETHIOPIC SYLLABLE GWAA -// 1314 ETHIOPIC SYLLABLE GWEE -// 1315 ETHIOPIC SYLLABLE GWE - { 0x1312, 0x4, 0x9, 0, 0 }, -// 1318 ETHIOPIC SYLLABLE GGA -// 1319 ETHIOPIC SYLLABLE GGU -// 131a ETHIOPIC SYLLABLE GGI -// 131b ETHIOPIC SYLLABLE GGAA -// 131c ETHIOPIC SYLLABLE GGEE -// 131d ETHIOPIC SYLLABLE GGE -// 131e ETHIOPIC SYLLABLE GGO -// 131f ETHIOPIC SYLLABLE GGWAA -// 1320 ETHIOPIC SYLLABLE THA -// 1321 ETHIOPIC SYLLABLE THU -// 1322 ETHIOPIC SYLLABLE THI -// 1323 ETHIOPIC SYLLABLE THAA -// 1324 ETHIOPIC SYLLABLE THEE -// 1325 ETHIOPIC SYLLABLE THE -// 1326 ETHIOPIC SYLLABLE THO -// 1327 ETHIOPIC SYLLABLE THWA -// 1328 ETHIOPIC SYLLABLE CHA -// 1329 ETHIOPIC SYLLABLE CHU -// 132a ETHIOPIC SYLLABLE CHI -// 132b ETHIOPIC SYLLABLE CHAA -// 132c ETHIOPIC SYLLABLE CHEE -// 132d ETHIOPIC SYLLABLE CHE -// 132e ETHIOPIC SYLLABLE CHO -// 132f ETHIOPIC SYLLABLE CHWA -// 1330 ETHIOPIC SYLLABLE PHA -// 1331 ETHIOPIC SYLLABLE PHU -// 1332 ETHIOPIC SYLLABLE PHI -// 1333 ETHIOPIC SYLLABLE PHAA -// 1334 ETHIOPIC SYLLABLE PHEE -// 1335 ETHIOPIC SYLLABLE PHE -// 1336 ETHIOPIC SYLLABLE PHO -// 1337 ETHIOPIC SYLLABLE PHWA -// 1338 ETHIOPIC SYLLABLE TSA -// 1339 ETHIOPIC SYLLABLE TSU -// 133a ETHIOPIC SYLLABLE TSI -// 133b ETHIOPIC SYLLABLE TSAA -// 133c ETHIOPIC SYLLABLE TSEE -// 133d ETHIOPIC SYLLABLE TSE -// 133e ETHIOPIC SYLLABLE TSO -// 133f ETHIOPIC SYLLABLE TSWA -// 1340 ETHIOPIC SYLLABLE TZA -// 1341 ETHIOPIC SYLLABLE TZU -// 1342 ETHIOPIC SYLLABLE TZI -// 1343 ETHIOPIC SYLLABLE TZAA -// 1344 ETHIOPIC SYLLABLE TZEE -// 1345 ETHIOPIC SYLLABLE TZE -// 1346 ETHIOPIC SYLLABLE TZO -// 1347 ETHIOPIC SYLLABLE TZOA -// 1348 ETHIOPIC SYLLABLE FA -// 1349 ETHIOPIC SYLLABLE FU -// 134a ETHIOPIC SYLLABLE FI -// 134b ETHIOPIC SYLLABLE FAA -// 134c ETHIOPIC SYLLABLE FEE -// 134d ETHIOPIC SYLLABLE FE -// 134e ETHIOPIC SYLLABLE FO -// 134f ETHIOPIC SYLLABLE FWA -// 1350 ETHIOPIC SYLLABLE PA -// 1351 ETHIOPIC SYLLABLE PU -// 1352 ETHIOPIC SYLLABLE PI -// 1353 ETHIOPIC SYLLABLE PAA -// 1354 ETHIOPIC SYLLABLE PEE -// 1355 ETHIOPIC SYLLABLE PE -// 1356 ETHIOPIC SYLLABLE PO -// 1357 ETHIOPIC SYLLABLE PWA -// 1358 ETHIOPIC SYLLABLE RYA -// 1359 ETHIOPIC SYLLABLE MYA -// 135a ETHIOPIC SYLLABLE FYA - { 0x1318, 0x43, 0x9, 0, 0 }, -// 135d ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK -// 135e ETHIOPIC COMBINING VOWEL LENGTH MARK -// 135f ETHIOPIC COMBINING GEMINATION MARK - { 0x135D, 0x3, 0x0, 0, 0 }, -// 1360 ETHIOPIC SECTION MARK -// 1361 ETHIOPIC WORDSPACE -// 1362 ETHIOPIC FULL STOP -// 1363 ETHIOPIC COMMA -// 1364 ETHIOPIC SEMICOLON -// 1365 ETHIOPIC COLON -// 1366 ETHIOPIC PREFACE COLON -// 1367 ETHIOPIC QUESTION MARK -// 1368 ETHIOPIC PARAGRAPH SEPARATOR - { 0x1360, 0x9, 0x18, 0, 0 }, -// 1369 ETHIOPIC DIGIT ONE -// 136a ETHIOPIC DIGIT TWO -// 136b ETHIOPIC DIGIT THREE -// 136c ETHIOPIC DIGIT FOUR -// 136d ETHIOPIC DIGIT FIVE -// 136e ETHIOPIC DIGIT SIX -// 136f ETHIOPIC DIGIT SEVEN -// 1370 ETHIOPIC DIGIT EIGHT -// 1371 ETHIOPIC DIGIT NINE -// 1372 ETHIOPIC NUMBER TEN -// 1373 ETHIOPIC NUMBER TWENTY -// 1374 ETHIOPIC NUMBER THIRTY -// 1375 ETHIOPIC NUMBER FORTY -// 1376 ETHIOPIC NUMBER FIFTY -// 1377 ETHIOPIC NUMBER SIXTY -// 1378 ETHIOPIC NUMBER SEVENTY -// 1379 ETHIOPIC NUMBER EIGHTY -// 137a ETHIOPIC NUMBER NINETY -// 137b ETHIOPIC NUMBER HUNDRED -// 137c ETHIOPIC NUMBER TEN THOUSAND - { 0x1369, 0x14, 0x8, 0, 0 }, -// 1380 ETHIOPIC SYLLABLE SEBATBEIT MWA -// 1381 ETHIOPIC SYLLABLE MWI -// 1382 ETHIOPIC SYLLABLE MWEE -// 1383 ETHIOPIC SYLLABLE MWE -// 1384 ETHIOPIC SYLLABLE SEBATBEIT BWA -// 1385 ETHIOPIC SYLLABLE BWI -// 1386 ETHIOPIC SYLLABLE BWEE -// 1387 ETHIOPIC SYLLABLE BWE -// 1388 ETHIOPIC SYLLABLE SEBATBEIT FWA -// 1389 ETHIOPIC SYLLABLE FWI -// 138a ETHIOPIC SYLLABLE FWEE -// 138b ETHIOPIC SYLLABLE FWE -// 138c ETHIOPIC SYLLABLE SEBATBEIT PWA -// 138d ETHIOPIC SYLLABLE PWI -// 138e ETHIOPIC SYLLABLE PWEE -// 138f ETHIOPIC SYLLABLE PWE - { 0x1380, 0x10, 0x9, 0, 0 }, -// 1390 ETHIOPIC TONAL MARK YIZET -// 1391 ETHIOPIC TONAL MARK DERET -// 1392 ETHIOPIC TONAL MARK RIKRIK -// 1393 ETHIOPIC TONAL MARK SHORT RIKRIK -// 1394 ETHIOPIC TONAL MARK DIFAT -// 1395 ETHIOPIC TONAL MARK KENAT -// 1396 ETHIOPIC TONAL MARK CHIRET -// 1397 ETHIOPIC TONAL MARK HIDET -// 1398 ETHIOPIC TONAL MARK DERET-HIDET -// 1399 ETHIOPIC TONAL MARK KURT - { 0x1390, 0xA, 0x8, 0, 0 }, -// 13a0 CHEROKEE LETTER A -// 13a1 CHEROKEE LETTER E -// 13a2 CHEROKEE LETTER I -// 13a3 CHEROKEE LETTER O -// 13a4 CHEROKEE LETTER U -// 13a5 CHEROKEE LETTER V -// 13a6 CHEROKEE LETTER GA -// 13a7 CHEROKEE LETTER KA -// 13a8 CHEROKEE LETTER GE -// 13a9 CHEROKEE LETTER GI -// 13aa CHEROKEE LETTER GO -// 13ab CHEROKEE LETTER GU -// 13ac CHEROKEE LETTER GV -// 13ad CHEROKEE LETTER HA -// 13ae CHEROKEE LETTER HE -// 13af CHEROKEE LETTER HI -// 13b0 CHEROKEE LETTER HO -// 13b1 CHEROKEE LETTER HU -// 13b2 CHEROKEE LETTER HV -// 13b3 CHEROKEE LETTER LA -// 13b4 CHEROKEE LETTER LE -// 13b5 CHEROKEE LETTER LI -// 13b6 CHEROKEE LETTER LO -// 13b7 CHEROKEE LETTER LU -// 13b8 CHEROKEE LETTER LV -// 13b9 CHEROKEE LETTER MA -// 13ba CHEROKEE LETTER ME -// 13bb CHEROKEE LETTER MI -// 13bc CHEROKEE LETTER MO -// 13bd CHEROKEE LETTER MU -// 13be CHEROKEE LETTER NA -// 13bf CHEROKEE LETTER HNA -// 13c0 CHEROKEE LETTER NAH -// 13c1 CHEROKEE LETTER NE -// 13c2 CHEROKEE LETTER NI -// 13c3 CHEROKEE LETTER NO -// 13c4 CHEROKEE LETTER NU -// 13c5 CHEROKEE LETTER NV -// 13c6 CHEROKEE LETTER QUA -// 13c7 CHEROKEE LETTER QUE -// 13c8 CHEROKEE LETTER QUI -// 13c9 CHEROKEE LETTER QUO -// 13ca CHEROKEE LETTER QUU -// 13cb CHEROKEE LETTER QUV -// 13cc CHEROKEE LETTER SA -// 13cd CHEROKEE LETTER S -// 13ce CHEROKEE LETTER SE -// 13cf CHEROKEE LETTER SI -// 13d0 CHEROKEE LETTER SO -// 13d1 CHEROKEE LETTER SU -// 13d2 CHEROKEE LETTER SV -// 13d3 CHEROKEE LETTER DA -// 13d4 CHEROKEE LETTER TA -// 13d5 CHEROKEE LETTER DE -// 13d6 CHEROKEE LETTER TE -// 13d7 CHEROKEE LETTER DI -// 13d8 CHEROKEE LETTER TI -// 13d9 CHEROKEE LETTER DO -// 13da CHEROKEE LETTER DU -// 13db CHEROKEE LETTER DV -// 13dc CHEROKEE LETTER DLA -// 13dd CHEROKEE LETTER TLA -// 13de CHEROKEE LETTER TLE -// 13df CHEROKEE LETTER TLI -// 13e0 CHEROKEE LETTER TLO -// 13e1 CHEROKEE LETTER TLU -// 13e2 CHEROKEE LETTER TLV -// 13e3 CHEROKEE LETTER TSA -// 13e4 CHEROKEE LETTER TSE -// 13e5 CHEROKEE LETTER TSI -// 13e6 CHEROKEE LETTER TSO -// 13e7 CHEROKEE LETTER TSU -// 13e8 CHEROKEE LETTER TSV -// 13e9 CHEROKEE LETTER WA -// 13ea CHEROKEE LETTER WE -// 13eb CHEROKEE LETTER WI -// 13ec CHEROKEE LETTER WO -// 13ed CHEROKEE LETTER WU -// 13ee CHEROKEE LETTER WV -// 13ef CHEROKEE LETTER YA -// 13f0 CHEROKEE LETTER YE -// 13f1 CHEROKEE LETTER YI -// 13f2 CHEROKEE LETTER YO -// 13f3 CHEROKEE LETTER YU -// 13f4 CHEROKEE LETTER YV - { 0x13A0, 0x55, 0x9, 0, 0 }, -// 1400 CANADIAN SYLLABICS HYPHEN - { 0x1400, 0x1, 0x18, 0, 0 }, -// 1401 CANADIAN SYLLABICS E -// 1402 CANADIAN SYLLABICS AAI -// 1403 CANADIAN SYLLABICS I -// 1404 CANADIAN SYLLABICS II -// 1405 CANADIAN SYLLABICS O -// 1406 CANADIAN SYLLABICS OO -// 1407 CANADIAN SYLLABICS Y-CREE OO -// 1408 CANADIAN SYLLABICS CARRIER EE -// 1409 CANADIAN SYLLABICS CARRIER I -// 140a CANADIAN SYLLABICS A -// 140b CANADIAN SYLLABICS AA -// 140c CANADIAN SYLLABICS WE -// 140d CANADIAN SYLLABICS WEST-CREE WE -// 140e CANADIAN SYLLABICS WI -// 140f CANADIAN SYLLABICS WEST-CREE WI -// 1410 CANADIAN SYLLABICS WII -// 1411 CANADIAN SYLLABICS WEST-CREE WII -// 1412 CANADIAN SYLLABICS WO -// 1413 CANADIAN SYLLABICS WEST-CREE WO -// 1414 CANADIAN SYLLABICS WOO -// 1415 CANADIAN SYLLABICS WEST-CREE WOO -// 1416 CANADIAN SYLLABICS NASKAPI WOO -// 1417 CANADIAN SYLLABICS WA -// 1418 CANADIAN SYLLABICS WEST-CREE WA -// 1419 CANADIAN SYLLABICS WAA -// 141a CANADIAN SYLLABICS WEST-CREE WAA -// 141b CANADIAN SYLLABICS NASKAPI WAA -// 141c CANADIAN SYLLABICS AI -// 141d CANADIAN SYLLABICS Y-CREE W -// 141e CANADIAN SYLLABICS GLOTTAL STOP -// 141f CANADIAN SYLLABICS FINAL ACUTE -// 1420 CANADIAN SYLLABICS FINAL GRAVE -// 1421 CANADIAN SYLLABICS FINAL BOTTOM HALF RING -// 1422 CANADIAN SYLLABICS FINAL TOP HALF RING -// 1423 CANADIAN SYLLABICS FINAL RIGHT HALF RING -// 1424 CANADIAN SYLLABICS FINAL RING -// 1425 CANADIAN SYLLABICS FINAL DOUBLE ACUTE -// 1426 CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES -// 1427 CANADIAN SYLLABICS FINAL MIDDLE DOT -// 1428 CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE -// 1429 CANADIAN SYLLABICS FINAL PLUS -// 142a CANADIAN SYLLABICS FINAL DOWN TACK -// 142b CANADIAN SYLLABICS EN -// 142c CANADIAN SYLLABICS IN -// 142d CANADIAN SYLLABICS ON -// 142e CANADIAN SYLLABICS AN -// 142f CANADIAN SYLLABICS PE -// 1430 CANADIAN SYLLABICS PAAI -// 1431 CANADIAN SYLLABICS PI -// 1432 CANADIAN SYLLABICS PII -// 1433 CANADIAN SYLLABICS PO -// 1434 CANADIAN SYLLABICS POO -// 1435 CANADIAN SYLLABICS Y-CREE POO -// 1436 CANADIAN SYLLABICS CARRIER HEE -// 1437 CANADIAN SYLLABICS CARRIER HI -// 1438 CANADIAN SYLLABICS PA -// 1439 CANADIAN SYLLABICS PAA -// 143a CANADIAN SYLLABICS PWE -// 143b CANADIAN SYLLABICS WEST-CREE PWE -// 143c CANADIAN SYLLABICS PWI -// 143d CANADIAN SYLLABICS WEST-CREE PWI -// 143e CANADIAN SYLLABICS PWII -// 143f CANADIAN SYLLABICS WEST-CREE PWII -// 1440 CANADIAN SYLLABICS PWO -// 1441 CANADIAN SYLLABICS WEST-CREE PWO -// 1442 CANADIAN SYLLABICS PWOO -// 1443 CANADIAN SYLLABICS WEST-CREE PWOO -// 1444 CANADIAN SYLLABICS PWA -// 1445 CANADIAN SYLLABICS WEST-CREE PWA -// 1446 CANADIAN SYLLABICS PWAA -// 1447 CANADIAN SYLLABICS WEST-CREE PWAA -// 1448 CANADIAN SYLLABICS Y-CREE PWAA -// 1449 CANADIAN SYLLABICS P -// 144a CANADIAN SYLLABICS WEST-CREE P -// 144b CANADIAN SYLLABICS CARRIER H -// 144c CANADIAN SYLLABICS TE -// 144d CANADIAN SYLLABICS TAAI -// 144e CANADIAN SYLLABICS TI -// 144f CANADIAN SYLLABICS TII -// 1450 CANADIAN SYLLABICS TO -// 1451 CANADIAN SYLLABICS TOO -// 1452 CANADIAN SYLLABICS Y-CREE TOO -// 1453 CANADIAN SYLLABICS CARRIER DEE -// 1454 CANADIAN SYLLABICS CARRIER DI -// 1455 CANADIAN SYLLABICS TA -// 1456 CANADIAN SYLLABICS TAA -// 1457 CANADIAN SYLLABICS TWE -// 1458 CANADIAN SYLLABICS WEST-CREE TWE -// 1459 CANADIAN SYLLABICS TWI -// 145a CANADIAN SYLLABICS WEST-CREE TWI -// 145b CANADIAN SYLLABICS TWII -// 145c CANADIAN SYLLABICS WEST-CREE TWII -// 145d CANADIAN SYLLABICS TWO -// 145e CANADIAN SYLLABICS WEST-CREE TWO -// 145f CANADIAN SYLLABICS TWOO -// 1460 CANADIAN SYLLABICS WEST-CREE TWOO -// 1461 CANADIAN SYLLABICS TWA -// 1462 CANADIAN SYLLABICS WEST-CREE TWA -// 1463 CANADIAN SYLLABICS TWAA -// 1464 CANADIAN SYLLABICS WEST-CREE TWAA -// 1465 CANADIAN SYLLABICS NASKAPI TWAA -// 1466 CANADIAN SYLLABICS T -// 1467 CANADIAN SYLLABICS TTE -// 1468 CANADIAN SYLLABICS TTI -// 1469 CANADIAN SYLLABICS TTO -// 146a CANADIAN SYLLABICS TTA -// 146b CANADIAN SYLLABICS KE -// 146c CANADIAN SYLLABICS KAAI -// 146d CANADIAN SYLLABICS KI -// 146e CANADIAN SYLLABICS KII -// 146f CANADIAN SYLLABICS KO -// 1470 CANADIAN SYLLABICS KOO -// 1471 CANADIAN SYLLABICS Y-CREE KOO -// 1472 CANADIAN SYLLABICS KA -// 1473 CANADIAN SYLLABICS KAA -// 1474 CANADIAN SYLLABICS KWE -// 1475 CANADIAN SYLLABICS WEST-CREE KWE -// 1476 CANADIAN SYLLABICS KWI -// 1477 CANADIAN SYLLABICS WEST-CREE KWI -// 1478 CANADIAN SYLLABICS KWII -// 1479 CANADIAN SYLLABICS WEST-CREE KWII -// 147a CANADIAN SYLLABICS KWO -// 147b CANADIAN SYLLABICS WEST-CREE KWO -// 147c CANADIAN SYLLABICS KWOO -// 147d CANADIAN SYLLABICS WEST-CREE KWOO -// 147e CANADIAN SYLLABICS KWA -// 147f CANADIAN SYLLABICS WEST-CREE KWA -// 1480 CANADIAN SYLLABICS KWAA -// 1481 CANADIAN SYLLABICS WEST-CREE KWAA -// 1482 CANADIAN SYLLABICS NASKAPI KWAA -// 1483 CANADIAN SYLLABICS K -// 1484 CANADIAN SYLLABICS KW -// 1485 CANADIAN SYLLABICS SOUTH-SLAVEY KEH -// 1486 CANADIAN SYLLABICS SOUTH-SLAVEY KIH -// 1487 CANADIAN SYLLABICS SOUTH-SLAVEY KOH -// 1488 CANADIAN SYLLABICS SOUTH-SLAVEY KAH -// 1489 CANADIAN SYLLABICS CE -// 148a CANADIAN SYLLABICS CAAI -// 148b CANADIAN SYLLABICS CI -// 148c CANADIAN SYLLABICS CII -// 148d CANADIAN SYLLABICS CO -// 148e CANADIAN SYLLABICS COO -// 148f CANADIAN SYLLABICS Y-CREE COO -// 1490 CANADIAN SYLLABICS CA -// 1491 CANADIAN SYLLABICS CAA -// 1492 CANADIAN SYLLABICS CWE -// 1493 CANADIAN SYLLABICS WEST-CREE CWE -// 1494 CANADIAN SYLLABICS CWI -// 1495 CANADIAN SYLLABICS WEST-CREE CWI -// 1496 CANADIAN SYLLABICS CWII -// 1497 CANADIAN SYLLABICS WEST-CREE CWII -// 1498 CANADIAN SYLLABICS CWO -// 1499 CANADIAN SYLLABICS WEST-CREE CWO -// 149a CANADIAN SYLLABICS CWOO -// 149b CANADIAN SYLLABICS WEST-CREE CWOO -// 149c CANADIAN SYLLABICS CWA -// 149d CANADIAN SYLLABICS WEST-CREE CWA -// 149e CANADIAN SYLLABICS CWAA -// 149f CANADIAN SYLLABICS WEST-CREE CWAA -// 14a0 CANADIAN SYLLABICS NASKAPI CWAA -// 14a1 CANADIAN SYLLABICS C -// 14a2 CANADIAN SYLLABICS SAYISI TH -// 14a3 CANADIAN SYLLABICS ME -// 14a4 CANADIAN SYLLABICS MAAI -// 14a5 CANADIAN SYLLABICS MI -// 14a6 CANADIAN SYLLABICS MII -// 14a7 CANADIAN SYLLABICS MO -// 14a8 CANADIAN SYLLABICS MOO -// 14a9 CANADIAN SYLLABICS Y-CREE MOO -// 14aa CANADIAN SYLLABICS MA -// 14ab CANADIAN SYLLABICS MAA -// 14ac CANADIAN SYLLABICS MWE -// 14ad CANADIAN SYLLABICS WEST-CREE MWE -// 14ae CANADIAN SYLLABICS MWI -// 14af CANADIAN SYLLABICS WEST-CREE MWI -// 14b0 CANADIAN SYLLABICS MWII -// 14b1 CANADIAN SYLLABICS WEST-CREE MWII -// 14b2 CANADIAN SYLLABICS MWO -// 14b3 CANADIAN SYLLABICS WEST-CREE MWO -// 14b4 CANADIAN SYLLABICS MWOO -// 14b5 CANADIAN SYLLABICS WEST-CREE MWOO -// 14b6 CANADIAN SYLLABICS MWA -// 14b7 CANADIAN SYLLABICS WEST-CREE MWA -// 14b8 CANADIAN SYLLABICS MWAA -// 14b9 CANADIAN SYLLABICS WEST-CREE MWAA -// 14ba CANADIAN SYLLABICS NASKAPI MWAA -// 14bb CANADIAN SYLLABICS M -// 14bc CANADIAN SYLLABICS WEST-CREE M -// 14bd CANADIAN SYLLABICS MH -// 14be CANADIAN SYLLABICS ATHAPASCAN M -// 14bf CANADIAN SYLLABICS SAYISI M -// 14c0 CANADIAN SYLLABICS NE -// 14c1 CANADIAN SYLLABICS NAAI -// 14c2 CANADIAN SYLLABICS NI -// 14c3 CANADIAN SYLLABICS NII -// 14c4 CANADIAN SYLLABICS NO -// 14c5 CANADIAN SYLLABICS NOO -// 14c6 CANADIAN SYLLABICS Y-CREE NOO -// 14c7 CANADIAN SYLLABICS NA -// 14c8 CANADIAN SYLLABICS NAA -// 14c9 CANADIAN SYLLABICS NWE -// 14ca CANADIAN SYLLABICS WEST-CREE NWE -// 14cb CANADIAN SYLLABICS NWA -// 14cc CANADIAN SYLLABICS WEST-CREE NWA -// 14cd CANADIAN SYLLABICS NWAA -// 14ce CANADIAN SYLLABICS WEST-CREE NWAA -// 14cf CANADIAN SYLLABICS NASKAPI NWAA -// 14d0 CANADIAN SYLLABICS N -// 14d1 CANADIAN SYLLABICS CARRIER NG -// 14d2 CANADIAN SYLLABICS NH -// 14d3 CANADIAN SYLLABICS LE -// 14d4 CANADIAN SYLLABICS LAAI -// 14d5 CANADIAN SYLLABICS LI -// 14d6 CANADIAN SYLLABICS LII -// 14d7 CANADIAN SYLLABICS LO -// 14d8 CANADIAN SYLLABICS LOO -// 14d9 CANADIAN SYLLABICS Y-CREE LOO -// 14da CANADIAN SYLLABICS LA -// 14db CANADIAN SYLLABICS LAA -// 14dc CANADIAN SYLLABICS LWE -// 14dd CANADIAN SYLLABICS WEST-CREE LWE -// 14de CANADIAN SYLLABICS LWI -// 14df CANADIAN SYLLABICS WEST-CREE LWI -// 14e0 CANADIAN SYLLABICS LWII -// 14e1 CANADIAN SYLLABICS WEST-CREE LWII -// 14e2 CANADIAN SYLLABICS LWO -// 14e3 CANADIAN SYLLABICS WEST-CREE LWO -// 14e4 CANADIAN SYLLABICS LWOO -// 14e5 CANADIAN SYLLABICS WEST-CREE LWOO -// 14e6 CANADIAN SYLLABICS LWA -// 14e7 CANADIAN SYLLABICS WEST-CREE LWA -// 14e8 CANADIAN SYLLABICS LWAA -// 14e9 CANADIAN SYLLABICS WEST-CREE LWAA -// 14ea CANADIAN SYLLABICS L -// 14eb CANADIAN SYLLABICS WEST-CREE L -// 14ec CANADIAN SYLLABICS MEDIAL L -// 14ed CANADIAN SYLLABICS SE -// 14ee CANADIAN SYLLABICS SAAI -// 14ef CANADIAN SYLLABICS SI -// 14f0 CANADIAN SYLLABICS SII -// 14f1 CANADIAN SYLLABICS SO -// 14f2 CANADIAN SYLLABICS SOO -// 14f3 CANADIAN SYLLABICS Y-CREE SOO -// 14f4 CANADIAN SYLLABICS SA -// 14f5 CANADIAN SYLLABICS SAA -// 14f6 CANADIAN SYLLABICS SWE -// 14f7 CANADIAN SYLLABICS WEST-CREE SWE -// 14f8 CANADIAN SYLLABICS SWI -// 14f9 CANADIAN SYLLABICS WEST-CREE SWI -// 14fa CANADIAN SYLLABICS SWII -// 14fb CANADIAN SYLLABICS WEST-CREE SWII -// 14fc CANADIAN SYLLABICS SWO -// 14fd CANADIAN SYLLABICS WEST-CREE SWO -// 14fe CANADIAN SYLLABICS SWOO -// 14ff CANADIAN SYLLABICS WEST-CREE SWOO -// 1500 CANADIAN SYLLABICS SWA -// 1501 CANADIAN SYLLABICS WEST-CREE SWA -// 1502 CANADIAN SYLLABICS SWAA -// 1503 CANADIAN SYLLABICS WEST-CREE SWAA -// 1504 CANADIAN SYLLABICS NASKAPI SWAA -// 1505 CANADIAN SYLLABICS S -// 1506 CANADIAN SYLLABICS ATHAPASCAN S -// 1507 CANADIAN SYLLABICS SW -// 1508 CANADIAN SYLLABICS BLACKFOOT S -// 1509 CANADIAN SYLLABICS MOOSE-CREE SK -// 150a CANADIAN SYLLABICS NASKAPI SKW -// 150b CANADIAN SYLLABICS NASKAPI S-W -// 150c CANADIAN SYLLABICS NASKAPI SPWA -// 150d CANADIAN SYLLABICS NASKAPI STWA -// 150e CANADIAN SYLLABICS NASKAPI SKWA -// 150f CANADIAN SYLLABICS NASKAPI SCWA -// 1510 CANADIAN SYLLABICS SHE -// 1511 CANADIAN SYLLABICS SHI -// 1512 CANADIAN SYLLABICS SHII -// 1513 CANADIAN SYLLABICS SHO -// 1514 CANADIAN SYLLABICS SHOO -// 1515 CANADIAN SYLLABICS SHA -// 1516 CANADIAN SYLLABICS SHAA -// 1517 CANADIAN SYLLABICS SHWE -// 1518 CANADIAN SYLLABICS WEST-CREE SHWE -// 1519 CANADIAN SYLLABICS SHWI -// 151a CANADIAN SYLLABICS WEST-CREE SHWI -// 151b CANADIAN SYLLABICS SHWII -// 151c CANADIAN SYLLABICS WEST-CREE SHWII -// 151d CANADIAN SYLLABICS SHWO -// 151e CANADIAN SYLLABICS WEST-CREE SHWO -// 151f CANADIAN SYLLABICS SHWOO -// 1520 CANADIAN SYLLABICS WEST-CREE SHWOO -// 1521 CANADIAN SYLLABICS SHWA -// 1522 CANADIAN SYLLABICS WEST-CREE SHWA -// 1523 CANADIAN SYLLABICS SHWAA -// 1524 CANADIAN SYLLABICS WEST-CREE SHWAA -// 1525 CANADIAN SYLLABICS SH -// 1526 CANADIAN SYLLABICS YE -// 1527 CANADIAN SYLLABICS YAAI -// 1528 CANADIAN SYLLABICS YI -// 1529 CANADIAN SYLLABICS YII -// 152a CANADIAN SYLLABICS YO -// 152b CANADIAN SYLLABICS YOO -// 152c CANADIAN SYLLABICS Y-CREE YOO -// 152d CANADIAN SYLLABICS YA -// 152e CANADIAN SYLLABICS YAA -// 152f CANADIAN SYLLABICS YWE -// 1530 CANADIAN SYLLABICS WEST-CREE YWE -// 1531 CANADIAN SYLLABICS YWI -// 1532 CANADIAN SYLLABICS WEST-CREE YWI -// 1533 CANADIAN SYLLABICS YWII -// 1534 CANADIAN SYLLABICS WEST-CREE YWII -// 1535 CANADIAN SYLLABICS YWO -// 1536 CANADIAN SYLLABICS WEST-CREE YWO -// 1537 CANADIAN SYLLABICS YWOO -// 1538 CANADIAN SYLLABICS WEST-CREE YWOO -// 1539 CANADIAN SYLLABICS YWA -// 153a CANADIAN SYLLABICS WEST-CREE YWA -// 153b CANADIAN SYLLABICS YWAA -// 153c CANADIAN SYLLABICS WEST-CREE YWAA -// 153d CANADIAN SYLLABICS NASKAPI YWAA -// 153e CANADIAN SYLLABICS Y -// 153f CANADIAN SYLLABICS BIBLE-CREE Y -// 1540 CANADIAN SYLLABICS WEST-CREE Y -// 1541 CANADIAN SYLLABICS SAYISI YI -// 1542 CANADIAN SYLLABICS RE -// 1543 CANADIAN SYLLABICS R-CREE RE -// 1544 CANADIAN SYLLABICS WEST-CREE LE -// 1545 CANADIAN SYLLABICS RAAI -// 1546 CANADIAN SYLLABICS RI -// 1547 CANADIAN SYLLABICS RII -// 1548 CANADIAN SYLLABICS RO -// 1549 CANADIAN SYLLABICS ROO -// 154a CANADIAN SYLLABICS WEST-CREE LO -// 154b CANADIAN SYLLABICS RA -// 154c CANADIAN SYLLABICS RAA -// 154d CANADIAN SYLLABICS WEST-CREE LA -// 154e CANADIAN SYLLABICS RWAA -// 154f CANADIAN SYLLABICS WEST-CREE RWAA -// 1550 CANADIAN SYLLABICS R -// 1551 CANADIAN SYLLABICS WEST-CREE R -// 1552 CANADIAN SYLLABICS MEDIAL R -// 1553 CANADIAN SYLLABICS FE -// 1554 CANADIAN SYLLABICS FAAI -// 1555 CANADIAN SYLLABICS FI -// 1556 CANADIAN SYLLABICS FII -// 1557 CANADIAN SYLLABICS FO -// 1558 CANADIAN SYLLABICS FOO -// 1559 CANADIAN SYLLABICS FA -// 155a CANADIAN SYLLABICS FAA -// 155b CANADIAN SYLLABICS FWAA -// 155c CANADIAN SYLLABICS WEST-CREE FWAA -// 155d CANADIAN SYLLABICS F -// 155e CANADIAN SYLLABICS THE -// 155f CANADIAN SYLLABICS N-CREE THE -// 1560 CANADIAN SYLLABICS THI -// 1561 CANADIAN SYLLABICS N-CREE THI -// 1562 CANADIAN SYLLABICS THII -// 1563 CANADIAN SYLLABICS N-CREE THII -// 1564 CANADIAN SYLLABICS THO -// 1565 CANADIAN SYLLABICS THOO -// 1566 CANADIAN SYLLABICS THA -// 1567 CANADIAN SYLLABICS THAA -// 1568 CANADIAN SYLLABICS THWAA -// 1569 CANADIAN SYLLABICS WEST-CREE THWAA -// 156a CANADIAN SYLLABICS TH -// 156b CANADIAN SYLLABICS TTHE -// 156c CANADIAN SYLLABICS TTHI -// 156d CANADIAN SYLLABICS TTHO -// 156e CANADIAN SYLLABICS TTHA -// 156f CANADIAN SYLLABICS TTH -// 1570 CANADIAN SYLLABICS TYE -// 1571 CANADIAN SYLLABICS TYI -// 1572 CANADIAN SYLLABICS TYO -// 1573 CANADIAN SYLLABICS TYA -// 1574 CANADIAN SYLLABICS NUNAVIK HE -// 1575 CANADIAN SYLLABICS NUNAVIK HI -// 1576 CANADIAN SYLLABICS NUNAVIK HII -// 1577 CANADIAN SYLLABICS NUNAVIK HO -// 1578 CANADIAN SYLLABICS NUNAVIK HOO -// 1579 CANADIAN SYLLABICS NUNAVIK HA -// 157a CANADIAN SYLLABICS NUNAVIK HAA -// 157b CANADIAN SYLLABICS NUNAVIK H -// 157c CANADIAN SYLLABICS NUNAVUT H -// 157d CANADIAN SYLLABICS HK -// 157e CANADIAN SYLLABICS QAAI -// 157f CANADIAN SYLLABICS QI -// 1580 CANADIAN SYLLABICS QII -// 1581 CANADIAN SYLLABICS QO -// 1582 CANADIAN SYLLABICS QOO -// 1583 CANADIAN SYLLABICS QA -// 1584 CANADIAN SYLLABICS QAA -// 1585 CANADIAN SYLLABICS Q -// 1586 CANADIAN SYLLABICS TLHE -// 1587 CANADIAN SYLLABICS TLHI -// 1588 CANADIAN SYLLABICS TLHO -// 1589 CANADIAN SYLLABICS TLHA -// 158a CANADIAN SYLLABICS WEST-CREE RE -// 158b CANADIAN SYLLABICS WEST-CREE RI -// 158c CANADIAN SYLLABICS WEST-CREE RO -// 158d CANADIAN SYLLABICS WEST-CREE RA -// 158e CANADIAN SYLLABICS NGAAI -// 158f CANADIAN SYLLABICS NGI -// 1590 CANADIAN SYLLABICS NGII -// 1591 CANADIAN SYLLABICS NGO -// 1592 CANADIAN SYLLABICS NGOO -// 1593 CANADIAN SYLLABICS NGA -// 1594 CANADIAN SYLLABICS NGAA -// 1595 CANADIAN SYLLABICS NG -// 1596 CANADIAN SYLLABICS NNG -// 1597 CANADIAN SYLLABICS SAYISI SHE -// 1598 CANADIAN SYLLABICS SAYISI SHI -// 1599 CANADIAN SYLLABICS SAYISI SHO -// 159a CANADIAN SYLLABICS SAYISI SHA -// 159b CANADIAN SYLLABICS WOODS-CREE THE -// 159c CANADIAN SYLLABICS WOODS-CREE THI -// 159d CANADIAN SYLLABICS WOODS-CREE THO -// 159e CANADIAN SYLLABICS WOODS-CREE THA -// 159f CANADIAN SYLLABICS WOODS-CREE TH -// 15a0 CANADIAN SYLLABICS LHI -// 15a1 CANADIAN SYLLABICS LHII -// 15a2 CANADIAN SYLLABICS LHO -// 15a3 CANADIAN SYLLABICS LHOO -// 15a4 CANADIAN SYLLABICS LHA -// 15a5 CANADIAN SYLLABICS LHAA -// 15a6 CANADIAN SYLLABICS LH -// 15a7 CANADIAN SYLLABICS TH-CREE THE -// 15a8 CANADIAN SYLLABICS TH-CREE THI -// 15a9 CANADIAN SYLLABICS TH-CREE THII -// 15aa CANADIAN SYLLABICS TH-CREE THO -// 15ab CANADIAN SYLLABICS TH-CREE THOO -// 15ac CANADIAN SYLLABICS TH-CREE THA -// 15ad CANADIAN SYLLABICS TH-CREE THAA -// 15ae CANADIAN SYLLABICS TH-CREE TH -// 15af CANADIAN SYLLABICS AIVILIK B -// 15b0 CANADIAN SYLLABICS BLACKFOOT E -// 15b1 CANADIAN SYLLABICS BLACKFOOT I -// 15b2 CANADIAN SYLLABICS BLACKFOOT O -// 15b3 CANADIAN SYLLABICS BLACKFOOT A -// 15b4 CANADIAN SYLLABICS BLACKFOOT WE -// 15b5 CANADIAN SYLLABICS BLACKFOOT WI -// 15b6 CANADIAN SYLLABICS BLACKFOOT WO -// 15b7 CANADIAN SYLLABICS BLACKFOOT WA -// 15b8 CANADIAN SYLLABICS BLACKFOOT NE -// 15b9 CANADIAN SYLLABICS BLACKFOOT NI -// 15ba CANADIAN SYLLABICS BLACKFOOT NO -// 15bb CANADIAN SYLLABICS BLACKFOOT NA -// 15bc CANADIAN SYLLABICS BLACKFOOT KE -// 15bd CANADIAN SYLLABICS BLACKFOOT KI -// 15be CANADIAN SYLLABICS BLACKFOOT KO -// 15bf CANADIAN SYLLABICS BLACKFOOT KA -// 15c0 CANADIAN SYLLABICS SAYISI HE -// 15c1 CANADIAN SYLLABICS SAYISI HI -// 15c2 CANADIAN SYLLABICS SAYISI HO -// 15c3 CANADIAN SYLLABICS SAYISI HA -// 15c4 CANADIAN SYLLABICS CARRIER GHU -// 15c5 CANADIAN SYLLABICS CARRIER GHO -// 15c6 CANADIAN SYLLABICS CARRIER GHE -// 15c7 CANADIAN SYLLABICS CARRIER GHEE -// 15c8 CANADIAN SYLLABICS CARRIER GHI -// 15c9 CANADIAN SYLLABICS CARRIER GHA -// 15ca CANADIAN SYLLABICS CARRIER RU -// 15cb CANADIAN SYLLABICS CARRIER RO -// 15cc CANADIAN SYLLABICS CARRIER RE -// 15cd CANADIAN SYLLABICS CARRIER REE -// 15ce CANADIAN SYLLABICS CARRIER RI -// 15cf CANADIAN SYLLABICS CARRIER RA -// 15d0 CANADIAN SYLLABICS CARRIER WU -// 15d1 CANADIAN SYLLABICS CARRIER WO -// 15d2 CANADIAN SYLLABICS CARRIER WE -// 15d3 CANADIAN SYLLABICS CARRIER WEE -// 15d4 CANADIAN SYLLABICS CARRIER WI -// 15d5 CANADIAN SYLLABICS CARRIER WA -// 15d6 CANADIAN SYLLABICS CARRIER HWU -// 15d7 CANADIAN SYLLABICS CARRIER HWO -// 15d8 CANADIAN SYLLABICS CARRIER HWE -// 15d9 CANADIAN SYLLABICS CARRIER HWEE -// 15da CANADIAN SYLLABICS CARRIER HWI -// 15db CANADIAN SYLLABICS CARRIER HWA -// 15dc CANADIAN SYLLABICS CARRIER THU -// 15dd CANADIAN SYLLABICS CARRIER THO -// 15de CANADIAN SYLLABICS CARRIER THE -// 15df CANADIAN SYLLABICS CARRIER THEE -// 15e0 CANADIAN SYLLABICS CARRIER THI -// 15e1 CANADIAN SYLLABICS CARRIER THA -// 15e2 CANADIAN SYLLABICS CARRIER TTU -// 15e3 CANADIAN SYLLABICS CARRIER TTO -// 15e4 CANADIAN SYLLABICS CARRIER TTE -// 15e5 CANADIAN SYLLABICS CARRIER TTEE -// 15e6 CANADIAN SYLLABICS CARRIER TTI -// 15e7 CANADIAN SYLLABICS CARRIER TTA -// 15e8 CANADIAN SYLLABICS CARRIER PU -// 15e9 CANADIAN SYLLABICS CARRIER PO -// 15ea CANADIAN SYLLABICS CARRIER PE -// 15eb CANADIAN SYLLABICS CARRIER PEE -// 15ec CANADIAN SYLLABICS CARRIER PI -// 15ed CANADIAN SYLLABICS CARRIER PA -// 15ee CANADIAN SYLLABICS CARRIER P -// 15ef CANADIAN SYLLABICS CARRIER GU -// 15f0 CANADIAN SYLLABICS CARRIER GO -// 15f1 CANADIAN SYLLABICS CARRIER GE -// 15f2 CANADIAN SYLLABICS CARRIER GEE -// 15f3 CANADIAN SYLLABICS CARRIER GI -// 15f4 CANADIAN SYLLABICS CARRIER GA -// 15f5 CANADIAN SYLLABICS CARRIER KHU -// 15f6 CANADIAN SYLLABICS CARRIER KHO -// 15f7 CANADIAN SYLLABICS CARRIER KHE -// 15f8 CANADIAN SYLLABICS CARRIER KHEE -// 15f9 CANADIAN SYLLABICS CARRIER KHI -// 15fa CANADIAN SYLLABICS CARRIER KHA -// 15fb CANADIAN SYLLABICS CARRIER KKU -// 15fc CANADIAN SYLLABICS CARRIER KKO -// 15fd CANADIAN SYLLABICS CARRIER KKE -// 15fe CANADIAN SYLLABICS CARRIER KKEE -// 15ff CANADIAN SYLLABICS CARRIER KKI -// 1600 CANADIAN SYLLABICS CARRIER KKA -// 1601 CANADIAN SYLLABICS CARRIER KK -// 1602 CANADIAN SYLLABICS CARRIER NU -// 1603 CANADIAN SYLLABICS CARRIER NO -// 1604 CANADIAN SYLLABICS CARRIER NE -// 1605 CANADIAN SYLLABICS CARRIER NEE -// 1606 CANADIAN SYLLABICS CARRIER NI -// 1607 CANADIAN SYLLABICS CARRIER NA -// 1608 CANADIAN SYLLABICS CARRIER MU -// 1609 CANADIAN SYLLABICS CARRIER MO -// 160a CANADIAN SYLLABICS CARRIER ME -// 160b CANADIAN SYLLABICS CARRIER MEE -// 160c CANADIAN SYLLABICS CARRIER MI -// 160d CANADIAN SYLLABICS CARRIER MA -// 160e CANADIAN SYLLABICS CARRIER YU -// 160f CANADIAN SYLLABICS CARRIER YO -// 1610 CANADIAN SYLLABICS CARRIER YE -// 1611 CANADIAN SYLLABICS CARRIER YEE -// 1612 CANADIAN SYLLABICS CARRIER YI -// 1613 CANADIAN SYLLABICS CARRIER YA -// 1614 CANADIAN SYLLABICS CARRIER JU -// 1615 CANADIAN SYLLABICS SAYISI JU -// 1616 CANADIAN SYLLABICS CARRIER JO -// 1617 CANADIAN SYLLABICS CARRIER JE -// 1618 CANADIAN SYLLABICS CARRIER JEE -// 1619 CANADIAN SYLLABICS CARRIER JI -// 161a CANADIAN SYLLABICS SAYISI JI -// 161b CANADIAN SYLLABICS CARRIER JA -// 161c CANADIAN SYLLABICS CARRIER JJU -// 161d CANADIAN SYLLABICS CARRIER JJO -// 161e CANADIAN SYLLABICS CARRIER JJE -// 161f CANADIAN SYLLABICS CARRIER JJEE -// 1620 CANADIAN SYLLABICS CARRIER JJI -// 1621 CANADIAN SYLLABICS CARRIER JJA -// 1622 CANADIAN SYLLABICS CARRIER LU -// 1623 CANADIAN SYLLABICS CARRIER LO -// 1624 CANADIAN SYLLABICS CARRIER LE -// 1625 CANADIAN SYLLABICS CARRIER LEE -// 1626 CANADIAN SYLLABICS CARRIER LI -// 1627 CANADIAN SYLLABICS CARRIER LA -// 1628 CANADIAN SYLLABICS CARRIER DLU -// 1629 CANADIAN SYLLABICS CARRIER DLO -// 162a CANADIAN SYLLABICS CARRIER DLE -// 162b CANADIAN SYLLABICS CARRIER DLEE -// 162c CANADIAN SYLLABICS CARRIER DLI -// 162d CANADIAN SYLLABICS CARRIER DLA -// 162e CANADIAN SYLLABICS CARRIER LHU -// 162f CANADIAN SYLLABICS CARRIER LHO -// 1630 CANADIAN SYLLABICS CARRIER LHE -// 1631 CANADIAN SYLLABICS CARRIER LHEE -// 1632 CANADIAN SYLLABICS CARRIER LHI -// 1633 CANADIAN SYLLABICS CARRIER LHA -// 1634 CANADIAN SYLLABICS CARRIER TLHU -// 1635 CANADIAN SYLLABICS CARRIER TLHO -// 1636 CANADIAN SYLLABICS CARRIER TLHE -// 1637 CANADIAN SYLLABICS CARRIER TLHEE -// 1638 CANADIAN SYLLABICS CARRIER TLHI -// 1639 CANADIAN SYLLABICS CARRIER TLHA -// 163a CANADIAN SYLLABICS CARRIER TLU -// 163b CANADIAN SYLLABICS CARRIER TLO -// 163c CANADIAN SYLLABICS CARRIER TLE -// 163d CANADIAN SYLLABICS CARRIER TLEE -// 163e CANADIAN SYLLABICS CARRIER TLI -// 163f CANADIAN SYLLABICS CARRIER TLA -// 1640 CANADIAN SYLLABICS CARRIER ZU -// 1641 CANADIAN SYLLABICS CARRIER ZO -// 1642 CANADIAN SYLLABICS CARRIER ZE -// 1643 CANADIAN SYLLABICS CARRIER ZEE -// 1644 CANADIAN SYLLABICS CARRIER ZI -// 1645 CANADIAN SYLLABICS CARRIER ZA -// 1646 CANADIAN SYLLABICS CARRIER Z -// 1647 CANADIAN SYLLABICS CARRIER INITIAL Z -// 1648 CANADIAN SYLLABICS CARRIER DZU -// 1649 CANADIAN SYLLABICS CARRIER DZO -// 164a CANADIAN SYLLABICS CARRIER DZE -// 164b CANADIAN SYLLABICS CARRIER DZEE -// 164c CANADIAN SYLLABICS CARRIER DZI -// 164d CANADIAN SYLLABICS CARRIER DZA -// 164e CANADIAN SYLLABICS CARRIER SU -// 164f CANADIAN SYLLABICS CARRIER SO -// 1650 CANADIAN SYLLABICS CARRIER SE -// 1651 CANADIAN SYLLABICS CARRIER SEE -// 1652 CANADIAN SYLLABICS CARRIER SI -// 1653 CANADIAN SYLLABICS CARRIER SA -// 1654 CANADIAN SYLLABICS CARRIER SHU -// 1655 CANADIAN SYLLABICS CARRIER SHO -// 1656 CANADIAN SYLLABICS CARRIER SHE -// 1657 CANADIAN SYLLABICS CARRIER SHEE -// 1658 CANADIAN SYLLABICS CARRIER SHI -// 1659 CANADIAN SYLLABICS CARRIER SHA -// 165a CANADIAN SYLLABICS CARRIER SH -// 165b CANADIAN SYLLABICS CARRIER TSU -// 165c CANADIAN SYLLABICS CARRIER TSO -// 165d CANADIAN SYLLABICS CARRIER TSE -// 165e CANADIAN SYLLABICS CARRIER TSEE -// 165f CANADIAN SYLLABICS CARRIER TSI -// 1660 CANADIAN SYLLABICS CARRIER TSA -// 1661 CANADIAN SYLLABICS CARRIER CHU -// 1662 CANADIAN SYLLABICS CARRIER CHO -// 1663 CANADIAN SYLLABICS CARRIER CHE -// 1664 CANADIAN SYLLABICS CARRIER CHEE -// 1665 CANADIAN SYLLABICS CARRIER CHI -// 1666 CANADIAN SYLLABICS CARRIER CHA -// 1667 CANADIAN SYLLABICS CARRIER TTSU -// 1668 CANADIAN SYLLABICS CARRIER TTSO -// 1669 CANADIAN SYLLABICS CARRIER TTSE -// 166a CANADIAN SYLLABICS CARRIER TTSEE -// 166b CANADIAN SYLLABICS CARRIER TTSI -// 166c CANADIAN SYLLABICS CARRIER TTSA - { 0x1401, 0x26C, 0x9, 0, 0 }, -// 166d CANADIAN SYLLABICS CHI SIGN -// 166e CANADIAN SYLLABICS FULL STOP - { 0x166D, 0x2, 0x18, 0, 0 }, -// 166f CANADIAN SYLLABICS QAI -// 1670 CANADIAN SYLLABICS NGAI -// 1671 CANADIAN SYLLABICS NNGI -// 1672 CANADIAN SYLLABICS NNGII -// 1673 CANADIAN SYLLABICS NNGO -// 1674 CANADIAN SYLLABICS NNGOO -// 1675 CANADIAN SYLLABICS NNGA -// 1676 CANADIAN SYLLABICS NNGAA -// 1677 CANADIAN SYLLABICS WOODS-CREE THWEE -// 1678 CANADIAN SYLLABICS WOODS-CREE THWI -// 1679 CANADIAN SYLLABICS WOODS-CREE THWII -// 167a CANADIAN SYLLABICS WOODS-CREE THWO -// 167b CANADIAN SYLLABICS WOODS-CREE THWOO -// 167c CANADIAN SYLLABICS WOODS-CREE THWA -// 167d CANADIAN SYLLABICS WOODS-CREE THWAA -// 167e CANADIAN SYLLABICS WOODS-CREE FINAL TH -// 167f CANADIAN SYLLABICS BLACKFOOT W - { 0x166F, 0x11, 0x9, 0, 0 }, -// 1680 OGHAM SPACE MARK - { 0x1680, 0x1, 0x20, 0, 0 }, -// 1681 OGHAM LETTER BEITH -// 1682 OGHAM LETTER LUIS -// 1683 OGHAM LETTER FEARN -// 1684 OGHAM LETTER SAIL -// 1685 OGHAM LETTER NION -// 1686 OGHAM LETTER UATH -// 1687 OGHAM LETTER DAIR -// 1688 OGHAM LETTER TINNE -// 1689 OGHAM LETTER COLL -// 168a OGHAM LETTER CEIRT -// 168b OGHAM LETTER MUIN -// 168c OGHAM LETTER GORT -// 168d OGHAM LETTER NGEADAL -// 168e OGHAM LETTER STRAIF -// 168f OGHAM LETTER RUIS -// 1690 OGHAM LETTER AILM -// 1691 OGHAM LETTER ONN -// 1692 OGHAM LETTER UR -// 1693 OGHAM LETTER EADHADH -// 1694 OGHAM LETTER IODHADH -// 1695 OGHAM LETTER EABHADH -// 1696 OGHAM LETTER OR -// 1697 OGHAM LETTER UILLEANN -// 1698 OGHAM LETTER IFIN -// 1699 OGHAM LETTER EAMHANCHOLL -// 169a OGHAM LETTER PEITH - { 0x1681, 0x1A, 0x9, 0, 0 }, -// 169b OGHAM FEATHER MARK -// 169c OGHAM REVERSED FEATHER MARK - { 0x169B, 0x2, 0x18, 0, 0 }, -// 16a0 RUNIC LETTER FEHU FEOH FE F -// 16a1 RUNIC LETTER V -// 16a2 RUNIC LETTER URUZ UR U -// 16a3 RUNIC LETTER YR -// 16a4 RUNIC LETTER Y -// 16a5 RUNIC LETTER W -// 16a6 RUNIC LETTER THURISAZ THURS THORN -// 16a7 RUNIC LETTER ETH -// 16a8 RUNIC LETTER ANSUZ A -// 16a9 RUNIC LETTER OS O -// 16aa RUNIC LETTER AC A -// 16ab RUNIC LETTER AESC -// 16ac RUNIC LETTER LONG-BRANCH-OSS O -// 16ad RUNIC LETTER SHORT-TWIG-OSS O -// 16ae RUNIC LETTER O -// 16af RUNIC LETTER OE -// 16b0 RUNIC LETTER ON -// 16b1 RUNIC LETTER RAIDO RAD REID R -// 16b2 RUNIC LETTER KAUNA -// 16b3 RUNIC LETTER CEN -// 16b4 RUNIC LETTER KAUN K -// 16b5 RUNIC LETTER G -// 16b6 RUNIC LETTER ENG -// 16b7 RUNIC LETTER GEBO GYFU G -// 16b8 RUNIC LETTER GAR -// 16b9 RUNIC LETTER WUNJO WYNN W -// 16ba RUNIC LETTER HAGLAZ H -// 16bb RUNIC LETTER HAEGL H -// 16bc RUNIC LETTER LONG-BRANCH-HAGALL H -// 16bd RUNIC LETTER SHORT-TWIG-HAGALL H -// 16be RUNIC LETTER NAUDIZ NYD NAUD N -// 16bf RUNIC LETTER SHORT-TWIG-NAUD N -// 16c0 RUNIC LETTER DOTTED-N -// 16c1 RUNIC LETTER ISAZ IS ISS I -// 16c2 RUNIC LETTER E -// 16c3 RUNIC LETTER JERAN J -// 16c4 RUNIC LETTER GER -// 16c5 RUNIC LETTER LONG-BRANCH-AR AE -// 16c6 RUNIC LETTER SHORT-TWIG-AR A -// 16c7 RUNIC LETTER IWAZ EOH -// 16c8 RUNIC LETTER PERTHO PEORTH P -// 16c9 RUNIC LETTER ALGIZ EOLHX -// 16ca RUNIC LETTER SOWILO S -// 16cb RUNIC LETTER SIGEL LONG-BRANCH-SOL S -// 16cc RUNIC LETTER SHORT-TWIG-SOL S -// 16cd RUNIC LETTER C -// 16ce RUNIC LETTER Z -// 16cf RUNIC LETTER TIWAZ TIR TYR T -// 16d0 RUNIC LETTER SHORT-TWIG-TYR T -// 16d1 RUNIC LETTER D -// 16d2 RUNIC LETTER BERKANAN BEORC BJARKAN B -// 16d3 RUNIC LETTER SHORT-TWIG-BJARKAN B -// 16d4 RUNIC LETTER DOTTED-P -// 16d5 RUNIC LETTER OPEN-P -// 16d6 RUNIC LETTER EHWAZ EH E -// 16d7 RUNIC LETTER MANNAZ MAN M -// 16d8 RUNIC LETTER LONG-BRANCH-MADR M -// 16d9 RUNIC LETTER SHORT-TWIG-MADR M -// 16da RUNIC LETTER LAUKAZ LAGU LOGR L -// 16db RUNIC LETTER DOTTED-L -// 16dc RUNIC LETTER INGWAZ -// 16dd RUNIC LETTER ING -// 16de RUNIC LETTER DAGAZ DAEG D -// 16df RUNIC LETTER OTHALAN ETHEL O -// 16e0 RUNIC LETTER EAR -// 16e1 RUNIC LETTER IOR -// 16e2 RUNIC LETTER CWEORTH -// 16e3 RUNIC LETTER CALC -// 16e4 RUNIC LETTER CEALC -// 16e5 RUNIC LETTER STAN -// 16e6 RUNIC LETTER LONG-BRANCH-YR -// 16e7 RUNIC LETTER SHORT-TWIG-YR -// 16e8 RUNIC LETTER ICELANDIC-YR -// 16e9 RUNIC LETTER Q -// 16ea RUNIC LETTER X - { 0x16A0, 0x4B, 0x9, 0, 0 }, -// 16eb RUNIC SINGLE PUNCTUATION -// 16ec RUNIC MULTIPLE PUNCTUATION -// 16ed RUNIC CROSS PUNCTUATION - { 0x16EB, 0x3, 0x18, 0, 0 }, -// 16ee RUNIC ARLAUG SYMBOL -// 16ef RUNIC TVIMADUR SYMBOL -// 16f0 RUNIC BELGTHOR SYMBOL - { 0x16EE, 0x3, 0x8, 0, 0 }, -// 16f1 RUNIC LETTER K -// 16f2 RUNIC LETTER SH -// 16f3 RUNIC LETTER OO -// 16f4 RUNIC LETTER FRANKS CASKET OS -// 16f5 RUNIC LETTER FRANKS CASKET IS -// 16f6 RUNIC LETTER FRANKS CASKET EH -// 16f7 RUNIC LETTER FRANKS CASKET AC -// 16f8 RUNIC LETTER FRANKS CASKET AESC - { 0x16F1, 0x8, 0x9, 0, 0 }, -// 1700 TAGALOG LETTER A -// 1701 TAGALOG LETTER I -// 1702 TAGALOG LETTER U -// 1703 TAGALOG LETTER KA -// 1704 TAGALOG LETTER GA -// 1705 TAGALOG LETTER NGA -// 1706 TAGALOG LETTER TA -// 1707 TAGALOG LETTER DA -// 1708 TAGALOG LETTER NA -// 1709 TAGALOG LETTER PA -// 170a TAGALOG LETTER BA -// 170b TAGALOG LETTER MA -// 170c TAGALOG LETTER YA - { 0x1700, 0xD, 0x9, 0, 0 }, -// 170e TAGALOG LETTER LA -// 170f TAGALOG LETTER WA -// 1710 TAGALOG LETTER SA -// 1711 TAGALOG LETTER HA - { 0x170E, 0x4, 0x9, 0, 0 }, -// 1712 TAGALOG VOWEL SIGN I -// 1713 TAGALOG VOWEL SIGN U -// 1714 TAGALOG SIGN VIRAMA - { 0x1712, 0x3, 0x0, 0, 0 }, -// 1720 HANUNOO LETTER A -// 1721 HANUNOO LETTER I -// 1722 HANUNOO LETTER U -// 1723 HANUNOO LETTER KA -// 1724 HANUNOO LETTER GA -// 1725 HANUNOO LETTER NGA -// 1726 HANUNOO LETTER TA -// 1727 HANUNOO LETTER DA -// 1728 HANUNOO LETTER NA -// 1729 HANUNOO LETTER PA -// 172a HANUNOO LETTER BA -// 172b HANUNOO LETTER MA -// 172c HANUNOO LETTER YA -// 172d HANUNOO LETTER RA -// 172e HANUNOO LETTER LA -// 172f HANUNOO LETTER WA -// 1730 HANUNOO LETTER SA -// 1731 HANUNOO LETTER HA - { 0x1720, 0x12, 0x9, 0, 0 }, -// 1732 HANUNOO VOWEL SIGN I -// 1733 HANUNOO VOWEL SIGN U -// 1734 HANUNOO SIGN PAMUDPOD - { 0x1732, 0x3, 0x0, 0, 0 }, -// 1735 PHILIPPINE SINGLE PUNCTUATION -// 1736 PHILIPPINE DOUBLE PUNCTUATION - { 0x1735, 0x2, 0x18, 0, 0 }, -// 1740 BUHID LETTER A -// 1741 BUHID LETTER I -// 1742 BUHID LETTER U -// 1743 BUHID LETTER KA -// 1744 BUHID LETTER GA -// 1745 BUHID LETTER NGA -// 1746 BUHID LETTER TA -// 1747 BUHID LETTER DA -// 1748 BUHID LETTER NA -// 1749 BUHID LETTER PA -// 174a BUHID LETTER BA -// 174b BUHID LETTER MA -// 174c BUHID LETTER YA -// 174d BUHID LETTER RA -// 174e BUHID LETTER LA -// 174f BUHID LETTER WA -// 1750 BUHID LETTER SA -// 1751 BUHID LETTER HA - { 0x1740, 0x12, 0x9, 0, 0 }, -// 1752 BUHID VOWEL SIGN I -// 1753 BUHID VOWEL SIGN U - { 0x1752, 0x2, 0x0, 0, 0 }, -// 1760 TAGBANWA LETTER A -// 1761 TAGBANWA LETTER I -// 1762 TAGBANWA LETTER U -// 1763 TAGBANWA LETTER KA -// 1764 TAGBANWA LETTER GA -// 1765 TAGBANWA LETTER NGA -// 1766 TAGBANWA LETTER TA -// 1767 TAGBANWA LETTER DA -// 1768 TAGBANWA LETTER NA -// 1769 TAGBANWA LETTER PA -// 176a TAGBANWA LETTER BA -// 176b TAGBANWA LETTER MA -// 176c TAGBANWA LETTER YA - { 0x1760, 0xD, 0x9, 0, 0 }, -// 176e TAGBANWA LETTER LA -// 176f TAGBANWA LETTER WA -// 1770 TAGBANWA LETTER SA - { 0x176E, 0x3, 0x9, 0, 0 }, -// 1772 TAGBANWA VOWEL SIGN I -// 1773 TAGBANWA VOWEL SIGN U - { 0x1772, 0x2, 0x0, 0, 0 }, -// 1780 KHMER LETTER KA -// 1781 KHMER LETTER KHA -// 1782 KHMER LETTER KO -// 1783 KHMER LETTER KHO -// 1784 KHMER LETTER NGO -// 1785 KHMER LETTER CA -// 1786 KHMER LETTER CHA -// 1787 KHMER LETTER CO -// 1788 KHMER LETTER CHO -// 1789 KHMER LETTER NYO -// 178a KHMER LETTER DA -// 178b KHMER LETTER TTHA -// 178c KHMER LETTER DO -// 178d KHMER LETTER TTHO -// 178e KHMER LETTER NNO -// 178f KHMER LETTER TA -// 1790 KHMER LETTER THA -// 1791 KHMER LETTER TO -// 1792 KHMER LETTER THO -// 1793 KHMER LETTER NO -// 1794 KHMER LETTER BA -// 1795 KHMER LETTER PHA -// 1796 KHMER LETTER PO -// 1797 KHMER LETTER PHO -// 1798 KHMER LETTER MO -// 1799 KHMER LETTER YO -// 179a KHMER LETTER RO -// 179b KHMER LETTER LO -// 179c KHMER LETTER VO -// 179d KHMER LETTER SHA -// 179e KHMER LETTER SSO -// 179f KHMER LETTER SA -// 17a0 KHMER LETTER HA -// 17a1 KHMER LETTER LA -// 17a2 KHMER LETTER QA -// 17a3 KHMER INDEPENDENT VOWEL QAQ -// 17a4 KHMER INDEPENDENT VOWEL QAA -// 17a5 KHMER INDEPENDENT VOWEL QI -// 17a6 KHMER INDEPENDENT VOWEL QII -// 17a7 KHMER INDEPENDENT VOWEL QU -// 17a8 KHMER INDEPENDENT VOWEL QUK -// 17a9 KHMER INDEPENDENT VOWEL QUU -// 17aa KHMER INDEPENDENT VOWEL QUUV -// 17ab KHMER INDEPENDENT VOWEL RY -// 17ac KHMER INDEPENDENT VOWEL RYY -// 17ad KHMER INDEPENDENT VOWEL LY -// 17ae KHMER INDEPENDENT VOWEL LYY -// 17af KHMER INDEPENDENT VOWEL QE -// 17b0 KHMER INDEPENDENT VOWEL QAI -// 17b1 KHMER INDEPENDENT VOWEL QOO TYPE ONE -// 17b2 KHMER INDEPENDENT VOWEL QOO TYPE TWO -// 17b3 KHMER INDEPENDENT VOWEL QAU - { 0x1780, 0x34, 0x9, 0, 0 }, -// 17b4 KHMER VOWEL INHERENT AQ -// 17b5 KHMER VOWEL INHERENT AA -// 17b6 KHMER VOWEL SIGN AA -// 17b7 KHMER VOWEL SIGN I -// 17b8 KHMER VOWEL SIGN II -// 17b9 KHMER VOWEL SIGN Y -// 17ba KHMER VOWEL SIGN YY -// 17bb KHMER VOWEL SIGN U -// 17bc KHMER VOWEL SIGN UU -// 17bd KHMER VOWEL SIGN UA -// 17be KHMER VOWEL SIGN OE -// 17bf KHMER VOWEL SIGN YA -// 17c0 KHMER VOWEL SIGN IE -// 17c1 KHMER VOWEL SIGN E -// 17c2 KHMER VOWEL SIGN AE -// 17c3 KHMER VOWEL SIGN AI -// 17c4 KHMER VOWEL SIGN OO -// 17c5 KHMER VOWEL SIGN AU -// 17c6 KHMER SIGN NIKAHIT -// 17c7 KHMER SIGN REAHMUK -// 17c8 KHMER SIGN YUUKALEAPINTU -// 17c9 KHMER SIGN MUUSIKATOAN -// 17ca KHMER SIGN TRIISAP -// 17cb KHMER SIGN BANTOC -// 17cc KHMER SIGN ROBAT -// 17cd KHMER SIGN TOANDAKHIAT -// 17ce KHMER SIGN KAKABAT -// 17cf KHMER SIGN AHSDA -// 17d0 KHMER SIGN SAMYOK SANNYA -// 17d1 KHMER SIGN VIRIAM -// 17d2 KHMER SIGN COENG -// 17d3 KHMER SIGN BATHAMASAT - { 0x17B4, 0x20, 0x0, 0, 0 }, -// 17d4 KHMER SIGN KHAN -// 17d5 KHMER SIGN BARIYOOSAN -// 17d6 KHMER SIGN CAMNUC PII KUUH - { 0x17D4, 0x3, 0x18, 0, 0 }, -// 17d7 KHMER SIGN LEK TOO - { 0x17D7, 0x1, 0x9, 0, 0 }, -// 17d8 KHMER SIGN BEYYAL -// 17d9 KHMER SIGN PHNAEK MUAN -// 17da KHMER SIGN KOOMUUT - { 0x17D8, 0x3, 0x18, 0, 0 }, -// 17db KHMER CURRENCY SYMBOL RIEL - { 0x17DB, 0x1, 0x8, 0, 0 }, -// 17dc KHMER SIGN AVAKRAHASANYA - { 0x17DC, 0x1, 0x9, 0, 0 }, -// 17dd KHMER SIGN ATTHACAN - { 0x17DD, 0x1, 0x0, 0, 0 }, -// 17e0 KHMER DIGIT ZERO -// 17e1 KHMER DIGIT ONE -// 17e2 KHMER DIGIT TWO -// 17e3 KHMER DIGIT THREE -// 17e4 KHMER DIGIT FOUR -// 17e5 KHMER DIGIT FIVE -// 17e6 KHMER DIGIT SIX -// 17e7 KHMER DIGIT SEVEN -// 17e8 KHMER DIGIT EIGHT -// 17e9 KHMER DIGIT NINE - { 0x17E0, 0xA, 0x108, 0, 0 }, -// 17f0 KHMER SYMBOL LEK ATTAK SON -// 17f1 KHMER SYMBOL LEK ATTAK MUOY -// 17f2 KHMER SYMBOL LEK ATTAK PII -// 17f3 KHMER SYMBOL LEK ATTAK BEI -// 17f4 KHMER SYMBOL LEK ATTAK BUON -// 17f5 KHMER SYMBOL LEK ATTAK PRAM -// 17f6 KHMER SYMBOL LEK ATTAK PRAM-MUOY -// 17f7 KHMER SYMBOL LEK ATTAK PRAM-PII -// 17f8 KHMER SYMBOL LEK ATTAK PRAM-BEI -// 17f9 KHMER SYMBOL LEK ATTAK PRAM-BUON - { 0x17F0, 0xA, 0x8, 0, 0 }, -// 1800 MONGOLIAN BIRGA -// 1801 MONGOLIAN ELLIPSIS -// 1802 MONGOLIAN COMMA -// 1803 MONGOLIAN FULL STOP -// 1804 MONGOLIAN COLON -// 1805 MONGOLIAN FOUR DOTS -// 1806 MONGOLIAN TODO SOFT HYPHEN -// 1807 MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER -// 1808 MONGOLIAN MANCHU COMMA -// 1809 MONGOLIAN MANCHU FULL STOP -// 180a MONGOLIAN NIRUGU - { 0x1800, 0xB, 0x18, 0, 0 }, -// 180b MONGOLIAN FREE VARIATION SELECTOR ONE -// 180c MONGOLIAN FREE VARIATION SELECTOR TWO -// 180d MONGOLIAN FREE VARIATION SELECTOR THREE -// 180e MONGOLIAN VOWEL SEPARATOR - { 0x180B, 0x4, 0x0, 0, 0 }, -// 1810 MONGOLIAN DIGIT ZERO -// 1811 MONGOLIAN DIGIT ONE -// 1812 MONGOLIAN DIGIT TWO -// 1813 MONGOLIAN DIGIT THREE -// 1814 MONGOLIAN DIGIT FOUR -// 1815 MONGOLIAN DIGIT FIVE -// 1816 MONGOLIAN DIGIT SIX -// 1817 MONGOLIAN DIGIT SEVEN -// 1818 MONGOLIAN DIGIT EIGHT -// 1819 MONGOLIAN DIGIT NINE - { 0x1810, 0xA, 0x108, 0, 0 }, -// 1820 MONGOLIAN LETTER A -// 1821 MONGOLIAN LETTER E -// 1822 MONGOLIAN LETTER I -// 1823 MONGOLIAN LETTER O -// 1824 MONGOLIAN LETTER U -// 1825 MONGOLIAN LETTER OE -// 1826 MONGOLIAN LETTER UE -// 1827 MONGOLIAN LETTER EE -// 1828 MONGOLIAN LETTER NA -// 1829 MONGOLIAN LETTER ANG -// 182a MONGOLIAN LETTER BA -// 182b MONGOLIAN LETTER PA -// 182c MONGOLIAN LETTER QA -// 182d MONGOLIAN LETTER GA -// 182e MONGOLIAN LETTER MA -// 182f MONGOLIAN LETTER LA -// 1830 MONGOLIAN LETTER SA -// 1831 MONGOLIAN LETTER SHA -// 1832 MONGOLIAN LETTER TA -// 1833 MONGOLIAN LETTER DA -// 1834 MONGOLIAN LETTER CHA -// 1835 MONGOLIAN LETTER JA -// 1836 MONGOLIAN LETTER YA -// 1837 MONGOLIAN LETTER RA -// 1838 MONGOLIAN LETTER WA -// 1839 MONGOLIAN LETTER FA -// 183a MONGOLIAN LETTER KA -// 183b MONGOLIAN LETTER KHA -// 183c MONGOLIAN LETTER TSA -// 183d MONGOLIAN LETTER ZA -// 183e MONGOLIAN LETTER HAA -// 183f MONGOLIAN LETTER ZRA -// 1840 MONGOLIAN LETTER LHA -// 1841 MONGOLIAN LETTER ZHI -// 1842 MONGOLIAN LETTER CHI -// 1843 MONGOLIAN LETTER TODO LONG VOWEL SIGN -// 1844 MONGOLIAN LETTER TODO E -// 1845 MONGOLIAN LETTER TODO I -// 1846 MONGOLIAN LETTER TODO O -// 1847 MONGOLIAN LETTER TODO U -// 1848 MONGOLIAN LETTER TODO OE -// 1849 MONGOLIAN LETTER TODO UE -// 184a MONGOLIAN LETTER TODO ANG -// 184b MONGOLIAN LETTER TODO BA -// 184c MONGOLIAN LETTER TODO PA -// 184d MONGOLIAN LETTER TODO QA -// 184e MONGOLIAN LETTER TODO GA -// 184f MONGOLIAN LETTER TODO MA -// 1850 MONGOLIAN LETTER TODO TA -// 1851 MONGOLIAN LETTER TODO DA -// 1852 MONGOLIAN LETTER TODO CHA -// 1853 MONGOLIAN LETTER TODO JA -// 1854 MONGOLIAN LETTER TODO TSA -// 1855 MONGOLIAN LETTER TODO YA -// 1856 MONGOLIAN LETTER TODO WA -// 1857 MONGOLIAN LETTER TODO KA -// 1858 MONGOLIAN LETTER TODO GAA -// 1859 MONGOLIAN LETTER TODO HAA -// 185a MONGOLIAN LETTER TODO JIA -// 185b MONGOLIAN LETTER TODO NIA -// 185c MONGOLIAN LETTER TODO DZA -// 185d MONGOLIAN LETTER SIBE E -// 185e MONGOLIAN LETTER SIBE I -// 185f MONGOLIAN LETTER SIBE IY -// 1860 MONGOLIAN LETTER SIBE UE -// 1861 MONGOLIAN LETTER SIBE U -// 1862 MONGOLIAN LETTER SIBE ANG -// 1863 MONGOLIAN LETTER SIBE KA -// 1864 MONGOLIAN LETTER SIBE GA -// 1865 MONGOLIAN LETTER SIBE HA -// 1866 MONGOLIAN LETTER SIBE PA -// 1867 MONGOLIAN LETTER SIBE SHA -// 1868 MONGOLIAN LETTER SIBE TA -// 1869 MONGOLIAN LETTER SIBE DA -// 186a MONGOLIAN LETTER SIBE JA -// 186b MONGOLIAN LETTER SIBE FA -// 186c MONGOLIAN LETTER SIBE GAA -// 186d MONGOLIAN LETTER SIBE HAA -// 186e MONGOLIAN LETTER SIBE TSA -// 186f MONGOLIAN LETTER SIBE ZA -// 1870 MONGOLIAN LETTER SIBE RAA -// 1871 MONGOLIAN LETTER SIBE CHA -// 1872 MONGOLIAN LETTER SIBE ZHA -// 1873 MONGOLIAN LETTER MANCHU I -// 1874 MONGOLIAN LETTER MANCHU KA -// 1875 MONGOLIAN LETTER MANCHU RA -// 1876 MONGOLIAN LETTER MANCHU FA -// 1877 MONGOLIAN LETTER MANCHU ZHA - { 0x1820, 0x58, 0x9, 0, 0 }, -// 1880 MONGOLIAN LETTER ALI GALI ANUSVARA ONE -// 1881 MONGOLIAN LETTER ALI GALI VISARGA ONE -// 1882 MONGOLIAN LETTER ALI GALI DAMARU -// 1883 MONGOLIAN LETTER ALI GALI UBADAMA -// 1884 MONGOLIAN LETTER ALI GALI INVERTED UBADAMA -// 1885 MONGOLIAN LETTER ALI GALI BALUDA -// 1886 MONGOLIAN LETTER ALI GALI THREE BALUDA -// 1887 MONGOLIAN LETTER ALI GALI A -// 1888 MONGOLIAN LETTER ALI GALI I -// 1889 MONGOLIAN LETTER ALI GALI KA -// 188a MONGOLIAN LETTER ALI GALI NGA -// 188b MONGOLIAN LETTER ALI GALI CA -// 188c MONGOLIAN LETTER ALI GALI TTA -// 188d MONGOLIAN LETTER ALI GALI TTHA -// 188e MONGOLIAN LETTER ALI GALI DDA -// 188f MONGOLIAN LETTER ALI GALI NNA -// 1890 MONGOLIAN LETTER ALI GALI TA -// 1891 MONGOLIAN LETTER ALI GALI DA -// 1892 MONGOLIAN LETTER ALI GALI PA -// 1893 MONGOLIAN LETTER ALI GALI PHA -// 1894 MONGOLIAN LETTER ALI GALI SSA -// 1895 MONGOLIAN LETTER ALI GALI ZHA -// 1896 MONGOLIAN LETTER ALI GALI ZA -// 1897 MONGOLIAN LETTER ALI GALI AH -// 1898 MONGOLIAN LETTER TODO ALI GALI TA -// 1899 MONGOLIAN LETTER TODO ALI GALI ZHA -// 189a MONGOLIAN LETTER MANCHU ALI GALI GHA -// 189b MONGOLIAN LETTER MANCHU ALI GALI NGA -// 189c MONGOLIAN LETTER MANCHU ALI GALI CA -// 189d MONGOLIAN LETTER MANCHU ALI GALI JHA -// 189e MONGOLIAN LETTER MANCHU ALI GALI TTA -// 189f MONGOLIAN LETTER MANCHU ALI GALI DDHA -// 18a0 MONGOLIAN LETTER MANCHU ALI GALI TA -// 18a1 MONGOLIAN LETTER MANCHU ALI GALI DHA -// 18a2 MONGOLIAN LETTER MANCHU ALI GALI SSA -// 18a3 MONGOLIAN LETTER MANCHU ALI GALI CYA -// 18a4 MONGOLIAN LETTER MANCHU ALI GALI ZHA -// 18a5 MONGOLIAN LETTER MANCHU ALI GALI ZA -// 18a6 MONGOLIAN LETTER ALI GALI HALF U -// 18a7 MONGOLIAN LETTER ALI GALI HALF YA -// 18a8 MONGOLIAN LETTER MANCHU ALI GALI BHA - { 0x1880, 0x29, 0x9, 0, 0 }, -// 18a9 MONGOLIAN LETTER ALI GALI DAGALGA - { 0x18A9, 0x1, 0x0, 0, 0 }, -// 18aa MONGOLIAN LETTER MANCHU ALI GALI LHA - { 0x18AA, 0x1, 0x9, 0, 0 }, -// 18b0 CANADIAN SYLLABICS OY -// 18b1 CANADIAN SYLLABICS AY -// 18b2 CANADIAN SYLLABICS AAY -// 18b3 CANADIAN SYLLABICS WAY -// 18b4 CANADIAN SYLLABICS POY -// 18b5 CANADIAN SYLLABICS PAY -// 18b6 CANADIAN SYLLABICS PWOY -// 18b7 CANADIAN SYLLABICS TAY -// 18b8 CANADIAN SYLLABICS KAY -// 18b9 CANADIAN SYLLABICS KWAY -// 18ba CANADIAN SYLLABICS MAY -// 18bb CANADIAN SYLLABICS NOY -// 18bc CANADIAN SYLLABICS NAY -// 18bd CANADIAN SYLLABICS LAY -// 18be CANADIAN SYLLABICS SOY -// 18bf CANADIAN SYLLABICS SAY -// 18c0 CANADIAN SYLLABICS SHOY -// 18c1 CANADIAN SYLLABICS SHAY -// 18c2 CANADIAN SYLLABICS SHWOY -// 18c3 CANADIAN SYLLABICS YOY -// 18c4 CANADIAN SYLLABICS YAY -// 18c5 CANADIAN SYLLABICS RAY -// 18c6 CANADIAN SYLLABICS NWI -// 18c7 CANADIAN SYLLABICS OJIBWAY NWI -// 18c8 CANADIAN SYLLABICS NWII -// 18c9 CANADIAN SYLLABICS OJIBWAY NWII -// 18ca CANADIAN SYLLABICS NWO -// 18cb CANADIAN SYLLABICS OJIBWAY NWO -// 18cc CANADIAN SYLLABICS NWOO -// 18cd CANADIAN SYLLABICS OJIBWAY NWOO -// 18ce CANADIAN SYLLABICS RWEE -// 18cf CANADIAN SYLLABICS RWI -// 18d0 CANADIAN SYLLABICS RWII -// 18d1 CANADIAN SYLLABICS RWO -// 18d2 CANADIAN SYLLABICS RWOO -// 18d3 CANADIAN SYLLABICS RWA -// 18d4 CANADIAN SYLLABICS OJIBWAY P -// 18d5 CANADIAN SYLLABICS OJIBWAY T -// 18d6 CANADIAN SYLLABICS OJIBWAY K -// 18d7 CANADIAN SYLLABICS OJIBWAY C -// 18d8 CANADIAN SYLLABICS OJIBWAY M -// 18d9 CANADIAN SYLLABICS OJIBWAY N -// 18da CANADIAN SYLLABICS OJIBWAY S -// 18db CANADIAN SYLLABICS OJIBWAY SH -// 18dc CANADIAN SYLLABICS EASTERN W -// 18dd CANADIAN SYLLABICS WESTERN W -// 18de CANADIAN SYLLABICS FINAL SMALL RING -// 18df CANADIAN SYLLABICS FINAL RAISED DOT -// 18e0 CANADIAN SYLLABICS R-CREE RWE -// 18e1 CANADIAN SYLLABICS WEST-CREE LOO -// 18e2 CANADIAN SYLLABICS WEST-CREE LAA -// 18e3 CANADIAN SYLLABICS THWE -// 18e4 CANADIAN SYLLABICS THWA -// 18e5 CANADIAN SYLLABICS TTHWE -// 18e6 CANADIAN SYLLABICS TTHOO -// 18e7 CANADIAN SYLLABICS TTHAA -// 18e8 CANADIAN SYLLABICS TLHWE -// 18e9 CANADIAN SYLLABICS TLHOO -// 18ea CANADIAN SYLLABICS SAYISI SHWE -// 18eb CANADIAN SYLLABICS SAYISI SHOO -// 18ec CANADIAN SYLLABICS SAYISI HOO -// 18ed CANADIAN SYLLABICS CARRIER GWU -// 18ee CANADIAN SYLLABICS CARRIER DENE GEE -// 18ef CANADIAN SYLLABICS CARRIER GAA -// 18f0 CANADIAN SYLLABICS CARRIER GWA -// 18f1 CANADIAN SYLLABICS SAYISI JUU -// 18f2 CANADIAN SYLLABICS CARRIER JWA -// 18f3 CANADIAN SYLLABICS BEAVER DENE L -// 18f4 CANADIAN SYLLABICS BEAVER DENE R -// 18f5 CANADIAN SYLLABICS CARRIER DENTAL S - { 0x18B0, 0x46, 0x9, 0, 0 }, -// 1900 LIMBU VOWEL-CARRIER LETTER -// 1901 LIMBU LETTER KA -// 1902 LIMBU LETTER KHA -// 1903 LIMBU LETTER GA -// 1904 LIMBU LETTER GHA -// 1905 LIMBU LETTER NGA -// 1906 LIMBU LETTER CA -// 1907 LIMBU LETTER CHA -// 1908 LIMBU LETTER JA -// 1909 LIMBU LETTER JHA -// 190a LIMBU LETTER YAN -// 190b LIMBU LETTER TA -// 190c LIMBU LETTER THA -// 190d LIMBU LETTER DA -// 190e LIMBU LETTER DHA -// 190f LIMBU LETTER NA -// 1910 LIMBU LETTER PA -// 1911 LIMBU LETTER PHA -// 1912 LIMBU LETTER BA -// 1913 LIMBU LETTER BHA -// 1914 LIMBU LETTER MA -// 1915 LIMBU LETTER YA -// 1916 LIMBU LETTER RA -// 1917 LIMBU LETTER LA -// 1918 LIMBU LETTER WA -// 1919 LIMBU LETTER SHA -// 191a LIMBU LETTER SSA -// 191b LIMBU LETTER SA -// 191c LIMBU LETTER HA -// 191d LIMBU LETTER GYAN -// 191e LIMBU LETTER TRA - { 0x1900, 0x1F, 0x9, 0, 0 }, -// 1920 LIMBU VOWEL SIGN A -// 1921 LIMBU VOWEL SIGN I -// 1922 LIMBU VOWEL SIGN U -// 1923 LIMBU VOWEL SIGN EE -// 1924 LIMBU VOWEL SIGN AI -// 1925 LIMBU VOWEL SIGN OO -// 1926 LIMBU VOWEL SIGN AU -// 1927 LIMBU VOWEL SIGN E -// 1928 LIMBU VOWEL SIGN O -// 1929 LIMBU SUBJOINED LETTER YA -// 192a LIMBU SUBJOINED LETTER RA -// 192b LIMBU SUBJOINED LETTER WA - { 0x1920, 0xC, 0x0, 0, 0 }, -// 1930 LIMBU SMALL LETTER KA -// 1931 LIMBU SMALL LETTER NGA -// 1932 LIMBU SMALL LETTER ANUSVARA -// 1933 LIMBU SMALL LETTER TA -// 1934 LIMBU SMALL LETTER NA -// 1935 LIMBU SMALL LETTER PA -// 1936 LIMBU SMALL LETTER MA -// 1937 LIMBU SMALL LETTER RA -// 1938 LIMBU SMALL LETTER LA -// 1939 LIMBU SIGN MUKPHRENG -// 193a LIMBU SIGN KEMPHRENG -// 193b LIMBU SIGN SA-I - { 0x1930, 0xC, 0x0, 0, 0 }, -// 1940 LIMBU SIGN LOO - { 0x1940, 0x1, 0x8, 0, 0 }, -// 1944 LIMBU EXCLAMATION MARK -// 1945 LIMBU QUESTION MARK - { 0x1944, 0x2, 0x18, 0, 0 }, -// 1946 LIMBU DIGIT ZERO -// 1947 LIMBU DIGIT ONE -// 1948 LIMBU DIGIT TWO -// 1949 LIMBU DIGIT THREE -// 194a LIMBU DIGIT FOUR -// 194b LIMBU DIGIT FIVE -// 194c LIMBU DIGIT SIX -// 194d LIMBU DIGIT SEVEN -// 194e LIMBU DIGIT EIGHT -// 194f LIMBU DIGIT NINE - { 0x1946, 0xA, 0x108, 0, 0 }, -// 1950 TAI LE LETTER KA -// 1951 TAI LE LETTER XA -// 1952 TAI LE LETTER NGA -// 1953 TAI LE LETTER TSA -// 1954 TAI LE LETTER SA -// 1955 TAI LE LETTER YA -// 1956 TAI LE LETTER TA -// 1957 TAI LE LETTER THA -// 1958 TAI LE LETTER LA -// 1959 TAI LE LETTER PA -// 195a TAI LE LETTER PHA -// 195b TAI LE LETTER MA -// 195c TAI LE LETTER FA -// 195d TAI LE LETTER VA -// 195e TAI LE LETTER HA -// 195f TAI LE LETTER QA -// 1960 TAI LE LETTER KHA -// 1961 TAI LE LETTER TSHA -// 1962 TAI LE LETTER NA -// 1963 TAI LE LETTER A -// 1964 TAI LE LETTER I -// 1965 TAI LE LETTER EE -// 1966 TAI LE LETTER EH -// 1967 TAI LE LETTER U -// 1968 TAI LE LETTER OO -// 1969 TAI LE LETTER O -// 196a TAI LE LETTER UE -// 196b TAI LE LETTER E -// 196c TAI LE LETTER AUE -// 196d TAI LE LETTER AI - { 0x1950, 0x1E, 0x9, 0, 0 }, -// 1970 TAI LE LETTER TONE-2 -// 1971 TAI LE LETTER TONE-3 -// 1972 TAI LE LETTER TONE-4 -// 1973 TAI LE LETTER TONE-5 -// 1974 TAI LE LETTER TONE-6 - { 0x1970, 0x5, 0x9, 0, 0 }, -// 1980 NEW TAI LUE LETTER HIGH QA -// 1981 NEW TAI LUE LETTER LOW QA -// 1982 NEW TAI LUE LETTER HIGH KA -// 1983 NEW TAI LUE LETTER HIGH XA -// 1984 NEW TAI LUE LETTER HIGH NGA -// 1985 NEW TAI LUE LETTER LOW KA -// 1986 NEW TAI LUE LETTER LOW XA -// 1987 NEW TAI LUE LETTER LOW NGA -// 1988 NEW TAI LUE LETTER HIGH TSA -// 1989 NEW TAI LUE LETTER HIGH SA -// 198a NEW TAI LUE LETTER HIGH YA -// 198b NEW TAI LUE LETTER LOW TSA -// 198c NEW TAI LUE LETTER LOW SA -// 198d NEW TAI LUE LETTER LOW YA -// 198e NEW TAI LUE LETTER HIGH TA -// 198f NEW TAI LUE LETTER HIGH THA -// 1990 NEW TAI LUE LETTER HIGH NA -// 1991 NEW TAI LUE LETTER LOW TA -// 1992 NEW TAI LUE LETTER LOW THA -// 1993 NEW TAI LUE LETTER LOW NA -// 1994 NEW TAI LUE LETTER HIGH PA -// 1995 NEW TAI LUE LETTER HIGH PHA -// 1996 NEW TAI LUE LETTER HIGH MA -// 1997 NEW TAI LUE LETTER LOW PA -// 1998 NEW TAI LUE LETTER LOW PHA -// 1999 NEW TAI LUE LETTER LOW MA -// 199a NEW TAI LUE LETTER HIGH FA -// 199b NEW TAI LUE LETTER HIGH VA -// 199c NEW TAI LUE LETTER HIGH LA -// 199d NEW TAI LUE LETTER LOW FA -// 199e NEW TAI LUE LETTER LOW VA -// 199f NEW TAI LUE LETTER LOW LA -// 19a0 NEW TAI LUE LETTER HIGH HA -// 19a1 NEW TAI LUE LETTER HIGH DA -// 19a2 NEW TAI LUE LETTER HIGH BA -// 19a3 NEW TAI LUE LETTER LOW HA -// 19a4 NEW TAI LUE LETTER LOW DA -// 19a5 NEW TAI LUE LETTER LOW BA -// 19a6 NEW TAI LUE LETTER HIGH KVA -// 19a7 NEW TAI LUE LETTER HIGH XVA -// 19a8 NEW TAI LUE LETTER LOW KVA -// 19a9 NEW TAI LUE LETTER LOW XVA -// 19aa NEW TAI LUE LETTER HIGH SUA -// 19ab NEW TAI LUE LETTER LOW SUA - { 0x1980, 0x2C, 0x9, 0, 0 }, -// 19b0 NEW TAI LUE VOWEL SIGN VOWEL SHORTENER -// 19b1 NEW TAI LUE VOWEL SIGN AA -// 19b2 NEW TAI LUE VOWEL SIGN II -// 19b3 NEW TAI LUE VOWEL SIGN U -// 19b4 NEW TAI LUE VOWEL SIGN UU -// 19b5 NEW TAI LUE VOWEL SIGN E -// 19b6 NEW TAI LUE VOWEL SIGN AE -// 19b7 NEW TAI LUE VOWEL SIGN O -// 19b8 NEW TAI LUE VOWEL SIGN OA -// 19b9 NEW TAI LUE VOWEL SIGN UE -// 19ba NEW TAI LUE VOWEL SIGN AY -// 19bb NEW TAI LUE VOWEL SIGN AAY -// 19bc NEW TAI LUE VOWEL SIGN UY -// 19bd NEW TAI LUE VOWEL SIGN OY -// 19be NEW TAI LUE VOWEL SIGN OAY -// 19bf NEW TAI LUE VOWEL SIGN UEY -// 19c0 NEW TAI LUE VOWEL SIGN IY - { 0x19B0, 0x11, 0x0, 0, 0 }, -// 19c1 NEW TAI LUE LETTER FINAL V -// 19c2 NEW TAI LUE LETTER FINAL NG -// 19c3 NEW TAI LUE LETTER FINAL N -// 19c4 NEW TAI LUE LETTER FINAL M -// 19c5 NEW TAI LUE LETTER FINAL K -// 19c6 NEW TAI LUE LETTER FINAL D -// 19c7 NEW TAI LUE LETTER FINAL B - { 0x19C1, 0x7, 0x9, 0, 0 }, -// 19c8 NEW TAI LUE TONE MARK-1 -// 19c9 NEW TAI LUE TONE MARK-2 - { 0x19C8, 0x2, 0x0, 0, 0 }, -// 19d0 NEW TAI LUE DIGIT ZERO -// 19d1 NEW TAI LUE DIGIT ONE -// 19d2 NEW TAI LUE DIGIT TWO -// 19d3 NEW TAI LUE DIGIT THREE -// 19d4 NEW TAI LUE DIGIT FOUR -// 19d5 NEW TAI LUE DIGIT FIVE -// 19d6 NEW TAI LUE DIGIT SIX -// 19d7 NEW TAI LUE DIGIT SEVEN -// 19d8 NEW TAI LUE DIGIT EIGHT -// 19d9 NEW TAI LUE DIGIT NINE - { 0x19D0, 0xA, 0x108, 0, 0 }, -// 19da NEW TAI LUE THAM DIGIT ONE - { 0x19DA, 0x1, 0x8, 0, 0 }, -// 19de NEW TAI LUE SIGN LAE -// 19df NEW TAI LUE SIGN LAEV -// 19e0 KHMER SYMBOL PATHAMASAT -// 19e1 KHMER SYMBOL MUOY KOET -// 19e2 KHMER SYMBOL PII KOET -// 19e3 KHMER SYMBOL BEI KOET -// 19e4 KHMER SYMBOL BUON KOET -// 19e5 KHMER SYMBOL PRAM KOET -// 19e6 KHMER SYMBOL PRAM-MUOY KOET -// 19e7 KHMER SYMBOL PRAM-PII KOET -// 19e8 KHMER SYMBOL PRAM-BEI KOET -// 19e9 KHMER SYMBOL PRAM-BUON KOET -// 19ea KHMER SYMBOL DAP KOET -// 19eb KHMER SYMBOL DAP-MUOY KOET -// 19ec KHMER SYMBOL DAP-PII KOET -// 19ed KHMER SYMBOL DAP-BEI KOET -// 19ee KHMER SYMBOL DAP-BUON KOET -// 19ef KHMER SYMBOL DAP-PRAM KOET -// 19f0 KHMER SYMBOL TUTEYASAT -// 19f1 KHMER SYMBOL MUOY ROC -// 19f2 KHMER SYMBOL PII ROC -// 19f3 KHMER SYMBOL BEI ROC -// 19f4 KHMER SYMBOL BUON ROC -// 19f5 KHMER SYMBOL PRAM ROC -// 19f6 KHMER SYMBOL PRAM-MUOY ROC -// 19f7 KHMER SYMBOL PRAM-PII ROC -// 19f8 KHMER SYMBOL PRAM-BEI ROC -// 19f9 KHMER SYMBOL PRAM-BUON ROC -// 19fa KHMER SYMBOL DAP ROC -// 19fb KHMER SYMBOL DAP-MUOY ROC -// 19fc KHMER SYMBOL DAP-PII ROC -// 19fd KHMER SYMBOL DAP-BEI ROC -// 19fe KHMER SYMBOL DAP-BUON ROC -// 19ff KHMER SYMBOL DAP-PRAM ROC - { 0x19DE, 0x22, 0x8, 0, 0 }, -// 1a00 BUGINESE LETTER KA -// 1a01 BUGINESE LETTER GA -// 1a02 BUGINESE LETTER NGA -// 1a03 BUGINESE LETTER NGKA -// 1a04 BUGINESE LETTER PA -// 1a05 BUGINESE LETTER BA -// 1a06 BUGINESE LETTER MA -// 1a07 BUGINESE LETTER MPA -// 1a08 BUGINESE LETTER TA -// 1a09 BUGINESE LETTER DA -// 1a0a BUGINESE LETTER NA -// 1a0b BUGINESE LETTER NRA -// 1a0c BUGINESE LETTER CA -// 1a0d BUGINESE LETTER JA -// 1a0e BUGINESE LETTER NYA -// 1a0f BUGINESE LETTER NYCA -// 1a10 BUGINESE LETTER YA -// 1a11 BUGINESE LETTER RA -// 1a12 BUGINESE LETTER LA -// 1a13 BUGINESE LETTER VA -// 1a14 BUGINESE LETTER SA -// 1a15 BUGINESE LETTER A -// 1a16 BUGINESE LETTER HA - { 0x1A00, 0x17, 0x9, 0, 0 }, -// 1a17 BUGINESE VOWEL SIGN I -// 1a18 BUGINESE VOWEL SIGN U -// 1a19 BUGINESE VOWEL SIGN E -// 1a1a BUGINESE VOWEL SIGN O -// 1a1b BUGINESE VOWEL SIGN AE - { 0x1A17, 0x5, 0x0, 0, 0 }, -// 1a1e BUGINESE PALLAWA -// 1a1f BUGINESE END OF SECTION - { 0x1A1E, 0x2, 0x18, 0, 0 }, -// 1a20 TAI THAM LETTER HIGH KA -// 1a21 TAI THAM LETTER HIGH KHA -// 1a22 TAI THAM LETTER HIGH KXA -// 1a23 TAI THAM LETTER LOW KA -// 1a24 TAI THAM LETTER LOW KXA -// 1a25 TAI THAM LETTER LOW KHA -// 1a26 TAI THAM LETTER NGA -// 1a27 TAI THAM LETTER HIGH CA -// 1a28 TAI THAM LETTER HIGH CHA -// 1a29 TAI THAM LETTER LOW CA -// 1a2a TAI THAM LETTER LOW SA -// 1a2b TAI THAM LETTER LOW CHA -// 1a2c TAI THAM LETTER NYA -// 1a2d TAI THAM LETTER RATA -// 1a2e TAI THAM LETTER HIGH RATHA -// 1a2f TAI THAM LETTER DA -// 1a30 TAI THAM LETTER LOW RATHA -// 1a31 TAI THAM LETTER RANA -// 1a32 TAI THAM LETTER HIGH TA -// 1a33 TAI THAM LETTER HIGH THA -// 1a34 TAI THAM LETTER LOW TA -// 1a35 TAI THAM LETTER LOW THA -// 1a36 TAI THAM LETTER NA -// 1a37 TAI THAM LETTER BA -// 1a38 TAI THAM LETTER HIGH PA -// 1a39 TAI THAM LETTER HIGH PHA -// 1a3a TAI THAM LETTER HIGH FA -// 1a3b TAI THAM LETTER LOW PA -// 1a3c TAI THAM LETTER LOW FA -// 1a3d TAI THAM LETTER LOW PHA -// 1a3e TAI THAM LETTER MA -// 1a3f TAI THAM LETTER LOW YA -// 1a40 TAI THAM LETTER HIGH YA -// 1a41 TAI THAM LETTER RA -// 1a42 TAI THAM LETTER RUE -// 1a43 TAI THAM LETTER LA -// 1a44 TAI THAM LETTER LUE -// 1a45 TAI THAM LETTER WA -// 1a46 TAI THAM LETTER HIGH SHA -// 1a47 TAI THAM LETTER HIGH SSA -// 1a48 TAI THAM LETTER HIGH SA -// 1a49 TAI THAM LETTER HIGH HA -// 1a4a TAI THAM LETTER LLA -// 1a4b TAI THAM LETTER A -// 1a4c TAI THAM LETTER LOW HA -// 1a4d TAI THAM LETTER I -// 1a4e TAI THAM LETTER II -// 1a4f TAI THAM LETTER U -// 1a50 TAI THAM LETTER UU -// 1a51 TAI THAM LETTER EE -// 1a52 TAI THAM LETTER OO -// 1a53 TAI THAM LETTER LAE -// 1a54 TAI THAM LETTER GREAT SA - { 0x1A20, 0x35, 0x9, 0, 0 }, -// 1a55 TAI THAM CONSONANT SIGN MEDIAL RA -// 1a56 TAI THAM CONSONANT SIGN MEDIAL LA -// 1a57 TAI THAM CONSONANT SIGN LA TANG LAI -// 1a58 TAI THAM SIGN MAI KANG LAI -// 1a59 TAI THAM CONSONANT SIGN FINAL NGA -// 1a5a TAI THAM CONSONANT SIGN LOW PA -// 1a5b TAI THAM CONSONANT SIGN HIGH RATHA OR LOW PA -// 1a5c TAI THAM CONSONANT SIGN MA -// 1a5d TAI THAM CONSONANT SIGN BA -// 1a5e TAI THAM CONSONANT SIGN SA - { 0x1A55, 0xA, 0x0, 0, 0 }, -// 1a60 TAI THAM SIGN SAKOT -// 1a61 TAI THAM VOWEL SIGN A -// 1a62 TAI THAM VOWEL SIGN MAI SAT -// 1a63 TAI THAM VOWEL SIGN AA -// 1a64 TAI THAM VOWEL SIGN TALL AA -// 1a65 TAI THAM VOWEL SIGN I -// 1a66 TAI THAM VOWEL SIGN II -// 1a67 TAI THAM VOWEL SIGN UE -// 1a68 TAI THAM VOWEL SIGN UUE -// 1a69 TAI THAM VOWEL SIGN U -// 1a6a TAI THAM VOWEL SIGN UU -// 1a6b TAI THAM VOWEL SIGN O -// 1a6c TAI THAM VOWEL SIGN OA BELOW -// 1a6d TAI THAM VOWEL SIGN OY -// 1a6e TAI THAM VOWEL SIGN E -// 1a6f TAI THAM VOWEL SIGN AE -// 1a70 TAI THAM VOWEL SIGN OO -// 1a71 TAI THAM VOWEL SIGN AI -// 1a72 TAI THAM VOWEL SIGN THAM AI -// 1a73 TAI THAM VOWEL SIGN OA ABOVE -// 1a74 TAI THAM SIGN MAI KANG -// 1a75 TAI THAM SIGN TONE-1 -// 1a76 TAI THAM SIGN TONE-2 -// 1a77 TAI THAM SIGN KHUEN TONE-3 -// 1a78 TAI THAM SIGN KHUEN TONE-4 -// 1a79 TAI THAM SIGN KHUEN TONE-5 -// 1a7a TAI THAM SIGN RA HAAM -// 1a7b TAI THAM SIGN MAI SAM -// 1a7c TAI THAM SIGN KHUEN-LUE KARAN - { 0x1A60, 0x1D, 0x0, 0, 0 }, -// 1a7f TAI THAM COMBINING CRYPTOGRAMMIC DOT - { 0x1A7F, 0x1, 0x0, 0, 0 }, -// 1a80 TAI THAM HORA DIGIT ZERO -// 1a81 TAI THAM HORA DIGIT ONE -// 1a82 TAI THAM HORA DIGIT TWO -// 1a83 TAI THAM HORA DIGIT THREE -// 1a84 TAI THAM HORA DIGIT FOUR -// 1a85 TAI THAM HORA DIGIT FIVE -// 1a86 TAI THAM HORA DIGIT SIX -// 1a87 TAI THAM HORA DIGIT SEVEN -// 1a88 TAI THAM HORA DIGIT EIGHT -// 1a89 TAI THAM HORA DIGIT NINE - { 0x1A80, 0xA, 0x108, 0, 0 }, -// 1a90 TAI THAM THAM DIGIT ZERO -// 1a91 TAI THAM THAM DIGIT ONE -// 1a92 TAI THAM THAM DIGIT TWO -// 1a93 TAI THAM THAM DIGIT THREE -// 1a94 TAI THAM THAM DIGIT FOUR -// 1a95 TAI THAM THAM DIGIT FIVE -// 1a96 TAI THAM THAM DIGIT SIX -// 1a97 TAI THAM THAM DIGIT SEVEN -// 1a98 TAI THAM THAM DIGIT EIGHT -// 1a99 TAI THAM THAM DIGIT NINE - { 0x1A90, 0xA, 0x108, 0, 0 }, -// 1aa0 TAI THAM SIGN WIANG -// 1aa1 TAI THAM SIGN WIANGWAAK -// 1aa2 TAI THAM SIGN SAWAN -// 1aa3 TAI THAM SIGN KEOW -// 1aa4 TAI THAM SIGN HOY -// 1aa5 TAI THAM SIGN DOKMAI -// 1aa6 TAI THAM SIGN REVERSED ROTATED RANA - { 0x1AA0, 0x7, 0x18, 0, 0 }, -// 1aa7 TAI THAM SIGN MAI YAMOK - { 0x1AA7, 0x1, 0x9, 0, 0 }, -// 1aa8 TAI THAM SIGN KAAN -// 1aa9 TAI THAM SIGN KAANKUU -// 1aaa TAI THAM SIGN SATKAAN -// 1aab TAI THAM SIGN SATKAANKUU -// 1aac TAI THAM SIGN HANG -// 1aad TAI THAM SIGN CAANG - { 0x1AA8, 0x6, 0x18, 0, 0 }, -// 1ab0 COMBINING DOUBLED CIRCUMFLEX ACCENT -// 1ab1 COMBINING DIAERESIS-RING -// 1ab2 COMBINING INFINITY -// 1ab3 COMBINING DOWNWARDS ARROW -// 1ab4 COMBINING TRIPLE DOT -// 1ab5 COMBINING X-X BELOW -// 1ab6 COMBINING WIGGLY LINE BELOW -// 1ab7 COMBINING OPEN MARK BELOW -// 1ab8 COMBINING DOUBLE OPEN MARK BELOW -// 1ab9 COMBINING LIGHT CENTRALIZATION STROKE BELOW -// 1aba COMBINING STRONG CENTRALIZATION STROKE BELOW -// 1abb COMBINING PARENTHESES ABOVE -// 1abc COMBINING DOUBLE PARENTHESES ABOVE -// 1abd COMBINING PARENTHESES BELOW -// 1abe COMBINING PARENTHESES OVERLAY - { 0x1AB0, 0xF, 0x0, 0, 0 }, -// 1b00 BALINESE SIGN ULU RICEM -// 1b01 BALINESE SIGN ULU CANDRA -// 1b02 BALINESE SIGN CECEK -// 1b03 BALINESE SIGN SURANG -// 1b04 BALINESE SIGN BISAH - { 0x1B00, 0x5, 0x0, 0, 0 }, -// 1b05 BALINESE LETTER AKARA -// 1b06 BALINESE LETTER AKARA TEDUNG -// 1b07 BALINESE LETTER IKARA -// 1b08 BALINESE LETTER IKARA TEDUNG -// 1b09 BALINESE LETTER UKARA -// 1b0a BALINESE LETTER UKARA TEDUNG -// 1b0b BALINESE LETTER RA REPA -// 1b0c BALINESE LETTER RA REPA TEDUNG -// 1b0d BALINESE LETTER LA LENGA -// 1b0e BALINESE LETTER LA LENGA TEDUNG -// 1b0f BALINESE LETTER EKARA -// 1b10 BALINESE LETTER AIKARA -// 1b11 BALINESE LETTER OKARA -// 1b12 BALINESE LETTER OKARA TEDUNG -// 1b13 BALINESE LETTER KA -// 1b14 BALINESE LETTER KA MAHAPRANA -// 1b15 BALINESE LETTER GA -// 1b16 BALINESE LETTER GA GORA -// 1b17 BALINESE LETTER NGA -// 1b18 BALINESE LETTER CA -// 1b19 BALINESE LETTER CA LACA -// 1b1a BALINESE LETTER JA -// 1b1b BALINESE LETTER JA JERA -// 1b1c BALINESE LETTER NYA -// 1b1d BALINESE LETTER TA LATIK -// 1b1e BALINESE LETTER TA MURDA MAHAPRANA -// 1b1f BALINESE LETTER DA MURDA ALPAPRANA -// 1b20 BALINESE LETTER DA MURDA MAHAPRANA -// 1b21 BALINESE LETTER NA RAMBAT -// 1b22 BALINESE LETTER TA -// 1b23 BALINESE LETTER TA TAWA -// 1b24 BALINESE LETTER DA -// 1b25 BALINESE LETTER DA MADU -// 1b26 BALINESE LETTER NA -// 1b27 BALINESE LETTER PA -// 1b28 BALINESE LETTER PA KAPAL -// 1b29 BALINESE LETTER BA -// 1b2a BALINESE LETTER BA KEMBANG -// 1b2b BALINESE LETTER MA -// 1b2c BALINESE LETTER YA -// 1b2d BALINESE LETTER RA -// 1b2e BALINESE LETTER LA -// 1b2f BALINESE LETTER WA -// 1b30 BALINESE LETTER SA SAGA -// 1b31 BALINESE LETTER SA SAPA -// 1b32 BALINESE LETTER SA -// 1b33 BALINESE LETTER HA - { 0x1B05, 0x2F, 0x9, 0, 0 }, -// 1b34 BALINESE SIGN REREKAN -// 1b35 BALINESE VOWEL SIGN TEDUNG -// 1b36 BALINESE VOWEL SIGN ULU -// 1b37 BALINESE VOWEL SIGN ULU SARI -// 1b38 BALINESE VOWEL SIGN SUKU -// 1b39 BALINESE VOWEL SIGN SUKU ILUT -// 1b3a BALINESE VOWEL SIGN RA REPA -// 1b3b BALINESE VOWEL SIGN RA REPA TEDUNG -// 1b3c BALINESE VOWEL SIGN LA LENGA -// 1b3d BALINESE VOWEL SIGN LA LENGA TEDUNG -// 1b3e BALINESE VOWEL SIGN TALING -// 1b3f BALINESE VOWEL SIGN TALING REPA -// 1b40 BALINESE VOWEL SIGN TALING TEDUNG -// 1b41 BALINESE VOWEL SIGN TALING REPA TEDUNG -// 1b42 BALINESE VOWEL SIGN PEPET -// 1b43 BALINESE VOWEL SIGN PEPET TEDUNG -// 1b44 BALINESE ADEG ADEG - { 0x1B34, 0x11, 0x0, 0, 0 }, -// 1b45 BALINESE LETTER KAF SASAK -// 1b46 BALINESE LETTER KHOT SASAK -// 1b47 BALINESE LETTER TZIR SASAK -// 1b48 BALINESE LETTER EF SASAK -// 1b49 BALINESE LETTER VE SASAK -// 1b4a BALINESE LETTER ZAL SASAK -// 1b4b BALINESE LETTER ASYURA SASAK - { 0x1B45, 0x7, 0x9, 0, 0 }, -// 1b50 BALINESE DIGIT ZERO -// 1b51 BALINESE DIGIT ONE -// 1b52 BALINESE DIGIT TWO -// 1b53 BALINESE DIGIT THREE -// 1b54 BALINESE DIGIT FOUR -// 1b55 BALINESE DIGIT FIVE -// 1b56 BALINESE DIGIT SIX -// 1b57 BALINESE DIGIT SEVEN -// 1b58 BALINESE DIGIT EIGHT -// 1b59 BALINESE DIGIT NINE - { 0x1B50, 0xA, 0x108, 0, 0 }, -// 1b5a BALINESE PANTI -// 1b5b BALINESE PAMADA -// 1b5c BALINESE WINDU -// 1b5d BALINESE CARIK PAMUNGKAH -// 1b5e BALINESE CARIK SIKI -// 1b5f BALINESE CARIK PAREREN -// 1b60 BALINESE PAMENENG - { 0x1B5A, 0x7, 0x18, 0, 0 }, -// 1b61 BALINESE MUSICAL SYMBOL DONG -// 1b62 BALINESE MUSICAL SYMBOL DENG -// 1b63 BALINESE MUSICAL SYMBOL DUNG -// 1b64 BALINESE MUSICAL SYMBOL DANG -// 1b65 BALINESE MUSICAL SYMBOL DANG SURANG -// 1b66 BALINESE MUSICAL SYMBOL DING -// 1b67 BALINESE MUSICAL SYMBOL DAENG -// 1b68 BALINESE MUSICAL SYMBOL DEUNG -// 1b69 BALINESE MUSICAL SYMBOL DAING -// 1b6a BALINESE MUSICAL SYMBOL DANG GEDE - { 0x1B61, 0xA, 0x8, 0, 0 }, -// 1b6b BALINESE MUSICAL SYMBOL COMBINING TEGEH -// 1b6c BALINESE MUSICAL SYMBOL COMBINING ENDEP -// 1b6d BALINESE MUSICAL SYMBOL COMBINING KEMPUL -// 1b6e BALINESE MUSICAL SYMBOL COMBINING KEMPLI -// 1b6f BALINESE MUSICAL SYMBOL COMBINING JEGOGAN -// 1b70 BALINESE MUSICAL SYMBOL COMBINING KEMPUL WITH JEGOGAN -// 1b71 BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN -// 1b72 BALINESE MUSICAL SYMBOL COMBINING BENDE -// 1b73 BALINESE MUSICAL SYMBOL COMBINING GONG - { 0x1B6B, 0x9, 0x0, 0, 0 }, -// 1b74 BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG -// 1b75 BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DAG -// 1b76 BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TUK -// 1b77 BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TAK -// 1b78 BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PANG -// 1b79 BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PUNG -// 1b7a BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLAK -// 1b7b BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLUK -// 1b7c BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING - { 0x1B74, 0x9, 0x8, 0, 0 }, -// 1b80 SUNDANESE SIGN PANYECEK -// 1b81 SUNDANESE SIGN PANGLAYAR -// 1b82 SUNDANESE SIGN PANGWISAD - { 0x1B80, 0x3, 0x0, 0, 0 }, -// 1b83 SUNDANESE LETTER A -// 1b84 SUNDANESE LETTER I -// 1b85 SUNDANESE LETTER U -// 1b86 SUNDANESE LETTER AE -// 1b87 SUNDANESE LETTER O -// 1b88 SUNDANESE LETTER E -// 1b89 SUNDANESE LETTER EU -// 1b8a SUNDANESE LETTER KA -// 1b8b SUNDANESE LETTER QA -// 1b8c SUNDANESE LETTER GA -// 1b8d SUNDANESE LETTER NGA -// 1b8e SUNDANESE LETTER CA -// 1b8f SUNDANESE LETTER JA -// 1b90 SUNDANESE LETTER ZA -// 1b91 SUNDANESE LETTER NYA -// 1b92 SUNDANESE LETTER TA -// 1b93 SUNDANESE LETTER DA -// 1b94 SUNDANESE LETTER NA -// 1b95 SUNDANESE LETTER PA -// 1b96 SUNDANESE LETTER FA -// 1b97 SUNDANESE LETTER VA -// 1b98 SUNDANESE LETTER BA -// 1b99 SUNDANESE LETTER MA -// 1b9a SUNDANESE LETTER YA -// 1b9b SUNDANESE LETTER RA -// 1b9c SUNDANESE LETTER LA -// 1b9d SUNDANESE LETTER WA -// 1b9e SUNDANESE LETTER SA -// 1b9f SUNDANESE LETTER XA -// 1ba0 SUNDANESE LETTER HA - { 0x1B83, 0x1E, 0x9, 0, 0 }, -// 1ba1 SUNDANESE CONSONANT SIGN PAMINGKAL -// 1ba2 SUNDANESE CONSONANT SIGN PANYAKRA -// 1ba3 SUNDANESE CONSONANT SIGN PANYIKU -// 1ba4 SUNDANESE VOWEL SIGN PANGHULU -// 1ba5 SUNDANESE VOWEL SIGN PANYUKU -// 1ba6 SUNDANESE VOWEL SIGN PANAELAENG -// 1ba7 SUNDANESE VOWEL SIGN PANOLONG -// 1ba8 SUNDANESE VOWEL SIGN PAMEPET -// 1ba9 SUNDANESE VOWEL SIGN PANEULEUNG -// 1baa SUNDANESE SIGN PAMAAEH -// 1bab SUNDANESE SIGN VIRAMA -// 1bac SUNDANESE CONSONANT SIGN PASANGAN MA -// 1bad SUNDANESE CONSONANT SIGN PASANGAN WA - { 0x1BA1, 0xD, 0x0, 0, 0 }, -// 1bae SUNDANESE LETTER KHA -// 1baf SUNDANESE LETTER SYA - { 0x1BAE, 0x2, 0x9, 0, 0 }, -// 1bb0 SUNDANESE DIGIT ZERO -// 1bb1 SUNDANESE DIGIT ONE -// 1bb2 SUNDANESE DIGIT TWO -// 1bb3 SUNDANESE DIGIT THREE -// 1bb4 SUNDANESE DIGIT FOUR -// 1bb5 SUNDANESE DIGIT FIVE -// 1bb6 SUNDANESE DIGIT SIX -// 1bb7 SUNDANESE DIGIT SEVEN -// 1bb8 SUNDANESE DIGIT EIGHT -// 1bb9 SUNDANESE DIGIT NINE - { 0x1BB0, 0xA, 0x108, 0, 0 }, -// 1bba SUNDANESE AVAGRAHA -// 1bbb SUNDANESE LETTER REU -// 1bbc SUNDANESE LETTER LEU -// 1bbd SUNDANESE LETTER BHA -// 1bbe SUNDANESE LETTER FINAL K -// 1bbf SUNDANESE LETTER FINAL M -// 1bc0 BATAK LETTER A -// 1bc1 BATAK LETTER SIMALUNGUN A -// 1bc2 BATAK LETTER HA -// 1bc3 BATAK LETTER SIMALUNGUN HA -// 1bc4 BATAK LETTER MANDAILING HA -// 1bc5 BATAK LETTER BA -// 1bc6 BATAK LETTER KARO BA -// 1bc7 BATAK LETTER PA -// 1bc8 BATAK LETTER SIMALUNGUN PA -// 1bc9 BATAK LETTER NA -// 1bca BATAK LETTER MANDAILING NA -// 1bcb BATAK LETTER WA -// 1bcc BATAK LETTER SIMALUNGUN WA -// 1bcd BATAK LETTER PAKPAK WA -// 1bce BATAK LETTER GA -// 1bcf BATAK LETTER SIMALUNGUN GA -// 1bd0 BATAK LETTER JA -// 1bd1 BATAK LETTER DA -// 1bd2 BATAK LETTER RA -// 1bd3 BATAK LETTER SIMALUNGUN RA -// 1bd4 BATAK LETTER MA -// 1bd5 BATAK LETTER SIMALUNGUN MA -// 1bd6 BATAK LETTER SOUTHERN TA -// 1bd7 BATAK LETTER NORTHERN TA -// 1bd8 BATAK LETTER SA -// 1bd9 BATAK LETTER SIMALUNGUN SA -// 1bda BATAK LETTER MANDAILING SA -// 1bdb BATAK LETTER YA -// 1bdc BATAK LETTER SIMALUNGUN YA -// 1bdd BATAK LETTER NGA -// 1bde BATAK LETTER LA -// 1bdf BATAK LETTER SIMALUNGUN LA -// 1be0 BATAK LETTER NYA -// 1be1 BATAK LETTER CA -// 1be2 BATAK LETTER NDA -// 1be3 BATAK LETTER MBA -// 1be4 BATAK LETTER I -// 1be5 BATAK LETTER U - { 0x1BBA, 0x2C, 0x9, 0, 0 }, -// 1be6 BATAK SIGN TOMPI -// 1be7 BATAK VOWEL SIGN E -// 1be8 BATAK VOWEL SIGN PAKPAK E -// 1be9 BATAK VOWEL SIGN EE -// 1bea BATAK VOWEL SIGN I -// 1beb BATAK VOWEL SIGN KARO I -// 1bec BATAK VOWEL SIGN O -// 1bed BATAK VOWEL SIGN KARO O -// 1bee BATAK VOWEL SIGN U -// 1bef BATAK VOWEL SIGN U FOR SIMALUNGUN SA -// 1bf0 BATAK CONSONANT SIGN NG -// 1bf1 BATAK CONSONANT SIGN H -// 1bf2 BATAK PANGOLAT -// 1bf3 BATAK PANONGONAN - { 0x1BE6, 0xE, 0x0, 0, 0 }, -// 1bfc BATAK SYMBOL BINDU NA METEK -// 1bfd BATAK SYMBOL BINDU PINARBORAS -// 1bfe BATAK SYMBOL BINDU JUDUL -// 1bff BATAK SYMBOL BINDU PANGOLAT - { 0x1BFC, 0x4, 0x18, 0, 0 }, -// 1c00 LEPCHA LETTER KA -// 1c01 LEPCHA LETTER KLA -// 1c02 LEPCHA LETTER KHA -// 1c03 LEPCHA LETTER GA -// 1c04 LEPCHA LETTER GLA -// 1c05 LEPCHA LETTER NGA -// 1c06 LEPCHA LETTER CA -// 1c07 LEPCHA LETTER CHA -// 1c08 LEPCHA LETTER JA -// 1c09 LEPCHA LETTER NYA -// 1c0a LEPCHA LETTER TA -// 1c0b LEPCHA LETTER THA -// 1c0c LEPCHA LETTER DA -// 1c0d LEPCHA LETTER NA -// 1c0e LEPCHA LETTER PA -// 1c0f LEPCHA LETTER PLA -// 1c10 LEPCHA LETTER PHA -// 1c11 LEPCHA LETTER FA -// 1c12 LEPCHA LETTER FLA -// 1c13 LEPCHA LETTER BA -// 1c14 LEPCHA LETTER BLA -// 1c15 LEPCHA LETTER MA -// 1c16 LEPCHA LETTER MLA -// 1c17 LEPCHA LETTER TSA -// 1c18 LEPCHA LETTER TSHA -// 1c19 LEPCHA LETTER DZA -// 1c1a LEPCHA LETTER YA -// 1c1b LEPCHA LETTER RA -// 1c1c LEPCHA LETTER LA -// 1c1d LEPCHA LETTER HA -// 1c1e LEPCHA LETTER HLA -// 1c1f LEPCHA LETTER VA -// 1c20 LEPCHA LETTER SA -// 1c21 LEPCHA LETTER SHA -// 1c22 LEPCHA LETTER WA -// 1c23 LEPCHA LETTER A - { 0x1C00, 0x24, 0x9, 0, 0 }, -// 1c24 LEPCHA SUBJOINED LETTER YA -// 1c25 LEPCHA SUBJOINED LETTER RA -// 1c26 LEPCHA VOWEL SIGN AA -// 1c27 LEPCHA VOWEL SIGN I -// 1c28 LEPCHA VOWEL SIGN O -// 1c29 LEPCHA VOWEL SIGN OO -// 1c2a LEPCHA VOWEL SIGN U -// 1c2b LEPCHA VOWEL SIGN UU -// 1c2c LEPCHA VOWEL SIGN E -// 1c2d LEPCHA CONSONANT SIGN K -// 1c2e LEPCHA CONSONANT SIGN M -// 1c2f LEPCHA CONSONANT SIGN L -// 1c30 LEPCHA CONSONANT SIGN N -// 1c31 LEPCHA CONSONANT SIGN P -// 1c32 LEPCHA CONSONANT SIGN R -// 1c33 LEPCHA CONSONANT SIGN T -// 1c34 LEPCHA CONSONANT SIGN NYIN-DO -// 1c35 LEPCHA CONSONANT SIGN KANG -// 1c36 LEPCHA SIGN RAN -// 1c37 LEPCHA SIGN NUKTA - { 0x1C24, 0x14, 0x0, 0, 0 }, -// 1c3b LEPCHA PUNCTUATION TA-ROL -// 1c3c LEPCHA PUNCTUATION NYET THYOOM TA-ROL -// 1c3d LEPCHA PUNCTUATION CER-WA -// 1c3e LEPCHA PUNCTUATION TSHOOK CER-WA -// 1c3f LEPCHA PUNCTUATION TSHOOK - { 0x1C3B, 0x5, 0x18, 0, 0 }, -// 1c40 LEPCHA DIGIT ZERO -// 1c41 LEPCHA DIGIT ONE -// 1c42 LEPCHA DIGIT TWO -// 1c43 LEPCHA DIGIT THREE -// 1c44 LEPCHA DIGIT FOUR -// 1c45 LEPCHA DIGIT FIVE -// 1c46 LEPCHA DIGIT SIX -// 1c47 LEPCHA DIGIT SEVEN -// 1c48 LEPCHA DIGIT EIGHT -// 1c49 LEPCHA DIGIT NINE - { 0x1C40, 0xA, 0x108, 0, 0 }, -// 1c4d LEPCHA LETTER TTA -// 1c4e LEPCHA LETTER TTHA -// 1c4f LEPCHA LETTER DDA - { 0x1C4D, 0x3, 0x9, 0, 0 }, -// 1c50 OL CHIKI DIGIT ZERO -// 1c51 OL CHIKI DIGIT ONE -// 1c52 OL CHIKI DIGIT TWO -// 1c53 OL CHIKI DIGIT THREE -// 1c54 OL CHIKI DIGIT FOUR -// 1c55 OL CHIKI DIGIT FIVE -// 1c56 OL CHIKI DIGIT SIX -// 1c57 OL CHIKI DIGIT SEVEN -// 1c58 OL CHIKI DIGIT EIGHT -// 1c59 OL CHIKI DIGIT NINE - { 0x1C50, 0xA, 0x108, 0, 0 }, -// 1c5a OL CHIKI LETTER LA -// 1c5b OL CHIKI LETTER AT -// 1c5c OL CHIKI LETTER AG -// 1c5d OL CHIKI LETTER ANG -// 1c5e OL CHIKI LETTER AL -// 1c5f OL CHIKI LETTER LAA -// 1c60 OL CHIKI LETTER AAK -// 1c61 OL CHIKI LETTER AAJ -// 1c62 OL CHIKI LETTER AAM -// 1c63 OL CHIKI LETTER AAW -// 1c64 OL CHIKI LETTER LI -// 1c65 OL CHIKI LETTER IS -// 1c66 OL CHIKI LETTER IH -// 1c67 OL CHIKI LETTER INY -// 1c68 OL CHIKI LETTER IR -// 1c69 OL CHIKI LETTER LU -// 1c6a OL CHIKI LETTER UC -// 1c6b OL CHIKI LETTER UD -// 1c6c OL CHIKI LETTER UNN -// 1c6d OL CHIKI LETTER UY -// 1c6e OL CHIKI LETTER LE -// 1c6f OL CHIKI LETTER EP -// 1c70 OL CHIKI LETTER EDD -// 1c71 OL CHIKI LETTER EN -// 1c72 OL CHIKI LETTER ERR -// 1c73 OL CHIKI LETTER LO -// 1c74 OL CHIKI LETTER OTT -// 1c75 OL CHIKI LETTER OB -// 1c76 OL CHIKI LETTER OV -// 1c77 OL CHIKI LETTER OH -// 1c78 OL CHIKI MU TTUDDAG -// 1c79 OL CHIKI GAAHLAA TTUDDAAG -// 1c7a OL CHIKI MU-GAAHLAA TTUDDAAG -// 1c7b OL CHIKI RELAA -// 1c7c OL CHIKI PHAARKAA -// 1c7d OL CHIKI AHAD - { 0x1C5A, 0x24, 0x9, 0, 0 }, -// 1c7e OL CHIKI PUNCTUATION MUCAAD -// 1c7f OL CHIKI PUNCTUATION DOUBLE MUCAAD - { 0x1C7E, 0x2, 0x18, 0, 0 }, -// 1cc0 SUNDANESE PUNCTUATION BINDU SURYA -// 1cc1 SUNDANESE PUNCTUATION BINDU PANGLONG -// 1cc2 SUNDANESE PUNCTUATION BINDU PURNAMA -// 1cc3 SUNDANESE PUNCTUATION BINDU CAKRA -// 1cc4 SUNDANESE PUNCTUATION BINDU LEU SATANGA -// 1cc5 SUNDANESE PUNCTUATION BINDU KA SATANGA -// 1cc6 SUNDANESE PUNCTUATION BINDU DA SATANGA -// 1cc7 SUNDANESE PUNCTUATION BINDU BA SATANGA - { 0x1CC0, 0x8, 0x18, 0, 0 }, -// 1cd0 VEDIC TONE KARSHANA -// 1cd1 VEDIC TONE SHARA -// 1cd2 VEDIC TONE PRENKHA - { 0x1CD0, 0x3, 0x0, 0, 0 }, -// 1cd3 VEDIC SIGN NIHSHVASA - { 0x1CD3, 0x1, 0x18, 0, 0 }, -// 1cd4 VEDIC SIGN YAJURVEDIC MIDLINE SVARITA -// 1cd5 VEDIC TONE YAJURVEDIC AGGRAVATED INDEPENDENT SVARITA -// 1cd6 VEDIC TONE YAJURVEDIC INDEPENDENT SVARITA -// 1cd7 VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA -// 1cd8 VEDIC TONE CANDRA BELOW -// 1cd9 VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA SCHROEDER -// 1cda VEDIC TONE DOUBLE SVARITA -// 1cdb VEDIC TONE TRIPLE SVARITA -// 1cdc VEDIC TONE KATHAKA ANUDATTA -// 1cdd VEDIC TONE DOT BELOW -// 1cde VEDIC TONE TWO DOTS BELOW -// 1cdf VEDIC TONE THREE DOTS BELOW -// 1ce0 VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA -// 1ce1 VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA -// 1ce2 VEDIC SIGN VISARGA SVARITA -// 1ce3 VEDIC SIGN VISARGA UDATTA -// 1ce4 VEDIC SIGN REVERSED VISARGA UDATTA -// 1ce5 VEDIC SIGN VISARGA ANUDATTA -// 1ce6 VEDIC SIGN REVERSED VISARGA ANUDATTA -// 1ce7 VEDIC SIGN VISARGA UDATTA WITH TAIL -// 1ce8 VEDIC SIGN VISARGA ANUDATTA WITH TAIL - { 0x1CD4, 0x15, 0x0, 0, 0 }, -// 1ce9 VEDIC SIGN ANUSVARA ANTARGOMUKHA -// 1cea VEDIC SIGN ANUSVARA BAHIRGOMUKHA -// 1ceb VEDIC SIGN ANUSVARA VAMAGOMUKHA -// 1cec VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL - { 0x1CE9, 0x4, 0x9, 0, 0 }, -// 1ced VEDIC SIGN TIRYAK - { 0x1CED, 0x1, 0x0, 0, 0 }, -// 1cee VEDIC SIGN HEXIFORM LONG ANUSVARA -// 1cef VEDIC SIGN LONG ANUSVARA -// 1cf0 VEDIC SIGN RTHANG LONG ANUSVARA -// 1cf1 VEDIC SIGN ANUSVARA UBHAYATO MUKHA - { 0x1CEE, 0x4, 0x9, 0, 0 }, -// 1cf2 VEDIC SIGN ARDHAVISARGA -// 1cf3 VEDIC SIGN ROTATED ARDHAVISARGA -// 1cf4 VEDIC TONE CANDRA ABOVE - { 0x1CF2, 0x3, 0x0, 0, 0 }, -// 1cf5 VEDIC SIGN JIHVAMULIYA -// 1cf6 VEDIC SIGN UPADHMANIYA - { 0x1CF5, 0x2, 0x9, 0, 0 }, -// 1cf8 VEDIC TONE RING ABOVE -// 1cf9 VEDIC TONE DOUBLE RING ABOVE - { 0x1CF8, 0x2, 0x0, 0, 0 }, -// 1d00 LATIN LETTER SMALL CAPITAL A -// 1d01 LATIN LETTER SMALL CAPITAL AE -// 1d02 LATIN SMALL LETTER TURNED AE -// 1d03 LATIN LETTER SMALL CAPITAL BARRED B -// 1d04 LATIN LETTER SMALL CAPITAL C -// 1d05 LATIN LETTER SMALL CAPITAL D -// 1d06 LATIN LETTER SMALL CAPITAL ETH -// 1d07 LATIN LETTER SMALL CAPITAL E -// 1d08 LATIN SMALL LETTER TURNED OPEN E -// 1d09 LATIN SMALL LETTER TURNED I -// 1d0a LATIN LETTER SMALL CAPITAL J -// 1d0b LATIN LETTER SMALL CAPITAL K -// 1d0c LATIN LETTER SMALL CAPITAL L WITH STROKE -// 1d0d LATIN LETTER SMALL CAPITAL M -// 1d0e LATIN LETTER SMALL CAPITAL REVERSED N -// 1d0f LATIN LETTER SMALL CAPITAL O -// 1d10 LATIN LETTER SMALL CAPITAL OPEN O -// 1d11 LATIN SMALL LETTER SIDEWAYS O -// 1d12 LATIN SMALL LETTER SIDEWAYS OPEN O -// 1d13 LATIN SMALL LETTER SIDEWAYS O WITH STROKE -// 1d14 LATIN SMALL LETTER TURNED OE -// 1d15 LATIN LETTER SMALL CAPITAL OU -// 1d16 LATIN SMALL LETTER TOP HALF O -// 1d17 LATIN SMALL LETTER BOTTOM HALF O -// 1d18 LATIN LETTER SMALL CAPITAL P -// 1d19 LATIN LETTER SMALL CAPITAL REVERSED R -// 1d1a LATIN LETTER SMALL CAPITAL TURNED R -// 1d1b LATIN LETTER SMALL CAPITAL T -// 1d1c LATIN LETTER SMALL CAPITAL U -// 1d1d LATIN SMALL LETTER SIDEWAYS U -// 1d1e LATIN SMALL LETTER SIDEWAYS DIAERESIZED U -// 1d1f LATIN SMALL LETTER SIDEWAYS TURNED M -// 1d20 LATIN LETTER SMALL CAPITAL V -// 1d21 LATIN LETTER SMALL CAPITAL W -// 1d22 LATIN LETTER SMALL CAPITAL Z -// 1d23 LATIN LETTER SMALL CAPITAL EZH -// 1d24 LATIN LETTER VOICED LARYNGEAL SPIRANT -// 1d25 LATIN LETTER AIN -// 1d26 GREEK LETTER SMALL CAPITAL GAMMA -// 1d27 GREEK LETTER SMALL CAPITAL LAMDA -// 1d28 GREEK LETTER SMALL CAPITAL PI -// 1d29 GREEK LETTER SMALL CAPITAL RHO -// 1d2a GREEK LETTER SMALL CAPITAL PSI -// 1d2b CYRILLIC LETTER SMALL CAPITAL EL - { 0x1D00, 0x2C, 0x49, 0, 0 }, -// 1d2c MODIFIER LETTER CAPITAL A -// 1d2d MODIFIER LETTER CAPITAL AE -// 1d2e MODIFIER LETTER CAPITAL B -// 1d2f MODIFIER LETTER CAPITAL BARRED B -// 1d30 MODIFIER LETTER CAPITAL D -// 1d31 MODIFIER LETTER CAPITAL E -// 1d32 MODIFIER LETTER CAPITAL REVERSED E -// 1d33 MODIFIER LETTER CAPITAL G -// 1d34 MODIFIER LETTER CAPITAL H -// 1d35 MODIFIER LETTER CAPITAL I -// 1d36 MODIFIER LETTER CAPITAL J -// 1d37 MODIFIER LETTER CAPITAL K -// 1d38 MODIFIER LETTER CAPITAL L -// 1d39 MODIFIER LETTER CAPITAL M -// 1d3a MODIFIER LETTER CAPITAL N -// 1d3b MODIFIER LETTER CAPITAL REVERSED N -// 1d3c MODIFIER LETTER CAPITAL O -// 1d3d MODIFIER LETTER CAPITAL OU -// 1d3e MODIFIER LETTER CAPITAL P -// 1d3f MODIFIER LETTER CAPITAL R -// 1d40 MODIFIER LETTER CAPITAL T -// 1d41 MODIFIER LETTER CAPITAL U -// 1d42 MODIFIER LETTER CAPITAL W -// 1d43 MODIFIER LETTER SMALL A -// 1d44 MODIFIER LETTER SMALL TURNED A -// 1d45 MODIFIER LETTER SMALL ALPHA -// 1d46 MODIFIER LETTER SMALL TURNED AE -// 1d47 MODIFIER LETTER SMALL B -// 1d48 MODIFIER LETTER SMALL D -// 1d49 MODIFIER LETTER SMALL E -// 1d4a MODIFIER LETTER SMALL SCHWA -// 1d4b MODIFIER LETTER SMALL OPEN E -// 1d4c MODIFIER LETTER SMALL TURNED OPEN E -// 1d4d MODIFIER LETTER SMALL G -// 1d4e MODIFIER LETTER SMALL TURNED I -// 1d4f MODIFIER LETTER SMALL K -// 1d50 MODIFIER LETTER SMALL M -// 1d51 MODIFIER LETTER SMALL ENG -// 1d52 MODIFIER LETTER SMALL O -// 1d53 MODIFIER LETTER SMALL OPEN O -// 1d54 MODIFIER LETTER SMALL TOP HALF O -// 1d55 MODIFIER LETTER SMALL BOTTOM HALF O -// 1d56 MODIFIER LETTER SMALL P -// 1d57 MODIFIER LETTER SMALL T -// 1d58 MODIFIER LETTER SMALL U -// 1d59 MODIFIER LETTER SMALL SIDEWAYS U -// 1d5a MODIFIER LETTER SMALL TURNED M -// 1d5b MODIFIER LETTER SMALL V -// 1d5c MODIFIER LETTER SMALL AIN -// 1d5d MODIFIER LETTER SMALL BETA -// 1d5e MODIFIER LETTER SMALL GREEK GAMMA -// 1d5f MODIFIER LETTER SMALL DELTA -// 1d60 MODIFIER LETTER SMALL GREEK PHI -// 1d61 MODIFIER LETTER SMALL CHI -// 1d62 LATIN SUBSCRIPT SMALL LETTER I -// 1d63 LATIN SUBSCRIPT SMALL LETTER R -// 1d64 LATIN SUBSCRIPT SMALL LETTER U -// 1d65 LATIN SUBSCRIPT SMALL LETTER V -// 1d66 GREEK SUBSCRIPT SMALL LETTER BETA -// 1d67 GREEK SUBSCRIPT SMALL LETTER GAMMA -// 1d68 GREEK SUBSCRIPT SMALL LETTER RHO -// 1d69 GREEK SUBSCRIPT SMALL LETTER PHI -// 1d6a GREEK SUBSCRIPT SMALL LETTER CHI - { 0x1D2C, 0x3F, 0x9, 0, 0 }, -// 1d6b LATIN SMALL LETTER UE -// 1d6c LATIN SMALL LETTER B WITH MIDDLE TILDE -// 1d6d LATIN SMALL LETTER D WITH MIDDLE TILDE -// 1d6e LATIN SMALL LETTER F WITH MIDDLE TILDE -// 1d6f LATIN SMALL LETTER M WITH MIDDLE TILDE -// 1d70 LATIN SMALL LETTER N WITH MIDDLE TILDE -// 1d71 LATIN SMALL LETTER P WITH MIDDLE TILDE -// 1d72 LATIN SMALL LETTER R WITH MIDDLE TILDE -// 1d73 LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE -// 1d74 LATIN SMALL LETTER S WITH MIDDLE TILDE -// 1d75 LATIN SMALL LETTER T WITH MIDDLE TILDE -// 1d76 LATIN SMALL LETTER Z WITH MIDDLE TILDE -// 1d77 LATIN SMALL LETTER TURNED G - { 0x1D6B, 0xD, 0x49, 0, 0 }, -// 1d78 MODIFIER LETTER CYRILLIC EN - { 0x1D78, 0x1, 0x9, 0, 0 }, -// 1d79 LATIN SMALL LETTER INSULAR G - { 0x1D79, 0x1, 0x49, 0, 35332 }, -// 1d7a LATIN SMALL LETTER TH WITH STRIKETHROUGH -// 1d7b LATIN SMALL CAPITAL LETTER I WITH STROKE -// 1d7c LATIN SMALL LETTER IOTA WITH STROKE - { 0x1D7A, 0x3, 0x49, 0, 0 }, -// 1d7d LATIN SMALL LETTER P WITH STROKE - { 0x1D7D, 0x1, 0x49, 0, 3814 }, -// 1d7e LATIN SMALL CAPITAL LETTER U WITH STROKE -// 1d7f LATIN SMALL LETTER UPSILON WITH STROKE -// 1d80 LATIN SMALL LETTER B WITH PALATAL HOOK -// 1d81 LATIN SMALL LETTER D WITH PALATAL HOOK -// 1d82 LATIN SMALL LETTER F WITH PALATAL HOOK -// 1d83 LATIN SMALL LETTER G WITH PALATAL HOOK -// 1d84 LATIN SMALL LETTER K WITH PALATAL HOOK -// 1d85 LATIN SMALL LETTER L WITH PALATAL HOOK -// 1d86 LATIN SMALL LETTER M WITH PALATAL HOOK -// 1d87 LATIN SMALL LETTER N WITH PALATAL HOOK -// 1d88 LATIN SMALL LETTER P WITH PALATAL HOOK -// 1d89 LATIN SMALL LETTER R WITH PALATAL HOOK -// 1d8a LATIN SMALL LETTER S WITH PALATAL HOOK -// 1d8b LATIN SMALL LETTER ESH WITH PALATAL HOOK -// 1d8c LATIN SMALL LETTER V WITH PALATAL HOOK -// 1d8d LATIN SMALL LETTER X WITH PALATAL HOOK -// 1d8e LATIN SMALL LETTER Z WITH PALATAL HOOK -// 1d8f LATIN SMALL LETTER A WITH RETROFLEX HOOK -// 1d90 LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK -// 1d91 LATIN SMALL LETTER D WITH HOOK AND TAIL -// 1d92 LATIN SMALL LETTER E WITH RETROFLEX HOOK -// 1d93 LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK -// 1d94 LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK -// 1d95 LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK -// 1d96 LATIN SMALL LETTER I WITH RETROFLEX HOOK -// 1d97 LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK -// 1d98 LATIN SMALL LETTER ESH WITH RETROFLEX HOOK -// 1d99 LATIN SMALL LETTER U WITH RETROFLEX HOOK -// 1d9a LATIN SMALL LETTER EZH WITH RETROFLEX HOOK - { 0x1D7E, 0x1D, 0x49, 0, 0 }, -// 1d9b MODIFIER LETTER SMALL TURNED ALPHA -// 1d9c MODIFIER LETTER SMALL C -// 1d9d MODIFIER LETTER SMALL C WITH CURL -// 1d9e MODIFIER LETTER SMALL ETH -// 1d9f MODIFIER LETTER SMALL REVERSED OPEN E -// 1da0 MODIFIER LETTER SMALL F -// 1da1 MODIFIER LETTER SMALL DOTLESS J WITH STROKE -// 1da2 MODIFIER LETTER SMALL SCRIPT G -// 1da3 MODIFIER LETTER SMALL TURNED H -// 1da4 MODIFIER LETTER SMALL I WITH STROKE -// 1da5 MODIFIER LETTER SMALL IOTA -// 1da6 MODIFIER LETTER SMALL CAPITAL I -// 1da7 MODIFIER LETTER SMALL CAPITAL I WITH STROKE -// 1da8 MODIFIER LETTER SMALL J WITH CROSSED-TAIL -// 1da9 MODIFIER LETTER SMALL L WITH RETROFLEX HOOK -// 1daa MODIFIER LETTER SMALL L WITH PALATAL HOOK -// 1dab MODIFIER LETTER SMALL CAPITAL L -// 1dac MODIFIER LETTER SMALL M WITH HOOK -// 1dad MODIFIER LETTER SMALL TURNED M WITH LONG LEG -// 1dae MODIFIER LETTER SMALL N WITH LEFT HOOK -// 1daf MODIFIER LETTER SMALL N WITH RETROFLEX HOOK -// 1db0 MODIFIER LETTER SMALL CAPITAL N -// 1db1 MODIFIER LETTER SMALL BARRED O -// 1db2 MODIFIER LETTER SMALL PHI -// 1db3 MODIFIER LETTER SMALL S WITH HOOK -// 1db4 MODIFIER LETTER SMALL ESH -// 1db5 MODIFIER LETTER SMALL T WITH PALATAL HOOK -// 1db6 MODIFIER LETTER SMALL U BAR -// 1db7 MODIFIER LETTER SMALL UPSILON -// 1db8 MODIFIER LETTER SMALL CAPITAL U -// 1db9 MODIFIER LETTER SMALL V WITH HOOK -// 1dba MODIFIER LETTER SMALL TURNED V -// 1dbb MODIFIER LETTER SMALL Z -// 1dbc MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK -// 1dbd MODIFIER LETTER SMALL Z WITH CURL -// 1dbe MODIFIER LETTER SMALL EZH -// 1dbf MODIFIER LETTER SMALL THETA - { 0x1D9B, 0x25, 0x9, 0, 0 }, -// 1dc0 COMBINING DOTTED GRAVE ACCENT -// 1dc1 COMBINING DOTTED ACUTE ACCENT -// 1dc2 COMBINING SNAKE BELOW -// 1dc3 COMBINING SUSPENSION MARK -// 1dc4 COMBINING MACRON-ACUTE -// 1dc5 COMBINING GRAVE-MACRON -// 1dc6 COMBINING MACRON-GRAVE -// 1dc7 COMBINING ACUTE-MACRON -// 1dc8 COMBINING GRAVE-ACUTE-GRAVE -// 1dc9 COMBINING ACUTE-GRAVE-ACUTE -// 1dca COMBINING LATIN SMALL LETTER R BELOW -// 1dcb COMBINING BREVE-MACRON -// 1dcc COMBINING MACRON-BREVE -// 1dcd COMBINING DOUBLE CIRCUMFLEX ABOVE -// 1dce COMBINING OGONEK ABOVE -// 1dcf COMBINING ZIGZAG BELOW -// 1dd0 COMBINING IS BELOW -// 1dd1 COMBINING UR ABOVE -// 1dd2 COMBINING US ABOVE -// 1dd3 COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE -// 1dd4 COMBINING LATIN SMALL LETTER AE -// 1dd5 COMBINING LATIN SMALL LETTER AO -// 1dd6 COMBINING LATIN SMALL LETTER AV -// 1dd7 COMBINING LATIN SMALL LETTER C CEDILLA -// 1dd8 COMBINING LATIN SMALL LETTER INSULAR D -// 1dd9 COMBINING LATIN SMALL LETTER ETH -// 1dda COMBINING LATIN SMALL LETTER G -// 1ddb COMBINING LATIN LETTER SMALL CAPITAL G -// 1ddc COMBINING LATIN SMALL LETTER K -// 1ddd COMBINING LATIN SMALL LETTER L -// 1dde COMBINING LATIN LETTER SMALL CAPITAL L -// 1ddf COMBINING LATIN LETTER SMALL CAPITAL M -// 1de0 COMBINING LATIN SMALL LETTER N -// 1de1 COMBINING LATIN LETTER SMALL CAPITAL N -// 1de2 COMBINING LATIN LETTER SMALL CAPITAL R -// 1de3 COMBINING LATIN SMALL LETTER R ROTUNDA -// 1de4 COMBINING LATIN SMALL LETTER S -// 1de5 COMBINING LATIN SMALL LETTER LONG S -// 1de6 COMBINING LATIN SMALL LETTER Z -// 1de7 COMBINING LATIN SMALL LETTER ALPHA -// 1de8 COMBINING LATIN SMALL LETTER B -// 1de9 COMBINING LATIN SMALL LETTER BETA -// 1dea COMBINING LATIN SMALL LETTER SCHWA -// 1deb COMBINING LATIN SMALL LETTER F -// 1dec COMBINING LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE -// 1ded COMBINING LATIN SMALL LETTER O WITH LIGHT CENTRALIZATION STROKE -// 1dee COMBINING LATIN SMALL LETTER P -// 1def COMBINING LATIN SMALL LETTER ESH -// 1df0 COMBINING LATIN SMALL LETTER U WITH LIGHT CENTRALIZATION STROKE -// 1df1 COMBINING LATIN SMALL LETTER W -// 1df2 COMBINING LATIN SMALL LETTER A WITH DIAERESIS -// 1df3 COMBINING LATIN SMALL LETTER O WITH DIAERESIS -// 1df4 COMBINING LATIN SMALL LETTER U WITH DIAERESIS -// 1df5 COMBINING UP TACK ABOVE - { 0x1DC0, 0x36, 0x0, 0, 0 }, -// 1dfc COMBINING DOUBLE INVERTED BREVE BELOW -// 1dfd COMBINING ALMOST EQUAL TO BELOW -// 1dfe COMBINING LEFT ARROWHEAD ABOVE -// 1dff COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW - { 0x1DFC, 0x4, 0x0, 0, 0 }, -// 1e00 LATIN CAPITAL LETTER A WITH RING BELOW - { 0x1E00, 0x1, 0x89, 1, 0 }, -// 1e01 LATIN SMALL LETTER A WITH RING BELOW - { 0x1E01, 0x1, 0x49, 0, -1 }, -// 1e02 LATIN CAPITAL LETTER B WITH DOT ABOVE - { 0x1E02, 0x1, 0x89, 1, 0 }, -// 1e03 LATIN SMALL LETTER B WITH DOT ABOVE - { 0x1E03, 0x1, 0x49, 0, -1 }, -// 1e04 LATIN CAPITAL LETTER B WITH DOT BELOW - { 0x1E04, 0x1, 0x89, 1, 0 }, -// 1e05 LATIN SMALL LETTER B WITH DOT BELOW - { 0x1E05, 0x1, 0x49, 0, -1 }, -// 1e06 LATIN CAPITAL LETTER B WITH LINE BELOW - { 0x1E06, 0x1, 0x89, 1, 0 }, -// 1e07 LATIN SMALL LETTER B WITH LINE BELOW - { 0x1E07, 0x1, 0x49, 0, -1 }, -// 1e08 LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE - { 0x1E08, 0x1, 0x89, 1, 0 }, -// 1e09 LATIN SMALL LETTER C WITH CEDILLA AND ACUTE - { 0x1E09, 0x1, 0x49, 0, -1 }, -// 1e0a LATIN CAPITAL LETTER D WITH DOT ABOVE - { 0x1E0A, 0x1, 0x89, 1, 0 }, -// 1e0b LATIN SMALL LETTER D WITH DOT ABOVE - { 0x1E0B, 0x1, 0x49, 0, -1 }, -// 1e0c LATIN CAPITAL LETTER D WITH DOT BELOW - { 0x1E0C, 0x1, 0x89, 1, 0 }, -// 1e0d LATIN SMALL LETTER D WITH DOT BELOW - { 0x1E0D, 0x1, 0x49, 0, -1 }, -// 1e0e LATIN CAPITAL LETTER D WITH LINE BELOW - { 0x1E0E, 0x1, 0x89, 1, 0 }, -// 1e0f LATIN SMALL LETTER D WITH LINE BELOW - { 0x1E0F, 0x1, 0x49, 0, -1 }, -// 1e10 LATIN CAPITAL LETTER D WITH CEDILLA - { 0x1E10, 0x1, 0x89, 1, 0 }, -// 1e11 LATIN SMALL LETTER D WITH CEDILLA - { 0x1E11, 0x1, 0x49, 0, -1 }, -// 1e12 LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW - { 0x1E12, 0x1, 0x89, 1, 0 }, -// 1e13 LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW - { 0x1E13, 0x1, 0x49, 0, -1 }, -// 1e14 LATIN CAPITAL LETTER E WITH MACRON AND GRAVE - { 0x1E14, 0x1, 0x89, 1, 0 }, -// 1e15 LATIN SMALL LETTER E WITH MACRON AND GRAVE - { 0x1E15, 0x1, 0x49, 0, -1 }, -// 1e16 LATIN CAPITAL LETTER E WITH MACRON AND ACUTE - { 0x1E16, 0x1, 0x89, 1, 0 }, -// 1e17 LATIN SMALL LETTER E WITH MACRON AND ACUTE - { 0x1E17, 0x1, 0x49, 0, -1 }, -// 1e18 LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW - { 0x1E18, 0x1, 0x89, 1, 0 }, -// 1e19 LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW - { 0x1E19, 0x1, 0x49, 0, -1 }, -// 1e1a LATIN CAPITAL LETTER E WITH TILDE BELOW - { 0x1E1A, 0x1, 0x89, 1, 0 }, -// 1e1b LATIN SMALL LETTER E WITH TILDE BELOW - { 0x1E1B, 0x1, 0x49, 0, -1 }, -// 1e1c LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE - { 0x1E1C, 0x1, 0x89, 1, 0 }, -// 1e1d LATIN SMALL LETTER E WITH CEDILLA AND BREVE - { 0x1E1D, 0x1, 0x49, 0, -1 }, -// 1e1e LATIN CAPITAL LETTER F WITH DOT ABOVE - { 0x1E1E, 0x1, 0x89, 1, 0 }, -// 1e1f LATIN SMALL LETTER F WITH DOT ABOVE - { 0x1E1F, 0x1, 0x49, 0, -1 }, -// 1e20 LATIN CAPITAL LETTER G WITH MACRON - { 0x1E20, 0x1, 0x89, 1, 0 }, -// 1e21 LATIN SMALL LETTER G WITH MACRON - { 0x1E21, 0x1, 0x49, 0, -1 }, -// 1e22 LATIN CAPITAL LETTER H WITH DOT ABOVE - { 0x1E22, 0x1, 0x89, 1, 0 }, -// 1e23 LATIN SMALL LETTER H WITH DOT ABOVE - { 0x1E23, 0x1, 0x49, 0, -1 }, -// 1e24 LATIN CAPITAL LETTER H WITH DOT BELOW - { 0x1E24, 0x1, 0x89, 1, 0 }, -// 1e25 LATIN SMALL LETTER H WITH DOT BELOW - { 0x1E25, 0x1, 0x49, 0, -1 }, -// 1e26 LATIN CAPITAL LETTER H WITH DIAERESIS - { 0x1E26, 0x1, 0x89, 1, 0 }, -// 1e27 LATIN SMALL LETTER H WITH DIAERESIS - { 0x1E27, 0x1, 0x49, 0, -1 }, -// 1e28 LATIN CAPITAL LETTER H WITH CEDILLA - { 0x1E28, 0x1, 0x89, 1, 0 }, -// 1e29 LATIN SMALL LETTER H WITH CEDILLA - { 0x1E29, 0x1, 0x49, 0, -1 }, -// 1e2a LATIN CAPITAL LETTER H WITH BREVE BELOW - { 0x1E2A, 0x1, 0x89, 1, 0 }, -// 1e2b LATIN SMALL LETTER H WITH BREVE BELOW - { 0x1E2B, 0x1, 0x49, 0, -1 }, -// 1e2c LATIN CAPITAL LETTER I WITH TILDE BELOW - { 0x1E2C, 0x1, 0x89, 1, 0 }, -// 1e2d LATIN SMALL LETTER I WITH TILDE BELOW - { 0x1E2D, 0x1, 0x49, 0, -1 }, -// 1e2e LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE - { 0x1E2E, 0x1, 0x89, 1, 0 }, -// 1e2f LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE - { 0x1E2F, 0x1, 0x49, 0, -1 }, -// 1e30 LATIN CAPITAL LETTER K WITH ACUTE - { 0x1E30, 0x1, 0x89, 1, 0 }, -// 1e31 LATIN SMALL LETTER K WITH ACUTE - { 0x1E31, 0x1, 0x49, 0, -1 }, -// 1e32 LATIN CAPITAL LETTER K WITH DOT BELOW - { 0x1E32, 0x1, 0x89, 1, 0 }, -// 1e33 LATIN SMALL LETTER K WITH DOT BELOW - { 0x1E33, 0x1, 0x49, 0, -1 }, -// 1e34 LATIN CAPITAL LETTER K WITH LINE BELOW - { 0x1E34, 0x1, 0x89, 1, 0 }, -// 1e35 LATIN SMALL LETTER K WITH LINE BELOW - { 0x1E35, 0x1, 0x49, 0, -1 }, -// 1e36 LATIN CAPITAL LETTER L WITH DOT BELOW - { 0x1E36, 0x1, 0x89, 1, 0 }, -// 1e37 LATIN SMALL LETTER L WITH DOT BELOW - { 0x1E37, 0x1, 0x49, 0, -1 }, -// 1e38 LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON - { 0x1E38, 0x1, 0x89, 1, 0 }, -// 1e39 LATIN SMALL LETTER L WITH DOT BELOW AND MACRON - { 0x1E39, 0x1, 0x49, 0, -1 }, -// 1e3a LATIN CAPITAL LETTER L WITH LINE BELOW - { 0x1E3A, 0x1, 0x89, 1, 0 }, -// 1e3b LATIN SMALL LETTER L WITH LINE BELOW - { 0x1E3B, 0x1, 0x49, 0, -1 }, -// 1e3c LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW - { 0x1E3C, 0x1, 0x89, 1, 0 }, -// 1e3d LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW - { 0x1E3D, 0x1, 0x49, 0, -1 }, -// 1e3e LATIN CAPITAL LETTER M WITH ACUTE - { 0x1E3E, 0x1, 0x89, 1, 0 }, -// 1e3f LATIN SMALL LETTER M WITH ACUTE - { 0x1E3F, 0x1, 0x49, 0, -1 }, -// 1e40 LATIN CAPITAL LETTER M WITH DOT ABOVE - { 0x1E40, 0x1, 0x89, 1, 0 }, -// 1e41 LATIN SMALL LETTER M WITH DOT ABOVE - { 0x1E41, 0x1, 0x49, 0, -1 }, -// 1e42 LATIN CAPITAL LETTER M WITH DOT BELOW - { 0x1E42, 0x1, 0x89, 1, 0 }, -// 1e43 LATIN SMALL LETTER M WITH DOT BELOW - { 0x1E43, 0x1, 0x49, 0, -1 }, -// 1e44 LATIN CAPITAL LETTER N WITH DOT ABOVE - { 0x1E44, 0x1, 0x89, 1, 0 }, -// 1e45 LATIN SMALL LETTER N WITH DOT ABOVE - { 0x1E45, 0x1, 0x49, 0, -1 }, -// 1e46 LATIN CAPITAL LETTER N WITH DOT BELOW - { 0x1E46, 0x1, 0x89, 1, 0 }, -// 1e47 LATIN SMALL LETTER N WITH DOT BELOW - { 0x1E47, 0x1, 0x49, 0, -1 }, -// 1e48 LATIN CAPITAL LETTER N WITH LINE BELOW - { 0x1E48, 0x1, 0x89, 1, 0 }, -// 1e49 LATIN SMALL LETTER N WITH LINE BELOW - { 0x1E49, 0x1, 0x49, 0, -1 }, -// 1e4a LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW - { 0x1E4A, 0x1, 0x89, 1, 0 }, -// 1e4b LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW - { 0x1E4B, 0x1, 0x49, 0, -1 }, -// 1e4c LATIN CAPITAL LETTER O WITH TILDE AND ACUTE - { 0x1E4C, 0x1, 0x89, 1, 0 }, -// 1e4d LATIN SMALL LETTER O WITH TILDE AND ACUTE - { 0x1E4D, 0x1, 0x49, 0, -1 }, -// 1e4e LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS - { 0x1E4E, 0x1, 0x89, 1, 0 }, -// 1e4f LATIN SMALL LETTER O WITH TILDE AND DIAERESIS - { 0x1E4F, 0x1, 0x49, 0, -1 }, -// 1e50 LATIN CAPITAL LETTER O WITH MACRON AND GRAVE - { 0x1E50, 0x1, 0x89, 1, 0 }, -// 1e51 LATIN SMALL LETTER O WITH MACRON AND GRAVE - { 0x1E51, 0x1, 0x49, 0, -1 }, -// 1e52 LATIN CAPITAL LETTER O WITH MACRON AND ACUTE - { 0x1E52, 0x1, 0x89, 1, 0 }, -// 1e53 LATIN SMALL LETTER O WITH MACRON AND ACUTE - { 0x1E53, 0x1, 0x49, 0, -1 }, -// 1e54 LATIN CAPITAL LETTER P WITH ACUTE - { 0x1E54, 0x1, 0x89, 1, 0 }, -// 1e55 LATIN SMALL LETTER P WITH ACUTE - { 0x1E55, 0x1, 0x49, 0, -1 }, -// 1e56 LATIN CAPITAL LETTER P WITH DOT ABOVE - { 0x1E56, 0x1, 0x89, 1, 0 }, -// 1e57 LATIN SMALL LETTER P WITH DOT ABOVE - { 0x1E57, 0x1, 0x49, 0, -1 }, -// 1e58 LATIN CAPITAL LETTER R WITH DOT ABOVE - { 0x1E58, 0x1, 0x89, 1, 0 }, -// 1e59 LATIN SMALL LETTER R WITH DOT ABOVE - { 0x1E59, 0x1, 0x49, 0, -1 }, -// 1e5a LATIN CAPITAL LETTER R WITH DOT BELOW - { 0x1E5A, 0x1, 0x89, 1, 0 }, -// 1e5b LATIN SMALL LETTER R WITH DOT BELOW - { 0x1E5B, 0x1, 0x49, 0, -1 }, -// 1e5c LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON - { 0x1E5C, 0x1, 0x89, 1, 0 }, -// 1e5d LATIN SMALL LETTER R WITH DOT BELOW AND MACRON - { 0x1E5D, 0x1, 0x49, 0, -1 }, -// 1e5e LATIN CAPITAL LETTER R WITH LINE BELOW - { 0x1E5E, 0x1, 0x89, 1, 0 }, -// 1e5f LATIN SMALL LETTER R WITH LINE BELOW - { 0x1E5F, 0x1, 0x49, 0, -1 }, -// 1e60 LATIN CAPITAL LETTER S WITH DOT ABOVE - { 0x1E60, 0x1, 0x89, 1, 0 }, -// 1e61 LATIN SMALL LETTER S WITH DOT ABOVE - { 0x1E61, 0x1, 0x49, 0, -1 }, -// 1e62 LATIN CAPITAL LETTER S WITH DOT BELOW - { 0x1E62, 0x1, 0x89, 1, 0 }, -// 1e63 LATIN SMALL LETTER S WITH DOT BELOW - { 0x1E63, 0x1, 0x49, 0, -1 }, -// 1e64 LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE - { 0x1E64, 0x1, 0x89, 1, 0 }, -// 1e65 LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE - { 0x1E65, 0x1, 0x49, 0, -1 }, -// 1e66 LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE - { 0x1E66, 0x1, 0x89, 1, 0 }, -// 1e67 LATIN SMALL LETTER S WITH CARON AND DOT ABOVE - { 0x1E67, 0x1, 0x49, 0, -1 }, -// 1e68 LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE - { 0x1E68, 0x1, 0x89, 1, 0 }, -// 1e69 LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE - { 0x1E69, 0x1, 0x49, 0, -1 }, -// 1e6a LATIN CAPITAL LETTER T WITH DOT ABOVE - { 0x1E6A, 0x1, 0x89, 1, 0 }, -// 1e6b LATIN SMALL LETTER T WITH DOT ABOVE - { 0x1E6B, 0x1, 0x49, 0, -1 }, -// 1e6c LATIN CAPITAL LETTER T WITH DOT BELOW - { 0x1E6C, 0x1, 0x89, 1, 0 }, -// 1e6d LATIN SMALL LETTER T WITH DOT BELOW - { 0x1E6D, 0x1, 0x49, 0, -1 }, -// 1e6e LATIN CAPITAL LETTER T WITH LINE BELOW - { 0x1E6E, 0x1, 0x89, 1, 0 }, -// 1e6f LATIN SMALL LETTER T WITH LINE BELOW - { 0x1E6F, 0x1, 0x49, 0, -1 }, -// 1e70 LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW - { 0x1E70, 0x1, 0x89, 1, 0 }, -// 1e71 LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW - { 0x1E71, 0x1, 0x49, 0, -1 }, -// 1e72 LATIN CAPITAL LETTER U WITH DIAERESIS BELOW - { 0x1E72, 0x1, 0x89, 1, 0 }, -// 1e73 LATIN SMALL LETTER U WITH DIAERESIS BELOW - { 0x1E73, 0x1, 0x49, 0, -1 }, -// 1e74 LATIN CAPITAL LETTER U WITH TILDE BELOW - { 0x1E74, 0x1, 0x89, 1, 0 }, -// 1e75 LATIN SMALL LETTER U WITH TILDE BELOW - { 0x1E75, 0x1, 0x49, 0, -1 }, -// 1e76 LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW - { 0x1E76, 0x1, 0x89, 1, 0 }, -// 1e77 LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW - { 0x1E77, 0x1, 0x49, 0, -1 }, -// 1e78 LATIN CAPITAL LETTER U WITH TILDE AND ACUTE - { 0x1E78, 0x1, 0x89, 1, 0 }, -// 1e79 LATIN SMALL LETTER U WITH TILDE AND ACUTE - { 0x1E79, 0x1, 0x49, 0, -1 }, -// 1e7a LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS - { 0x1E7A, 0x1, 0x89, 1, 0 }, -// 1e7b LATIN SMALL LETTER U WITH MACRON AND DIAERESIS - { 0x1E7B, 0x1, 0x49, 0, -1 }, -// 1e7c LATIN CAPITAL LETTER V WITH TILDE - { 0x1E7C, 0x1, 0x89, 1, 0 }, -// 1e7d LATIN SMALL LETTER V WITH TILDE - { 0x1E7D, 0x1, 0x49, 0, -1 }, -// 1e7e LATIN CAPITAL LETTER V WITH DOT BELOW - { 0x1E7E, 0x1, 0x89, 1, 0 }, -// 1e7f LATIN SMALL LETTER V WITH DOT BELOW - { 0x1E7F, 0x1, 0x49, 0, -1 }, -// 1e80 LATIN CAPITAL LETTER W WITH GRAVE - { 0x1E80, 0x1, 0x89, 1, 0 }, -// 1e81 LATIN SMALL LETTER W WITH GRAVE - { 0x1E81, 0x1, 0x49, 0, -1 }, -// 1e82 LATIN CAPITAL LETTER W WITH ACUTE - { 0x1E82, 0x1, 0x89, 1, 0 }, -// 1e83 LATIN SMALL LETTER W WITH ACUTE - { 0x1E83, 0x1, 0x49, 0, -1 }, -// 1e84 LATIN CAPITAL LETTER W WITH DIAERESIS - { 0x1E84, 0x1, 0x89, 1, 0 }, -// 1e85 LATIN SMALL LETTER W WITH DIAERESIS - { 0x1E85, 0x1, 0x49, 0, -1 }, -// 1e86 LATIN CAPITAL LETTER W WITH DOT ABOVE - { 0x1E86, 0x1, 0x89, 1, 0 }, -// 1e87 LATIN SMALL LETTER W WITH DOT ABOVE - { 0x1E87, 0x1, 0x49, 0, -1 }, -// 1e88 LATIN CAPITAL LETTER W WITH DOT BELOW - { 0x1E88, 0x1, 0x89, 1, 0 }, -// 1e89 LATIN SMALL LETTER W WITH DOT BELOW - { 0x1E89, 0x1, 0x49, 0, -1 }, -// 1e8a LATIN CAPITAL LETTER X WITH DOT ABOVE - { 0x1E8A, 0x1, 0x89, 1, 0 }, -// 1e8b LATIN SMALL LETTER X WITH DOT ABOVE - { 0x1E8B, 0x1, 0x49, 0, -1 }, -// 1e8c LATIN CAPITAL LETTER X WITH DIAERESIS - { 0x1E8C, 0x1, 0x89, 1, 0 }, -// 1e8d LATIN SMALL LETTER X WITH DIAERESIS - { 0x1E8D, 0x1, 0x49, 0, -1 }, -// 1e8e LATIN CAPITAL LETTER Y WITH DOT ABOVE - { 0x1E8E, 0x1, 0x89, 1, 0 }, -// 1e8f LATIN SMALL LETTER Y WITH DOT ABOVE - { 0x1E8F, 0x1, 0x49, 0, -1 }, -// 1e90 LATIN CAPITAL LETTER Z WITH CIRCUMFLEX - { 0x1E90, 0x1, 0x89, 1, 0 }, -// 1e91 LATIN SMALL LETTER Z WITH CIRCUMFLEX - { 0x1E91, 0x1, 0x49, 0, -1 }, -// 1e92 LATIN CAPITAL LETTER Z WITH DOT BELOW - { 0x1E92, 0x1, 0x89, 1, 0 }, -// 1e93 LATIN SMALL LETTER Z WITH DOT BELOW - { 0x1E93, 0x1, 0x49, 0, -1 }, -// 1e94 LATIN CAPITAL LETTER Z WITH LINE BELOW - { 0x1E94, 0x1, 0x89, 1, 0 }, -// 1e95 LATIN SMALL LETTER Z WITH LINE BELOW - { 0x1E95, 0x1, 0x49, 0, -1 }, -// 1e96 LATIN SMALL LETTER H WITH LINE BELOW -// 1e97 LATIN SMALL LETTER T WITH DIAERESIS -// 1e98 LATIN SMALL LETTER W WITH RING ABOVE -// 1e99 LATIN SMALL LETTER Y WITH RING ABOVE -// 1e9a LATIN SMALL LETTER A WITH RIGHT HALF RING - { 0x1E96, 0x5, 0x49, 0, 0 }, -// 1e9b LATIN SMALL LETTER LONG S WITH DOT ABOVE - { 0x1E9B, 0x1, 0x49, 0, -59 }, -// 1e9c LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE -// 1e9d LATIN SMALL LETTER LONG S WITH HIGH STROKE - { 0x1E9C, 0x2, 0x49, 0, 0 }, -// 1e9e LATIN CAPITAL LETTER SHARP S - { 0x1E9E, 0x1, 0x89, -7615, 0 }, -// 1e9f LATIN SMALL LETTER DELTA - { 0x1E9F, 0x1, 0x49, 0, 0 }, -// 1ea0 LATIN CAPITAL LETTER A WITH DOT BELOW - { 0x1EA0, 0x1, 0x89, 1, 0 }, -// 1ea1 LATIN SMALL LETTER A WITH DOT BELOW - { 0x1EA1, 0x1, 0x49, 0, -1 }, -// 1ea2 LATIN CAPITAL LETTER A WITH HOOK ABOVE - { 0x1EA2, 0x1, 0x89, 1, 0 }, -// 1ea3 LATIN SMALL LETTER A WITH HOOK ABOVE - { 0x1EA3, 0x1, 0x49, 0, -1 }, -// 1ea4 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE - { 0x1EA4, 0x1, 0x89, 1, 0 }, -// 1ea5 LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE - { 0x1EA5, 0x1, 0x49, 0, -1 }, -// 1ea6 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE - { 0x1EA6, 0x1, 0x89, 1, 0 }, -// 1ea7 LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE - { 0x1EA7, 0x1, 0x49, 0, -1 }, -// 1ea8 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE - { 0x1EA8, 0x1, 0x89, 1, 0 }, -// 1ea9 LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE - { 0x1EA9, 0x1, 0x49, 0, -1 }, -// 1eaa LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE - { 0x1EAA, 0x1, 0x89, 1, 0 }, -// 1eab LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE - { 0x1EAB, 0x1, 0x49, 0, -1 }, -// 1eac LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW - { 0x1EAC, 0x1, 0x89, 1, 0 }, -// 1ead LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW - { 0x1EAD, 0x1, 0x49, 0, -1 }, -// 1eae LATIN CAPITAL LETTER A WITH BREVE AND ACUTE - { 0x1EAE, 0x1, 0x89, 1, 0 }, -// 1eaf LATIN SMALL LETTER A WITH BREVE AND ACUTE - { 0x1EAF, 0x1, 0x49, 0, -1 }, -// 1eb0 LATIN CAPITAL LETTER A WITH BREVE AND GRAVE - { 0x1EB0, 0x1, 0x89, 1, 0 }, -// 1eb1 LATIN SMALL LETTER A WITH BREVE AND GRAVE - { 0x1EB1, 0x1, 0x49, 0, -1 }, -// 1eb2 LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE - { 0x1EB2, 0x1, 0x89, 1, 0 }, -// 1eb3 LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE - { 0x1EB3, 0x1, 0x49, 0, -1 }, -// 1eb4 LATIN CAPITAL LETTER A WITH BREVE AND TILDE - { 0x1EB4, 0x1, 0x89, 1, 0 }, -// 1eb5 LATIN SMALL LETTER A WITH BREVE AND TILDE - { 0x1EB5, 0x1, 0x49, 0, -1 }, -// 1eb6 LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW - { 0x1EB6, 0x1, 0x89, 1, 0 }, -// 1eb7 LATIN SMALL LETTER A WITH BREVE AND DOT BELOW - { 0x1EB7, 0x1, 0x49, 0, -1 }, -// 1eb8 LATIN CAPITAL LETTER E WITH DOT BELOW - { 0x1EB8, 0x1, 0x89, 1, 0 }, -// 1eb9 LATIN SMALL LETTER E WITH DOT BELOW - { 0x1EB9, 0x1, 0x49, 0, -1 }, -// 1eba LATIN CAPITAL LETTER E WITH HOOK ABOVE - { 0x1EBA, 0x1, 0x89, 1, 0 }, -// 1ebb LATIN SMALL LETTER E WITH HOOK ABOVE - { 0x1EBB, 0x1, 0x49, 0, -1 }, -// 1ebc LATIN CAPITAL LETTER E WITH TILDE - { 0x1EBC, 0x1, 0x89, 1, 0 }, -// 1ebd LATIN SMALL LETTER E WITH TILDE - { 0x1EBD, 0x1, 0x49, 0, -1 }, -// 1ebe LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE - { 0x1EBE, 0x1, 0x89, 1, 0 }, -// 1ebf LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE - { 0x1EBF, 0x1, 0x49, 0, -1 }, -// 1ec0 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE - { 0x1EC0, 0x1, 0x89, 1, 0 }, -// 1ec1 LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE - { 0x1EC1, 0x1, 0x49, 0, -1 }, -// 1ec2 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE - { 0x1EC2, 0x1, 0x89, 1, 0 }, -// 1ec3 LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE - { 0x1EC3, 0x1, 0x49, 0, -1 }, -// 1ec4 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE - { 0x1EC4, 0x1, 0x89, 1, 0 }, -// 1ec5 LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE - { 0x1EC5, 0x1, 0x49, 0, -1 }, -// 1ec6 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW - { 0x1EC6, 0x1, 0x89, 1, 0 }, -// 1ec7 LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW - { 0x1EC7, 0x1, 0x49, 0, -1 }, -// 1ec8 LATIN CAPITAL LETTER I WITH HOOK ABOVE - { 0x1EC8, 0x1, 0x89, 1, 0 }, -// 1ec9 LATIN SMALL LETTER I WITH HOOK ABOVE - { 0x1EC9, 0x1, 0x49, 0, -1 }, -// 1eca LATIN CAPITAL LETTER I WITH DOT BELOW - { 0x1ECA, 0x1, 0x89, 1, 0 }, -// 1ecb LATIN SMALL LETTER I WITH DOT BELOW - { 0x1ECB, 0x1, 0x49, 0, -1 }, -// 1ecc LATIN CAPITAL LETTER O WITH DOT BELOW - { 0x1ECC, 0x1, 0x89, 1, 0 }, -// 1ecd LATIN SMALL LETTER O WITH DOT BELOW - { 0x1ECD, 0x1, 0x49, 0, -1 }, -// 1ece LATIN CAPITAL LETTER O WITH HOOK ABOVE - { 0x1ECE, 0x1, 0x89, 1, 0 }, -// 1ecf LATIN SMALL LETTER O WITH HOOK ABOVE - { 0x1ECF, 0x1, 0x49, 0, -1 }, -// 1ed0 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE - { 0x1ED0, 0x1, 0x89, 1, 0 }, -// 1ed1 LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE - { 0x1ED1, 0x1, 0x49, 0, -1 }, -// 1ed2 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE - { 0x1ED2, 0x1, 0x89, 1, 0 }, -// 1ed3 LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE - { 0x1ED3, 0x1, 0x49, 0, -1 }, -// 1ed4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE - { 0x1ED4, 0x1, 0x89, 1, 0 }, -// 1ed5 LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE - { 0x1ED5, 0x1, 0x49, 0, -1 }, -// 1ed6 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE - { 0x1ED6, 0x1, 0x89, 1, 0 }, -// 1ed7 LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE - { 0x1ED7, 0x1, 0x49, 0, -1 }, -// 1ed8 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW - { 0x1ED8, 0x1, 0x89, 1, 0 }, -// 1ed9 LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW - { 0x1ED9, 0x1, 0x49, 0, -1 }, -// 1eda LATIN CAPITAL LETTER O WITH HORN AND ACUTE - { 0x1EDA, 0x1, 0x89, 1, 0 }, -// 1edb LATIN SMALL LETTER O WITH HORN AND ACUTE - { 0x1EDB, 0x1, 0x49, 0, -1 }, -// 1edc LATIN CAPITAL LETTER O WITH HORN AND GRAVE - { 0x1EDC, 0x1, 0x89, 1, 0 }, -// 1edd LATIN SMALL LETTER O WITH HORN AND GRAVE - { 0x1EDD, 0x1, 0x49, 0, -1 }, -// 1ede LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE - { 0x1EDE, 0x1, 0x89, 1, 0 }, -// 1edf LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE - { 0x1EDF, 0x1, 0x49, 0, -1 }, -// 1ee0 LATIN CAPITAL LETTER O WITH HORN AND TILDE - { 0x1EE0, 0x1, 0x89, 1, 0 }, -// 1ee1 LATIN SMALL LETTER O WITH HORN AND TILDE - { 0x1EE1, 0x1, 0x49, 0, -1 }, -// 1ee2 LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW - { 0x1EE2, 0x1, 0x89, 1, 0 }, -// 1ee3 LATIN SMALL LETTER O WITH HORN AND DOT BELOW - { 0x1EE3, 0x1, 0x49, 0, -1 }, -// 1ee4 LATIN CAPITAL LETTER U WITH DOT BELOW - { 0x1EE4, 0x1, 0x89, 1, 0 }, -// 1ee5 LATIN SMALL LETTER U WITH DOT BELOW - { 0x1EE5, 0x1, 0x49, 0, -1 }, -// 1ee6 LATIN CAPITAL LETTER U WITH HOOK ABOVE - { 0x1EE6, 0x1, 0x89, 1, 0 }, -// 1ee7 LATIN SMALL LETTER U WITH HOOK ABOVE - { 0x1EE7, 0x1, 0x49, 0, -1 }, -// 1ee8 LATIN CAPITAL LETTER U WITH HORN AND ACUTE - { 0x1EE8, 0x1, 0x89, 1, 0 }, -// 1ee9 LATIN SMALL LETTER U WITH HORN AND ACUTE - { 0x1EE9, 0x1, 0x49, 0, -1 }, -// 1eea LATIN CAPITAL LETTER U WITH HORN AND GRAVE - { 0x1EEA, 0x1, 0x89, 1, 0 }, -// 1eeb LATIN SMALL LETTER U WITH HORN AND GRAVE - { 0x1EEB, 0x1, 0x49, 0, -1 }, -// 1eec LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE - { 0x1EEC, 0x1, 0x89, 1, 0 }, -// 1eed LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE - { 0x1EED, 0x1, 0x49, 0, -1 }, -// 1eee LATIN CAPITAL LETTER U WITH HORN AND TILDE - { 0x1EEE, 0x1, 0x89, 1, 0 }, -// 1eef LATIN SMALL LETTER U WITH HORN AND TILDE - { 0x1EEF, 0x1, 0x49, 0, -1 }, -// 1ef0 LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW - { 0x1EF0, 0x1, 0x89, 1, 0 }, -// 1ef1 LATIN SMALL LETTER U WITH HORN AND DOT BELOW - { 0x1EF1, 0x1, 0x49, 0, -1 }, -// 1ef2 LATIN CAPITAL LETTER Y WITH GRAVE - { 0x1EF2, 0x1, 0x89, 1, 0 }, -// 1ef3 LATIN SMALL LETTER Y WITH GRAVE - { 0x1EF3, 0x1, 0x49, 0, -1 }, -// 1ef4 LATIN CAPITAL LETTER Y WITH DOT BELOW - { 0x1EF4, 0x1, 0x89, 1, 0 }, -// 1ef5 LATIN SMALL LETTER Y WITH DOT BELOW - { 0x1EF5, 0x1, 0x49, 0, -1 }, -// 1ef6 LATIN CAPITAL LETTER Y WITH HOOK ABOVE - { 0x1EF6, 0x1, 0x89, 1, 0 }, -// 1ef7 LATIN SMALL LETTER Y WITH HOOK ABOVE - { 0x1EF7, 0x1, 0x49, 0, -1 }, -// 1ef8 LATIN CAPITAL LETTER Y WITH TILDE - { 0x1EF8, 0x1, 0x89, 1, 0 }, -// 1ef9 LATIN SMALL LETTER Y WITH TILDE - { 0x1EF9, 0x1, 0x49, 0, -1 }, -// 1efa LATIN CAPITAL LETTER MIDDLE-WELSH LL - { 0x1EFA, 0x1, 0x89, 1, 0 }, -// 1efb LATIN SMALL LETTER MIDDLE-WELSH LL - { 0x1EFB, 0x1, 0x49, 0, -1 }, -// 1efc LATIN CAPITAL LETTER MIDDLE-WELSH V - { 0x1EFC, 0x1, 0x89, 1, 0 }, -// 1efd LATIN SMALL LETTER MIDDLE-WELSH V - { 0x1EFD, 0x1, 0x49, 0, -1 }, -// 1efe LATIN CAPITAL LETTER Y WITH LOOP - { 0x1EFE, 0x1, 0x89, 1, 0 }, -// 1eff LATIN SMALL LETTER Y WITH LOOP - { 0x1EFF, 0x1, 0x49, 0, -1 }, -// 1f00 GREEK SMALL LETTER ALPHA WITH PSILI -// 1f01 GREEK SMALL LETTER ALPHA WITH DASIA -// 1f02 GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA -// 1f03 GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA -// 1f04 GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA -// 1f05 GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA -// 1f06 GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI -// 1f07 GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI - { 0x1F00, 0x8, 0x49, 0, 8 }, -// 1f08 GREEK CAPITAL LETTER ALPHA WITH PSILI -// 1f09 GREEK CAPITAL LETTER ALPHA WITH DASIA -// 1f0a GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA -// 1f0b GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA -// 1f0c GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA -// 1f0d GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA -// 1f0e GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI -// 1f0f GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI - { 0x1F08, 0x8, 0x89, -8, 0 }, -// 1f10 GREEK SMALL LETTER EPSILON WITH PSILI -// 1f11 GREEK SMALL LETTER EPSILON WITH DASIA -// 1f12 GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA -// 1f13 GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA -// 1f14 GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA -// 1f15 GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA - { 0x1F10, 0x6, 0x49, 0, 8 }, -// 1f18 GREEK CAPITAL LETTER EPSILON WITH PSILI -// 1f19 GREEK CAPITAL LETTER EPSILON WITH DASIA -// 1f1a GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA -// 1f1b GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA -// 1f1c GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA -// 1f1d GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA - { 0x1F18, 0x6, 0x89, -8, 0 }, -// 1f20 GREEK SMALL LETTER ETA WITH PSILI -// 1f21 GREEK SMALL LETTER ETA WITH DASIA -// 1f22 GREEK SMALL LETTER ETA WITH PSILI AND VARIA -// 1f23 GREEK SMALL LETTER ETA WITH DASIA AND VARIA -// 1f24 GREEK SMALL LETTER ETA WITH PSILI AND OXIA -// 1f25 GREEK SMALL LETTER ETA WITH DASIA AND OXIA -// 1f26 GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI -// 1f27 GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI - { 0x1F20, 0x8, 0x49, 0, 8 }, -// 1f28 GREEK CAPITAL LETTER ETA WITH PSILI -// 1f29 GREEK CAPITAL LETTER ETA WITH DASIA -// 1f2a GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA -// 1f2b GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA -// 1f2c GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA -// 1f2d GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA -// 1f2e GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI -// 1f2f GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI - { 0x1F28, 0x8, 0x89, -8, 0 }, -// 1f30 GREEK SMALL LETTER IOTA WITH PSILI -// 1f31 GREEK SMALL LETTER IOTA WITH DASIA -// 1f32 GREEK SMALL LETTER IOTA WITH PSILI AND VARIA -// 1f33 GREEK SMALL LETTER IOTA WITH DASIA AND VARIA -// 1f34 GREEK SMALL LETTER IOTA WITH PSILI AND OXIA -// 1f35 GREEK SMALL LETTER IOTA WITH DASIA AND OXIA -// 1f36 GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI -// 1f37 GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI - { 0x1F30, 0x8, 0x49, 0, 8 }, -// 1f38 GREEK CAPITAL LETTER IOTA WITH PSILI -// 1f39 GREEK CAPITAL LETTER IOTA WITH DASIA -// 1f3a GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA -// 1f3b GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA -// 1f3c GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA -// 1f3d GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA -// 1f3e GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI -// 1f3f GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI - { 0x1F38, 0x8, 0x89, -8, 0 }, -// 1f40 GREEK SMALL LETTER OMICRON WITH PSILI -// 1f41 GREEK SMALL LETTER OMICRON WITH DASIA -// 1f42 GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA -// 1f43 GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA -// 1f44 GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA -// 1f45 GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA - { 0x1F40, 0x6, 0x49, 0, 8 }, -// 1f48 GREEK CAPITAL LETTER OMICRON WITH PSILI -// 1f49 GREEK CAPITAL LETTER OMICRON WITH DASIA -// 1f4a GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA -// 1f4b GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA -// 1f4c GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA -// 1f4d GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA - { 0x1F48, 0x6, 0x89, -8, 0 }, -// 1f50 GREEK SMALL LETTER UPSILON WITH PSILI - { 0x1F50, 0x1, 0x49, 0, 0 }, -// 1f51 GREEK SMALL LETTER UPSILON WITH DASIA - { 0x1F51, 0x1, 0x49, 0, 8 }, -// 1f52 GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA - { 0x1F52, 0x1, 0x49, 0, 0 }, -// 1f53 GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA - { 0x1F53, 0x1, 0x49, 0, 8 }, -// 1f54 GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA - { 0x1F54, 0x1, 0x49, 0, 0 }, -// 1f55 GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA - { 0x1F55, 0x1, 0x49, 0, 8 }, -// 1f56 GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI - { 0x1F56, 0x1, 0x49, 0, 0 }, -// 1f57 GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI - { 0x1F57, 0x1, 0x49, 0, 8 }, -// 1f59 GREEK CAPITAL LETTER UPSILON WITH DASIA - { 0x1F59, 0x1, 0x89, -8, 0 }, -// 1f5b GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA - { 0x1F5B, 0x1, 0x89, -8, 0 }, -// 1f5d GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA - { 0x1F5D, 0x1, 0x89, -8, 0 }, -// 1f5f GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI - { 0x1F5F, 0x1, 0x89, -8, 0 }, -// 1f60 GREEK SMALL LETTER OMEGA WITH PSILI -// 1f61 GREEK SMALL LETTER OMEGA WITH DASIA -// 1f62 GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA -// 1f63 GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA -// 1f64 GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA -// 1f65 GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA -// 1f66 GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI -// 1f67 GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI - { 0x1F60, 0x8, 0x49, 0, 8 }, -// 1f68 GREEK CAPITAL LETTER OMEGA WITH PSILI -// 1f69 GREEK CAPITAL LETTER OMEGA WITH DASIA -// 1f6a GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA -// 1f6b GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA -// 1f6c GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA -// 1f6d GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA -// 1f6e GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI -// 1f6f GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI - { 0x1F68, 0x8, 0x89, -8, 0 }, -// 1f70 GREEK SMALL LETTER ALPHA WITH VARIA -// 1f71 GREEK SMALL LETTER ALPHA WITH OXIA - { 0x1F70, 0x2, 0x49, 0, 74 }, -// 1f72 GREEK SMALL LETTER EPSILON WITH VARIA -// 1f73 GREEK SMALL LETTER EPSILON WITH OXIA -// 1f74 GREEK SMALL LETTER ETA WITH VARIA -// 1f75 GREEK SMALL LETTER ETA WITH OXIA - { 0x1F72, 0x4, 0x49, 0, 86 }, -// 1f76 GREEK SMALL LETTER IOTA WITH VARIA -// 1f77 GREEK SMALL LETTER IOTA WITH OXIA - { 0x1F76, 0x2, 0x49, 0, 100 }, -// 1f78 GREEK SMALL LETTER OMICRON WITH VARIA -// 1f79 GREEK SMALL LETTER OMICRON WITH OXIA - { 0x1F78, 0x2, 0x49, 0, 128 }, -// 1f7a GREEK SMALL LETTER UPSILON WITH VARIA -// 1f7b GREEK SMALL LETTER UPSILON WITH OXIA - { 0x1F7A, 0x2, 0x49, 0, 112 }, -// 1f7c GREEK SMALL LETTER OMEGA WITH VARIA -// 1f7d GREEK SMALL LETTER OMEGA WITH OXIA - { 0x1F7C, 0x2, 0x49, 0, 126 }, -// 1f80 GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI -// 1f81 GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI -// 1f82 GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI -// 1f83 GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI -// 1f84 GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI -// 1f85 GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI -// 1f86 GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI -// 1f87 GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI - { 0x1F80, 0x8, 0x49, 0, 8 }, -// 1f88 GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI -// 1f89 GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI -// 1f8a GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI -// 1f8b GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI -// 1f8c GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI -// 1f8d GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI -// 1f8e GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI -// 1f8f GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI - { 0x1F88, 0x8, 0x89, -8, 0 }, -// 1f90 GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI -// 1f91 GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI -// 1f92 GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI -// 1f93 GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI -// 1f94 GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI -// 1f95 GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI -// 1f96 GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI -// 1f97 GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI - { 0x1F90, 0x8, 0x49, 0, 8 }, -// 1f98 GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI -// 1f99 GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI -// 1f9a GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI -// 1f9b GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI -// 1f9c GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI -// 1f9d GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI -// 1f9e GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI -// 1f9f GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI - { 0x1F98, 0x8, 0x89, -8, 0 }, -// 1fa0 GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI -// 1fa1 GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI -// 1fa2 GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI -// 1fa3 GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI -// 1fa4 GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI -// 1fa5 GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI -// 1fa6 GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI -// 1fa7 GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI - { 0x1FA0, 0x8, 0x49, 0, 8 }, -// 1fa8 GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI -// 1fa9 GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI -// 1faa GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI -// 1fab GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI -// 1fac GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI -// 1fad GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI -// 1fae GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI -// 1faf GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI - { 0x1FA8, 0x8, 0x89, -8, 0 }, -// 1fb0 GREEK SMALL LETTER ALPHA WITH VRACHY -// 1fb1 GREEK SMALL LETTER ALPHA WITH MACRON - { 0x1FB0, 0x2, 0x49, 0, 8 }, -// 1fb2 GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI - { 0x1FB2, 0x1, 0x49, 0, 0 }, -// 1fb3 GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI - { 0x1FB3, 0x1, 0x49, 0, 9 }, -// 1fb4 GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI - { 0x1FB4, 0x1, 0x49, 0, 0 }, -// 1fb6 GREEK SMALL LETTER ALPHA WITH PERISPOMENI -// 1fb7 GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI - { 0x1FB6, 0x2, 0x49, 0, 0 }, -// 1fb8 GREEK CAPITAL LETTER ALPHA WITH VRACHY -// 1fb9 GREEK CAPITAL LETTER ALPHA WITH MACRON - { 0x1FB8, 0x2, 0x89, -8, 0 }, -// 1fba GREEK CAPITAL LETTER ALPHA WITH VARIA -// 1fbb GREEK CAPITAL LETTER ALPHA WITH OXIA - { 0x1FBA, 0x2, 0x89, -74, 0 }, -// 1fbc GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI - { 0x1FBC, 0x1, 0x89, -9, 0 }, -// 1fbd GREEK KORONIS - { 0x1FBD, 0x1, 0x8, 0, 0 }, -// 1fbe GREEK PROSGEGRAMMENI - { 0x1FBE, 0x1, 0x49, 0, -7205 }, -// 1fbf GREEK PSILI -// 1fc0 GREEK PERISPOMENI -// 1fc1 GREEK DIALYTIKA AND PERISPOMENI - { 0x1FBF, 0x3, 0x8, 0, 0 }, -// 1fc2 GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI - { 0x1FC2, 0x1, 0x49, 0, 0 }, -// 1fc3 GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI - { 0x1FC3, 0x1, 0x49, 0, 9 }, -// 1fc4 GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI - { 0x1FC4, 0x1, 0x49, 0, 0 }, -// 1fc6 GREEK SMALL LETTER ETA WITH PERISPOMENI -// 1fc7 GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI - { 0x1FC6, 0x2, 0x49, 0, 0 }, -// 1fc8 GREEK CAPITAL LETTER EPSILON WITH VARIA -// 1fc9 GREEK CAPITAL LETTER EPSILON WITH OXIA -// 1fca GREEK CAPITAL LETTER ETA WITH VARIA -// 1fcb GREEK CAPITAL LETTER ETA WITH OXIA - { 0x1FC8, 0x4, 0x89, -86, 0 }, -// 1fcc GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI - { 0x1FCC, 0x1, 0x89, -9, 0 }, -// 1fcd GREEK PSILI AND VARIA -// 1fce GREEK PSILI AND OXIA -// 1fcf GREEK PSILI AND PERISPOMENI - { 0x1FCD, 0x3, 0x8, 0, 0 }, -// 1fd0 GREEK SMALL LETTER IOTA WITH VRACHY -// 1fd1 GREEK SMALL LETTER IOTA WITH MACRON - { 0x1FD0, 0x2, 0x49, 0, 8 }, -// 1fd2 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA -// 1fd3 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA - { 0x1FD2, 0x2, 0x49, 0, 0 }, -// 1fd6 GREEK SMALL LETTER IOTA WITH PERISPOMENI -// 1fd7 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI - { 0x1FD6, 0x2, 0x49, 0, 0 }, -// 1fd8 GREEK CAPITAL LETTER IOTA WITH VRACHY -// 1fd9 GREEK CAPITAL LETTER IOTA WITH MACRON - { 0x1FD8, 0x2, 0x89, -8, 0 }, -// 1fda GREEK CAPITAL LETTER IOTA WITH VARIA -// 1fdb GREEK CAPITAL LETTER IOTA WITH OXIA - { 0x1FDA, 0x2, 0x89, -100, 0 }, -// 1fdd GREEK DASIA AND VARIA -// 1fde GREEK DASIA AND OXIA -// 1fdf GREEK DASIA AND PERISPOMENI - { 0x1FDD, 0x3, 0x8, 0, 0 }, -// 1fe0 GREEK SMALL LETTER UPSILON WITH VRACHY -// 1fe1 GREEK SMALL LETTER UPSILON WITH MACRON - { 0x1FE0, 0x2, 0x49, 0, 8 }, -// 1fe2 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA -// 1fe3 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA -// 1fe4 GREEK SMALL LETTER RHO WITH PSILI - { 0x1FE2, 0x3, 0x49, 0, 0 }, -// 1fe5 GREEK SMALL LETTER RHO WITH DASIA - { 0x1FE5, 0x1, 0x49, 0, 7 }, -// 1fe6 GREEK SMALL LETTER UPSILON WITH PERISPOMENI -// 1fe7 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI - { 0x1FE6, 0x2, 0x49, 0, 0 }, -// 1fe8 GREEK CAPITAL LETTER UPSILON WITH VRACHY -// 1fe9 GREEK CAPITAL LETTER UPSILON WITH MACRON - { 0x1FE8, 0x2, 0x89, -8, 0 }, -// 1fea GREEK CAPITAL LETTER UPSILON WITH VARIA -// 1feb GREEK CAPITAL LETTER UPSILON WITH OXIA - { 0x1FEA, 0x2, 0x89, -112, 0 }, -// 1fec GREEK CAPITAL LETTER RHO WITH DASIA - { 0x1FEC, 0x1, 0x89, -7, 0 }, -// 1fed GREEK DIALYTIKA AND VARIA -// 1fee GREEK DIALYTIKA AND OXIA -// 1fef GREEK VARIA - { 0x1FED, 0x3, 0x8, 0, 0 }, -// 1ff2 GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI - { 0x1FF2, 0x1, 0x49, 0, 0 }, -// 1ff3 GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI - { 0x1FF3, 0x1, 0x49, 0, 9 }, -// 1ff4 GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI - { 0x1FF4, 0x1, 0x49, 0, 0 }, -// 1ff6 GREEK SMALL LETTER OMEGA WITH PERISPOMENI -// 1ff7 GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI - { 0x1FF6, 0x2, 0x49, 0, 0 }, -// 1ff8 GREEK CAPITAL LETTER OMICRON WITH VARIA -// 1ff9 GREEK CAPITAL LETTER OMICRON WITH OXIA - { 0x1FF8, 0x2, 0x89, -128, 0 }, -// 1ffa GREEK CAPITAL LETTER OMEGA WITH VARIA -// 1ffb GREEK CAPITAL LETTER OMEGA WITH OXIA - { 0x1FFA, 0x2, 0x89, -126, 0 }, -// 1ffc GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI - { 0x1FFC, 0x1, 0x89, -9, 0 }, -// 1ffd GREEK OXIA -// 1ffe GREEK DASIA - { 0x1FFD, 0x2, 0x8, 0, 0 }, -// 2000 EN QUAD -// 2001 EM QUAD -// 2002 EN SPACE -// 2003 EM SPACE -// 2004 THREE-PER-EM SPACE -// 2005 FOUR-PER-EM SPACE -// 2006 SIX-PER-EM SPACE -// 2007 FIGURE SPACE -// 2008 PUNCTUATION SPACE -// 2009 THIN SPACE -// 200a HAIR SPACE - { 0x2000, 0xB, 0x20, 0, 0 }, -// 200b ZERO WIDTH SPACE -// 200c ZERO WIDTH NON-JOINER -// 200d ZERO WIDTH JOINER -// 200e LEFT-TO-RIGHT MARK -// 200f RIGHT-TO-LEFT MARK - { 0x200B, 0x5, 0x0, 0, 0 }, -// 2010 HYPHEN -// 2011 NON-BREAKING HYPHEN -// 2012 FIGURE DASH -// 2013 EN DASH -// 2014 EM DASH -// 2015 HORIZONTAL BAR -// 2016 DOUBLE VERTICAL LINE -// 2017 DOUBLE LOW LINE -// 2018 LEFT SINGLE QUOTATION MARK -// 2019 RIGHT SINGLE QUOTATION MARK -// 201a SINGLE LOW-9 QUOTATION MARK -// 201b SINGLE HIGH-REVERSED-9 QUOTATION MARK -// 201c LEFT DOUBLE QUOTATION MARK -// 201d RIGHT DOUBLE QUOTATION MARK -// 201e DOUBLE LOW-9 QUOTATION MARK -// 201f DOUBLE HIGH-REVERSED-9 QUOTATION MARK -// 2020 DAGGER -// 2021 DOUBLE DAGGER -// 2022 BULLET -// 2023 TRIANGULAR BULLET -// 2024 ONE DOT LEADER -// 2025 TWO DOT LEADER -// 2026 HORIZONTAL ELLIPSIS -// 2027 HYPHENATION POINT - { 0x2010, 0x18, 0x18, 0, 0 }, -// 2028 LINE SEPARATOR -// 2029 PARAGRAPH SEPARATOR - { 0x2028, 0x2, 0x20, 0, 0 }, -// 202a LEFT-TO-RIGHT EMBEDDING -// 202b RIGHT-TO-LEFT EMBEDDING -// 202c POP DIRECTIONAL FORMATTING -// 202d LEFT-TO-RIGHT OVERRIDE -// 202e RIGHT-TO-LEFT OVERRIDE - { 0x202A, 0x5, 0x0, 0, 0 }, -// 202f NARROW NO-BREAK SPACE - { 0x202F, 0x1, 0x20, 0, 0 }, -// 2030 PER MILLE SIGN -// 2031 PER TEN THOUSAND SIGN -// 2032 PRIME -// 2033 DOUBLE PRIME -// 2034 TRIPLE PRIME -// 2035 REVERSED PRIME -// 2036 REVERSED DOUBLE PRIME -// 2037 REVERSED TRIPLE PRIME -// 2038 CARET -// 2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK -// 203a SINGLE RIGHT-POINTING ANGLE QUOTATION MARK -// 203b REFERENCE MARK -// 203c DOUBLE EXCLAMATION MARK -// 203d INTERROBANG -// 203e OVERLINE -// 203f UNDERTIE -// 2040 CHARACTER TIE -// 2041 CARET INSERTION POINT -// 2042 ASTERISM -// 2043 HYPHEN BULLET - { 0x2030, 0x14, 0x18, 0, 0 }, -// 2044 FRACTION SLASH - { 0x2044, 0x1, 0x8, 0, 0 }, -// 2045 LEFT SQUARE BRACKET WITH QUILL -// 2046 RIGHT SQUARE BRACKET WITH QUILL -// 2047 DOUBLE QUESTION MARK -// 2048 QUESTION EXCLAMATION MARK -// 2049 EXCLAMATION QUESTION MARK -// 204a TIRONIAN SIGN ET -// 204b REVERSED PILCROW SIGN -// 204c BLACK LEFTWARDS BULLET -// 204d BLACK RIGHTWARDS BULLET -// 204e LOW ASTERISK -// 204f REVERSED SEMICOLON -// 2050 CLOSE UP -// 2051 TWO ASTERISKS ALIGNED VERTICALLY - { 0x2045, 0xD, 0x18, 0, 0 }, -// 2052 COMMERCIAL MINUS SIGN - { 0x2052, 0x1, 0x8, 0, 0 }, -// 2053 SWUNG DASH -// 2054 INVERTED UNDERTIE -// 2055 FLOWER PUNCTUATION MARK -// 2056 THREE DOT PUNCTUATION -// 2057 QUADRUPLE PRIME -// 2058 FOUR DOT PUNCTUATION -// 2059 FIVE DOT PUNCTUATION -// 205a TWO DOT PUNCTUATION -// 205b FOUR DOT MARK -// 205c DOTTED CROSS -// 205d TRICOLON -// 205e VERTICAL FOUR DOTS - { 0x2053, 0xC, 0x18, 0, 0 }, -// 205f MEDIUM MATHEMATICAL SPACE - { 0x205F, 0x1, 0x20, 0, 0 }, -// 2060 WORD JOINER -// 2061 FUNCTION APPLICATION -// 2062 INVISIBLE TIMES -// 2063 INVISIBLE SEPARATOR -// 2064 INVISIBLE PLUS - { 0x2060, 0x5, 0x0, 0, 0 }, -// 2066 LEFT-TO-RIGHT ISOLATE -// 2067 RIGHT-TO-LEFT ISOLATE -// 2068 FIRST STRONG ISOLATE -// 2069 POP DIRECTIONAL ISOLATE -// 206a INHIBIT SYMMETRIC SWAPPING -// 206b ACTIVATE SYMMETRIC SWAPPING -// 206c INHIBIT ARABIC FORM SHAPING -// 206d ACTIVATE ARABIC FORM SHAPING -// 206e NATIONAL DIGIT SHAPES -// 206f NOMINAL DIGIT SHAPES - { 0x2066, 0xA, 0x0, 0, 0 }, -// 2070 SUPERSCRIPT ZERO - { 0x2070, 0x1, 0x8, 0, 0 }, -// 2071 SUPERSCRIPT LATIN SMALL LETTER I - { 0x2071, 0x1, 0x9, 0, 0 }, -// 2074 SUPERSCRIPT FOUR -// 2075 SUPERSCRIPT FIVE -// 2076 SUPERSCRIPT SIX -// 2077 SUPERSCRIPT SEVEN -// 2078 SUPERSCRIPT EIGHT -// 2079 SUPERSCRIPT NINE -// 207a SUPERSCRIPT PLUS SIGN -// 207b SUPERSCRIPT MINUS -// 207c SUPERSCRIPT EQUALS SIGN - { 0x2074, 0x9, 0x8, 0, 0 }, -// 207d SUPERSCRIPT LEFT PARENTHESIS -// 207e SUPERSCRIPT RIGHT PARENTHESIS - { 0x207D, 0x2, 0x18, 0, 0 }, -// 207f SUPERSCRIPT LATIN SMALL LETTER N - { 0x207F, 0x1, 0x9, 0, 0 }, -// 2080 SUBSCRIPT ZERO -// 2081 SUBSCRIPT ONE -// 2082 SUBSCRIPT TWO -// 2083 SUBSCRIPT THREE -// 2084 SUBSCRIPT FOUR -// 2085 SUBSCRIPT FIVE -// 2086 SUBSCRIPT SIX -// 2087 SUBSCRIPT SEVEN -// 2088 SUBSCRIPT EIGHT -// 2089 SUBSCRIPT NINE -// 208a SUBSCRIPT PLUS SIGN -// 208b SUBSCRIPT MINUS -// 208c SUBSCRIPT EQUALS SIGN - { 0x2080, 0xD, 0x8, 0, 0 }, -// 208d SUBSCRIPT LEFT PARENTHESIS -// 208e SUBSCRIPT RIGHT PARENTHESIS - { 0x208D, 0x2, 0x18, 0, 0 }, -// 2090 LATIN SUBSCRIPT SMALL LETTER A -// 2091 LATIN SUBSCRIPT SMALL LETTER E -// 2092 LATIN SUBSCRIPT SMALL LETTER O -// 2093 LATIN SUBSCRIPT SMALL LETTER X -// 2094 LATIN SUBSCRIPT SMALL LETTER SCHWA -// 2095 LATIN SUBSCRIPT SMALL LETTER H -// 2096 LATIN SUBSCRIPT SMALL LETTER K -// 2097 LATIN SUBSCRIPT SMALL LETTER L -// 2098 LATIN SUBSCRIPT SMALL LETTER M -// 2099 LATIN SUBSCRIPT SMALL LETTER N -// 209a LATIN SUBSCRIPT SMALL LETTER P -// 209b LATIN SUBSCRIPT SMALL LETTER S -// 209c LATIN SUBSCRIPT SMALL LETTER T - { 0x2090, 0xD, 0x9, 0, 0 }, -// 20a0 EURO-CURRENCY SIGN -// 20a1 COLON SIGN -// 20a2 CRUZEIRO SIGN -// 20a3 FRENCH FRANC SIGN -// 20a4 LIRA SIGN -// 20a5 MILL SIGN -// 20a6 NAIRA SIGN -// 20a7 PESETA SIGN -// 20a8 RUPEE SIGN -// 20a9 WON SIGN -// 20aa NEW SHEQEL SIGN -// 20ab DONG SIGN -// 20ac EURO SIGN -// 20ad KIP SIGN -// 20ae TUGRIK SIGN -// 20af DRACHMA SIGN -// 20b0 GERMAN PENNY SIGN -// 20b1 PESO SIGN -// 20b2 GUARANI SIGN -// 20b3 AUSTRAL SIGN -// 20b4 HRYVNIA SIGN -// 20b5 CEDI SIGN -// 20b6 LIVRE TOURNOIS SIGN -// 20b7 SPESMILO SIGN -// 20b8 TENGE SIGN -// 20b9 INDIAN RUPEE SIGN -// 20ba TURKISH LIRA SIGN -// 20bb NORDIC MARK SIGN -// 20bc MANAT SIGN -// 20bd RUBLE SIGN - { 0x20A0, 0x1E, 0x8, 0, 0 }, -// 20d0 COMBINING LEFT HARPOON ABOVE -// 20d1 COMBINING RIGHT HARPOON ABOVE -// 20d2 COMBINING LONG VERTICAL LINE OVERLAY -// 20d3 COMBINING SHORT VERTICAL LINE OVERLAY -// 20d4 COMBINING ANTICLOCKWISE ARROW ABOVE -// 20d5 COMBINING CLOCKWISE ARROW ABOVE -// 20d6 COMBINING LEFT ARROW ABOVE -// 20d7 COMBINING RIGHT ARROW ABOVE -// 20d8 COMBINING RING OVERLAY -// 20d9 COMBINING CLOCKWISE RING OVERLAY -// 20da COMBINING ANTICLOCKWISE RING OVERLAY -// 20db COMBINING THREE DOTS ABOVE -// 20dc COMBINING FOUR DOTS ABOVE -// 20dd COMBINING ENCLOSING CIRCLE -// 20de COMBINING ENCLOSING SQUARE -// 20df COMBINING ENCLOSING DIAMOND -// 20e0 COMBINING ENCLOSING CIRCLE BACKSLASH -// 20e1 COMBINING LEFT RIGHT ARROW ABOVE -// 20e2 COMBINING ENCLOSING SCREEN -// 20e3 COMBINING ENCLOSING KEYCAP -// 20e4 COMBINING ENCLOSING UPWARD POINTING TRIANGLE -// 20e5 COMBINING REVERSE SOLIDUS OVERLAY -// 20e6 COMBINING DOUBLE VERTICAL STROKE OVERLAY -// 20e7 COMBINING ANNUITY SYMBOL -// 20e8 COMBINING TRIPLE UNDERDOT -// 20e9 COMBINING WIDE BRIDGE ABOVE -// 20ea COMBINING LEFTWARDS ARROW OVERLAY -// 20eb COMBINING LONG DOUBLE SOLIDUS OVERLAY -// 20ec COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS -// 20ed COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS -// 20ee COMBINING LEFT ARROW BELOW -// 20ef COMBINING RIGHT ARROW BELOW -// 20f0 COMBINING ASTERISK ABOVE - { 0x20D0, 0x21, 0x0, 0, 0 }, -// 2100 ACCOUNT OF -// 2101 ADDRESSED TO THE SUBJECT - { 0x2100, 0x2, 0x8, 0, 0 }, -// 2102 DOUBLE-STRUCK CAPITAL C - { 0x2102, 0x1, 0x89, 0, 0 }, -// 2103 DEGREE CELSIUS -// 2104 CENTRE LINE SYMBOL -// 2105 CARE OF -// 2106 CADA UNA - { 0x2103, 0x4, 0x8, 0, 0 }, -// 2107 EULER CONSTANT - { 0x2107, 0x1, 0x89, 0, 0 }, -// 2108 SCRUPLE -// 2109 DEGREE FAHRENHEIT - { 0x2108, 0x2, 0x8, 0, 0 }, -// 210a SCRIPT SMALL G - { 0x210A, 0x1, 0x49, 0, 0 }, -// 210b SCRIPT CAPITAL H -// 210c BLACK-LETTER CAPITAL H -// 210d DOUBLE-STRUCK CAPITAL H - { 0x210B, 0x3, 0x89, 0, 0 }, -// 210e PLANCK CONSTANT -// 210f PLANCK CONSTANT OVER TWO PI - { 0x210E, 0x2, 0x49, 0, 0 }, -// 2110 SCRIPT CAPITAL I -// 2111 BLACK-LETTER CAPITAL I -// 2112 SCRIPT CAPITAL L - { 0x2110, 0x3, 0x89, 0, 0 }, -// 2113 SCRIPT SMALL L - { 0x2113, 0x1, 0x49, 0, 0 }, -// 2114 L B BAR SYMBOL - { 0x2114, 0x1, 0x8, 0, 0 }, -// 2115 DOUBLE-STRUCK CAPITAL N - { 0x2115, 0x1, 0x89, 0, 0 }, -// 2116 NUMERO SIGN -// 2117 SOUND RECORDING COPYRIGHT -// 2118 SCRIPT CAPITAL P - { 0x2116, 0x3, 0x8, 0, 0 }, -// 2119 DOUBLE-STRUCK CAPITAL P -// 211a DOUBLE-STRUCK CAPITAL Q -// 211b SCRIPT CAPITAL R -// 211c BLACK-LETTER CAPITAL R -// 211d DOUBLE-STRUCK CAPITAL R - { 0x2119, 0x5, 0x89, 0, 0 }, -// 211e PRESCRIPTION TAKE -// 211f RESPONSE -// 2120 SERVICE MARK -// 2121 TELEPHONE SIGN -// 2122 TRADE MARK SIGN -// 2123 VERSICLE - { 0x211E, 0x6, 0x8, 0, 0 }, -// 2124 DOUBLE-STRUCK CAPITAL Z - { 0x2124, 0x1, 0x89, 0, 0 }, -// 2125 OUNCE SIGN - { 0x2125, 0x1, 0x8, 0, 0 }, -// 2126 OHM SIGN - { 0x2126, 0x1, 0x89, -7517, 0 }, -// 2127 INVERTED OHM SIGN - { 0x2127, 0x1, 0x8, 0, 0 }, -// 2128 BLACK-LETTER CAPITAL Z - { 0x2128, 0x1, 0x89, 0, 0 }, -// 2129 TURNED GREEK SMALL LETTER IOTA - { 0x2129, 0x1, 0x8, 0, 0 }, -// 212a KELVIN SIGN - { 0x212A, 0x1, 0x89, -8383, 0 }, -// 212b ANGSTROM SIGN - { 0x212B, 0x1, 0x89, -8262, 0 }, -// 212c SCRIPT CAPITAL B -// 212d BLACK-LETTER CAPITAL C - { 0x212C, 0x2, 0x89, 0, 0 }, -// 212e ESTIMATED SYMBOL - { 0x212E, 0x1, 0x8, 0, 0 }, -// 212f SCRIPT SMALL E - { 0x212F, 0x1, 0x49, 0, 0 }, -// 2130 SCRIPT CAPITAL E -// 2131 SCRIPT CAPITAL F - { 0x2130, 0x2, 0x89, 0, 0 }, -// 2132 TURNED CAPITAL F - { 0x2132, 0x1, 0x89, 28, 0 }, -// 2133 SCRIPT CAPITAL M - { 0x2133, 0x1, 0x89, 0, 0 }, -// 2134 SCRIPT SMALL O - { 0x2134, 0x1, 0x49, 0, 0 }, -// 2135 ALEF SYMBOL -// 2136 BET SYMBOL -// 2137 GIMEL SYMBOL -// 2138 DALET SYMBOL - { 0x2135, 0x4, 0x9, 0, 0 }, -// 2139 INFORMATION SOURCE - { 0x2139, 0x1, 0x49, 0, 0 }, -// 213a ROTATED CAPITAL Q -// 213b FACSIMILE SIGN - { 0x213A, 0x2, 0x8, 0, 0 }, -// 213c DOUBLE-STRUCK SMALL PI -// 213d DOUBLE-STRUCK SMALL GAMMA - { 0x213C, 0x2, 0x49, 0, 0 }, -// 213e DOUBLE-STRUCK CAPITAL GAMMA -// 213f DOUBLE-STRUCK CAPITAL PI - { 0x213E, 0x2, 0x89, 0, 0 }, -// 2140 DOUBLE-STRUCK N-ARY SUMMATION -// 2141 TURNED SANS-SERIF CAPITAL G -// 2142 TURNED SANS-SERIF CAPITAL L -// 2143 REVERSED SANS-SERIF CAPITAL L -// 2144 TURNED SANS-SERIF CAPITAL Y - { 0x2140, 0x5, 0x8, 0, 0 }, -// 2145 DOUBLE-STRUCK ITALIC CAPITAL D - { 0x2145, 0x1, 0x89, 0, 0 }, -// 2146 DOUBLE-STRUCK ITALIC SMALL D -// 2147 DOUBLE-STRUCK ITALIC SMALL E -// 2148 DOUBLE-STRUCK ITALIC SMALL I -// 2149 DOUBLE-STRUCK ITALIC SMALL J - { 0x2146, 0x4, 0x49, 0, 0 }, -// 214a PROPERTY LINE -// 214b TURNED AMPERSAND -// 214c PER SIGN -// 214d AKTIESELSKAB - { 0x214A, 0x4, 0x8, 0, 0 }, -// 214e TURNED SMALL F - { 0x214E, 0x1, 0x49, 0, -28 }, -// 214f SYMBOL FOR SAMARITAN SOURCE -// 2150 VULGAR FRACTION ONE SEVENTH -// 2151 VULGAR FRACTION ONE NINTH -// 2152 VULGAR FRACTION ONE TENTH -// 2153 VULGAR FRACTION ONE THIRD -// 2154 VULGAR FRACTION TWO THIRDS -// 2155 VULGAR FRACTION ONE FIFTH -// 2156 VULGAR FRACTION TWO FIFTHS -// 2157 VULGAR FRACTION THREE FIFTHS -// 2158 VULGAR FRACTION FOUR FIFTHS -// 2159 VULGAR FRACTION ONE SIXTH -// 215a VULGAR FRACTION FIVE SIXTHS -// 215b VULGAR FRACTION ONE EIGHTH -// 215c VULGAR FRACTION THREE EIGHTHS -// 215d VULGAR FRACTION FIVE EIGHTHS -// 215e VULGAR FRACTION SEVEN EIGHTHS -// 215f FRACTION NUMERATOR ONE - { 0x214F, 0x11, 0x8, 0, 0 }, -// 2160 ROMAN NUMERAL ONE -// 2161 ROMAN NUMERAL TWO -// 2162 ROMAN NUMERAL THREE -// 2163 ROMAN NUMERAL FOUR -// 2164 ROMAN NUMERAL FIVE -// 2165 ROMAN NUMERAL SIX -// 2166 ROMAN NUMERAL SEVEN -// 2167 ROMAN NUMERAL EIGHT -// 2168 ROMAN NUMERAL NINE -// 2169 ROMAN NUMERAL TEN -// 216a ROMAN NUMERAL ELEVEN -// 216b ROMAN NUMERAL TWELVE -// 216c ROMAN NUMERAL FIFTY -// 216d ROMAN NUMERAL ONE HUNDRED -// 216e ROMAN NUMERAL FIVE HUNDRED -// 216f ROMAN NUMERAL ONE THOUSAND - { 0x2160, 0x10, 0x8, 16, 0 }, -// 2170 SMALL ROMAN NUMERAL ONE -// 2171 SMALL ROMAN NUMERAL TWO -// 2172 SMALL ROMAN NUMERAL THREE -// 2173 SMALL ROMAN NUMERAL FOUR -// 2174 SMALL ROMAN NUMERAL FIVE -// 2175 SMALL ROMAN NUMERAL SIX -// 2176 SMALL ROMAN NUMERAL SEVEN -// 2177 SMALL ROMAN NUMERAL EIGHT -// 2178 SMALL ROMAN NUMERAL NINE -// 2179 SMALL ROMAN NUMERAL TEN -// 217a SMALL ROMAN NUMERAL ELEVEN -// 217b SMALL ROMAN NUMERAL TWELVE -// 217c SMALL ROMAN NUMERAL FIFTY -// 217d SMALL ROMAN NUMERAL ONE HUNDRED -// 217e SMALL ROMAN NUMERAL FIVE HUNDRED -// 217f SMALL ROMAN NUMERAL ONE THOUSAND - { 0x2170, 0x10, 0x8, 0, -16 }, -// 2180 ROMAN NUMERAL ONE THOUSAND C D -// 2181 ROMAN NUMERAL FIVE THOUSAND -// 2182 ROMAN NUMERAL TEN THOUSAND - { 0x2180, 0x3, 0x8, 0, 0 }, -// 2183 ROMAN NUMERAL REVERSED ONE HUNDRED - { 0x2183, 0x1, 0x89, 1, 0 }, -// 2184 LATIN SMALL LETTER REVERSED C - { 0x2184, 0x1, 0x49, 0, -1 }, -// 2185 ROMAN NUMERAL SIX LATE FORM -// 2186 ROMAN NUMERAL FIFTY EARLY FORM -// 2187 ROMAN NUMERAL FIFTY THOUSAND -// 2188 ROMAN NUMERAL ONE HUNDRED THOUSAND -// 2189 VULGAR FRACTION ZERO THIRDS - { 0x2185, 0x5, 0x8, 0, 0 }, -// 2190 LEFTWARDS ARROW -// 2191 UPWARDS ARROW -// 2192 RIGHTWARDS ARROW -// 2193 DOWNWARDS ARROW -// 2194 LEFT RIGHT ARROW -// 2195 UP DOWN ARROW -// 2196 NORTH WEST ARROW -// 2197 NORTH EAST ARROW -// 2198 SOUTH EAST ARROW -// 2199 SOUTH WEST ARROW -// 219a LEFTWARDS ARROW WITH STROKE -// 219b RIGHTWARDS ARROW WITH STROKE -// 219c LEFTWARDS WAVE ARROW -// 219d RIGHTWARDS WAVE ARROW -// 219e LEFTWARDS TWO HEADED ARROW -// 219f UPWARDS TWO HEADED ARROW -// 21a0 RIGHTWARDS TWO HEADED ARROW -// 21a1 DOWNWARDS TWO HEADED ARROW -// 21a2 LEFTWARDS ARROW WITH TAIL -// 21a3 RIGHTWARDS ARROW WITH TAIL -// 21a4 LEFTWARDS ARROW FROM BAR -// 21a5 UPWARDS ARROW FROM BAR -// 21a6 RIGHTWARDS ARROW FROM BAR -// 21a7 DOWNWARDS ARROW FROM BAR -// 21a8 UP DOWN ARROW WITH BASE -// 21a9 LEFTWARDS ARROW WITH HOOK -// 21aa RIGHTWARDS ARROW WITH HOOK -// 21ab LEFTWARDS ARROW WITH LOOP -// 21ac RIGHTWARDS ARROW WITH LOOP -// 21ad LEFT RIGHT WAVE ARROW -// 21ae LEFT RIGHT ARROW WITH STROKE -// 21af DOWNWARDS ZIGZAG ARROW -// 21b0 UPWARDS ARROW WITH TIP LEFTWARDS -// 21b1 UPWARDS ARROW WITH TIP RIGHTWARDS -// 21b2 DOWNWARDS ARROW WITH TIP LEFTWARDS -// 21b3 DOWNWARDS ARROW WITH TIP RIGHTWARDS -// 21b4 RIGHTWARDS ARROW WITH CORNER DOWNWARDS -// 21b5 DOWNWARDS ARROW WITH CORNER LEFTWARDS -// 21b6 ANTICLOCKWISE TOP SEMICIRCLE ARROW -// 21b7 CLOCKWISE TOP SEMICIRCLE ARROW -// 21b8 NORTH WEST ARROW TO LONG BAR -// 21b9 LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR -// 21ba ANTICLOCKWISE OPEN CIRCLE ARROW -// 21bb CLOCKWISE OPEN CIRCLE ARROW -// 21bc LEFTWARDS HARPOON WITH BARB UPWARDS -// 21bd LEFTWARDS HARPOON WITH BARB DOWNWARDS -// 21be UPWARDS HARPOON WITH BARB RIGHTWARDS -// 21bf UPWARDS HARPOON WITH BARB LEFTWARDS -// 21c0 RIGHTWARDS HARPOON WITH BARB UPWARDS -// 21c1 RIGHTWARDS HARPOON WITH BARB DOWNWARDS -// 21c2 DOWNWARDS HARPOON WITH BARB RIGHTWARDS -// 21c3 DOWNWARDS HARPOON WITH BARB LEFTWARDS -// 21c4 RIGHTWARDS ARROW OVER LEFTWARDS ARROW -// 21c5 UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW -// 21c6 LEFTWARDS ARROW OVER RIGHTWARDS ARROW -// 21c7 LEFTWARDS PAIRED ARROWS -// 21c8 UPWARDS PAIRED ARROWS -// 21c9 RIGHTWARDS PAIRED ARROWS -// 21ca DOWNWARDS PAIRED ARROWS -// 21cb LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON -// 21cc RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON -// 21cd LEFTWARDS DOUBLE ARROW WITH STROKE -// 21ce LEFT RIGHT DOUBLE ARROW WITH STROKE -// 21cf RIGHTWARDS DOUBLE ARROW WITH STROKE -// 21d0 LEFTWARDS DOUBLE ARROW -// 21d1 UPWARDS DOUBLE ARROW -// 21d2 RIGHTWARDS DOUBLE ARROW -// 21d3 DOWNWARDS DOUBLE ARROW -// 21d4 LEFT RIGHT DOUBLE ARROW -// 21d5 UP DOWN DOUBLE ARROW -// 21d6 NORTH WEST DOUBLE ARROW -// 21d7 NORTH EAST DOUBLE ARROW -// 21d8 SOUTH EAST DOUBLE ARROW -// 21d9 SOUTH WEST DOUBLE ARROW -// 21da LEFTWARDS TRIPLE ARROW -// 21db RIGHTWARDS TRIPLE ARROW -// 21dc LEFTWARDS SQUIGGLE ARROW -// 21dd RIGHTWARDS SQUIGGLE ARROW -// 21de UPWARDS ARROW WITH DOUBLE STROKE -// 21df DOWNWARDS ARROW WITH DOUBLE STROKE -// 21e0 LEFTWARDS DASHED ARROW -// 21e1 UPWARDS DASHED ARROW -// 21e2 RIGHTWARDS DASHED ARROW -// 21e3 DOWNWARDS DASHED ARROW -// 21e4 LEFTWARDS ARROW TO BAR -// 21e5 RIGHTWARDS ARROW TO BAR -// 21e6 LEFTWARDS WHITE ARROW -// 21e7 UPWARDS WHITE ARROW -// 21e8 RIGHTWARDS WHITE ARROW -// 21e9 DOWNWARDS WHITE ARROW -// 21ea UPWARDS WHITE ARROW FROM BAR -// 21eb UPWARDS WHITE ARROW ON PEDESTAL -// 21ec UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR -// 21ed UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR -// 21ee UPWARDS WHITE DOUBLE ARROW -// 21ef UPWARDS WHITE DOUBLE ARROW ON PEDESTAL -// 21f0 RIGHTWARDS WHITE ARROW FROM WALL -// 21f1 NORTH WEST ARROW TO CORNER -// 21f2 SOUTH EAST ARROW TO CORNER -// 21f3 UP DOWN WHITE ARROW -// 21f4 RIGHT ARROW WITH SMALL CIRCLE -// 21f5 DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW -// 21f6 THREE RIGHTWARDS ARROWS -// 21f7 LEFTWARDS ARROW WITH VERTICAL STROKE -// 21f8 RIGHTWARDS ARROW WITH VERTICAL STROKE -// 21f9 LEFT RIGHT ARROW WITH VERTICAL STROKE -// 21fa LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE -// 21fb RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE -// 21fc LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE -// 21fd LEFTWARDS OPEN-HEADED ARROW -// 21fe RIGHTWARDS OPEN-HEADED ARROW -// 21ff LEFT RIGHT OPEN-HEADED ARROW -// 2200 FOR ALL -// 2201 COMPLEMENT -// 2202 PARTIAL DIFFERENTIAL -// 2203 THERE EXISTS -// 2204 THERE DOES NOT EXIST -// 2205 EMPTY SET -// 2206 INCREMENT -// 2207 NABLA -// 2208 ELEMENT OF -// 2209 NOT AN ELEMENT OF -// 220a SMALL ELEMENT OF -// 220b CONTAINS AS MEMBER -// 220c DOES NOT CONTAIN AS MEMBER -// 220d SMALL CONTAINS AS MEMBER -// 220e END OF PROOF -// 220f N-ARY PRODUCT -// 2210 N-ARY COPRODUCT -// 2211 N-ARY SUMMATION -// 2212 MINUS SIGN -// 2213 MINUS-OR-PLUS SIGN -// 2214 DOT PLUS -// 2215 DIVISION SLASH -// 2216 SET MINUS -// 2217 ASTERISK OPERATOR -// 2218 RING OPERATOR -// 2219 BULLET OPERATOR -// 221a SQUARE ROOT -// 221b CUBE ROOT -// 221c FOURTH ROOT -// 221d PROPORTIONAL TO -// 221e INFINITY -// 221f RIGHT ANGLE -// 2220 ANGLE -// 2221 MEASURED ANGLE -// 2222 SPHERICAL ANGLE -// 2223 DIVIDES -// 2224 DOES NOT DIVIDE -// 2225 PARALLEL TO -// 2226 NOT PARALLEL TO -// 2227 LOGICAL AND -// 2228 LOGICAL OR -// 2229 INTERSECTION -// 222a UNION -// 222b INTEGRAL -// 222c DOUBLE INTEGRAL -// 222d TRIPLE INTEGRAL -// 222e CONTOUR INTEGRAL -// 222f SURFACE INTEGRAL -// 2230 VOLUME INTEGRAL -// 2231 CLOCKWISE INTEGRAL -// 2232 CLOCKWISE CONTOUR INTEGRAL -// 2233 ANTICLOCKWISE CONTOUR INTEGRAL -// 2234 THEREFORE -// 2235 BECAUSE -// 2236 RATIO -// 2237 PROPORTION -// 2238 DOT MINUS -// 2239 EXCESS -// 223a GEOMETRIC PROPORTION -// 223b HOMOTHETIC -// 223c TILDE OPERATOR -// 223d REVERSED TILDE -// 223e INVERTED LAZY S -// 223f SINE WAVE -// 2240 WREATH PRODUCT -// 2241 NOT TILDE -// 2242 MINUS TILDE -// 2243 ASYMPTOTICALLY EQUAL TO -// 2244 NOT ASYMPTOTICALLY EQUAL TO -// 2245 APPROXIMATELY EQUAL TO -// 2246 APPROXIMATELY BUT NOT ACTUALLY EQUAL TO -// 2247 NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO -// 2248 ALMOST EQUAL TO -// 2249 NOT ALMOST EQUAL TO -// 224a ALMOST EQUAL OR EQUAL TO -// 224b TRIPLE TILDE -// 224c ALL EQUAL TO -// 224d EQUIVALENT TO -// 224e GEOMETRICALLY EQUIVALENT TO -// 224f DIFFERENCE BETWEEN -// 2250 APPROACHES THE LIMIT -// 2251 GEOMETRICALLY EQUAL TO -// 2252 APPROXIMATELY EQUAL TO OR THE IMAGE OF -// 2253 IMAGE OF OR APPROXIMATELY EQUAL TO -// 2254 COLON EQUALS -// 2255 EQUALS COLON -// 2256 RING IN EQUAL TO -// 2257 RING EQUAL TO -// 2258 CORRESPONDS TO -// 2259 ESTIMATES -// 225a EQUIANGULAR TO -// 225b STAR EQUALS -// 225c DELTA EQUAL TO -// 225d EQUAL TO BY DEFINITION -// 225e MEASURED BY -// 225f QUESTIONED EQUAL TO -// 2260 NOT EQUAL TO -// 2261 IDENTICAL TO -// 2262 NOT IDENTICAL TO -// 2263 STRICTLY EQUIVALENT TO -// 2264 LESS-THAN OR EQUAL TO -// 2265 GREATER-THAN OR EQUAL TO -// 2266 LESS-THAN OVER EQUAL TO -// 2267 GREATER-THAN OVER EQUAL TO -// 2268 LESS-THAN BUT NOT EQUAL TO -// 2269 GREATER-THAN BUT NOT EQUAL TO -// 226a MUCH LESS-THAN -// 226b MUCH GREATER-THAN -// 226c BETWEEN -// 226d NOT EQUIVALENT TO -// 226e NOT LESS-THAN -// 226f NOT GREATER-THAN -// 2270 NEITHER LESS-THAN NOR EQUAL TO -// 2271 NEITHER GREATER-THAN NOR EQUAL TO -// 2272 LESS-THAN OR EQUIVALENT TO -// 2273 GREATER-THAN OR EQUIVALENT TO -// 2274 NEITHER LESS-THAN NOR EQUIVALENT TO -// 2275 NEITHER GREATER-THAN NOR EQUIVALENT TO -// 2276 LESS-THAN OR GREATER-THAN -// 2277 GREATER-THAN OR LESS-THAN -// 2278 NEITHER LESS-THAN NOR GREATER-THAN -// 2279 NEITHER GREATER-THAN NOR LESS-THAN -// 227a PRECEDES -// 227b SUCCEEDS -// 227c PRECEDES OR EQUAL TO -// 227d SUCCEEDS OR EQUAL TO -// 227e PRECEDES OR EQUIVALENT TO -// 227f SUCCEEDS OR EQUIVALENT TO -// 2280 DOES NOT PRECEDE -// 2281 DOES NOT SUCCEED -// 2282 SUBSET OF -// 2283 SUPERSET OF -// 2284 NOT A SUBSET OF -// 2285 NOT A SUPERSET OF -// 2286 SUBSET OF OR EQUAL TO -// 2287 SUPERSET OF OR EQUAL TO -// 2288 NEITHER A SUBSET OF NOR EQUAL TO -// 2289 NEITHER A SUPERSET OF NOR EQUAL TO -// 228a SUBSET OF WITH NOT EQUAL TO -// 228b SUPERSET OF WITH NOT EQUAL TO -// 228c MULTISET -// 228d MULTISET MULTIPLICATION -// 228e MULTISET UNION -// 228f SQUARE IMAGE OF -// 2290 SQUARE ORIGINAL OF -// 2291 SQUARE IMAGE OF OR EQUAL TO -// 2292 SQUARE ORIGINAL OF OR EQUAL TO -// 2293 SQUARE CAP -// 2294 SQUARE CUP -// 2295 CIRCLED PLUS -// 2296 CIRCLED MINUS -// 2297 CIRCLED TIMES -// 2298 CIRCLED DIVISION SLASH -// 2299 CIRCLED DOT OPERATOR -// 229a CIRCLED RING OPERATOR -// 229b CIRCLED ASTERISK OPERATOR -// 229c CIRCLED EQUALS -// 229d CIRCLED DASH -// 229e SQUARED PLUS -// 229f SQUARED MINUS -// 22a0 SQUARED TIMES -// 22a1 SQUARED DOT OPERATOR -// 22a2 RIGHT TACK -// 22a3 LEFT TACK -// 22a4 DOWN TACK -// 22a5 UP TACK -// 22a6 ASSERTION -// 22a7 MODELS -// 22a8 TRUE -// 22a9 FORCES -// 22aa TRIPLE VERTICAL BAR RIGHT TURNSTILE -// 22ab DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE -// 22ac DOES NOT PROVE -// 22ad NOT TRUE -// 22ae DOES NOT FORCE -// 22af NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE -// 22b0 PRECEDES UNDER RELATION -// 22b1 SUCCEEDS UNDER RELATION -// 22b2 NORMAL SUBGROUP OF -// 22b3 CONTAINS AS NORMAL SUBGROUP -// 22b4 NORMAL SUBGROUP OF OR EQUAL TO -// 22b5 CONTAINS AS NORMAL SUBGROUP OR EQUAL TO -// 22b6 ORIGINAL OF -// 22b7 IMAGE OF -// 22b8 MULTIMAP -// 22b9 HERMITIAN CONJUGATE MATRIX -// 22ba INTERCALATE -// 22bb XOR -// 22bc NAND -// 22bd NOR -// 22be RIGHT ANGLE WITH ARC -// 22bf RIGHT TRIANGLE -// 22c0 N-ARY LOGICAL AND -// 22c1 N-ARY LOGICAL OR -// 22c2 N-ARY INTERSECTION -// 22c3 N-ARY UNION -// 22c4 DIAMOND OPERATOR -// 22c5 DOT OPERATOR -// 22c6 STAR OPERATOR -// 22c7 DIVISION TIMES -// 22c8 BOWTIE -// 22c9 LEFT NORMAL FACTOR SEMIDIRECT PRODUCT -// 22ca RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT -// 22cb LEFT SEMIDIRECT PRODUCT -// 22cc RIGHT SEMIDIRECT PRODUCT -// 22cd REVERSED TILDE EQUALS -// 22ce CURLY LOGICAL OR -// 22cf CURLY LOGICAL AND -// 22d0 DOUBLE SUBSET -// 22d1 DOUBLE SUPERSET -// 22d2 DOUBLE INTERSECTION -// 22d3 DOUBLE UNION -// 22d4 PITCHFORK -// 22d5 EQUAL AND PARALLEL TO -// 22d6 LESS-THAN WITH DOT -// 22d7 GREATER-THAN WITH DOT -// 22d8 VERY MUCH LESS-THAN -// 22d9 VERY MUCH GREATER-THAN -// 22da LESS-THAN EQUAL TO OR GREATER-THAN -// 22db GREATER-THAN EQUAL TO OR LESS-THAN -// 22dc EQUAL TO OR LESS-THAN -// 22dd EQUAL TO OR GREATER-THAN -// 22de EQUAL TO OR PRECEDES -// 22df EQUAL TO OR SUCCEEDS -// 22e0 DOES NOT PRECEDE OR EQUAL -// 22e1 DOES NOT SUCCEED OR EQUAL -// 22e2 NOT SQUARE IMAGE OF OR EQUAL TO -// 22e3 NOT SQUARE ORIGINAL OF OR EQUAL TO -// 22e4 SQUARE IMAGE OF OR NOT EQUAL TO -// 22e5 SQUARE ORIGINAL OF OR NOT EQUAL TO -// 22e6 LESS-THAN BUT NOT EQUIVALENT TO -// 22e7 GREATER-THAN BUT NOT EQUIVALENT TO -// 22e8 PRECEDES BUT NOT EQUIVALENT TO -// 22e9 SUCCEEDS BUT NOT EQUIVALENT TO -// 22ea NOT NORMAL SUBGROUP OF -// 22eb DOES NOT CONTAIN AS NORMAL SUBGROUP -// 22ec NOT NORMAL SUBGROUP OF OR EQUAL TO -// 22ed DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL -// 22ee VERTICAL ELLIPSIS -// 22ef MIDLINE HORIZONTAL ELLIPSIS -// 22f0 UP RIGHT DIAGONAL ELLIPSIS -// 22f1 DOWN RIGHT DIAGONAL ELLIPSIS -// 22f2 ELEMENT OF WITH LONG HORIZONTAL STROKE -// 22f3 ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE -// 22f4 SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE -// 22f5 ELEMENT OF WITH DOT ABOVE -// 22f6 ELEMENT OF WITH OVERBAR -// 22f7 SMALL ELEMENT OF WITH OVERBAR -// 22f8 ELEMENT OF WITH UNDERBAR -// 22f9 ELEMENT OF WITH TWO HORIZONTAL STROKES -// 22fa CONTAINS WITH LONG HORIZONTAL STROKE -// 22fb CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE -// 22fc SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE -// 22fd CONTAINS WITH OVERBAR -// 22fe SMALL CONTAINS WITH OVERBAR -// 22ff Z NOTATION BAG MEMBERSHIP -// 2300 DIAMETER SIGN -// 2301 ELECTRIC ARROW -// 2302 HOUSE -// 2303 UP ARROWHEAD -// 2304 DOWN ARROWHEAD -// 2305 PROJECTIVE -// 2306 PERSPECTIVE -// 2307 WAVY LINE - { 0x2190, 0x178, 0x8, 0, 0 }, -// 2308 LEFT CEILING -// 2309 RIGHT CEILING -// 230a LEFT FLOOR -// 230b RIGHT FLOOR - { 0x2308, 0x4, 0x18, 0, 0 }, -// 230c BOTTOM RIGHT CROP -// 230d BOTTOM LEFT CROP -// 230e TOP RIGHT CROP -// 230f TOP LEFT CROP -// 2310 REVERSED NOT SIGN -// 2311 SQUARE LOZENGE -// 2312 ARC -// 2313 SEGMENT -// 2314 SECTOR -// 2315 TELEPHONE RECORDER -// 2316 POSITION INDICATOR -// 2317 VIEWDATA SQUARE -// 2318 PLACE OF INTEREST SIGN -// 2319 TURNED NOT SIGN -// 231a WATCH -// 231b HOURGLASS -// 231c TOP LEFT CORNER -// 231d TOP RIGHT CORNER -// 231e BOTTOM LEFT CORNER -// 231f BOTTOM RIGHT CORNER -// 2320 TOP HALF INTEGRAL -// 2321 BOTTOM HALF INTEGRAL -// 2322 FROWN -// 2323 SMILE -// 2324 UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS -// 2325 OPTION KEY -// 2326 ERASE TO THE RIGHT -// 2327 X IN A RECTANGLE BOX -// 2328 KEYBOARD - { 0x230C, 0x1D, 0x8, 0, 0 }, -// 2329 LEFT-POINTING ANGLE BRACKET -// 232a RIGHT-POINTING ANGLE BRACKET - { 0x2329, 0x2, 0x18, 0, 0 }, -// 232b ERASE TO THE LEFT -// 232c BENZENE RING -// 232d CYLINDRICITY -// 232e ALL AROUND-PROFILE -// 232f SYMMETRY -// 2330 TOTAL RUNOUT -// 2331 DIMENSION ORIGIN -// 2332 CONICAL TAPER -// 2333 SLOPE -// 2334 COUNTERBORE -// 2335 COUNTERSINK -// 2336 APL FUNCTIONAL SYMBOL I-BEAM -// 2337 APL FUNCTIONAL SYMBOL SQUISH QUAD -// 2338 APL FUNCTIONAL SYMBOL QUAD EQUAL -// 2339 APL FUNCTIONAL SYMBOL QUAD DIVIDE -// 233a APL FUNCTIONAL SYMBOL QUAD DIAMOND -// 233b APL FUNCTIONAL SYMBOL QUAD JOT -// 233c APL FUNCTIONAL SYMBOL QUAD CIRCLE -// 233d APL FUNCTIONAL SYMBOL CIRCLE STILE -// 233e APL FUNCTIONAL SYMBOL CIRCLE JOT -// 233f APL FUNCTIONAL SYMBOL SLASH BAR -// 2340 APL FUNCTIONAL SYMBOL BACKSLASH BAR -// 2341 APL FUNCTIONAL SYMBOL QUAD SLASH -// 2342 APL FUNCTIONAL SYMBOL QUAD BACKSLASH -// 2343 APL FUNCTIONAL SYMBOL QUAD LESS-THAN -// 2344 APL FUNCTIONAL SYMBOL QUAD GREATER-THAN -// 2345 APL FUNCTIONAL SYMBOL LEFTWARDS VANE -// 2346 APL FUNCTIONAL SYMBOL RIGHTWARDS VANE -// 2347 APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW -// 2348 APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW -// 2349 APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH -// 234a APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR -// 234b APL FUNCTIONAL SYMBOL DELTA STILE -// 234c APL FUNCTIONAL SYMBOL QUAD DOWN CARET -// 234d APL FUNCTIONAL SYMBOL QUAD DELTA -// 234e APL FUNCTIONAL SYMBOL DOWN TACK JOT -// 234f APL FUNCTIONAL SYMBOL UPWARDS VANE -// 2350 APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW -// 2351 APL FUNCTIONAL SYMBOL UP TACK OVERBAR -// 2352 APL FUNCTIONAL SYMBOL DEL STILE -// 2353 APL FUNCTIONAL SYMBOL QUAD UP CARET -// 2354 APL FUNCTIONAL SYMBOL QUAD DEL -// 2355 APL FUNCTIONAL SYMBOL UP TACK JOT -// 2356 APL FUNCTIONAL SYMBOL DOWNWARDS VANE -// 2357 APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW -// 2358 APL FUNCTIONAL SYMBOL QUOTE UNDERBAR -// 2359 APL FUNCTIONAL SYMBOL DELTA UNDERBAR -// 235a APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR -// 235b APL FUNCTIONAL SYMBOL JOT UNDERBAR -// 235c APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR -// 235d APL FUNCTIONAL SYMBOL UP SHOE JOT -// 235e APL FUNCTIONAL SYMBOL QUOTE QUAD -// 235f APL FUNCTIONAL SYMBOL CIRCLE STAR -// 2360 APL FUNCTIONAL SYMBOL QUAD COLON -// 2361 APL FUNCTIONAL SYMBOL UP TACK DIAERESIS -// 2362 APL FUNCTIONAL SYMBOL DEL DIAERESIS -// 2363 APL FUNCTIONAL SYMBOL STAR DIAERESIS -// 2364 APL FUNCTIONAL SYMBOL JOT DIAERESIS -// 2365 APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS -// 2366 APL FUNCTIONAL SYMBOL DOWN SHOE STILE -// 2367 APL FUNCTIONAL SYMBOL LEFT SHOE STILE -// 2368 APL FUNCTIONAL SYMBOL TILDE DIAERESIS -// 2369 APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS -// 236a APL FUNCTIONAL SYMBOL COMMA BAR -// 236b APL FUNCTIONAL SYMBOL DEL TILDE -// 236c APL FUNCTIONAL SYMBOL ZILDE -// 236d APL FUNCTIONAL SYMBOL STILE TILDE -// 236e APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR -// 236f APL FUNCTIONAL SYMBOL QUAD NOT EQUAL -// 2370 APL FUNCTIONAL SYMBOL QUAD QUESTION -// 2371 APL FUNCTIONAL SYMBOL DOWN CARET TILDE -// 2372 APL FUNCTIONAL SYMBOL UP CARET TILDE -// 2373 APL FUNCTIONAL SYMBOL IOTA -// 2374 APL FUNCTIONAL SYMBOL RHO -// 2375 APL FUNCTIONAL SYMBOL OMEGA -// 2376 APL FUNCTIONAL SYMBOL ALPHA UNDERBAR -// 2377 APL FUNCTIONAL SYMBOL EPSILON UNDERBAR -// 2378 APL FUNCTIONAL SYMBOL IOTA UNDERBAR -// 2379 APL FUNCTIONAL SYMBOL OMEGA UNDERBAR -// 237a APL FUNCTIONAL SYMBOL ALPHA -// 237b NOT CHECK MARK -// 237c RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW -// 237d SHOULDERED OPEN BOX -// 237e BELL SYMBOL -// 237f VERTICAL LINE WITH MIDDLE DOT -// 2380 INSERTION SYMBOL -// 2381 CONTINUOUS UNDERLINE SYMBOL -// 2382 DISCONTINUOUS UNDERLINE SYMBOL -// 2383 EMPHASIS SYMBOL -// 2384 COMPOSITION SYMBOL -// 2385 WHITE SQUARE WITH CENTRE VERTICAL LINE -// 2386 ENTER SYMBOL -// 2387 ALTERNATIVE KEY SYMBOL -// 2388 HELM SYMBOL -// 2389 CIRCLED HORIZONTAL BAR WITH NOTCH -// 238a CIRCLED TRIANGLE DOWN -// 238b BROKEN CIRCLE WITH NORTHWEST ARROW -// 238c UNDO SYMBOL -// 238d MONOSTABLE SYMBOL -// 238e HYSTERESIS SYMBOL -// 238f OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL -// 2390 OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL -// 2391 PASSIVE-PULL-DOWN-OUTPUT SYMBOL -// 2392 PASSIVE-PULL-UP-OUTPUT SYMBOL -// 2393 DIRECT CURRENT SYMBOL FORM TWO -// 2394 SOFTWARE-FUNCTION SYMBOL -// 2395 APL FUNCTIONAL SYMBOL QUAD -// 2396 DECIMAL SEPARATOR KEY SYMBOL -// 2397 PREVIOUS PAGE -// 2398 NEXT PAGE -// 2399 PRINT SCREEN SYMBOL -// 239a CLEAR SCREEN SYMBOL -// 239b LEFT PARENTHESIS UPPER HOOK -// 239c LEFT PARENTHESIS EXTENSION -// 239d LEFT PARENTHESIS LOWER HOOK -// 239e RIGHT PARENTHESIS UPPER HOOK -// 239f RIGHT PARENTHESIS EXTENSION -// 23a0 RIGHT PARENTHESIS LOWER HOOK -// 23a1 LEFT SQUARE BRACKET UPPER CORNER -// 23a2 LEFT SQUARE BRACKET EXTENSION -// 23a3 LEFT SQUARE BRACKET LOWER CORNER -// 23a4 RIGHT SQUARE BRACKET UPPER CORNER -// 23a5 RIGHT SQUARE BRACKET EXTENSION -// 23a6 RIGHT SQUARE BRACKET LOWER CORNER -// 23a7 LEFT CURLY BRACKET UPPER HOOK -// 23a8 LEFT CURLY BRACKET MIDDLE PIECE -// 23a9 LEFT CURLY BRACKET LOWER HOOK -// 23aa CURLY BRACKET EXTENSION -// 23ab RIGHT CURLY BRACKET UPPER HOOK -// 23ac RIGHT CURLY BRACKET MIDDLE PIECE -// 23ad RIGHT CURLY BRACKET LOWER HOOK -// 23ae INTEGRAL EXTENSION -// 23af HORIZONTAL LINE EXTENSION -// 23b0 UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION -// 23b1 UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION -// 23b2 SUMMATION TOP -// 23b3 SUMMATION BOTTOM -// 23b4 TOP SQUARE BRACKET -// 23b5 BOTTOM SQUARE BRACKET -// 23b6 BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET -// 23b7 RADICAL SYMBOL BOTTOM -// 23b8 LEFT VERTICAL BOX LINE -// 23b9 RIGHT VERTICAL BOX LINE -// 23ba HORIZONTAL SCAN LINE-1 -// 23bb HORIZONTAL SCAN LINE-3 -// 23bc HORIZONTAL SCAN LINE-7 -// 23bd HORIZONTAL SCAN LINE-9 -// 23be DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT -// 23bf DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT -// 23c0 DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE -// 23c1 DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE -// 23c2 DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE -// 23c3 DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE -// 23c4 DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE -// 23c5 DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE -// 23c6 DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE -// 23c7 DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE -// 23c8 DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE -// 23c9 DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL -// 23ca DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL -// 23cb DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT -// 23cc DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT -// 23cd SQUARE FOOT -// 23ce RETURN SYMBOL -// 23cf EJECT SYMBOL -// 23d0 VERTICAL LINE EXTENSION -// 23d1 METRICAL BREVE -// 23d2 METRICAL LONG OVER SHORT -// 23d3 METRICAL SHORT OVER LONG -// 23d4 METRICAL LONG OVER TWO SHORTS -// 23d5 METRICAL TWO SHORTS OVER LONG -// 23d6 METRICAL TWO SHORTS JOINED -// 23d7 METRICAL TRISEME -// 23d8 METRICAL TETRASEME -// 23d9 METRICAL PENTASEME -// 23da EARTH GROUND -// 23db FUSE -// 23dc TOP PARENTHESIS -// 23dd BOTTOM PARENTHESIS -// 23de TOP CURLY BRACKET -// 23df BOTTOM CURLY BRACKET -// 23e0 TOP TORTOISE SHELL BRACKET -// 23e1 BOTTOM TORTOISE SHELL BRACKET -// 23e2 WHITE TRAPEZIUM -// 23e3 BENZENE RING WITH CIRCLE -// 23e4 STRAIGHTNESS -// 23e5 FLATNESS -// 23e6 AC CURRENT -// 23e7 ELECTRICAL INTERSECTION -// 23e8 DECIMAL EXPONENT SYMBOL -// 23e9 BLACK RIGHT-POINTING DOUBLE TRIANGLE -// 23ea BLACK LEFT-POINTING DOUBLE TRIANGLE -// 23eb BLACK UP-POINTING DOUBLE TRIANGLE -// 23ec BLACK DOWN-POINTING DOUBLE TRIANGLE -// 23ed BLACK RIGHT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR -// 23ee BLACK LEFT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR -// 23ef BLACK RIGHT-POINTING TRIANGLE WITH DOUBLE VERTICAL BAR -// 23f0 ALARM CLOCK -// 23f1 STOPWATCH -// 23f2 TIMER CLOCK -// 23f3 HOURGLASS WITH FLOWING SAND -// 23f4 BLACK MEDIUM LEFT-POINTING TRIANGLE -// 23f5 BLACK MEDIUM RIGHT-POINTING TRIANGLE -// 23f6 BLACK MEDIUM UP-POINTING TRIANGLE -// 23f7 BLACK MEDIUM DOWN-POINTING TRIANGLE -// 23f8 DOUBLE VERTICAL BAR -// 23f9 BLACK SQUARE FOR STOP -// 23fa BLACK CIRCLE FOR RECORD - { 0x232B, 0xD0, 0x8, 0, 0 }, -// 2400 SYMBOL FOR NULL -// 2401 SYMBOL FOR START OF HEADING -// 2402 SYMBOL FOR START OF TEXT -// 2403 SYMBOL FOR END OF TEXT -// 2404 SYMBOL FOR END OF TRANSMISSION -// 2405 SYMBOL FOR ENQUIRY -// 2406 SYMBOL FOR ACKNOWLEDGE -// 2407 SYMBOL FOR BELL -// 2408 SYMBOL FOR BACKSPACE -// 2409 SYMBOL FOR HORIZONTAL TABULATION -// 240a SYMBOL FOR LINE FEED -// 240b SYMBOL FOR VERTICAL TABULATION -// 240c SYMBOL FOR FORM FEED -// 240d SYMBOL FOR CARRIAGE RETURN -// 240e SYMBOL FOR SHIFT OUT -// 240f SYMBOL FOR SHIFT IN -// 2410 SYMBOL FOR DATA LINK ESCAPE -// 2411 SYMBOL FOR DEVICE CONTROL ONE -// 2412 SYMBOL FOR DEVICE CONTROL TWO -// 2413 SYMBOL FOR DEVICE CONTROL THREE -// 2414 SYMBOL FOR DEVICE CONTROL FOUR -// 2415 SYMBOL FOR NEGATIVE ACKNOWLEDGE -// 2416 SYMBOL FOR SYNCHRONOUS IDLE -// 2417 SYMBOL FOR END OF TRANSMISSION BLOCK -// 2418 SYMBOL FOR CANCEL -// 2419 SYMBOL FOR END OF MEDIUM -// 241a SYMBOL FOR SUBSTITUTE -// 241b SYMBOL FOR ESCAPE -// 241c SYMBOL FOR FILE SEPARATOR -// 241d SYMBOL FOR GROUP SEPARATOR -// 241e SYMBOL FOR RECORD SEPARATOR -// 241f SYMBOL FOR UNIT SEPARATOR -// 2420 SYMBOL FOR SPACE -// 2421 SYMBOL FOR DELETE -// 2422 BLANK SYMBOL -// 2423 OPEN BOX -// 2424 SYMBOL FOR NEWLINE -// 2425 SYMBOL FOR DELETE FORM TWO -// 2426 SYMBOL FOR SUBSTITUTE FORM TWO - { 0x2400, 0x27, 0x8, 0, 0 }, -// 2440 OCR HOOK -// 2441 OCR CHAIR -// 2442 OCR FORK -// 2443 OCR INVERTED FORK -// 2444 OCR BELT BUCKLE -// 2445 OCR BOW TIE -// 2446 OCR BRANCH BANK IDENTIFICATION -// 2447 OCR AMOUNT OF CHECK -// 2448 OCR DASH -// 2449 OCR CUSTOMER ACCOUNT NUMBER -// 244a OCR DOUBLE BACKSLASH - { 0x2440, 0xB, 0x8, 0, 0 }, -// 2460 CIRCLED DIGIT ONE -// 2461 CIRCLED DIGIT TWO -// 2462 CIRCLED DIGIT THREE -// 2463 CIRCLED DIGIT FOUR -// 2464 CIRCLED DIGIT FIVE -// 2465 CIRCLED DIGIT SIX -// 2466 CIRCLED DIGIT SEVEN -// 2467 CIRCLED DIGIT EIGHT -// 2468 CIRCLED DIGIT NINE -// 2469 CIRCLED NUMBER TEN -// 246a CIRCLED NUMBER ELEVEN -// 246b CIRCLED NUMBER TWELVE -// 246c CIRCLED NUMBER THIRTEEN -// 246d CIRCLED NUMBER FOURTEEN -// 246e CIRCLED NUMBER FIFTEEN -// 246f CIRCLED NUMBER SIXTEEN -// 2470 CIRCLED NUMBER SEVENTEEN -// 2471 CIRCLED NUMBER EIGHTEEN -// 2472 CIRCLED NUMBER NINETEEN -// 2473 CIRCLED NUMBER TWENTY -// 2474 PARENTHESIZED DIGIT ONE -// 2475 PARENTHESIZED DIGIT TWO -// 2476 PARENTHESIZED DIGIT THREE -// 2477 PARENTHESIZED DIGIT FOUR -// 2478 PARENTHESIZED DIGIT FIVE -// 2479 PARENTHESIZED DIGIT SIX -// 247a PARENTHESIZED DIGIT SEVEN -// 247b PARENTHESIZED DIGIT EIGHT -// 247c PARENTHESIZED DIGIT NINE -// 247d PARENTHESIZED NUMBER TEN -// 247e PARENTHESIZED NUMBER ELEVEN -// 247f PARENTHESIZED NUMBER TWELVE -// 2480 PARENTHESIZED NUMBER THIRTEEN -// 2481 PARENTHESIZED NUMBER FOURTEEN -// 2482 PARENTHESIZED NUMBER FIFTEEN -// 2483 PARENTHESIZED NUMBER SIXTEEN -// 2484 PARENTHESIZED NUMBER SEVENTEEN -// 2485 PARENTHESIZED NUMBER EIGHTEEN -// 2486 PARENTHESIZED NUMBER NINETEEN -// 2487 PARENTHESIZED NUMBER TWENTY -// 2488 DIGIT ONE FULL STOP -// 2489 DIGIT TWO FULL STOP -// 248a DIGIT THREE FULL STOP -// 248b DIGIT FOUR FULL STOP -// 248c DIGIT FIVE FULL STOP -// 248d DIGIT SIX FULL STOP -// 248e DIGIT SEVEN FULL STOP -// 248f DIGIT EIGHT FULL STOP -// 2490 DIGIT NINE FULL STOP -// 2491 NUMBER TEN FULL STOP -// 2492 NUMBER ELEVEN FULL STOP -// 2493 NUMBER TWELVE FULL STOP -// 2494 NUMBER THIRTEEN FULL STOP -// 2495 NUMBER FOURTEEN FULL STOP -// 2496 NUMBER FIFTEEN FULL STOP -// 2497 NUMBER SIXTEEN FULL STOP -// 2498 NUMBER SEVENTEEN FULL STOP -// 2499 NUMBER EIGHTEEN FULL STOP -// 249a NUMBER NINETEEN FULL STOP -// 249b NUMBER TWENTY FULL STOP -// 249c PARENTHESIZED LATIN SMALL LETTER A -// 249d PARENTHESIZED LATIN SMALL LETTER B -// 249e PARENTHESIZED LATIN SMALL LETTER C -// 249f PARENTHESIZED LATIN SMALL LETTER D -// 24a0 PARENTHESIZED LATIN SMALL LETTER E -// 24a1 PARENTHESIZED LATIN SMALL LETTER F -// 24a2 PARENTHESIZED LATIN SMALL LETTER G -// 24a3 PARENTHESIZED LATIN SMALL LETTER H -// 24a4 PARENTHESIZED LATIN SMALL LETTER I -// 24a5 PARENTHESIZED LATIN SMALL LETTER J -// 24a6 PARENTHESIZED LATIN SMALL LETTER K -// 24a7 PARENTHESIZED LATIN SMALL LETTER L -// 24a8 PARENTHESIZED LATIN SMALL LETTER M -// 24a9 PARENTHESIZED LATIN SMALL LETTER N -// 24aa PARENTHESIZED LATIN SMALL LETTER O -// 24ab PARENTHESIZED LATIN SMALL LETTER P -// 24ac PARENTHESIZED LATIN SMALL LETTER Q -// 24ad PARENTHESIZED LATIN SMALL LETTER R -// 24ae PARENTHESIZED LATIN SMALL LETTER S -// 24af PARENTHESIZED LATIN SMALL LETTER T -// 24b0 PARENTHESIZED LATIN SMALL LETTER U -// 24b1 PARENTHESIZED LATIN SMALL LETTER V -// 24b2 PARENTHESIZED LATIN SMALL LETTER W -// 24b3 PARENTHESIZED LATIN SMALL LETTER X -// 24b4 PARENTHESIZED LATIN SMALL LETTER Y -// 24b5 PARENTHESIZED LATIN SMALL LETTER Z - { 0x2460, 0x56, 0x8, 0, 0 }, -// 24b6 CIRCLED LATIN CAPITAL LETTER A -// 24b7 CIRCLED LATIN CAPITAL LETTER B -// 24b8 CIRCLED LATIN CAPITAL LETTER C -// 24b9 CIRCLED LATIN CAPITAL LETTER D -// 24ba CIRCLED LATIN CAPITAL LETTER E -// 24bb CIRCLED LATIN CAPITAL LETTER F -// 24bc CIRCLED LATIN CAPITAL LETTER G -// 24bd CIRCLED LATIN CAPITAL LETTER H -// 24be CIRCLED LATIN CAPITAL LETTER I -// 24bf CIRCLED LATIN CAPITAL LETTER J -// 24c0 CIRCLED LATIN CAPITAL LETTER K -// 24c1 CIRCLED LATIN CAPITAL LETTER L -// 24c2 CIRCLED LATIN CAPITAL LETTER M -// 24c3 CIRCLED LATIN CAPITAL LETTER N -// 24c4 CIRCLED LATIN CAPITAL LETTER O -// 24c5 CIRCLED LATIN CAPITAL LETTER P -// 24c6 CIRCLED LATIN CAPITAL LETTER Q -// 24c7 CIRCLED LATIN CAPITAL LETTER R -// 24c8 CIRCLED LATIN CAPITAL LETTER S -// 24c9 CIRCLED LATIN CAPITAL LETTER T -// 24ca CIRCLED LATIN CAPITAL LETTER U -// 24cb CIRCLED LATIN CAPITAL LETTER V -// 24cc CIRCLED LATIN CAPITAL LETTER W -// 24cd CIRCLED LATIN CAPITAL LETTER X -// 24ce CIRCLED LATIN CAPITAL LETTER Y -// 24cf CIRCLED LATIN CAPITAL LETTER Z - { 0x24B6, 0x1A, 0x8, 26, 0 }, -// 24d0 CIRCLED LATIN SMALL LETTER A -// 24d1 CIRCLED LATIN SMALL LETTER B -// 24d2 CIRCLED LATIN SMALL LETTER C -// 24d3 CIRCLED LATIN SMALL LETTER D -// 24d4 CIRCLED LATIN SMALL LETTER E -// 24d5 CIRCLED LATIN SMALL LETTER F -// 24d6 CIRCLED LATIN SMALL LETTER G -// 24d7 CIRCLED LATIN SMALL LETTER H -// 24d8 CIRCLED LATIN SMALL LETTER I -// 24d9 CIRCLED LATIN SMALL LETTER J -// 24da CIRCLED LATIN SMALL LETTER K -// 24db CIRCLED LATIN SMALL LETTER L -// 24dc CIRCLED LATIN SMALL LETTER M -// 24dd CIRCLED LATIN SMALL LETTER N -// 24de CIRCLED LATIN SMALL LETTER O -// 24df CIRCLED LATIN SMALL LETTER P -// 24e0 CIRCLED LATIN SMALL LETTER Q -// 24e1 CIRCLED LATIN SMALL LETTER R -// 24e2 CIRCLED LATIN SMALL LETTER S -// 24e3 CIRCLED LATIN SMALL LETTER T -// 24e4 CIRCLED LATIN SMALL LETTER U -// 24e5 CIRCLED LATIN SMALL LETTER V -// 24e6 CIRCLED LATIN SMALL LETTER W -// 24e7 CIRCLED LATIN SMALL LETTER X -// 24e8 CIRCLED LATIN SMALL LETTER Y -// 24e9 CIRCLED LATIN SMALL LETTER Z - { 0x24D0, 0x1A, 0x8, 0, -26 }, -// 24ea CIRCLED DIGIT ZERO -// 24eb NEGATIVE CIRCLED NUMBER ELEVEN -// 24ec NEGATIVE CIRCLED NUMBER TWELVE -// 24ed NEGATIVE CIRCLED NUMBER THIRTEEN -// 24ee NEGATIVE CIRCLED NUMBER FOURTEEN -// 24ef NEGATIVE CIRCLED NUMBER FIFTEEN -// 24f0 NEGATIVE CIRCLED NUMBER SIXTEEN -// 24f1 NEGATIVE CIRCLED NUMBER SEVENTEEN -// 24f2 NEGATIVE CIRCLED NUMBER EIGHTEEN -// 24f3 NEGATIVE CIRCLED NUMBER NINETEEN -// 24f4 NEGATIVE CIRCLED NUMBER TWENTY -// 24f5 DOUBLE CIRCLED DIGIT ONE -// 24f6 DOUBLE CIRCLED DIGIT TWO -// 24f7 DOUBLE CIRCLED DIGIT THREE -// 24f8 DOUBLE CIRCLED DIGIT FOUR -// 24f9 DOUBLE CIRCLED DIGIT FIVE -// 24fa DOUBLE CIRCLED DIGIT SIX -// 24fb DOUBLE CIRCLED DIGIT SEVEN -// 24fc DOUBLE CIRCLED DIGIT EIGHT -// 24fd DOUBLE CIRCLED DIGIT NINE -// 24fe DOUBLE CIRCLED NUMBER TEN -// 24ff NEGATIVE CIRCLED DIGIT ZERO -// 2500 BOX DRAWINGS LIGHT HORIZONTAL -// 2501 BOX DRAWINGS HEAVY HORIZONTAL -// 2502 BOX DRAWINGS LIGHT VERTICAL -// 2503 BOX DRAWINGS HEAVY VERTICAL -// 2504 BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL -// 2505 BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL -// 2506 BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL -// 2507 BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL -// 2508 BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL -// 2509 BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL -// 250a BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL -// 250b BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL -// 250c BOX DRAWINGS LIGHT DOWN AND RIGHT -// 250d BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY -// 250e BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT -// 250f BOX DRAWINGS HEAVY DOWN AND RIGHT -// 2510 BOX DRAWINGS LIGHT DOWN AND LEFT -// 2511 BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY -// 2512 BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT -// 2513 BOX DRAWINGS HEAVY DOWN AND LEFT -// 2514 BOX DRAWINGS LIGHT UP AND RIGHT -// 2515 BOX DRAWINGS UP LIGHT AND RIGHT HEAVY -// 2516 BOX DRAWINGS UP HEAVY AND RIGHT LIGHT -// 2517 BOX DRAWINGS HEAVY UP AND RIGHT -// 2518 BOX DRAWINGS LIGHT UP AND LEFT -// 2519 BOX DRAWINGS UP LIGHT AND LEFT HEAVY -// 251a BOX DRAWINGS UP HEAVY AND LEFT LIGHT -// 251b BOX DRAWINGS HEAVY UP AND LEFT -// 251c BOX DRAWINGS LIGHT VERTICAL AND RIGHT -// 251d BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY -// 251e BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT -// 251f BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT -// 2520 BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT -// 2521 BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY -// 2522 BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY -// 2523 BOX DRAWINGS HEAVY VERTICAL AND RIGHT -// 2524 BOX DRAWINGS LIGHT VERTICAL AND LEFT -// 2525 BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY -// 2526 BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT -// 2527 BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT -// 2528 BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT -// 2529 BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY -// 252a BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY -// 252b BOX DRAWINGS HEAVY VERTICAL AND LEFT -// 252c BOX DRAWINGS LIGHT DOWN AND HORIZONTAL -// 252d BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT -// 252e BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT -// 252f BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY -// 2530 BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT -// 2531 BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY -// 2532 BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY -// 2533 BOX DRAWINGS HEAVY DOWN AND HORIZONTAL -// 2534 BOX DRAWINGS LIGHT UP AND HORIZONTAL -// 2535 BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT -// 2536 BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT -// 2537 BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY -// 2538 BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT -// 2539 BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY -// 253a BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY -// 253b BOX DRAWINGS HEAVY UP AND HORIZONTAL -// 253c BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL -// 253d BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT -// 253e BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT -// 253f BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY -// 2540 BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT -// 2541 BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT -// 2542 BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT -// 2543 BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT -// 2544 BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT -// 2545 BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT -// 2546 BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT -// 2547 BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY -// 2548 BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY -// 2549 BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY -// 254a BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY -// 254b BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL -// 254c BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL -// 254d BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL -// 254e BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL -// 254f BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL -// 2550 BOX DRAWINGS DOUBLE HORIZONTAL -// 2551 BOX DRAWINGS DOUBLE VERTICAL -// 2552 BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE -// 2553 BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE -// 2554 BOX DRAWINGS DOUBLE DOWN AND RIGHT -// 2555 BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE -// 2556 BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE -// 2557 BOX DRAWINGS DOUBLE DOWN AND LEFT -// 2558 BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE -// 2559 BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE -// 255a BOX DRAWINGS DOUBLE UP AND RIGHT -// 255b BOX DRAWINGS UP SINGLE AND LEFT DOUBLE -// 255c BOX DRAWINGS UP DOUBLE AND LEFT SINGLE -// 255d BOX DRAWINGS DOUBLE UP AND LEFT -// 255e BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE -// 255f BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE -// 2560 BOX DRAWINGS DOUBLE VERTICAL AND RIGHT -// 2561 BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE -// 2562 BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE -// 2563 BOX DRAWINGS DOUBLE VERTICAL AND LEFT -// 2564 BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE -// 2565 BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE -// 2566 BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL -// 2567 BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE -// 2568 BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE -// 2569 BOX DRAWINGS DOUBLE UP AND HORIZONTAL -// 256a BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE -// 256b BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE -// 256c BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL -// 256d BOX DRAWINGS LIGHT ARC DOWN AND RIGHT -// 256e BOX DRAWINGS LIGHT ARC DOWN AND LEFT -// 256f BOX DRAWINGS LIGHT ARC UP AND LEFT -// 2570 BOX DRAWINGS LIGHT ARC UP AND RIGHT -// 2571 BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT -// 2572 BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT -// 2573 BOX DRAWINGS LIGHT DIAGONAL CROSS -// 2574 BOX DRAWINGS LIGHT LEFT -// 2575 BOX DRAWINGS LIGHT UP -// 2576 BOX DRAWINGS LIGHT RIGHT -// 2577 BOX DRAWINGS LIGHT DOWN -// 2578 BOX DRAWINGS HEAVY LEFT -// 2579 BOX DRAWINGS HEAVY UP -// 257a BOX DRAWINGS HEAVY RIGHT -// 257b BOX DRAWINGS HEAVY DOWN -// 257c BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT -// 257d BOX DRAWINGS LIGHT UP AND HEAVY DOWN -// 257e BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT -// 257f BOX DRAWINGS HEAVY UP AND LIGHT DOWN -// 2580 UPPER HALF BLOCK -// 2581 LOWER ONE EIGHTH BLOCK -// 2582 LOWER ONE QUARTER BLOCK -// 2583 LOWER THREE EIGHTHS BLOCK -// 2584 LOWER HALF BLOCK -// 2585 LOWER FIVE EIGHTHS BLOCK -// 2586 LOWER THREE QUARTERS BLOCK -// 2587 LOWER SEVEN EIGHTHS BLOCK -// 2588 FULL BLOCK -// 2589 LEFT SEVEN EIGHTHS BLOCK -// 258a LEFT THREE QUARTERS BLOCK -// 258b LEFT FIVE EIGHTHS BLOCK -// 258c LEFT HALF BLOCK -// 258d LEFT THREE EIGHTHS BLOCK -// 258e LEFT ONE QUARTER BLOCK -// 258f LEFT ONE EIGHTH BLOCK -// 2590 RIGHT HALF BLOCK -// 2591 LIGHT SHADE -// 2592 MEDIUM SHADE -// 2593 DARK SHADE -// 2594 UPPER ONE EIGHTH BLOCK -// 2595 RIGHT ONE EIGHTH BLOCK -// 2596 QUADRANT LOWER LEFT -// 2597 QUADRANT LOWER RIGHT -// 2598 QUADRANT UPPER LEFT -// 2599 QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT -// 259a QUADRANT UPPER LEFT AND LOWER RIGHT -// 259b QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT -// 259c QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT -// 259d QUADRANT UPPER RIGHT -// 259e QUADRANT UPPER RIGHT AND LOWER LEFT -// 259f QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT -// 25a0 BLACK SQUARE -// 25a1 WHITE SQUARE -// 25a2 WHITE SQUARE WITH ROUNDED CORNERS -// 25a3 WHITE SQUARE CONTAINING BLACK SMALL SQUARE -// 25a4 SQUARE WITH HORIZONTAL FILL -// 25a5 SQUARE WITH VERTICAL FILL -// 25a6 SQUARE WITH ORTHOGONAL CROSSHATCH FILL -// 25a7 SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL -// 25a8 SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL -// 25a9 SQUARE WITH DIAGONAL CROSSHATCH FILL -// 25aa BLACK SMALL SQUARE -// 25ab WHITE SMALL SQUARE -// 25ac BLACK RECTANGLE -// 25ad WHITE RECTANGLE -// 25ae BLACK VERTICAL RECTANGLE -// 25af WHITE VERTICAL RECTANGLE -// 25b0 BLACK PARALLELOGRAM -// 25b1 WHITE PARALLELOGRAM -// 25b2 BLACK UP-POINTING TRIANGLE -// 25b3 WHITE UP-POINTING TRIANGLE -// 25b4 BLACK UP-POINTING SMALL TRIANGLE -// 25b5 WHITE UP-POINTING SMALL TRIANGLE -// 25b6 BLACK RIGHT-POINTING TRIANGLE -// 25b7 WHITE RIGHT-POINTING TRIANGLE -// 25b8 BLACK RIGHT-POINTING SMALL TRIANGLE -// 25b9 WHITE RIGHT-POINTING SMALL TRIANGLE -// 25ba BLACK RIGHT-POINTING POINTER -// 25bb WHITE RIGHT-POINTING POINTER -// 25bc BLACK DOWN-POINTING TRIANGLE -// 25bd WHITE DOWN-POINTING TRIANGLE -// 25be BLACK DOWN-POINTING SMALL TRIANGLE -// 25bf WHITE DOWN-POINTING SMALL TRIANGLE -// 25c0 BLACK LEFT-POINTING TRIANGLE -// 25c1 WHITE LEFT-POINTING TRIANGLE -// 25c2 BLACK LEFT-POINTING SMALL TRIANGLE -// 25c3 WHITE LEFT-POINTING SMALL TRIANGLE -// 25c4 BLACK LEFT-POINTING POINTER -// 25c5 WHITE LEFT-POINTING POINTER -// 25c6 BLACK DIAMOND -// 25c7 WHITE DIAMOND -// 25c8 WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND -// 25c9 FISHEYE -// 25ca LOZENGE -// 25cb WHITE CIRCLE -// 25cc DOTTED CIRCLE -// 25cd CIRCLE WITH VERTICAL FILL -// 25ce BULLSEYE -// 25cf BLACK CIRCLE -// 25d0 CIRCLE WITH LEFT HALF BLACK -// 25d1 CIRCLE WITH RIGHT HALF BLACK -// 25d2 CIRCLE WITH LOWER HALF BLACK -// 25d3 CIRCLE WITH UPPER HALF BLACK -// 25d4 CIRCLE WITH UPPER RIGHT QUADRANT BLACK -// 25d5 CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK -// 25d6 LEFT HALF BLACK CIRCLE -// 25d7 RIGHT HALF BLACK CIRCLE -// 25d8 INVERSE BULLET -// 25d9 INVERSE WHITE CIRCLE -// 25da UPPER HALF INVERSE WHITE CIRCLE -// 25db LOWER HALF INVERSE WHITE CIRCLE -// 25dc UPPER LEFT QUADRANT CIRCULAR ARC -// 25dd UPPER RIGHT QUADRANT CIRCULAR ARC -// 25de LOWER RIGHT QUADRANT CIRCULAR ARC -// 25df LOWER LEFT QUADRANT CIRCULAR ARC -// 25e0 UPPER HALF CIRCLE -// 25e1 LOWER HALF CIRCLE -// 25e2 BLACK LOWER RIGHT TRIANGLE -// 25e3 BLACK LOWER LEFT TRIANGLE -// 25e4 BLACK UPPER LEFT TRIANGLE -// 25e5 BLACK UPPER RIGHT TRIANGLE -// 25e6 WHITE BULLET -// 25e7 SQUARE WITH LEFT HALF BLACK -// 25e8 SQUARE WITH RIGHT HALF BLACK -// 25e9 SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK -// 25ea SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK -// 25eb WHITE SQUARE WITH VERTICAL BISECTING LINE -// 25ec WHITE UP-POINTING TRIANGLE WITH DOT -// 25ed UP-POINTING TRIANGLE WITH LEFT HALF BLACK -// 25ee UP-POINTING TRIANGLE WITH RIGHT HALF BLACK -// 25ef LARGE CIRCLE -// 25f0 WHITE SQUARE WITH UPPER LEFT QUADRANT -// 25f1 WHITE SQUARE WITH LOWER LEFT QUADRANT -// 25f2 WHITE SQUARE WITH LOWER RIGHT QUADRANT -// 25f3 WHITE SQUARE WITH UPPER RIGHT QUADRANT -// 25f4 WHITE CIRCLE WITH UPPER LEFT QUADRANT -// 25f5 WHITE CIRCLE WITH LOWER LEFT QUADRANT -// 25f6 WHITE CIRCLE WITH LOWER RIGHT QUADRANT -// 25f7 WHITE CIRCLE WITH UPPER RIGHT QUADRANT -// 25f8 UPPER LEFT TRIANGLE -// 25f9 UPPER RIGHT TRIANGLE -// 25fa LOWER LEFT TRIANGLE -// 25fb WHITE MEDIUM SQUARE -// 25fc BLACK MEDIUM SQUARE -// 25fd WHITE MEDIUM SMALL SQUARE -// 25fe BLACK MEDIUM SMALL SQUARE -// 25ff LOWER RIGHT TRIANGLE -// 2600 BLACK SUN WITH RAYS -// 2601 CLOUD -// 2602 UMBRELLA -// 2603 SNOWMAN -// 2604 COMET -// 2605 BLACK STAR -// 2606 WHITE STAR -// 2607 LIGHTNING -// 2608 THUNDERSTORM -// 2609 SUN -// 260a ASCENDING NODE -// 260b DESCENDING NODE -// 260c CONJUNCTION -// 260d OPPOSITION -// 260e BLACK TELEPHONE -// 260f WHITE TELEPHONE -// 2610 BALLOT BOX -// 2611 BALLOT BOX WITH CHECK -// 2612 BALLOT BOX WITH X -// 2613 SALTIRE -// 2614 UMBRELLA WITH RAIN DROPS -// 2615 HOT BEVERAGE -// 2616 WHITE SHOGI PIECE -// 2617 BLACK SHOGI PIECE -// 2618 SHAMROCK -// 2619 REVERSED ROTATED FLORAL HEART BULLET -// 261a BLACK LEFT POINTING INDEX -// 261b BLACK RIGHT POINTING INDEX -// 261c WHITE LEFT POINTING INDEX -// 261d WHITE UP POINTING INDEX -// 261e WHITE RIGHT POINTING INDEX -// 261f WHITE DOWN POINTING INDEX -// 2620 SKULL AND CROSSBONES -// 2621 CAUTION SIGN -// 2622 RADIOACTIVE SIGN -// 2623 BIOHAZARD SIGN -// 2624 CADUCEUS -// 2625 ANKH -// 2626 ORTHODOX CROSS -// 2627 CHI RHO -// 2628 CROSS OF LORRAINE -// 2629 CROSS OF JERUSALEM -// 262a STAR AND CRESCENT -// 262b FARSI SYMBOL -// 262c ADI SHAKTI -// 262d HAMMER AND SICKLE -// 262e PEACE SYMBOL -// 262f YIN YANG -// 2630 TRIGRAM FOR HEAVEN -// 2631 TRIGRAM FOR LAKE -// 2632 TRIGRAM FOR FIRE -// 2633 TRIGRAM FOR THUNDER -// 2634 TRIGRAM FOR WIND -// 2635 TRIGRAM FOR WATER -// 2636 TRIGRAM FOR MOUNTAIN -// 2637 TRIGRAM FOR EARTH -// 2638 WHEEL OF DHARMA -// 2639 WHITE FROWNING FACE -// 263a WHITE SMILING FACE -// 263b BLACK SMILING FACE -// 263c WHITE SUN WITH RAYS -// 263d FIRST QUARTER MOON -// 263e LAST QUARTER MOON -// 263f MERCURY -// 2640 FEMALE SIGN -// 2641 EARTH -// 2642 MALE SIGN -// 2643 JUPITER -// 2644 SATURN -// 2645 URANUS -// 2646 NEPTUNE -// 2647 PLUTO -// 2648 ARIES -// 2649 TAURUS -// 264a GEMINI -// 264b CANCER -// 264c LEO -// 264d VIRGO -// 264e LIBRA -// 264f SCORPIUS -// 2650 SAGITTARIUS -// 2651 CAPRICORN -// 2652 AQUARIUS -// 2653 PISCES -// 2654 WHITE CHESS KING -// 2655 WHITE CHESS QUEEN -// 2656 WHITE CHESS ROOK -// 2657 WHITE CHESS BISHOP -// 2658 WHITE CHESS KNIGHT -// 2659 WHITE CHESS PAWN -// 265a BLACK CHESS KING -// 265b BLACK CHESS QUEEN -// 265c BLACK CHESS ROOK -// 265d BLACK CHESS BISHOP -// 265e BLACK CHESS KNIGHT -// 265f BLACK CHESS PAWN -// 2660 BLACK SPADE SUIT -// 2661 WHITE HEART SUIT -// 2662 WHITE DIAMOND SUIT -// 2663 BLACK CLUB SUIT -// 2664 WHITE SPADE SUIT -// 2665 BLACK HEART SUIT -// 2666 BLACK DIAMOND SUIT -// 2667 WHITE CLUB SUIT -// 2668 HOT SPRINGS -// 2669 QUARTER NOTE -// 266a EIGHTH NOTE -// 266b BEAMED EIGHTH NOTES -// 266c BEAMED SIXTEENTH NOTES -// 266d MUSIC FLAT SIGN -// 266e MUSIC NATURAL SIGN -// 266f MUSIC SHARP SIGN -// 2670 WEST SYRIAC CROSS -// 2671 EAST SYRIAC CROSS -// 2672 UNIVERSAL RECYCLING SYMBOL -// 2673 RECYCLING SYMBOL FOR TYPE-1 PLASTICS -// 2674 RECYCLING SYMBOL FOR TYPE-2 PLASTICS -// 2675 RECYCLING SYMBOL FOR TYPE-3 PLASTICS -// 2676 RECYCLING SYMBOL FOR TYPE-4 PLASTICS -// 2677 RECYCLING SYMBOL FOR TYPE-5 PLASTICS -// 2678 RECYCLING SYMBOL FOR TYPE-6 PLASTICS -// 2679 RECYCLING SYMBOL FOR TYPE-7 PLASTICS -// 267a RECYCLING SYMBOL FOR GENERIC MATERIALS -// 267b BLACK UNIVERSAL RECYCLING SYMBOL -// 267c RECYCLED PAPER SYMBOL -// 267d PARTIALLY-RECYCLED PAPER SYMBOL -// 267e PERMANENT PAPER SIGN -// 267f WHEELCHAIR SYMBOL -// 2680 DIE FACE-1 -// 2681 DIE FACE-2 -// 2682 DIE FACE-3 -// 2683 DIE FACE-4 -// 2684 DIE FACE-5 -// 2685 DIE FACE-6 -// 2686 WHITE CIRCLE WITH DOT RIGHT -// 2687 WHITE CIRCLE WITH TWO DOTS -// 2688 BLACK CIRCLE WITH WHITE DOT RIGHT -// 2689 BLACK CIRCLE WITH TWO WHITE DOTS -// 268a MONOGRAM FOR YANG -// 268b MONOGRAM FOR YIN -// 268c DIGRAM FOR GREATER YANG -// 268d DIGRAM FOR LESSER YIN -// 268e DIGRAM FOR LESSER YANG -// 268f DIGRAM FOR GREATER YIN -// 2690 WHITE FLAG -// 2691 BLACK FLAG -// 2692 HAMMER AND PICK -// 2693 ANCHOR -// 2694 CROSSED SWORDS -// 2695 STAFF OF AESCULAPIUS -// 2696 SCALES -// 2697 ALEMBIC -// 2698 FLOWER -// 2699 GEAR -// 269a STAFF OF HERMES -// 269b ATOM SYMBOL -// 269c FLEUR-DE-LIS -// 269d OUTLINED WHITE STAR -// 269e THREE LINES CONVERGING RIGHT -// 269f THREE LINES CONVERGING LEFT -// 26a0 WARNING SIGN -// 26a1 HIGH VOLTAGE SIGN -// 26a2 DOUBLED FEMALE SIGN -// 26a3 DOUBLED MALE SIGN -// 26a4 INTERLOCKED FEMALE AND MALE SIGN -// 26a5 MALE AND FEMALE SIGN -// 26a6 MALE WITH STROKE SIGN -// 26a7 MALE WITH STROKE AND MALE AND FEMALE SIGN -// 26a8 VERTICAL MALE WITH STROKE SIGN -// 26a9 HORIZONTAL MALE WITH STROKE SIGN -// 26aa MEDIUM WHITE CIRCLE -// 26ab MEDIUM BLACK CIRCLE -// 26ac MEDIUM SMALL WHITE CIRCLE -// 26ad MARRIAGE SYMBOL -// 26ae DIVORCE SYMBOL -// 26af UNMARRIED PARTNERSHIP SYMBOL -// 26b0 COFFIN -// 26b1 FUNERAL URN -// 26b2 NEUTER -// 26b3 CERES -// 26b4 PALLAS -// 26b5 JUNO -// 26b6 VESTA -// 26b7 CHIRON -// 26b8 BLACK MOON LILITH -// 26b9 SEXTILE -// 26ba SEMISEXTILE -// 26bb QUINCUNX -// 26bc SESQUIQUADRATE -// 26bd SOCCER BALL -// 26be BASEBALL -// 26bf SQUARED KEY -// 26c0 WHITE DRAUGHTS MAN -// 26c1 WHITE DRAUGHTS KING -// 26c2 BLACK DRAUGHTS MAN -// 26c3 BLACK DRAUGHTS KING -// 26c4 SNOWMAN WITHOUT SNOW -// 26c5 SUN BEHIND CLOUD -// 26c6 RAIN -// 26c7 BLACK SNOWMAN -// 26c8 THUNDER CLOUD AND RAIN -// 26c9 TURNED WHITE SHOGI PIECE -// 26ca TURNED BLACK SHOGI PIECE -// 26cb WHITE DIAMOND IN SQUARE -// 26cc CROSSING LANES -// 26cd DISABLED CAR -// 26ce OPHIUCHUS -// 26cf PICK -// 26d0 CAR SLIDING -// 26d1 HELMET WITH WHITE CROSS -// 26d2 CIRCLED CROSSING LANES -// 26d3 CHAINS -// 26d4 NO ENTRY -// 26d5 ALTERNATE ONE-WAY LEFT WAY TRAFFIC -// 26d6 BLACK TWO-WAY LEFT WAY TRAFFIC -// 26d7 WHITE TWO-WAY LEFT WAY TRAFFIC -// 26d8 BLACK LEFT LANE MERGE -// 26d9 WHITE LEFT LANE MERGE -// 26da DRIVE SLOW SIGN -// 26db HEAVY WHITE DOWN-POINTING TRIANGLE -// 26dc LEFT CLOSED ENTRY -// 26dd SQUARED SALTIRE -// 26de FALLING DIAGONAL IN WHITE CIRCLE IN BLACK SQUARE -// 26df BLACK TRUCK -// 26e0 RESTRICTED LEFT ENTRY-1 -// 26e1 RESTRICTED LEFT ENTRY-2 -// 26e2 ASTRONOMICAL SYMBOL FOR URANUS -// 26e3 HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE -// 26e4 PENTAGRAM -// 26e5 RIGHT-HANDED INTERLACED PENTAGRAM -// 26e6 LEFT-HANDED INTERLACED PENTAGRAM -// 26e7 INVERTED PENTAGRAM -// 26e8 BLACK CROSS ON SHIELD -// 26e9 SHINTO SHRINE -// 26ea CHURCH -// 26eb CASTLE -// 26ec HISTORIC SITE -// 26ed GEAR WITHOUT HUB -// 26ee GEAR WITH HANDLES -// 26ef MAP SYMBOL FOR LIGHTHOUSE -// 26f0 MOUNTAIN -// 26f1 UMBRELLA ON GROUND -// 26f2 FOUNTAIN -// 26f3 FLAG IN HOLE -// 26f4 FERRY -// 26f5 SAILBOAT -// 26f6 SQUARE FOUR CORNERS -// 26f7 SKIER -// 26f8 ICE SKATE -// 26f9 PERSON WITH BALL -// 26fa TENT -// 26fb JAPANESE BANK SYMBOL -// 26fc HEADSTONE GRAVEYARD SYMBOL -// 26fd FUEL PUMP -// 26fe CUP ON BLACK SQUARE -// 26ff WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE -// 2700 BLACK SAFETY SCISSORS -// 2701 UPPER BLADE SCISSORS -// 2702 BLACK SCISSORS -// 2703 LOWER BLADE SCISSORS -// 2704 WHITE SCISSORS -// 2705 WHITE HEAVY CHECK MARK -// 2706 TELEPHONE LOCATION SIGN -// 2707 TAPE DRIVE -// 2708 AIRPLANE -// 2709 ENVELOPE -// 270a RAISED FIST -// 270b RAISED HAND -// 270c VICTORY HAND -// 270d WRITING HAND -// 270e LOWER RIGHT PENCIL -// 270f PENCIL -// 2710 UPPER RIGHT PENCIL -// 2711 WHITE NIB -// 2712 BLACK NIB -// 2713 CHECK MARK -// 2714 HEAVY CHECK MARK -// 2715 MULTIPLICATION X -// 2716 HEAVY MULTIPLICATION X -// 2717 BALLOT X -// 2718 HEAVY BALLOT X -// 2719 OUTLINED GREEK CROSS -// 271a HEAVY GREEK CROSS -// 271b OPEN CENTRE CROSS -// 271c HEAVY OPEN CENTRE CROSS -// 271d LATIN CROSS -// 271e SHADOWED WHITE LATIN CROSS -// 271f OUTLINED LATIN CROSS -// 2720 MALTESE CROSS -// 2721 STAR OF DAVID -// 2722 FOUR TEARDROP-SPOKED ASTERISK -// 2723 FOUR BALLOON-SPOKED ASTERISK -// 2724 HEAVY FOUR BALLOON-SPOKED ASTERISK -// 2725 FOUR CLUB-SPOKED ASTERISK -// 2726 BLACK FOUR POINTED STAR -// 2727 WHITE FOUR POINTED STAR -// 2728 SPARKLES -// 2729 STRESS OUTLINED WHITE STAR -// 272a CIRCLED WHITE STAR -// 272b OPEN CENTRE BLACK STAR -// 272c BLACK CENTRE WHITE STAR -// 272d OUTLINED BLACK STAR -// 272e HEAVY OUTLINED BLACK STAR -// 272f PINWHEEL STAR -// 2730 SHADOWED WHITE STAR -// 2731 HEAVY ASTERISK -// 2732 OPEN CENTRE ASTERISK -// 2733 EIGHT SPOKED ASTERISK -// 2734 EIGHT POINTED BLACK STAR -// 2735 EIGHT POINTED PINWHEEL STAR -// 2736 SIX POINTED BLACK STAR -// 2737 EIGHT POINTED RECTILINEAR BLACK STAR -// 2738 HEAVY EIGHT POINTED RECTILINEAR BLACK STAR -// 2739 TWELVE POINTED BLACK STAR -// 273a SIXTEEN POINTED ASTERISK -// 273b TEARDROP-SPOKED ASTERISK -// 273c OPEN CENTRE TEARDROP-SPOKED ASTERISK -// 273d HEAVY TEARDROP-SPOKED ASTERISK -// 273e SIX PETALLED BLACK AND WHITE FLORETTE -// 273f BLACK FLORETTE -// 2740 WHITE FLORETTE -// 2741 EIGHT PETALLED OUTLINED BLACK FLORETTE -// 2742 CIRCLED OPEN CENTRE EIGHT POINTED STAR -// 2743 HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK -// 2744 SNOWFLAKE -// 2745 TIGHT TRIFOLIATE SNOWFLAKE -// 2746 HEAVY CHEVRON SNOWFLAKE -// 2747 SPARKLE -// 2748 HEAVY SPARKLE -// 2749 BALLOON-SPOKED ASTERISK -// 274a EIGHT TEARDROP-SPOKED PROPELLER ASTERISK -// 274b HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK -// 274c CROSS MARK -// 274d SHADOWED WHITE CIRCLE -// 274e NEGATIVE SQUARED CROSS MARK -// 274f LOWER RIGHT DROP-SHADOWED WHITE SQUARE -// 2750 UPPER RIGHT DROP-SHADOWED WHITE SQUARE -// 2751 LOWER RIGHT SHADOWED WHITE SQUARE -// 2752 UPPER RIGHT SHADOWED WHITE SQUARE -// 2753 BLACK QUESTION MARK ORNAMENT -// 2754 WHITE QUESTION MARK ORNAMENT -// 2755 WHITE EXCLAMATION MARK ORNAMENT -// 2756 BLACK DIAMOND MINUS WHITE X -// 2757 HEAVY EXCLAMATION MARK SYMBOL -// 2758 LIGHT VERTICAL BAR -// 2759 MEDIUM VERTICAL BAR -// 275a HEAVY VERTICAL BAR -// 275b HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT -// 275c HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT -// 275d HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT -// 275e HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT -// 275f HEAVY LOW SINGLE COMMA QUOTATION MARK ORNAMENT -// 2760 HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT -// 2761 CURVED STEM PARAGRAPH SIGN ORNAMENT -// 2762 HEAVY EXCLAMATION MARK ORNAMENT -// 2763 HEAVY HEART EXCLAMATION MARK ORNAMENT -// 2764 HEAVY BLACK HEART -// 2765 ROTATED HEAVY BLACK HEART BULLET -// 2766 FLORAL HEART -// 2767 ROTATED FLORAL HEART BULLET - { 0x24EA, 0x27E, 0x8, 0, 0 }, -// 2768 MEDIUM LEFT PARENTHESIS ORNAMENT -// 2769 MEDIUM RIGHT PARENTHESIS ORNAMENT -// 276a MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT -// 276b MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT -// 276c MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT -// 276d MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT -// 276e HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT -// 276f HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT -// 2770 HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT -// 2771 HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT -// 2772 LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT -// 2773 LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT -// 2774 MEDIUM LEFT CURLY BRACKET ORNAMENT -// 2775 MEDIUM RIGHT CURLY BRACKET ORNAMENT - { 0x2768, 0xE, 0x18, 0, 0 }, -// 2776 DINGBAT NEGATIVE CIRCLED DIGIT ONE -// 2777 DINGBAT NEGATIVE CIRCLED DIGIT TWO -// 2778 DINGBAT NEGATIVE CIRCLED DIGIT THREE -// 2779 DINGBAT NEGATIVE CIRCLED DIGIT FOUR -// 277a DINGBAT NEGATIVE CIRCLED DIGIT FIVE -// 277b DINGBAT NEGATIVE CIRCLED DIGIT SIX -// 277c DINGBAT NEGATIVE CIRCLED DIGIT SEVEN -// 277d DINGBAT NEGATIVE CIRCLED DIGIT EIGHT -// 277e DINGBAT NEGATIVE CIRCLED DIGIT NINE -// 277f DINGBAT NEGATIVE CIRCLED NUMBER TEN -// 2780 DINGBAT CIRCLED SANS-SERIF DIGIT ONE -// 2781 DINGBAT CIRCLED SANS-SERIF DIGIT TWO -// 2782 DINGBAT CIRCLED SANS-SERIF DIGIT THREE -// 2783 DINGBAT CIRCLED SANS-SERIF DIGIT FOUR -// 2784 DINGBAT CIRCLED SANS-SERIF DIGIT FIVE -// 2785 DINGBAT CIRCLED SANS-SERIF DIGIT SIX -// 2786 DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN -// 2787 DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT -// 2788 DINGBAT CIRCLED SANS-SERIF DIGIT NINE -// 2789 DINGBAT CIRCLED SANS-SERIF NUMBER TEN -// 278a DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE -// 278b DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO -// 278c DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE -// 278d DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR -// 278e DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE -// 278f DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX -// 2790 DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN -// 2791 DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT -// 2792 DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE -// 2793 DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN -// 2794 HEAVY WIDE-HEADED RIGHTWARDS ARROW -// 2795 HEAVY PLUS SIGN -// 2796 HEAVY MINUS SIGN -// 2797 HEAVY DIVISION SIGN -// 2798 HEAVY SOUTH EAST ARROW -// 2799 HEAVY RIGHTWARDS ARROW -// 279a HEAVY NORTH EAST ARROW -// 279b DRAFTING POINT RIGHTWARDS ARROW -// 279c HEAVY ROUND-TIPPED RIGHTWARDS ARROW -// 279d TRIANGLE-HEADED RIGHTWARDS ARROW -// 279e HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW -// 279f DASHED TRIANGLE-HEADED RIGHTWARDS ARROW -// 27a0 HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW -// 27a1 BLACK RIGHTWARDS ARROW -// 27a2 THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD -// 27a3 THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD -// 27a4 BLACK RIGHTWARDS ARROWHEAD -// 27a5 HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW -// 27a6 HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW -// 27a7 SQUAT BLACK RIGHTWARDS ARROW -// 27a8 HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW -// 27a9 RIGHT-SHADED WHITE RIGHTWARDS ARROW -// 27aa LEFT-SHADED WHITE RIGHTWARDS ARROW -// 27ab BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW -// 27ac FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW -// 27ad HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW -// 27ae HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW -// 27af NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW -// 27b0 CURLY LOOP -// 27b1 NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW -// 27b2 CIRCLED HEAVY WHITE RIGHTWARDS ARROW -// 27b3 WHITE-FEATHERED RIGHTWARDS ARROW -// 27b4 BLACK-FEATHERED SOUTH EAST ARROW -// 27b5 BLACK-FEATHERED RIGHTWARDS ARROW -// 27b6 BLACK-FEATHERED NORTH EAST ARROW -// 27b7 HEAVY BLACK-FEATHERED SOUTH EAST ARROW -// 27b8 HEAVY BLACK-FEATHERED RIGHTWARDS ARROW -// 27b9 HEAVY BLACK-FEATHERED NORTH EAST ARROW -// 27ba TEARDROP-BARBED RIGHTWARDS ARROW -// 27bb HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW -// 27bc WEDGE-TAILED RIGHTWARDS ARROW -// 27bd HEAVY WEDGE-TAILED RIGHTWARDS ARROW -// 27be OPEN-OUTLINED RIGHTWARDS ARROW -// 27bf DOUBLE CURLY LOOP -// 27c0 THREE DIMENSIONAL ANGLE -// 27c1 WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE -// 27c2 PERPENDICULAR -// 27c3 OPEN SUBSET -// 27c4 OPEN SUPERSET - { 0x2776, 0x4F, 0x8, 0, 0 }, -// 27c5 LEFT S-SHAPED BAG DELIMITER -// 27c6 RIGHT S-SHAPED BAG DELIMITER - { 0x27C5, 0x2, 0x18, 0, 0 }, -// 27c7 OR WITH DOT INSIDE -// 27c8 REVERSE SOLIDUS PRECEDING SUBSET -// 27c9 SUPERSET PRECEDING SOLIDUS -// 27ca VERTICAL BAR WITH HORIZONTAL STROKE -// 27cb MATHEMATICAL RISING DIAGONAL -// 27cc LONG DIVISION -// 27cd MATHEMATICAL FALLING DIAGONAL -// 27ce SQUARED LOGICAL AND -// 27cf SQUARED LOGICAL OR -// 27d0 WHITE DIAMOND WITH CENTRED DOT -// 27d1 AND WITH DOT -// 27d2 ELEMENT OF OPENING UPWARDS -// 27d3 LOWER RIGHT CORNER WITH DOT -// 27d4 UPPER LEFT CORNER WITH DOT -// 27d5 LEFT OUTER JOIN -// 27d6 RIGHT OUTER JOIN -// 27d7 FULL OUTER JOIN -// 27d8 LARGE UP TACK -// 27d9 LARGE DOWN TACK -// 27da LEFT AND RIGHT DOUBLE TURNSTILE -// 27db LEFT AND RIGHT TACK -// 27dc LEFT MULTIMAP -// 27dd LONG RIGHT TACK -// 27de LONG LEFT TACK -// 27df UP TACK WITH CIRCLE ABOVE -// 27e0 LOZENGE DIVIDED BY HORIZONTAL RULE -// 27e1 WHITE CONCAVE-SIDED DIAMOND -// 27e2 WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK -// 27e3 WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK -// 27e4 WHITE SQUARE WITH LEFTWARDS TICK -// 27e5 WHITE SQUARE WITH RIGHTWARDS TICK - { 0x27C7, 0x1F, 0x8, 0, 0 }, -// 27e6 MATHEMATICAL LEFT WHITE SQUARE BRACKET -// 27e7 MATHEMATICAL RIGHT WHITE SQUARE BRACKET -// 27e8 MATHEMATICAL LEFT ANGLE BRACKET -// 27e9 MATHEMATICAL RIGHT ANGLE BRACKET -// 27ea MATHEMATICAL LEFT DOUBLE ANGLE BRACKET -// 27eb MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET -// 27ec MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET -// 27ed MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET -// 27ee MATHEMATICAL LEFT FLATTENED PARENTHESIS -// 27ef MATHEMATICAL RIGHT FLATTENED PARENTHESIS - { 0x27E6, 0xA, 0x18, 0, 0 }, -// 27f0 UPWARDS QUADRUPLE ARROW -// 27f1 DOWNWARDS QUADRUPLE ARROW -// 27f2 ANTICLOCKWISE GAPPED CIRCLE ARROW -// 27f3 CLOCKWISE GAPPED CIRCLE ARROW -// 27f4 RIGHT ARROW WITH CIRCLED PLUS -// 27f5 LONG LEFTWARDS ARROW -// 27f6 LONG RIGHTWARDS ARROW -// 27f7 LONG LEFT RIGHT ARROW -// 27f8 LONG LEFTWARDS DOUBLE ARROW -// 27f9 LONG RIGHTWARDS DOUBLE ARROW -// 27fa LONG LEFT RIGHT DOUBLE ARROW -// 27fb LONG LEFTWARDS ARROW FROM BAR -// 27fc LONG RIGHTWARDS ARROW FROM BAR -// 27fd LONG LEFTWARDS DOUBLE ARROW FROM BAR -// 27fe LONG RIGHTWARDS DOUBLE ARROW FROM BAR -// 27ff LONG RIGHTWARDS SQUIGGLE ARROW -// 2800 BRAILLE PATTERN BLANK -// 2801 BRAILLE PATTERN DOTS-1 -// 2802 BRAILLE PATTERN DOTS-2 -// 2803 BRAILLE PATTERN DOTS-12 -// 2804 BRAILLE PATTERN DOTS-3 -// 2805 BRAILLE PATTERN DOTS-13 -// 2806 BRAILLE PATTERN DOTS-23 -// 2807 BRAILLE PATTERN DOTS-123 -// 2808 BRAILLE PATTERN DOTS-4 -// 2809 BRAILLE PATTERN DOTS-14 -// 280a BRAILLE PATTERN DOTS-24 -// 280b BRAILLE PATTERN DOTS-124 -// 280c BRAILLE PATTERN DOTS-34 -// 280d BRAILLE PATTERN DOTS-134 -// 280e BRAILLE PATTERN DOTS-234 -// 280f BRAILLE PATTERN DOTS-1234 -// 2810 BRAILLE PATTERN DOTS-5 -// 2811 BRAILLE PATTERN DOTS-15 -// 2812 BRAILLE PATTERN DOTS-25 -// 2813 BRAILLE PATTERN DOTS-125 -// 2814 BRAILLE PATTERN DOTS-35 -// 2815 BRAILLE PATTERN DOTS-135 -// 2816 BRAILLE PATTERN DOTS-235 -// 2817 BRAILLE PATTERN DOTS-1235 -// 2818 BRAILLE PATTERN DOTS-45 -// 2819 BRAILLE PATTERN DOTS-145 -// 281a BRAILLE PATTERN DOTS-245 -// 281b BRAILLE PATTERN DOTS-1245 -// 281c BRAILLE PATTERN DOTS-345 -// 281d BRAILLE PATTERN DOTS-1345 -// 281e BRAILLE PATTERN DOTS-2345 -// 281f BRAILLE PATTERN DOTS-12345 -// 2820 BRAILLE PATTERN DOTS-6 -// 2821 BRAILLE PATTERN DOTS-16 -// 2822 BRAILLE PATTERN DOTS-26 -// 2823 BRAILLE PATTERN DOTS-126 -// 2824 BRAILLE PATTERN DOTS-36 -// 2825 BRAILLE PATTERN DOTS-136 -// 2826 BRAILLE PATTERN DOTS-236 -// 2827 BRAILLE PATTERN DOTS-1236 -// 2828 BRAILLE PATTERN DOTS-46 -// 2829 BRAILLE PATTERN DOTS-146 -// 282a BRAILLE PATTERN DOTS-246 -// 282b BRAILLE PATTERN DOTS-1246 -// 282c BRAILLE PATTERN DOTS-346 -// 282d BRAILLE PATTERN DOTS-1346 -// 282e BRAILLE PATTERN DOTS-2346 -// 282f BRAILLE PATTERN DOTS-12346 -// 2830 BRAILLE PATTERN DOTS-56 -// 2831 BRAILLE PATTERN DOTS-156 -// 2832 BRAILLE PATTERN DOTS-256 -// 2833 BRAILLE PATTERN DOTS-1256 -// 2834 BRAILLE PATTERN DOTS-356 -// 2835 BRAILLE PATTERN DOTS-1356 -// 2836 BRAILLE PATTERN DOTS-2356 -// 2837 BRAILLE PATTERN DOTS-12356 -// 2838 BRAILLE PATTERN DOTS-456 -// 2839 BRAILLE PATTERN DOTS-1456 -// 283a BRAILLE PATTERN DOTS-2456 -// 283b BRAILLE PATTERN DOTS-12456 -// 283c BRAILLE PATTERN DOTS-3456 -// 283d BRAILLE PATTERN DOTS-13456 -// 283e BRAILLE PATTERN DOTS-23456 -// 283f BRAILLE PATTERN DOTS-123456 -// 2840 BRAILLE PATTERN DOTS-7 -// 2841 BRAILLE PATTERN DOTS-17 -// 2842 BRAILLE PATTERN DOTS-27 -// 2843 BRAILLE PATTERN DOTS-127 -// 2844 BRAILLE PATTERN DOTS-37 -// 2845 BRAILLE PATTERN DOTS-137 -// 2846 BRAILLE PATTERN DOTS-237 -// 2847 BRAILLE PATTERN DOTS-1237 -// 2848 BRAILLE PATTERN DOTS-47 -// 2849 BRAILLE PATTERN DOTS-147 -// 284a BRAILLE PATTERN DOTS-247 -// 284b BRAILLE PATTERN DOTS-1247 -// 284c BRAILLE PATTERN DOTS-347 -// 284d BRAILLE PATTERN DOTS-1347 -// 284e BRAILLE PATTERN DOTS-2347 -// 284f BRAILLE PATTERN DOTS-12347 -// 2850 BRAILLE PATTERN DOTS-57 -// 2851 BRAILLE PATTERN DOTS-157 -// 2852 BRAILLE PATTERN DOTS-257 -// 2853 BRAILLE PATTERN DOTS-1257 -// 2854 BRAILLE PATTERN DOTS-357 -// 2855 BRAILLE PATTERN DOTS-1357 -// 2856 BRAILLE PATTERN DOTS-2357 -// 2857 BRAILLE PATTERN DOTS-12357 -// 2858 BRAILLE PATTERN DOTS-457 -// 2859 BRAILLE PATTERN DOTS-1457 -// 285a BRAILLE PATTERN DOTS-2457 -// 285b BRAILLE PATTERN DOTS-12457 -// 285c BRAILLE PATTERN DOTS-3457 -// 285d BRAILLE PATTERN DOTS-13457 -// 285e BRAILLE PATTERN DOTS-23457 -// 285f BRAILLE PATTERN DOTS-123457 -// 2860 BRAILLE PATTERN DOTS-67 -// 2861 BRAILLE PATTERN DOTS-167 -// 2862 BRAILLE PATTERN DOTS-267 -// 2863 BRAILLE PATTERN DOTS-1267 -// 2864 BRAILLE PATTERN DOTS-367 -// 2865 BRAILLE PATTERN DOTS-1367 -// 2866 BRAILLE PATTERN DOTS-2367 -// 2867 BRAILLE PATTERN DOTS-12367 -// 2868 BRAILLE PATTERN DOTS-467 -// 2869 BRAILLE PATTERN DOTS-1467 -// 286a BRAILLE PATTERN DOTS-2467 -// 286b BRAILLE PATTERN DOTS-12467 -// 286c BRAILLE PATTERN DOTS-3467 -// 286d BRAILLE PATTERN DOTS-13467 -// 286e BRAILLE PATTERN DOTS-23467 -// 286f BRAILLE PATTERN DOTS-123467 -// 2870 BRAILLE PATTERN DOTS-567 -// 2871 BRAILLE PATTERN DOTS-1567 -// 2872 BRAILLE PATTERN DOTS-2567 -// 2873 BRAILLE PATTERN DOTS-12567 -// 2874 BRAILLE PATTERN DOTS-3567 -// 2875 BRAILLE PATTERN DOTS-13567 -// 2876 BRAILLE PATTERN DOTS-23567 -// 2877 BRAILLE PATTERN DOTS-123567 -// 2878 BRAILLE PATTERN DOTS-4567 -// 2879 BRAILLE PATTERN DOTS-14567 -// 287a BRAILLE PATTERN DOTS-24567 -// 287b BRAILLE PATTERN DOTS-124567 -// 287c BRAILLE PATTERN DOTS-34567 -// 287d BRAILLE PATTERN DOTS-134567 -// 287e BRAILLE PATTERN DOTS-234567 -// 287f BRAILLE PATTERN DOTS-1234567 -// 2880 BRAILLE PATTERN DOTS-8 -// 2881 BRAILLE PATTERN DOTS-18 -// 2882 BRAILLE PATTERN DOTS-28 -// 2883 BRAILLE PATTERN DOTS-128 -// 2884 BRAILLE PATTERN DOTS-38 -// 2885 BRAILLE PATTERN DOTS-138 -// 2886 BRAILLE PATTERN DOTS-238 -// 2887 BRAILLE PATTERN DOTS-1238 -// 2888 BRAILLE PATTERN DOTS-48 -// 2889 BRAILLE PATTERN DOTS-148 -// 288a BRAILLE PATTERN DOTS-248 -// 288b BRAILLE PATTERN DOTS-1248 -// 288c BRAILLE PATTERN DOTS-348 -// 288d BRAILLE PATTERN DOTS-1348 -// 288e BRAILLE PATTERN DOTS-2348 -// 288f BRAILLE PATTERN DOTS-12348 -// 2890 BRAILLE PATTERN DOTS-58 -// 2891 BRAILLE PATTERN DOTS-158 -// 2892 BRAILLE PATTERN DOTS-258 -// 2893 BRAILLE PATTERN DOTS-1258 -// 2894 BRAILLE PATTERN DOTS-358 -// 2895 BRAILLE PATTERN DOTS-1358 -// 2896 BRAILLE PATTERN DOTS-2358 -// 2897 BRAILLE PATTERN DOTS-12358 -// 2898 BRAILLE PATTERN DOTS-458 -// 2899 BRAILLE PATTERN DOTS-1458 -// 289a BRAILLE PATTERN DOTS-2458 -// 289b BRAILLE PATTERN DOTS-12458 -// 289c BRAILLE PATTERN DOTS-3458 -// 289d BRAILLE PATTERN DOTS-13458 -// 289e BRAILLE PATTERN DOTS-23458 -// 289f BRAILLE PATTERN DOTS-123458 -// 28a0 BRAILLE PATTERN DOTS-68 -// 28a1 BRAILLE PATTERN DOTS-168 -// 28a2 BRAILLE PATTERN DOTS-268 -// 28a3 BRAILLE PATTERN DOTS-1268 -// 28a4 BRAILLE PATTERN DOTS-368 -// 28a5 BRAILLE PATTERN DOTS-1368 -// 28a6 BRAILLE PATTERN DOTS-2368 -// 28a7 BRAILLE PATTERN DOTS-12368 -// 28a8 BRAILLE PATTERN DOTS-468 -// 28a9 BRAILLE PATTERN DOTS-1468 -// 28aa BRAILLE PATTERN DOTS-2468 -// 28ab BRAILLE PATTERN DOTS-12468 -// 28ac BRAILLE PATTERN DOTS-3468 -// 28ad BRAILLE PATTERN DOTS-13468 -// 28ae BRAILLE PATTERN DOTS-23468 -// 28af BRAILLE PATTERN DOTS-123468 -// 28b0 BRAILLE PATTERN DOTS-568 -// 28b1 BRAILLE PATTERN DOTS-1568 -// 28b2 BRAILLE PATTERN DOTS-2568 -// 28b3 BRAILLE PATTERN DOTS-12568 -// 28b4 BRAILLE PATTERN DOTS-3568 -// 28b5 BRAILLE PATTERN DOTS-13568 -// 28b6 BRAILLE PATTERN DOTS-23568 -// 28b7 BRAILLE PATTERN DOTS-123568 -// 28b8 BRAILLE PATTERN DOTS-4568 -// 28b9 BRAILLE PATTERN DOTS-14568 -// 28ba BRAILLE PATTERN DOTS-24568 -// 28bb BRAILLE PATTERN DOTS-124568 -// 28bc BRAILLE PATTERN DOTS-34568 -// 28bd BRAILLE PATTERN DOTS-134568 -// 28be BRAILLE PATTERN DOTS-234568 -// 28bf BRAILLE PATTERN DOTS-1234568 -// 28c0 BRAILLE PATTERN DOTS-78 -// 28c1 BRAILLE PATTERN DOTS-178 -// 28c2 BRAILLE PATTERN DOTS-278 -// 28c3 BRAILLE PATTERN DOTS-1278 -// 28c4 BRAILLE PATTERN DOTS-378 -// 28c5 BRAILLE PATTERN DOTS-1378 -// 28c6 BRAILLE PATTERN DOTS-2378 -// 28c7 BRAILLE PATTERN DOTS-12378 -// 28c8 BRAILLE PATTERN DOTS-478 -// 28c9 BRAILLE PATTERN DOTS-1478 -// 28ca BRAILLE PATTERN DOTS-2478 -// 28cb BRAILLE PATTERN DOTS-12478 -// 28cc BRAILLE PATTERN DOTS-3478 -// 28cd BRAILLE PATTERN DOTS-13478 -// 28ce BRAILLE PATTERN DOTS-23478 -// 28cf BRAILLE PATTERN DOTS-123478 -// 28d0 BRAILLE PATTERN DOTS-578 -// 28d1 BRAILLE PATTERN DOTS-1578 -// 28d2 BRAILLE PATTERN DOTS-2578 -// 28d3 BRAILLE PATTERN DOTS-12578 -// 28d4 BRAILLE PATTERN DOTS-3578 -// 28d5 BRAILLE PATTERN DOTS-13578 -// 28d6 BRAILLE PATTERN DOTS-23578 -// 28d7 BRAILLE PATTERN DOTS-123578 -// 28d8 BRAILLE PATTERN DOTS-4578 -// 28d9 BRAILLE PATTERN DOTS-14578 -// 28da BRAILLE PATTERN DOTS-24578 -// 28db BRAILLE PATTERN DOTS-124578 -// 28dc BRAILLE PATTERN DOTS-34578 -// 28dd BRAILLE PATTERN DOTS-134578 -// 28de BRAILLE PATTERN DOTS-234578 -// 28df BRAILLE PATTERN DOTS-1234578 -// 28e0 BRAILLE PATTERN DOTS-678 -// 28e1 BRAILLE PATTERN DOTS-1678 -// 28e2 BRAILLE PATTERN DOTS-2678 -// 28e3 BRAILLE PATTERN DOTS-12678 -// 28e4 BRAILLE PATTERN DOTS-3678 -// 28e5 BRAILLE PATTERN DOTS-13678 -// 28e6 BRAILLE PATTERN DOTS-23678 -// 28e7 BRAILLE PATTERN DOTS-123678 -// 28e8 BRAILLE PATTERN DOTS-4678 -// 28e9 BRAILLE PATTERN DOTS-14678 -// 28ea BRAILLE PATTERN DOTS-24678 -// 28eb BRAILLE PATTERN DOTS-124678 -// 28ec BRAILLE PATTERN DOTS-34678 -// 28ed BRAILLE PATTERN DOTS-134678 -// 28ee BRAILLE PATTERN DOTS-234678 -// 28ef BRAILLE PATTERN DOTS-1234678 -// 28f0 BRAILLE PATTERN DOTS-5678 -// 28f1 BRAILLE PATTERN DOTS-15678 -// 28f2 BRAILLE PATTERN DOTS-25678 -// 28f3 BRAILLE PATTERN DOTS-125678 -// 28f4 BRAILLE PATTERN DOTS-35678 -// 28f5 BRAILLE PATTERN DOTS-135678 -// 28f6 BRAILLE PATTERN DOTS-235678 -// 28f7 BRAILLE PATTERN DOTS-1235678 -// 28f8 BRAILLE PATTERN DOTS-45678 -// 28f9 BRAILLE PATTERN DOTS-145678 -// 28fa BRAILLE PATTERN DOTS-245678 -// 28fb BRAILLE PATTERN DOTS-1245678 -// 28fc BRAILLE PATTERN DOTS-345678 -// 28fd BRAILLE PATTERN DOTS-1345678 -// 28fe BRAILLE PATTERN DOTS-2345678 -// 28ff BRAILLE PATTERN DOTS-12345678 -// 2900 RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE -// 2901 RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE -// 2902 LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE -// 2903 RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE -// 2904 LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE -// 2905 RIGHTWARDS TWO-HEADED ARROW FROM BAR -// 2906 LEFTWARDS DOUBLE ARROW FROM BAR -// 2907 RIGHTWARDS DOUBLE ARROW FROM BAR -// 2908 DOWNWARDS ARROW WITH HORIZONTAL STROKE -// 2909 UPWARDS ARROW WITH HORIZONTAL STROKE -// 290a UPWARDS TRIPLE ARROW -// 290b DOWNWARDS TRIPLE ARROW -// 290c LEFTWARDS DOUBLE DASH ARROW -// 290d RIGHTWARDS DOUBLE DASH ARROW -// 290e LEFTWARDS TRIPLE DASH ARROW -// 290f RIGHTWARDS TRIPLE DASH ARROW -// 2910 RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW -// 2911 RIGHTWARDS ARROW WITH DOTTED STEM -// 2912 UPWARDS ARROW TO BAR -// 2913 DOWNWARDS ARROW TO BAR -// 2914 RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE -// 2915 RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE -// 2916 RIGHTWARDS TWO-HEADED ARROW WITH TAIL -// 2917 RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE -// 2918 RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE -// 2919 LEFTWARDS ARROW-TAIL -// 291a RIGHTWARDS ARROW-TAIL -// 291b LEFTWARDS DOUBLE ARROW-TAIL -// 291c RIGHTWARDS DOUBLE ARROW-TAIL -// 291d LEFTWARDS ARROW TO BLACK DIAMOND -// 291e RIGHTWARDS ARROW TO BLACK DIAMOND -// 291f LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND -// 2920 RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND -// 2921 NORTH WEST AND SOUTH EAST ARROW -// 2922 NORTH EAST AND SOUTH WEST ARROW -// 2923 NORTH WEST ARROW WITH HOOK -// 2924 NORTH EAST ARROW WITH HOOK -// 2925 SOUTH EAST ARROW WITH HOOK -// 2926 SOUTH WEST ARROW WITH HOOK -// 2927 NORTH WEST ARROW AND NORTH EAST ARROW -// 2928 NORTH EAST ARROW AND SOUTH EAST ARROW -// 2929 SOUTH EAST ARROW AND SOUTH WEST ARROW -// 292a SOUTH WEST ARROW AND NORTH WEST ARROW -// 292b RISING DIAGONAL CROSSING FALLING DIAGONAL -// 292c FALLING DIAGONAL CROSSING RISING DIAGONAL -// 292d SOUTH EAST ARROW CROSSING NORTH EAST ARROW -// 292e NORTH EAST ARROW CROSSING SOUTH EAST ARROW -// 292f FALLING DIAGONAL CROSSING NORTH EAST ARROW -// 2930 RISING DIAGONAL CROSSING SOUTH EAST ARROW -// 2931 NORTH EAST ARROW CROSSING NORTH WEST ARROW -// 2932 NORTH WEST ARROW CROSSING NORTH EAST ARROW -// 2933 WAVE ARROW POINTING DIRECTLY RIGHT -// 2934 ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS -// 2935 ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS -// 2936 ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS -// 2937 ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS -// 2938 RIGHT-SIDE ARC CLOCKWISE ARROW -// 2939 LEFT-SIDE ARC ANTICLOCKWISE ARROW -// 293a TOP ARC ANTICLOCKWISE ARROW -// 293b BOTTOM ARC ANTICLOCKWISE ARROW -// 293c TOP ARC CLOCKWISE ARROW WITH MINUS -// 293d TOP ARC ANTICLOCKWISE ARROW WITH PLUS -// 293e LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW -// 293f LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW -// 2940 ANTICLOCKWISE CLOSED CIRCLE ARROW -// 2941 CLOCKWISE CLOSED CIRCLE ARROW -// 2942 RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW -// 2943 LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW -// 2944 SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW -// 2945 RIGHTWARDS ARROW WITH PLUS BELOW -// 2946 LEFTWARDS ARROW WITH PLUS BELOW -// 2947 RIGHTWARDS ARROW THROUGH X -// 2948 LEFT RIGHT ARROW THROUGH SMALL CIRCLE -// 2949 UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE -// 294a LEFT BARB UP RIGHT BARB DOWN HARPOON -// 294b LEFT BARB DOWN RIGHT BARB UP HARPOON -// 294c UP BARB RIGHT DOWN BARB LEFT HARPOON -// 294d UP BARB LEFT DOWN BARB RIGHT HARPOON -// 294e LEFT BARB UP RIGHT BARB UP HARPOON -// 294f UP BARB RIGHT DOWN BARB RIGHT HARPOON -// 2950 LEFT BARB DOWN RIGHT BARB DOWN HARPOON -// 2951 UP BARB LEFT DOWN BARB LEFT HARPOON -// 2952 LEFTWARDS HARPOON WITH BARB UP TO BAR -// 2953 RIGHTWARDS HARPOON WITH BARB UP TO BAR -// 2954 UPWARDS HARPOON WITH BARB RIGHT TO BAR -// 2955 DOWNWARDS HARPOON WITH BARB RIGHT TO BAR -// 2956 LEFTWARDS HARPOON WITH BARB DOWN TO BAR -// 2957 RIGHTWARDS HARPOON WITH BARB DOWN TO BAR -// 2958 UPWARDS HARPOON WITH BARB LEFT TO BAR -// 2959 DOWNWARDS HARPOON WITH BARB LEFT TO BAR -// 295a LEFTWARDS HARPOON WITH BARB UP FROM BAR -// 295b RIGHTWARDS HARPOON WITH BARB UP FROM BAR -// 295c UPWARDS HARPOON WITH BARB RIGHT FROM BAR -// 295d DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR -// 295e LEFTWARDS HARPOON WITH BARB DOWN FROM BAR -// 295f RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR -// 2960 UPWARDS HARPOON WITH BARB LEFT FROM BAR -// 2961 DOWNWARDS HARPOON WITH BARB LEFT FROM BAR -// 2962 LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN -// 2963 UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT -// 2964 RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN -// 2965 DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT -// 2966 LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP -// 2967 LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN -// 2968 RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP -// 2969 RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN -// 296a LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH -// 296b LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH -// 296c RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH -// 296d RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH -// 296e UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT -// 296f DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT -// 2970 RIGHT DOUBLE ARROW WITH ROUNDED HEAD -// 2971 EQUALS SIGN ABOVE RIGHTWARDS ARROW -// 2972 TILDE OPERATOR ABOVE RIGHTWARDS ARROW -// 2973 LEFTWARDS ARROW ABOVE TILDE OPERATOR -// 2974 RIGHTWARDS ARROW ABOVE TILDE OPERATOR -// 2975 RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO -// 2976 LESS-THAN ABOVE LEFTWARDS ARROW -// 2977 LEFTWARDS ARROW THROUGH LESS-THAN -// 2978 GREATER-THAN ABOVE RIGHTWARDS ARROW -// 2979 SUBSET ABOVE RIGHTWARDS ARROW -// 297a LEFTWARDS ARROW THROUGH SUBSET -// 297b SUPERSET ABOVE LEFTWARDS ARROW -// 297c LEFT FISH TAIL -// 297d RIGHT FISH TAIL -// 297e UP FISH TAIL -// 297f DOWN FISH TAIL -// 2980 TRIPLE VERTICAL BAR DELIMITER -// 2981 Z NOTATION SPOT -// 2982 Z NOTATION TYPE COLON - { 0x27F0, 0x193, 0x8, 0, 0 }, -// 2983 LEFT WHITE CURLY BRACKET -// 2984 RIGHT WHITE CURLY BRACKET -// 2985 LEFT WHITE PARENTHESIS -// 2986 RIGHT WHITE PARENTHESIS -// 2987 Z NOTATION LEFT IMAGE BRACKET -// 2988 Z NOTATION RIGHT IMAGE BRACKET -// 2989 Z NOTATION LEFT BINDING BRACKET -// 298a Z NOTATION RIGHT BINDING BRACKET -// 298b LEFT SQUARE BRACKET WITH UNDERBAR -// 298c RIGHT SQUARE BRACKET WITH UNDERBAR -// 298d LEFT SQUARE BRACKET WITH TICK IN TOP CORNER -// 298e RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER -// 298f LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER -// 2990 RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER -// 2991 LEFT ANGLE BRACKET WITH DOT -// 2992 RIGHT ANGLE BRACKET WITH DOT -// 2993 LEFT ARC LESS-THAN BRACKET -// 2994 RIGHT ARC GREATER-THAN BRACKET -// 2995 DOUBLE LEFT ARC GREATER-THAN BRACKET -// 2996 DOUBLE RIGHT ARC LESS-THAN BRACKET -// 2997 LEFT BLACK TORTOISE SHELL BRACKET -// 2998 RIGHT BLACK TORTOISE SHELL BRACKET - { 0x2983, 0x16, 0x18, 0, 0 }, -// 2999 DOTTED FENCE -// 299a VERTICAL ZIGZAG LINE -// 299b MEASURED ANGLE OPENING LEFT -// 299c RIGHT ANGLE VARIANT WITH SQUARE -// 299d MEASURED RIGHT ANGLE WITH DOT -// 299e ANGLE WITH S INSIDE -// 299f ACUTE ANGLE -// 29a0 SPHERICAL ANGLE OPENING LEFT -// 29a1 SPHERICAL ANGLE OPENING UP -// 29a2 TURNED ANGLE -// 29a3 REVERSED ANGLE -// 29a4 ANGLE WITH UNDERBAR -// 29a5 REVERSED ANGLE WITH UNDERBAR -// 29a6 OBLIQUE ANGLE OPENING UP -// 29a7 OBLIQUE ANGLE OPENING DOWN -// 29a8 MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT -// 29a9 MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT -// 29aa MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT -// 29ab MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT -// 29ac MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP -// 29ad MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP -// 29ae MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN -// 29af MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN -// 29b0 REVERSED EMPTY SET -// 29b1 EMPTY SET WITH OVERBAR -// 29b2 EMPTY SET WITH SMALL CIRCLE ABOVE -// 29b3 EMPTY SET WITH RIGHT ARROW ABOVE -// 29b4 EMPTY SET WITH LEFT ARROW ABOVE -// 29b5 CIRCLE WITH HORIZONTAL BAR -// 29b6 CIRCLED VERTICAL BAR -// 29b7 CIRCLED PARALLEL -// 29b8 CIRCLED REVERSE SOLIDUS -// 29b9 CIRCLED PERPENDICULAR -// 29ba CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR -// 29bb CIRCLE WITH SUPERIMPOSED X -// 29bc CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN -// 29bd UP ARROW THROUGH CIRCLE -// 29be CIRCLED WHITE BULLET -// 29bf CIRCLED BULLET -// 29c0 CIRCLED LESS-THAN -// 29c1 CIRCLED GREATER-THAN -// 29c2 CIRCLE WITH SMALL CIRCLE TO THE RIGHT -// 29c3 CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT -// 29c4 SQUARED RISING DIAGONAL SLASH -// 29c5 SQUARED FALLING DIAGONAL SLASH -// 29c6 SQUARED ASTERISK -// 29c7 SQUARED SMALL CIRCLE -// 29c8 SQUARED SQUARE -// 29c9 TWO JOINED SQUARES -// 29ca TRIANGLE WITH DOT ABOVE -// 29cb TRIANGLE WITH UNDERBAR -// 29cc S IN TRIANGLE -// 29cd TRIANGLE WITH SERIFS AT BOTTOM -// 29ce RIGHT TRIANGLE ABOVE LEFT TRIANGLE -// 29cf LEFT TRIANGLE BESIDE VERTICAL BAR -// 29d0 VERTICAL BAR BESIDE RIGHT TRIANGLE -// 29d1 BOWTIE WITH LEFT HALF BLACK -// 29d2 BOWTIE WITH RIGHT HALF BLACK -// 29d3 BLACK BOWTIE -// 29d4 TIMES WITH LEFT HALF BLACK -// 29d5 TIMES WITH RIGHT HALF BLACK -// 29d6 WHITE HOURGLASS -// 29d7 BLACK HOURGLASS - { 0x2999, 0x3F, 0x8, 0, 0 }, -// 29d8 LEFT WIGGLY FENCE -// 29d9 RIGHT WIGGLY FENCE -// 29da LEFT DOUBLE WIGGLY FENCE -// 29db RIGHT DOUBLE WIGGLY FENCE - { 0x29D8, 0x4, 0x18, 0, 0 }, -// 29dc INCOMPLETE INFINITY -// 29dd TIE OVER INFINITY -// 29de INFINITY NEGATED WITH VERTICAL BAR -// 29df DOUBLE-ENDED MULTIMAP -// 29e0 SQUARE WITH CONTOURED OUTLINE -// 29e1 INCREASES AS -// 29e2 SHUFFLE PRODUCT -// 29e3 EQUALS SIGN AND SLANTED PARALLEL -// 29e4 EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE -// 29e5 IDENTICAL TO AND SLANTED PARALLEL -// 29e6 GLEICH STARK -// 29e7 THERMODYNAMIC -// 29e8 DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK -// 29e9 DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK -// 29ea BLACK DIAMOND WITH DOWN ARROW -// 29eb BLACK LOZENGE -// 29ec WHITE CIRCLE WITH DOWN ARROW -// 29ed BLACK CIRCLE WITH DOWN ARROW -// 29ee ERROR-BARRED WHITE SQUARE -// 29ef ERROR-BARRED BLACK SQUARE -// 29f0 ERROR-BARRED WHITE DIAMOND -// 29f1 ERROR-BARRED BLACK DIAMOND -// 29f2 ERROR-BARRED WHITE CIRCLE -// 29f3 ERROR-BARRED BLACK CIRCLE -// 29f4 RULE-DELAYED -// 29f5 REVERSE SOLIDUS OPERATOR -// 29f6 SOLIDUS WITH OVERBAR -// 29f7 REVERSE SOLIDUS WITH HORIZONTAL STROKE -// 29f8 BIG SOLIDUS -// 29f9 BIG REVERSE SOLIDUS -// 29fa DOUBLE PLUS -// 29fb TRIPLE PLUS - { 0x29DC, 0x20, 0x8, 0, 0 }, -// 29fc LEFT-POINTING CURVED ANGLE BRACKET -// 29fd RIGHT-POINTING CURVED ANGLE BRACKET - { 0x29FC, 0x2, 0x18, 0, 0 }, -// 29fe TINY -// 29ff MINY -// 2a00 N-ARY CIRCLED DOT OPERATOR -// 2a01 N-ARY CIRCLED PLUS OPERATOR -// 2a02 N-ARY CIRCLED TIMES OPERATOR -// 2a03 N-ARY UNION OPERATOR WITH DOT -// 2a04 N-ARY UNION OPERATOR WITH PLUS -// 2a05 N-ARY SQUARE INTERSECTION OPERATOR -// 2a06 N-ARY SQUARE UNION OPERATOR -// 2a07 TWO LOGICAL AND OPERATOR -// 2a08 TWO LOGICAL OR OPERATOR -// 2a09 N-ARY TIMES OPERATOR -// 2a0a MODULO TWO SUM -// 2a0b SUMMATION WITH INTEGRAL -// 2a0c QUADRUPLE INTEGRAL OPERATOR -// 2a0d FINITE PART INTEGRAL -// 2a0e INTEGRAL WITH DOUBLE STROKE -// 2a0f INTEGRAL AVERAGE WITH SLASH -// 2a10 CIRCULATION FUNCTION -// 2a11 ANTICLOCKWISE INTEGRATION -// 2a12 LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE -// 2a13 LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE -// 2a14 LINE INTEGRATION NOT INCLUDING THE POLE -// 2a15 INTEGRAL AROUND A POINT OPERATOR -// 2a16 QUATERNION INTEGRAL OPERATOR -// 2a17 INTEGRAL WITH LEFTWARDS ARROW WITH HOOK -// 2a18 INTEGRAL WITH TIMES SIGN -// 2a19 INTEGRAL WITH INTERSECTION -// 2a1a INTEGRAL WITH UNION -// 2a1b INTEGRAL WITH OVERBAR -// 2a1c INTEGRAL WITH UNDERBAR -// 2a1d JOIN -// 2a1e LARGE LEFT TRIANGLE OPERATOR -// 2a1f Z NOTATION SCHEMA COMPOSITION -// 2a20 Z NOTATION SCHEMA PIPING -// 2a21 Z NOTATION SCHEMA PROJECTION -// 2a22 PLUS SIGN WITH SMALL CIRCLE ABOVE -// 2a23 PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE -// 2a24 PLUS SIGN WITH TILDE ABOVE -// 2a25 PLUS SIGN WITH DOT BELOW -// 2a26 PLUS SIGN WITH TILDE BELOW -// 2a27 PLUS SIGN WITH SUBSCRIPT TWO -// 2a28 PLUS SIGN WITH BLACK TRIANGLE -// 2a29 MINUS SIGN WITH COMMA ABOVE -// 2a2a MINUS SIGN WITH DOT BELOW -// 2a2b MINUS SIGN WITH FALLING DOTS -// 2a2c MINUS SIGN WITH RISING DOTS -// 2a2d PLUS SIGN IN LEFT HALF CIRCLE -// 2a2e PLUS SIGN IN RIGHT HALF CIRCLE -// 2a2f VECTOR OR CROSS PRODUCT -// 2a30 MULTIPLICATION SIGN WITH DOT ABOVE -// 2a31 MULTIPLICATION SIGN WITH UNDERBAR -// 2a32 SEMIDIRECT PRODUCT WITH BOTTOM CLOSED -// 2a33 SMASH PRODUCT -// 2a34 MULTIPLICATION SIGN IN LEFT HALF CIRCLE -// 2a35 MULTIPLICATION SIGN IN RIGHT HALF CIRCLE -// 2a36 CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT -// 2a37 MULTIPLICATION SIGN IN DOUBLE CIRCLE -// 2a38 CIRCLED DIVISION SIGN -// 2a39 PLUS SIGN IN TRIANGLE -// 2a3a MINUS SIGN IN TRIANGLE -// 2a3b MULTIPLICATION SIGN IN TRIANGLE -// 2a3c INTERIOR PRODUCT -// 2a3d RIGHTHAND INTERIOR PRODUCT -// 2a3e Z NOTATION RELATIONAL COMPOSITION -// 2a3f AMALGAMATION OR COPRODUCT -// 2a40 INTERSECTION WITH DOT -// 2a41 UNION WITH MINUS SIGN -// 2a42 UNION WITH OVERBAR -// 2a43 INTERSECTION WITH OVERBAR -// 2a44 INTERSECTION WITH LOGICAL AND -// 2a45 UNION WITH LOGICAL OR -// 2a46 UNION ABOVE INTERSECTION -// 2a47 INTERSECTION ABOVE UNION -// 2a48 UNION ABOVE BAR ABOVE INTERSECTION -// 2a49 INTERSECTION ABOVE BAR ABOVE UNION -// 2a4a UNION BESIDE AND JOINED WITH UNION -// 2a4b INTERSECTION BESIDE AND JOINED WITH INTERSECTION -// 2a4c CLOSED UNION WITH SERIFS -// 2a4d CLOSED INTERSECTION WITH SERIFS -// 2a4e DOUBLE SQUARE INTERSECTION -// 2a4f DOUBLE SQUARE UNION -// 2a50 CLOSED UNION WITH SERIFS AND SMASH PRODUCT -// 2a51 LOGICAL AND WITH DOT ABOVE -// 2a52 LOGICAL OR WITH DOT ABOVE -// 2a53 DOUBLE LOGICAL AND -// 2a54 DOUBLE LOGICAL OR -// 2a55 TWO INTERSECTING LOGICAL AND -// 2a56 TWO INTERSECTING LOGICAL OR -// 2a57 SLOPING LARGE OR -// 2a58 SLOPING LARGE AND -// 2a59 LOGICAL OR OVERLAPPING LOGICAL AND -// 2a5a LOGICAL AND WITH MIDDLE STEM -// 2a5b LOGICAL OR WITH MIDDLE STEM -// 2a5c LOGICAL AND WITH HORIZONTAL DASH -// 2a5d LOGICAL OR WITH HORIZONTAL DASH -// 2a5e LOGICAL AND WITH DOUBLE OVERBAR -// 2a5f LOGICAL AND WITH UNDERBAR -// 2a60 LOGICAL AND WITH DOUBLE UNDERBAR -// 2a61 SMALL VEE WITH UNDERBAR -// 2a62 LOGICAL OR WITH DOUBLE OVERBAR -// 2a63 LOGICAL OR WITH DOUBLE UNDERBAR -// 2a64 Z NOTATION DOMAIN ANTIRESTRICTION -// 2a65 Z NOTATION RANGE ANTIRESTRICTION -// 2a66 EQUALS SIGN WITH DOT BELOW -// 2a67 IDENTICAL WITH DOT ABOVE -// 2a68 TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE -// 2a69 TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE -// 2a6a TILDE OPERATOR WITH DOT ABOVE -// 2a6b TILDE OPERATOR WITH RISING DOTS -// 2a6c SIMILAR MINUS SIMILAR -// 2a6d CONGRUENT WITH DOT ABOVE -// 2a6e EQUALS WITH ASTERISK -// 2a6f ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT -// 2a70 APPROXIMATELY EQUAL OR EQUAL TO -// 2a71 EQUALS SIGN ABOVE PLUS SIGN -// 2a72 PLUS SIGN ABOVE EQUALS SIGN -// 2a73 EQUALS SIGN ABOVE TILDE OPERATOR -// 2a74 DOUBLE COLON EQUAL -// 2a75 TWO CONSECUTIVE EQUALS SIGNS -// 2a76 THREE CONSECUTIVE EQUALS SIGNS -// 2a77 EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW -// 2a78 EQUIVALENT WITH FOUR DOTS ABOVE -// 2a79 LESS-THAN WITH CIRCLE INSIDE -// 2a7a GREATER-THAN WITH CIRCLE INSIDE -// 2a7b LESS-THAN WITH QUESTION MARK ABOVE -// 2a7c GREATER-THAN WITH QUESTION MARK ABOVE -// 2a7d LESS-THAN OR SLANTED EQUAL TO -// 2a7e GREATER-THAN OR SLANTED EQUAL TO -// 2a7f LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE -// 2a80 GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE -// 2a81 LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE -// 2a82 GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE -// 2a83 LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT -// 2a84 GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT -// 2a85 LESS-THAN OR APPROXIMATE -// 2a86 GREATER-THAN OR APPROXIMATE -// 2a87 LESS-THAN AND SINGLE-LINE NOT EQUAL TO -// 2a88 GREATER-THAN AND SINGLE-LINE NOT EQUAL TO -// 2a89 LESS-THAN AND NOT APPROXIMATE -// 2a8a GREATER-THAN AND NOT APPROXIMATE -// 2a8b LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN -// 2a8c GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN -// 2a8d LESS-THAN ABOVE SIMILAR OR EQUAL -// 2a8e GREATER-THAN ABOVE SIMILAR OR EQUAL -// 2a8f LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN -// 2a90 GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN -// 2a91 LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL -// 2a92 GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL -// 2a93 LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL -// 2a94 GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL -// 2a95 SLANTED EQUAL TO OR LESS-THAN -// 2a96 SLANTED EQUAL TO OR GREATER-THAN -// 2a97 SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE -// 2a98 SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE -// 2a99 DOUBLE-LINE EQUAL TO OR LESS-THAN -// 2a9a DOUBLE-LINE EQUAL TO OR GREATER-THAN -// 2a9b DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN -// 2a9c DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN -// 2a9d SIMILAR OR LESS-THAN -// 2a9e SIMILAR OR GREATER-THAN -// 2a9f SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN -// 2aa0 SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN -// 2aa1 DOUBLE NESTED LESS-THAN -// 2aa2 DOUBLE NESTED GREATER-THAN -// 2aa3 DOUBLE NESTED LESS-THAN WITH UNDERBAR -// 2aa4 GREATER-THAN OVERLAPPING LESS-THAN -// 2aa5 GREATER-THAN BESIDE LESS-THAN -// 2aa6 LESS-THAN CLOSED BY CURVE -// 2aa7 GREATER-THAN CLOSED BY CURVE -// 2aa8 LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL -// 2aa9 GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL -// 2aaa SMALLER THAN -// 2aab LARGER THAN -// 2aac SMALLER THAN OR EQUAL TO -// 2aad LARGER THAN OR EQUAL TO -// 2aae EQUALS SIGN WITH BUMPY ABOVE -// 2aaf PRECEDES ABOVE SINGLE-LINE EQUALS SIGN -// 2ab0 SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN -// 2ab1 PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO -// 2ab2 SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO -// 2ab3 PRECEDES ABOVE EQUALS SIGN -// 2ab4 SUCCEEDS ABOVE EQUALS SIGN -// 2ab5 PRECEDES ABOVE NOT EQUAL TO -// 2ab6 SUCCEEDS ABOVE NOT EQUAL TO -// 2ab7 PRECEDES ABOVE ALMOST EQUAL TO -// 2ab8 SUCCEEDS ABOVE ALMOST EQUAL TO -// 2ab9 PRECEDES ABOVE NOT ALMOST EQUAL TO -// 2aba SUCCEEDS ABOVE NOT ALMOST EQUAL TO -// 2abb DOUBLE PRECEDES -// 2abc DOUBLE SUCCEEDS -// 2abd SUBSET WITH DOT -// 2abe SUPERSET WITH DOT -// 2abf SUBSET WITH PLUS SIGN BELOW -// 2ac0 SUPERSET WITH PLUS SIGN BELOW -// 2ac1 SUBSET WITH MULTIPLICATION SIGN BELOW -// 2ac2 SUPERSET WITH MULTIPLICATION SIGN BELOW -// 2ac3 SUBSET OF OR EQUAL TO WITH DOT ABOVE -// 2ac4 SUPERSET OF OR EQUAL TO WITH DOT ABOVE -// 2ac5 SUBSET OF ABOVE EQUALS SIGN -// 2ac6 SUPERSET OF ABOVE EQUALS SIGN -// 2ac7 SUBSET OF ABOVE TILDE OPERATOR -// 2ac8 SUPERSET OF ABOVE TILDE OPERATOR -// 2ac9 SUBSET OF ABOVE ALMOST EQUAL TO -// 2aca SUPERSET OF ABOVE ALMOST EQUAL TO -// 2acb SUBSET OF ABOVE NOT EQUAL TO -// 2acc SUPERSET OF ABOVE NOT EQUAL TO -// 2acd SQUARE LEFT OPEN BOX OPERATOR -// 2ace SQUARE RIGHT OPEN BOX OPERATOR -// 2acf CLOSED SUBSET -// 2ad0 CLOSED SUPERSET -// 2ad1 CLOSED SUBSET OR EQUAL TO -// 2ad2 CLOSED SUPERSET OR EQUAL TO -// 2ad3 SUBSET ABOVE SUPERSET -// 2ad4 SUPERSET ABOVE SUBSET -// 2ad5 SUBSET ABOVE SUBSET -// 2ad6 SUPERSET ABOVE SUPERSET -// 2ad7 SUPERSET BESIDE SUBSET -// 2ad8 SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET -// 2ad9 ELEMENT OF OPENING DOWNWARDS -// 2ada PITCHFORK WITH TEE TOP -// 2adb TRANSVERSAL INTERSECTION -// 2adc FORKING -// 2add NONFORKING -// 2ade SHORT LEFT TACK -// 2adf SHORT DOWN TACK -// 2ae0 SHORT UP TACK -// 2ae1 PERPENDICULAR WITH S -// 2ae2 VERTICAL BAR TRIPLE RIGHT TURNSTILE -// 2ae3 DOUBLE VERTICAL BAR LEFT TURNSTILE -// 2ae4 VERTICAL BAR DOUBLE LEFT TURNSTILE -// 2ae5 DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE -// 2ae6 LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL -// 2ae7 SHORT DOWN TACK WITH OVERBAR -// 2ae8 SHORT UP TACK WITH UNDERBAR -// 2ae9 SHORT UP TACK ABOVE SHORT DOWN TACK -// 2aea DOUBLE DOWN TACK -// 2aeb DOUBLE UP TACK -// 2aec DOUBLE STROKE NOT SIGN -// 2aed REVERSED DOUBLE STROKE NOT SIGN -// 2aee DOES NOT DIVIDE WITH REVERSED NEGATION SLASH -// 2aef VERTICAL LINE WITH CIRCLE ABOVE -// 2af0 VERTICAL LINE WITH CIRCLE BELOW -// 2af1 DOWN TACK WITH CIRCLE BELOW -// 2af2 PARALLEL WITH HORIZONTAL STROKE -// 2af3 PARALLEL WITH TILDE OPERATOR -// 2af4 TRIPLE VERTICAL BAR BINARY RELATION -// 2af5 TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE -// 2af6 TRIPLE COLON OPERATOR -// 2af7 TRIPLE NESTED LESS-THAN -// 2af8 TRIPLE NESTED GREATER-THAN -// 2af9 DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO -// 2afa DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO -// 2afb TRIPLE SOLIDUS BINARY RELATION -// 2afc LARGE TRIPLE VERTICAL BAR OPERATOR -// 2afd DOUBLE SOLIDUS OPERATOR -// 2afe WHITE VERTICAL BAR -// 2aff N-ARY WHITE VERTICAL BAR -// 2b00 NORTH EAST WHITE ARROW -// 2b01 NORTH WEST WHITE ARROW -// 2b02 SOUTH EAST WHITE ARROW -// 2b03 SOUTH WEST WHITE ARROW -// 2b04 LEFT RIGHT WHITE ARROW -// 2b05 LEFTWARDS BLACK ARROW -// 2b06 UPWARDS BLACK ARROW -// 2b07 DOWNWARDS BLACK ARROW -// 2b08 NORTH EAST BLACK ARROW -// 2b09 NORTH WEST BLACK ARROW -// 2b0a SOUTH EAST BLACK ARROW -// 2b0b SOUTH WEST BLACK ARROW -// 2b0c LEFT RIGHT BLACK ARROW -// 2b0d UP DOWN BLACK ARROW -// 2b0e RIGHTWARDS ARROW WITH TIP DOWNWARDS -// 2b0f RIGHTWARDS ARROW WITH TIP UPWARDS -// 2b10 LEFTWARDS ARROW WITH TIP DOWNWARDS -// 2b11 LEFTWARDS ARROW WITH TIP UPWARDS -// 2b12 SQUARE WITH TOP HALF BLACK -// 2b13 SQUARE WITH BOTTOM HALF BLACK -// 2b14 SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK -// 2b15 SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK -// 2b16 DIAMOND WITH LEFT HALF BLACK -// 2b17 DIAMOND WITH RIGHT HALF BLACK -// 2b18 DIAMOND WITH TOP HALF BLACK -// 2b19 DIAMOND WITH BOTTOM HALF BLACK -// 2b1a DOTTED SQUARE -// 2b1b BLACK LARGE SQUARE -// 2b1c WHITE LARGE SQUARE -// 2b1d BLACK VERY SMALL SQUARE -// 2b1e WHITE VERY SMALL SQUARE -// 2b1f BLACK PENTAGON -// 2b20 WHITE PENTAGON -// 2b21 WHITE HEXAGON -// 2b22 BLACK HEXAGON -// 2b23 HORIZONTAL BLACK HEXAGON -// 2b24 BLACK LARGE CIRCLE -// 2b25 BLACK MEDIUM DIAMOND -// 2b26 WHITE MEDIUM DIAMOND -// 2b27 BLACK MEDIUM LOZENGE -// 2b28 WHITE MEDIUM LOZENGE -// 2b29 BLACK SMALL DIAMOND -// 2b2a BLACK SMALL LOZENGE -// 2b2b WHITE SMALL LOZENGE -// 2b2c BLACK HORIZONTAL ELLIPSE -// 2b2d WHITE HORIZONTAL ELLIPSE -// 2b2e BLACK VERTICAL ELLIPSE -// 2b2f WHITE VERTICAL ELLIPSE -// 2b30 LEFT ARROW WITH SMALL CIRCLE -// 2b31 THREE LEFTWARDS ARROWS -// 2b32 LEFT ARROW WITH CIRCLED PLUS -// 2b33 LONG LEFTWARDS SQUIGGLE ARROW -// 2b34 LEFTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE -// 2b35 LEFTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE -// 2b36 LEFTWARDS TWO-HEADED ARROW FROM BAR -// 2b37 LEFTWARDS TWO-HEADED TRIPLE DASH ARROW -// 2b38 LEFTWARDS ARROW WITH DOTTED STEM -// 2b39 LEFTWARDS ARROW WITH TAIL WITH VERTICAL STROKE -// 2b3a LEFTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE -// 2b3b LEFTWARDS TWO-HEADED ARROW WITH TAIL -// 2b3c LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE -// 2b3d LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE -// 2b3e LEFTWARDS ARROW THROUGH X -// 2b3f WAVE ARROW POINTING DIRECTLY LEFT -// 2b40 EQUALS SIGN ABOVE LEFTWARDS ARROW -// 2b41 REVERSE TILDE OPERATOR ABOVE LEFTWARDS ARROW -// 2b42 LEFTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO -// 2b43 RIGHTWARDS ARROW THROUGH GREATER-THAN -// 2b44 RIGHTWARDS ARROW THROUGH SUPERSET -// 2b45 LEFTWARDS QUADRUPLE ARROW -// 2b46 RIGHTWARDS QUADRUPLE ARROW -// 2b47 REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW -// 2b48 RIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO -// 2b49 TILDE OPERATOR ABOVE LEFTWARDS ARROW -// 2b4a LEFTWARDS ARROW ABOVE ALMOST EQUAL TO -// 2b4b LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR -// 2b4c RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR -// 2b4d DOWNWARDS TRIANGLE-HEADED ZIGZAG ARROW -// 2b4e SHORT SLANTED NORTH ARROW -// 2b4f SHORT BACKSLANTED SOUTH ARROW -// 2b50 WHITE MEDIUM STAR -// 2b51 BLACK SMALL STAR -// 2b52 WHITE SMALL STAR -// 2b53 BLACK RIGHT-POINTING PENTAGON -// 2b54 WHITE RIGHT-POINTING PENTAGON -// 2b55 HEAVY LARGE CIRCLE -// 2b56 HEAVY OVAL WITH OVAL INSIDE -// 2b57 HEAVY CIRCLE WITH CIRCLE INSIDE -// 2b58 HEAVY CIRCLE -// 2b59 HEAVY CIRCLED SALTIRE -// 2b5a SLANTED NORTH ARROW WITH HOOKED HEAD -// 2b5b BACKSLANTED SOUTH ARROW WITH HOOKED TAIL -// 2b5c SLANTED NORTH ARROW WITH HORIZONTAL TAIL -// 2b5d BACKSLANTED SOUTH ARROW WITH HORIZONTAL TAIL -// 2b5e BENT ARROW POINTING DOWNWARDS THEN NORTH EAST -// 2b5f SHORT BENT ARROW POINTING DOWNWARDS THEN NORTH EAST -// 2b60 LEFTWARDS TRIANGLE-HEADED ARROW -// 2b61 UPWARDS TRIANGLE-HEADED ARROW -// 2b62 RIGHTWARDS TRIANGLE-HEADED ARROW -// 2b63 DOWNWARDS TRIANGLE-HEADED ARROW -// 2b64 LEFT RIGHT TRIANGLE-HEADED ARROW -// 2b65 UP DOWN TRIANGLE-HEADED ARROW -// 2b66 NORTH WEST TRIANGLE-HEADED ARROW -// 2b67 NORTH EAST TRIANGLE-HEADED ARROW -// 2b68 SOUTH EAST TRIANGLE-HEADED ARROW -// 2b69 SOUTH WEST TRIANGLE-HEADED ARROW -// 2b6a LEFTWARDS TRIANGLE-HEADED DASHED ARROW -// 2b6b UPWARDS TRIANGLE-HEADED DASHED ARROW -// 2b6c RIGHTWARDS TRIANGLE-HEADED DASHED ARROW -// 2b6d DOWNWARDS TRIANGLE-HEADED DASHED ARROW -// 2b6e CLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW -// 2b6f ANTICLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW -// 2b70 LEFTWARDS TRIANGLE-HEADED ARROW TO BAR -// 2b71 UPWARDS TRIANGLE-HEADED ARROW TO BAR -// 2b72 RIGHTWARDS TRIANGLE-HEADED ARROW TO BAR -// 2b73 DOWNWARDS TRIANGLE-HEADED ARROW TO BAR - { 0x29FE, 0x176, 0x8, 0, 0 }, -// 2b76 NORTH WEST TRIANGLE-HEADED ARROW TO BAR -// 2b77 NORTH EAST TRIANGLE-HEADED ARROW TO BAR -// 2b78 SOUTH EAST TRIANGLE-HEADED ARROW TO BAR -// 2b79 SOUTH WEST TRIANGLE-HEADED ARROW TO BAR -// 2b7a LEFTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE -// 2b7b UPWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE -// 2b7c RIGHTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE -// 2b7d DOWNWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE -// 2b7e HORIZONTAL TAB KEY -// 2b7f VERTICAL TAB KEY -// 2b80 LEFTWARDS TRIANGLE-HEADED ARROW OVER RIGHTWARDS TRIANGLE-HEADED ARROW -// 2b81 UPWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF DOWNWARDS TRIANGLE-HEADED ARROW -// 2b82 RIGHTWARDS TRIANGLE-HEADED ARROW OVER LEFTWARDS TRIANGLE-HEADED ARROW -// 2b83 DOWNWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF UPWARDS TRIANGLE-HEADED ARROW -// 2b84 LEFTWARDS TRIANGLE-HEADED PAIRED ARROWS -// 2b85 UPWARDS TRIANGLE-HEADED PAIRED ARROWS -// 2b86 RIGHTWARDS TRIANGLE-HEADED PAIRED ARROWS -// 2b87 DOWNWARDS TRIANGLE-HEADED PAIRED ARROWS -// 2b88 LEFTWARDS BLACK CIRCLED WHITE ARROW -// 2b89 UPWARDS BLACK CIRCLED WHITE ARROW -// 2b8a RIGHTWARDS BLACK CIRCLED WHITE ARROW -// 2b8b DOWNWARDS BLACK CIRCLED WHITE ARROW -// 2b8c ANTICLOCKWISE TRIANGLE-HEADED RIGHT U-SHAPED ARROW -// 2b8d ANTICLOCKWISE TRIANGLE-HEADED BOTTOM U-SHAPED ARROW -// 2b8e ANTICLOCKWISE TRIANGLE-HEADED LEFT U-SHAPED ARROW -// 2b8f ANTICLOCKWISE TRIANGLE-HEADED TOP U-SHAPED ARROW -// 2b90 RETURN LEFT -// 2b91 RETURN RIGHT -// 2b92 NEWLINE LEFT -// 2b93 NEWLINE RIGHT -// 2b94 FOUR CORNER ARROWS CIRCLING ANTICLOCKWISE -// 2b95 RIGHTWARDS BLACK ARROW - { 0x2B76, 0x20, 0x8, 0, 0 }, -// 2b98 THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD -// 2b99 THREE-D RIGHT-LIGHTED UPWARDS EQUILATERAL ARROWHEAD -// 2b9a THREE-D TOP-LIGHTED RIGHTWARDS EQUILATERAL ARROWHEAD -// 2b9b THREE-D LEFT-LIGHTED DOWNWARDS EQUILATERAL ARROWHEAD -// 2b9c BLACK LEFTWARDS EQUILATERAL ARROWHEAD -// 2b9d BLACK UPWARDS EQUILATERAL ARROWHEAD -// 2b9e BLACK RIGHTWARDS EQUILATERAL ARROWHEAD -// 2b9f BLACK DOWNWARDS EQUILATERAL ARROWHEAD -// 2ba0 DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS -// 2ba1 DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS -// 2ba2 UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS -// 2ba3 UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS -// 2ba4 LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS -// 2ba5 RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS -// 2ba6 LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS -// 2ba7 RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS -// 2ba8 BLACK CURVED DOWNWARDS AND LEFTWARDS ARROW -// 2ba9 BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW -// 2baa BLACK CURVED UPWARDS AND LEFTWARDS ARROW -// 2bab BLACK CURVED UPWARDS AND RIGHTWARDS ARROW -// 2bac BLACK CURVED LEFTWARDS AND UPWARDS ARROW -// 2bad BLACK CURVED RIGHTWARDS AND UPWARDS ARROW -// 2bae BLACK CURVED LEFTWARDS AND DOWNWARDS ARROW -// 2baf BLACK CURVED RIGHTWARDS AND DOWNWARDS ARROW -// 2bb0 RIBBON ARROW DOWN LEFT -// 2bb1 RIBBON ARROW DOWN RIGHT -// 2bb2 RIBBON ARROW UP LEFT -// 2bb3 RIBBON ARROW UP RIGHT -// 2bb4 RIBBON ARROW LEFT UP -// 2bb5 RIBBON ARROW RIGHT UP -// 2bb6 RIBBON ARROW LEFT DOWN -// 2bb7 RIBBON ARROW RIGHT DOWN -// 2bb8 UPWARDS WHITE ARROW FROM BAR WITH HORIZONTAL BAR -// 2bb9 UP ARROWHEAD IN A RECTANGLE BOX - { 0x2B98, 0x22, 0x8, 0, 0 }, -// 2bbd BALLOT BOX WITH LIGHT X -// 2bbe CIRCLED X -// 2bbf CIRCLED BOLD X -// 2bc0 BLACK SQUARE CENTRED -// 2bc1 BLACK DIAMOND CENTRED -// 2bc2 TURNED BLACK PENTAGON -// 2bc3 HORIZONTAL BLACK OCTAGON -// 2bc4 BLACK OCTAGON -// 2bc5 BLACK MEDIUM UP-POINTING TRIANGLE CENTRED -// 2bc6 BLACK MEDIUM DOWN-POINTING TRIANGLE CENTRED -// 2bc7 BLACK MEDIUM LEFT-POINTING TRIANGLE CENTRED -// 2bc8 BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED - { 0x2BBD, 0xC, 0x8, 0, 0 }, -// 2bca TOP HALF BLACK CIRCLE -// 2bcb BOTTOM HALF BLACK CIRCLE -// 2bcc LIGHT FOUR POINTED BLACK CUSP -// 2bcd ROTATED LIGHT FOUR POINTED BLACK CUSP -// 2bce WHITE FOUR POINTED CUSP -// 2bcf ROTATED WHITE FOUR POINTED CUSP -// 2bd0 SQUARE POSITION INDICATOR -// 2bd1 UNCERTAINTY SIGN - { 0x2BCA, 0x8, 0x8, 0, 0 }, -// 2c00 GLAGOLITIC CAPITAL LETTER AZU -// 2c01 GLAGOLITIC CAPITAL LETTER BUKY -// 2c02 GLAGOLITIC CAPITAL LETTER VEDE -// 2c03 GLAGOLITIC CAPITAL LETTER GLAGOLI -// 2c04 GLAGOLITIC CAPITAL LETTER DOBRO -// 2c05 GLAGOLITIC CAPITAL LETTER YESTU -// 2c06 GLAGOLITIC CAPITAL LETTER ZHIVETE -// 2c07 GLAGOLITIC CAPITAL LETTER DZELO -// 2c08 GLAGOLITIC CAPITAL LETTER ZEMLJA -// 2c09 GLAGOLITIC CAPITAL LETTER IZHE -// 2c0a GLAGOLITIC CAPITAL LETTER INITIAL IZHE -// 2c0b GLAGOLITIC CAPITAL LETTER I -// 2c0c GLAGOLITIC CAPITAL LETTER DJERVI -// 2c0d GLAGOLITIC CAPITAL LETTER KAKO -// 2c0e GLAGOLITIC CAPITAL LETTER LJUDIJE -// 2c0f GLAGOLITIC CAPITAL LETTER MYSLITE -// 2c10 GLAGOLITIC CAPITAL LETTER NASHI -// 2c11 GLAGOLITIC CAPITAL LETTER ONU -// 2c12 GLAGOLITIC CAPITAL LETTER POKOJI -// 2c13 GLAGOLITIC CAPITAL LETTER RITSI -// 2c14 GLAGOLITIC CAPITAL LETTER SLOVO -// 2c15 GLAGOLITIC CAPITAL LETTER TVRIDO -// 2c16 GLAGOLITIC CAPITAL LETTER UKU -// 2c17 GLAGOLITIC CAPITAL LETTER FRITU -// 2c18 GLAGOLITIC CAPITAL LETTER HERU -// 2c19 GLAGOLITIC CAPITAL LETTER OTU -// 2c1a GLAGOLITIC CAPITAL LETTER PE -// 2c1b GLAGOLITIC CAPITAL LETTER SHTA -// 2c1c GLAGOLITIC CAPITAL LETTER TSI -// 2c1d GLAGOLITIC CAPITAL LETTER CHRIVI -// 2c1e GLAGOLITIC CAPITAL LETTER SHA -// 2c1f GLAGOLITIC CAPITAL LETTER YERU -// 2c20 GLAGOLITIC CAPITAL LETTER YERI -// 2c21 GLAGOLITIC CAPITAL LETTER YATI -// 2c22 GLAGOLITIC CAPITAL LETTER SPIDERY HA -// 2c23 GLAGOLITIC CAPITAL LETTER YU -// 2c24 GLAGOLITIC CAPITAL LETTER SMALL YUS -// 2c25 GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL -// 2c26 GLAGOLITIC CAPITAL LETTER YO -// 2c27 GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS -// 2c28 GLAGOLITIC CAPITAL LETTER BIG YUS -// 2c29 GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS -// 2c2a GLAGOLITIC CAPITAL LETTER FITA -// 2c2b GLAGOLITIC CAPITAL LETTER IZHITSA -// 2c2c GLAGOLITIC CAPITAL LETTER SHTAPIC -// 2c2d GLAGOLITIC CAPITAL LETTER TROKUTASTI A -// 2c2e GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE - { 0x2C00, 0x2F, 0x89, 48, 0 }, -// 2c30 GLAGOLITIC SMALL LETTER AZU -// 2c31 GLAGOLITIC SMALL LETTER BUKY -// 2c32 GLAGOLITIC SMALL LETTER VEDE -// 2c33 GLAGOLITIC SMALL LETTER GLAGOLI -// 2c34 GLAGOLITIC SMALL LETTER DOBRO -// 2c35 GLAGOLITIC SMALL LETTER YESTU -// 2c36 GLAGOLITIC SMALL LETTER ZHIVETE -// 2c37 GLAGOLITIC SMALL LETTER DZELO -// 2c38 GLAGOLITIC SMALL LETTER ZEMLJA -// 2c39 GLAGOLITIC SMALL LETTER IZHE -// 2c3a GLAGOLITIC SMALL LETTER INITIAL IZHE -// 2c3b GLAGOLITIC SMALL LETTER I -// 2c3c GLAGOLITIC SMALL LETTER DJERVI -// 2c3d GLAGOLITIC SMALL LETTER KAKO -// 2c3e GLAGOLITIC SMALL LETTER LJUDIJE -// 2c3f GLAGOLITIC SMALL LETTER MYSLITE -// 2c40 GLAGOLITIC SMALL LETTER NASHI -// 2c41 GLAGOLITIC SMALL LETTER ONU -// 2c42 GLAGOLITIC SMALL LETTER POKOJI -// 2c43 GLAGOLITIC SMALL LETTER RITSI -// 2c44 GLAGOLITIC SMALL LETTER SLOVO -// 2c45 GLAGOLITIC SMALL LETTER TVRIDO -// 2c46 GLAGOLITIC SMALL LETTER UKU -// 2c47 GLAGOLITIC SMALL LETTER FRITU -// 2c48 GLAGOLITIC SMALL LETTER HERU -// 2c49 GLAGOLITIC SMALL LETTER OTU -// 2c4a GLAGOLITIC SMALL LETTER PE -// 2c4b GLAGOLITIC SMALL LETTER SHTA -// 2c4c GLAGOLITIC SMALL LETTER TSI -// 2c4d GLAGOLITIC SMALL LETTER CHRIVI -// 2c4e GLAGOLITIC SMALL LETTER SHA -// 2c4f GLAGOLITIC SMALL LETTER YERU -// 2c50 GLAGOLITIC SMALL LETTER YERI -// 2c51 GLAGOLITIC SMALL LETTER YATI -// 2c52 GLAGOLITIC SMALL LETTER SPIDERY HA -// 2c53 GLAGOLITIC SMALL LETTER YU -// 2c54 GLAGOLITIC SMALL LETTER SMALL YUS -// 2c55 GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL -// 2c56 GLAGOLITIC SMALL LETTER YO -// 2c57 GLAGOLITIC SMALL LETTER IOTATED SMALL YUS -// 2c58 GLAGOLITIC SMALL LETTER BIG YUS -// 2c59 GLAGOLITIC SMALL LETTER IOTATED BIG YUS -// 2c5a GLAGOLITIC SMALL LETTER FITA -// 2c5b GLAGOLITIC SMALL LETTER IZHITSA -// 2c5c GLAGOLITIC SMALL LETTER SHTAPIC -// 2c5d GLAGOLITIC SMALL LETTER TROKUTASTI A -// 2c5e GLAGOLITIC SMALL LETTER LATINATE MYSLITE - { 0x2C30, 0x2F, 0x49, 0, -48 }, -// 2c60 LATIN CAPITAL LETTER L WITH DOUBLE BAR - { 0x2C60, 0x1, 0x89, 1, 0 }, -// 2c61 LATIN SMALL LETTER L WITH DOUBLE BAR - { 0x2C61, 0x1, 0x49, 0, -1 }, -// 2c62 LATIN CAPITAL LETTER L WITH MIDDLE TILDE - { 0x2C62, 0x1, 0x89, -10743, 0 }, -// 2c63 LATIN CAPITAL LETTER P WITH STROKE - { 0x2C63, 0x1, 0x89, -3814, 0 }, -// 2c64 LATIN CAPITAL LETTER R WITH TAIL - { 0x2C64, 0x1, 0x89, -10727, 0 }, -// 2c65 LATIN SMALL LETTER A WITH STROKE - { 0x2C65, 0x1, 0x49, 0, -10795 }, -// 2c66 LATIN SMALL LETTER T WITH DIAGONAL STROKE - { 0x2C66, 0x1, 0x49, 0, -10792 }, -// 2c67 LATIN CAPITAL LETTER H WITH DESCENDER - { 0x2C67, 0x1, 0x89, 1, 0 }, -// 2c68 LATIN SMALL LETTER H WITH DESCENDER - { 0x2C68, 0x1, 0x49, 0, -1 }, -// 2c69 LATIN CAPITAL LETTER K WITH DESCENDER - { 0x2C69, 0x1, 0x89, 1, 0 }, -// 2c6a LATIN SMALL LETTER K WITH DESCENDER - { 0x2C6A, 0x1, 0x49, 0, -1 }, -// 2c6b LATIN CAPITAL LETTER Z WITH DESCENDER - { 0x2C6B, 0x1, 0x89, 1, 0 }, -// 2c6c LATIN SMALL LETTER Z WITH DESCENDER - { 0x2C6C, 0x1, 0x49, 0, -1 }, -// 2c6d LATIN CAPITAL LETTER ALPHA - { 0x2C6D, 0x1, 0x89, -10780, 0 }, -// 2c6e LATIN CAPITAL LETTER M WITH HOOK - { 0x2C6E, 0x1, 0x89, -10749, 0 }, -// 2c6f LATIN CAPITAL LETTER TURNED A - { 0x2C6F, 0x1, 0x89, -10783, 0 }, -// 2c70 LATIN CAPITAL LETTER TURNED ALPHA - { 0x2C70, 0x1, 0x89, -10782, 0 }, -// 2c71 LATIN SMALL LETTER V WITH RIGHT HOOK - { 0x2C71, 0x1, 0x49, 0, 0 }, -// 2c72 LATIN CAPITAL LETTER W WITH HOOK - { 0x2C72, 0x1, 0x89, 1, 0 }, -// 2c73 LATIN SMALL LETTER W WITH HOOK - { 0x2C73, 0x1, 0x49, 0, -1 }, -// 2c74 LATIN SMALL LETTER V WITH CURL - { 0x2C74, 0x1, 0x49, 0, 0 }, -// 2c75 LATIN CAPITAL LETTER HALF H - { 0x2C75, 0x1, 0x89, 1, 0 }, -// 2c76 LATIN SMALL LETTER HALF H - { 0x2C76, 0x1, 0x49, 0, -1 }, -// 2c77 LATIN SMALL LETTER TAILLESS PHI -// 2c78 LATIN SMALL LETTER E WITH NOTCH -// 2c79 LATIN SMALL LETTER TURNED R WITH TAIL -// 2c7a LATIN SMALL LETTER O WITH LOW RING INSIDE -// 2c7b LATIN LETTER SMALL CAPITAL TURNED E - { 0x2C77, 0x5, 0x49, 0, 0 }, -// 2c7c LATIN SUBSCRIPT SMALL LETTER J -// 2c7d MODIFIER LETTER CAPITAL V - { 0x2C7C, 0x2, 0x9, 0, 0 }, -// 2c7e LATIN CAPITAL LETTER S WITH SWASH TAIL -// 2c7f LATIN CAPITAL LETTER Z WITH SWASH TAIL - { 0x2C7E, 0x2, 0x89, -10815, 0 }, -// 2c80 COPTIC CAPITAL LETTER ALFA - { 0x2C80, 0x1, 0x89, 1, 0 }, -// 2c81 COPTIC SMALL LETTER ALFA - { 0x2C81, 0x1, 0x49, 0, -1 }, -// 2c82 COPTIC CAPITAL LETTER VIDA - { 0x2C82, 0x1, 0x89, 1, 0 }, -// 2c83 COPTIC SMALL LETTER VIDA - { 0x2C83, 0x1, 0x49, 0, -1 }, -// 2c84 COPTIC CAPITAL LETTER GAMMA - { 0x2C84, 0x1, 0x89, 1, 0 }, -// 2c85 COPTIC SMALL LETTER GAMMA - { 0x2C85, 0x1, 0x49, 0, -1 }, -// 2c86 COPTIC CAPITAL LETTER DALDA - { 0x2C86, 0x1, 0x89, 1, 0 }, -// 2c87 COPTIC SMALL LETTER DALDA - { 0x2C87, 0x1, 0x49, 0, -1 }, -// 2c88 COPTIC CAPITAL LETTER EIE - { 0x2C88, 0x1, 0x89, 1, 0 }, -// 2c89 COPTIC SMALL LETTER EIE - { 0x2C89, 0x1, 0x49, 0, -1 }, -// 2c8a COPTIC CAPITAL LETTER SOU - { 0x2C8A, 0x1, 0x89, 1, 0 }, -// 2c8b COPTIC SMALL LETTER SOU - { 0x2C8B, 0x1, 0x49, 0, -1 }, -// 2c8c COPTIC CAPITAL LETTER ZATA - { 0x2C8C, 0x1, 0x89, 1, 0 }, -// 2c8d COPTIC SMALL LETTER ZATA - { 0x2C8D, 0x1, 0x49, 0, -1 }, -// 2c8e COPTIC CAPITAL LETTER HATE - { 0x2C8E, 0x1, 0x89, 1, 0 }, -// 2c8f COPTIC SMALL LETTER HATE - { 0x2C8F, 0x1, 0x49, 0, -1 }, -// 2c90 COPTIC CAPITAL LETTER THETHE - { 0x2C90, 0x1, 0x89, 1, 0 }, -// 2c91 COPTIC SMALL LETTER THETHE - { 0x2C91, 0x1, 0x49, 0, -1 }, -// 2c92 COPTIC CAPITAL LETTER IAUDA - { 0x2C92, 0x1, 0x89, 1, 0 }, -// 2c93 COPTIC SMALL LETTER IAUDA - { 0x2C93, 0x1, 0x49, 0, -1 }, -// 2c94 COPTIC CAPITAL LETTER KAPA - { 0x2C94, 0x1, 0x89, 1, 0 }, -// 2c95 COPTIC SMALL LETTER KAPA - { 0x2C95, 0x1, 0x49, 0, -1 }, -// 2c96 COPTIC CAPITAL LETTER LAULA - { 0x2C96, 0x1, 0x89, 1, 0 }, -// 2c97 COPTIC SMALL LETTER LAULA - { 0x2C97, 0x1, 0x49, 0, -1 }, -// 2c98 COPTIC CAPITAL LETTER MI - { 0x2C98, 0x1, 0x89, 1, 0 }, -// 2c99 COPTIC SMALL LETTER MI - { 0x2C99, 0x1, 0x49, 0, -1 }, -// 2c9a COPTIC CAPITAL LETTER NI - { 0x2C9A, 0x1, 0x89, 1, 0 }, -// 2c9b COPTIC SMALL LETTER NI - { 0x2C9B, 0x1, 0x49, 0, -1 }, -// 2c9c COPTIC CAPITAL LETTER KSI - { 0x2C9C, 0x1, 0x89, 1, 0 }, -// 2c9d COPTIC SMALL LETTER KSI - { 0x2C9D, 0x1, 0x49, 0, -1 }, -// 2c9e COPTIC CAPITAL LETTER O - { 0x2C9E, 0x1, 0x89, 1, 0 }, -// 2c9f COPTIC SMALL LETTER O - { 0x2C9F, 0x1, 0x49, 0, -1 }, -// 2ca0 COPTIC CAPITAL LETTER PI - { 0x2CA0, 0x1, 0x89, 1, 0 }, -// 2ca1 COPTIC SMALL LETTER PI - { 0x2CA1, 0x1, 0x49, 0, -1 }, -// 2ca2 COPTIC CAPITAL LETTER RO - { 0x2CA2, 0x1, 0x89, 1, 0 }, -// 2ca3 COPTIC SMALL LETTER RO - { 0x2CA3, 0x1, 0x49, 0, -1 }, -// 2ca4 COPTIC CAPITAL LETTER SIMA - { 0x2CA4, 0x1, 0x89, 1, 0 }, -// 2ca5 COPTIC SMALL LETTER SIMA - { 0x2CA5, 0x1, 0x49, 0, -1 }, -// 2ca6 COPTIC CAPITAL LETTER TAU - { 0x2CA6, 0x1, 0x89, 1, 0 }, -// 2ca7 COPTIC SMALL LETTER TAU - { 0x2CA7, 0x1, 0x49, 0, -1 }, -// 2ca8 COPTIC CAPITAL LETTER UA - { 0x2CA8, 0x1, 0x89, 1, 0 }, -// 2ca9 COPTIC SMALL LETTER UA - { 0x2CA9, 0x1, 0x49, 0, -1 }, -// 2caa COPTIC CAPITAL LETTER FI - { 0x2CAA, 0x1, 0x89, 1, 0 }, -// 2cab COPTIC SMALL LETTER FI - { 0x2CAB, 0x1, 0x49, 0, -1 }, -// 2cac COPTIC CAPITAL LETTER KHI - { 0x2CAC, 0x1, 0x89, 1, 0 }, -// 2cad COPTIC SMALL LETTER KHI - { 0x2CAD, 0x1, 0x49, 0, -1 }, -// 2cae COPTIC CAPITAL LETTER PSI - { 0x2CAE, 0x1, 0x89, 1, 0 }, -// 2caf COPTIC SMALL LETTER PSI - { 0x2CAF, 0x1, 0x49, 0, -1 }, -// 2cb0 COPTIC CAPITAL LETTER OOU - { 0x2CB0, 0x1, 0x89, 1, 0 }, -// 2cb1 COPTIC SMALL LETTER OOU - { 0x2CB1, 0x1, 0x49, 0, -1 }, -// 2cb2 COPTIC CAPITAL LETTER DIALECT-P ALEF - { 0x2CB2, 0x1, 0x89, 1, 0 }, -// 2cb3 COPTIC SMALL LETTER DIALECT-P ALEF - { 0x2CB3, 0x1, 0x49, 0, -1 }, -// 2cb4 COPTIC CAPITAL LETTER OLD COPTIC AIN - { 0x2CB4, 0x1, 0x89, 1, 0 }, -// 2cb5 COPTIC SMALL LETTER OLD COPTIC AIN - { 0x2CB5, 0x1, 0x49, 0, -1 }, -// 2cb6 COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE - { 0x2CB6, 0x1, 0x89, 1, 0 }, -// 2cb7 COPTIC SMALL LETTER CRYPTOGRAMMIC EIE - { 0x2CB7, 0x1, 0x49, 0, -1 }, -// 2cb8 COPTIC CAPITAL LETTER DIALECT-P KAPA - { 0x2CB8, 0x1, 0x89, 1, 0 }, -// 2cb9 COPTIC SMALL LETTER DIALECT-P KAPA - { 0x2CB9, 0x1, 0x49, 0, -1 }, -// 2cba COPTIC CAPITAL LETTER DIALECT-P NI - { 0x2CBA, 0x1, 0x89, 1, 0 }, -// 2cbb COPTIC SMALL LETTER DIALECT-P NI - { 0x2CBB, 0x1, 0x49, 0, -1 }, -// 2cbc COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI - { 0x2CBC, 0x1, 0x89, 1, 0 }, -// 2cbd COPTIC SMALL LETTER CRYPTOGRAMMIC NI - { 0x2CBD, 0x1, 0x49, 0, -1 }, -// 2cbe COPTIC CAPITAL LETTER OLD COPTIC OOU - { 0x2CBE, 0x1, 0x89, 1, 0 }, -// 2cbf COPTIC SMALL LETTER OLD COPTIC OOU - { 0x2CBF, 0x1, 0x49, 0, -1 }, -// 2cc0 COPTIC CAPITAL LETTER SAMPI - { 0x2CC0, 0x1, 0x89, 1, 0 }, -// 2cc1 COPTIC SMALL LETTER SAMPI - { 0x2CC1, 0x1, 0x49, 0, -1 }, -// 2cc2 COPTIC CAPITAL LETTER CROSSED SHEI - { 0x2CC2, 0x1, 0x89, 1, 0 }, -// 2cc3 COPTIC SMALL LETTER CROSSED SHEI - { 0x2CC3, 0x1, 0x49, 0, -1 }, -// 2cc4 COPTIC CAPITAL LETTER OLD COPTIC SHEI - { 0x2CC4, 0x1, 0x89, 1, 0 }, -// 2cc5 COPTIC SMALL LETTER OLD COPTIC SHEI - { 0x2CC5, 0x1, 0x49, 0, -1 }, -// 2cc6 COPTIC CAPITAL LETTER OLD COPTIC ESH - { 0x2CC6, 0x1, 0x89, 1, 0 }, -// 2cc7 COPTIC SMALL LETTER OLD COPTIC ESH - { 0x2CC7, 0x1, 0x49, 0, -1 }, -// 2cc8 COPTIC CAPITAL LETTER AKHMIMIC KHEI - { 0x2CC8, 0x1, 0x89, 1, 0 }, -// 2cc9 COPTIC SMALL LETTER AKHMIMIC KHEI - { 0x2CC9, 0x1, 0x49, 0, -1 }, -// 2cca COPTIC CAPITAL LETTER DIALECT-P HORI - { 0x2CCA, 0x1, 0x89, 1, 0 }, -// 2ccb COPTIC SMALL LETTER DIALECT-P HORI - { 0x2CCB, 0x1, 0x49, 0, -1 }, -// 2ccc COPTIC CAPITAL LETTER OLD COPTIC HORI - { 0x2CCC, 0x1, 0x89, 1, 0 }, -// 2ccd COPTIC SMALL LETTER OLD COPTIC HORI - { 0x2CCD, 0x1, 0x49, 0, -1 }, -// 2cce COPTIC CAPITAL LETTER OLD COPTIC HA - { 0x2CCE, 0x1, 0x89, 1, 0 }, -// 2ccf COPTIC SMALL LETTER OLD COPTIC HA - { 0x2CCF, 0x1, 0x49, 0, -1 }, -// 2cd0 COPTIC CAPITAL LETTER L-SHAPED HA - { 0x2CD0, 0x1, 0x89, 1, 0 }, -// 2cd1 COPTIC SMALL LETTER L-SHAPED HA - { 0x2CD1, 0x1, 0x49, 0, -1 }, -// 2cd2 COPTIC CAPITAL LETTER OLD COPTIC HEI - { 0x2CD2, 0x1, 0x89, 1, 0 }, -// 2cd3 COPTIC SMALL LETTER OLD COPTIC HEI - { 0x2CD3, 0x1, 0x49, 0, -1 }, -// 2cd4 COPTIC CAPITAL LETTER OLD COPTIC HAT - { 0x2CD4, 0x1, 0x89, 1, 0 }, -// 2cd5 COPTIC SMALL LETTER OLD COPTIC HAT - { 0x2CD5, 0x1, 0x49, 0, -1 }, -// 2cd6 COPTIC CAPITAL LETTER OLD COPTIC GANGIA - { 0x2CD6, 0x1, 0x89, 1, 0 }, -// 2cd7 COPTIC SMALL LETTER OLD COPTIC GANGIA - { 0x2CD7, 0x1, 0x49, 0, -1 }, -// 2cd8 COPTIC CAPITAL LETTER OLD COPTIC DJA - { 0x2CD8, 0x1, 0x89, 1, 0 }, -// 2cd9 COPTIC SMALL LETTER OLD COPTIC DJA - { 0x2CD9, 0x1, 0x49, 0, -1 }, -// 2cda COPTIC CAPITAL LETTER OLD COPTIC SHIMA - { 0x2CDA, 0x1, 0x89, 1, 0 }, -// 2cdb COPTIC SMALL LETTER OLD COPTIC SHIMA - { 0x2CDB, 0x1, 0x49, 0, -1 }, -// 2cdc COPTIC CAPITAL LETTER OLD NUBIAN SHIMA - { 0x2CDC, 0x1, 0x89, 1, 0 }, -// 2cdd COPTIC SMALL LETTER OLD NUBIAN SHIMA - { 0x2CDD, 0x1, 0x49, 0, -1 }, -// 2cde COPTIC CAPITAL LETTER OLD NUBIAN NGI - { 0x2CDE, 0x1, 0x89, 1, 0 }, -// 2cdf COPTIC SMALL LETTER OLD NUBIAN NGI - { 0x2CDF, 0x1, 0x49, 0, -1 }, -// 2ce0 COPTIC CAPITAL LETTER OLD NUBIAN NYI - { 0x2CE0, 0x1, 0x89, 1, 0 }, -// 2ce1 COPTIC SMALL LETTER OLD NUBIAN NYI - { 0x2CE1, 0x1, 0x49, 0, -1 }, -// 2ce2 COPTIC CAPITAL LETTER OLD NUBIAN WAU - { 0x2CE2, 0x1, 0x89, 1, 0 }, -// 2ce3 COPTIC SMALL LETTER OLD NUBIAN WAU - { 0x2CE3, 0x1, 0x49, 0, -1 }, -// 2ce4 COPTIC SYMBOL KAI - { 0x2CE4, 0x1, 0x49, 0, 0 }, -// 2ce5 COPTIC SYMBOL MI RO -// 2ce6 COPTIC SYMBOL PI RO -// 2ce7 COPTIC SYMBOL STAUROS -// 2ce8 COPTIC SYMBOL TAU RO -// 2ce9 COPTIC SYMBOL KHI RO -// 2cea COPTIC SYMBOL SHIMA SIMA - { 0x2CE5, 0x6, 0x8, 0, 0 }, -// 2ceb COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI - { 0x2CEB, 0x1, 0x89, 1, 0 }, -// 2cec COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI - { 0x2CEC, 0x1, 0x49, 0, -1 }, -// 2ced COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA - { 0x2CED, 0x1, 0x89, 1, 0 }, -// 2cee COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA - { 0x2CEE, 0x1, 0x49, 0, -1 }, -// 2cef COPTIC COMBINING NI ABOVE -// 2cf0 COPTIC COMBINING SPIRITUS ASPER -// 2cf1 COPTIC COMBINING SPIRITUS LENIS - { 0x2CEF, 0x3, 0x0, 0, 0 }, -// 2cf2 COPTIC CAPITAL LETTER BOHAIRIC KHEI - { 0x2CF2, 0x1, 0x89, 1, 0 }, -// 2cf3 COPTIC SMALL LETTER BOHAIRIC KHEI - { 0x2CF3, 0x1, 0x49, 0, -1 }, -// 2cf9 COPTIC OLD NUBIAN FULL STOP -// 2cfa COPTIC OLD NUBIAN DIRECT QUESTION MARK -// 2cfb COPTIC OLD NUBIAN INDIRECT QUESTION MARK -// 2cfc COPTIC OLD NUBIAN VERSE DIVIDER - { 0x2CF9, 0x4, 0x18, 0, 0 }, -// 2cfd COPTIC FRACTION ONE HALF - { 0x2CFD, 0x1, 0x8, 0, 0 }, -// 2cfe COPTIC FULL STOP -// 2cff COPTIC MORPHOLOGICAL DIVIDER - { 0x2CFE, 0x2, 0x18, 0, 0 }, -// 2d00 GEORGIAN SMALL LETTER AN -// 2d01 GEORGIAN SMALL LETTER BAN -// 2d02 GEORGIAN SMALL LETTER GAN -// 2d03 GEORGIAN SMALL LETTER DON -// 2d04 GEORGIAN SMALL LETTER EN -// 2d05 GEORGIAN SMALL LETTER VIN -// 2d06 GEORGIAN SMALL LETTER ZEN -// 2d07 GEORGIAN SMALL LETTER TAN -// 2d08 GEORGIAN SMALL LETTER IN -// 2d09 GEORGIAN SMALL LETTER KAN -// 2d0a GEORGIAN SMALL LETTER LAS -// 2d0b GEORGIAN SMALL LETTER MAN -// 2d0c GEORGIAN SMALL LETTER NAR -// 2d0d GEORGIAN SMALL LETTER ON -// 2d0e GEORGIAN SMALL LETTER PAR -// 2d0f GEORGIAN SMALL LETTER ZHAR -// 2d10 GEORGIAN SMALL LETTER RAE -// 2d11 GEORGIAN SMALL LETTER SAN -// 2d12 GEORGIAN SMALL LETTER TAR -// 2d13 GEORGIAN SMALL LETTER UN -// 2d14 GEORGIAN SMALL LETTER PHAR -// 2d15 GEORGIAN SMALL LETTER KHAR -// 2d16 GEORGIAN SMALL LETTER GHAN -// 2d17 GEORGIAN SMALL LETTER QAR -// 2d18 GEORGIAN SMALL LETTER SHIN -// 2d19 GEORGIAN SMALL LETTER CHIN -// 2d1a GEORGIAN SMALL LETTER CAN -// 2d1b GEORGIAN SMALL LETTER JIL -// 2d1c GEORGIAN SMALL LETTER CIL -// 2d1d GEORGIAN SMALL LETTER CHAR -// 2d1e GEORGIAN SMALL LETTER XAN -// 2d1f GEORGIAN SMALL LETTER JHAN -// 2d20 GEORGIAN SMALL LETTER HAE -// 2d21 GEORGIAN SMALL LETTER HE -// 2d22 GEORGIAN SMALL LETTER HIE -// 2d23 GEORGIAN SMALL LETTER WE -// 2d24 GEORGIAN SMALL LETTER HAR -// 2d25 GEORGIAN SMALL LETTER HOE - { 0x2D00, 0x26, 0x49, 0, -7264 }, -// 2d27 GEORGIAN SMALL LETTER YN - { 0x2D27, 0x1, 0x49, 0, -7264 }, -// 2d2d GEORGIAN SMALL LETTER AEN - { 0x2D2D, 0x1, 0x49, 0, -7264 }, -// 2d30 TIFINAGH LETTER YA -// 2d31 TIFINAGH LETTER YAB -// 2d32 TIFINAGH LETTER YABH -// 2d33 TIFINAGH LETTER YAG -// 2d34 TIFINAGH LETTER YAGHH -// 2d35 TIFINAGH LETTER BERBER ACADEMY YAJ -// 2d36 TIFINAGH LETTER YAJ -// 2d37 TIFINAGH LETTER YAD -// 2d38 TIFINAGH LETTER YADH -// 2d39 TIFINAGH LETTER YADD -// 2d3a TIFINAGH LETTER YADDH -// 2d3b TIFINAGH LETTER YEY -// 2d3c TIFINAGH LETTER YAF -// 2d3d TIFINAGH LETTER YAK -// 2d3e TIFINAGH LETTER TUAREG YAK -// 2d3f TIFINAGH LETTER YAKHH -// 2d40 TIFINAGH LETTER YAH -// 2d41 TIFINAGH LETTER BERBER ACADEMY YAH -// 2d42 TIFINAGH LETTER TUAREG YAH -// 2d43 TIFINAGH LETTER YAHH -// 2d44 TIFINAGH LETTER YAA -// 2d45 TIFINAGH LETTER YAKH -// 2d46 TIFINAGH LETTER TUAREG YAKH -// 2d47 TIFINAGH LETTER YAQ -// 2d48 TIFINAGH LETTER TUAREG YAQ -// 2d49 TIFINAGH LETTER YI -// 2d4a TIFINAGH LETTER YAZH -// 2d4b TIFINAGH LETTER AHAGGAR YAZH -// 2d4c TIFINAGH LETTER TUAREG YAZH -// 2d4d TIFINAGH LETTER YAL -// 2d4e TIFINAGH LETTER YAM -// 2d4f TIFINAGH LETTER YAN -// 2d50 TIFINAGH LETTER TUAREG YAGN -// 2d51 TIFINAGH LETTER TUAREG YANG -// 2d52 TIFINAGH LETTER YAP -// 2d53 TIFINAGH LETTER YU -// 2d54 TIFINAGH LETTER YAR -// 2d55 TIFINAGH LETTER YARR -// 2d56 TIFINAGH LETTER YAGH -// 2d57 TIFINAGH LETTER TUAREG YAGH -// 2d58 TIFINAGH LETTER AYER YAGH -// 2d59 TIFINAGH LETTER YAS -// 2d5a TIFINAGH LETTER YASS -// 2d5b TIFINAGH LETTER YASH -// 2d5c TIFINAGH LETTER YAT -// 2d5d TIFINAGH LETTER YATH -// 2d5e TIFINAGH LETTER YACH -// 2d5f TIFINAGH LETTER YATT -// 2d60 TIFINAGH LETTER YAV -// 2d61 TIFINAGH LETTER YAW -// 2d62 TIFINAGH LETTER YAY -// 2d63 TIFINAGH LETTER YAZ -// 2d64 TIFINAGH LETTER TAWELLEMET YAZ -// 2d65 TIFINAGH LETTER YAZZ -// 2d66 TIFINAGH LETTER YE -// 2d67 TIFINAGH LETTER YO - { 0x2D30, 0x38, 0x9, 0, 0 }, -// 2d6f TIFINAGH MODIFIER LETTER LABIALIZATION MARK - { 0x2D6F, 0x1, 0x9, 0, 0 }, -// 2d70 TIFINAGH SEPARATOR MARK - { 0x2D70, 0x1, 0x18, 0, 0 }, -// 2d7f TIFINAGH CONSONANT JOINER - { 0x2D7F, 0x1, 0x0, 0, 0 }, -// 2d80 ETHIOPIC SYLLABLE LOA -// 2d81 ETHIOPIC SYLLABLE MOA -// 2d82 ETHIOPIC SYLLABLE ROA -// 2d83 ETHIOPIC SYLLABLE SOA -// 2d84 ETHIOPIC SYLLABLE SHOA -// 2d85 ETHIOPIC SYLLABLE BOA -// 2d86 ETHIOPIC SYLLABLE TOA -// 2d87 ETHIOPIC SYLLABLE COA -// 2d88 ETHIOPIC SYLLABLE NOA -// 2d89 ETHIOPIC SYLLABLE NYOA -// 2d8a ETHIOPIC SYLLABLE GLOTTAL OA -// 2d8b ETHIOPIC SYLLABLE ZOA -// 2d8c ETHIOPIC SYLLABLE DOA -// 2d8d ETHIOPIC SYLLABLE DDOA -// 2d8e ETHIOPIC SYLLABLE JOA -// 2d8f ETHIOPIC SYLLABLE THOA -// 2d90 ETHIOPIC SYLLABLE CHOA -// 2d91 ETHIOPIC SYLLABLE PHOA -// 2d92 ETHIOPIC SYLLABLE POA -// 2d93 ETHIOPIC SYLLABLE GGWA -// 2d94 ETHIOPIC SYLLABLE GGWI -// 2d95 ETHIOPIC SYLLABLE GGWEE -// 2d96 ETHIOPIC SYLLABLE GGWE - { 0x2D80, 0x17, 0x9, 0, 0 }, -// 2da0 ETHIOPIC SYLLABLE SSA -// 2da1 ETHIOPIC SYLLABLE SSU -// 2da2 ETHIOPIC SYLLABLE SSI -// 2da3 ETHIOPIC SYLLABLE SSAA -// 2da4 ETHIOPIC SYLLABLE SSEE -// 2da5 ETHIOPIC SYLLABLE SSE -// 2da6 ETHIOPIC SYLLABLE SSO - { 0x2DA0, 0x7, 0x9, 0, 0 }, -// 2da8 ETHIOPIC SYLLABLE CCA -// 2da9 ETHIOPIC SYLLABLE CCU -// 2daa ETHIOPIC SYLLABLE CCI -// 2dab ETHIOPIC SYLLABLE CCAA -// 2dac ETHIOPIC SYLLABLE CCEE -// 2dad ETHIOPIC SYLLABLE CCE -// 2dae ETHIOPIC SYLLABLE CCO - { 0x2DA8, 0x7, 0x9, 0, 0 }, -// 2db0 ETHIOPIC SYLLABLE ZZA -// 2db1 ETHIOPIC SYLLABLE ZZU -// 2db2 ETHIOPIC SYLLABLE ZZI -// 2db3 ETHIOPIC SYLLABLE ZZAA -// 2db4 ETHIOPIC SYLLABLE ZZEE -// 2db5 ETHIOPIC SYLLABLE ZZE -// 2db6 ETHIOPIC SYLLABLE ZZO - { 0x2DB0, 0x7, 0x9, 0, 0 }, -// 2db8 ETHIOPIC SYLLABLE CCHA -// 2db9 ETHIOPIC SYLLABLE CCHU -// 2dba ETHIOPIC SYLLABLE CCHI -// 2dbb ETHIOPIC SYLLABLE CCHAA -// 2dbc ETHIOPIC SYLLABLE CCHEE -// 2dbd ETHIOPIC SYLLABLE CCHE -// 2dbe ETHIOPIC SYLLABLE CCHO - { 0x2DB8, 0x7, 0x9, 0, 0 }, -// 2dc0 ETHIOPIC SYLLABLE QYA -// 2dc1 ETHIOPIC SYLLABLE QYU -// 2dc2 ETHIOPIC SYLLABLE QYI -// 2dc3 ETHIOPIC SYLLABLE QYAA -// 2dc4 ETHIOPIC SYLLABLE QYEE -// 2dc5 ETHIOPIC SYLLABLE QYE -// 2dc6 ETHIOPIC SYLLABLE QYO - { 0x2DC0, 0x7, 0x9, 0, 0 }, -// 2dc8 ETHIOPIC SYLLABLE KYA -// 2dc9 ETHIOPIC SYLLABLE KYU -// 2dca ETHIOPIC SYLLABLE KYI -// 2dcb ETHIOPIC SYLLABLE KYAA -// 2dcc ETHIOPIC SYLLABLE KYEE -// 2dcd ETHIOPIC SYLLABLE KYE -// 2dce ETHIOPIC SYLLABLE KYO - { 0x2DC8, 0x7, 0x9, 0, 0 }, -// 2dd0 ETHIOPIC SYLLABLE XYA -// 2dd1 ETHIOPIC SYLLABLE XYU -// 2dd2 ETHIOPIC SYLLABLE XYI -// 2dd3 ETHIOPIC SYLLABLE XYAA -// 2dd4 ETHIOPIC SYLLABLE XYEE -// 2dd5 ETHIOPIC SYLLABLE XYE -// 2dd6 ETHIOPIC SYLLABLE XYO - { 0x2DD0, 0x7, 0x9, 0, 0 }, -// 2dd8 ETHIOPIC SYLLABLE GYA -// 2dd9 ETHIOPIC SYLLABLE GYU -// 2dda ETHIOPIC SYLLABLE GYI -// 2ddb ETHIOPIC SYLLABLE GYAA -// 2ddc ETHIOPIC SYLLABLE GYEE -// 2ddd ETHIOPIC SYLLABLE GYE -// 2dde ETHIOPIC SYLLABLE GYO - { 0x2DD8, 0x7, 0x9, 0, 0 }, -// 2de0 COMBINING CYRILLIC LETTER BE -// 2de1 COMBINING CYRILLIC LETTER VE -// 2de2 COMBINING CYRILLIC LETTER GHE -// 2de3 COMBINING CYRILLIC LETTER DE -// 2de4 COMBINING CYRILLIC LETTER ZHE -// 2de5 COMBINING CYRILLIC LETTER ZE -// 2de6 COMBINING CYRILLIC LETTER KA -// 2de7 COMBINING CYRILLIC LETTER EL -// 2de8 COMBINING CYRILLIC LETTER EM -// 2de9 COMBINING CYRILLIC LETTER EN -// 2dea COMBINING CYRILLIC LETTER O -// 2deb COMBINING CYRILLIC LETTER PE -// 2dec COMBINING CYRILLIC LETTER ER -// 2ded COMBINING CYRILLIC LETTER ES -// 2dee COMBINING CYRILLIC LETTER TE -// 2def COMBINING CYRILLIC LETTER HA -// 2df0 COMBINING CYRILLIC LETTER TSE -// 2df1 COMBINING CYRILLIC LETTER CHE -// 2df2 COMBINING CYRILLIC LETTER SHA -// 2df3 COMBINING CYRILLIC LETTER SHCHA -// 2df4 COMBINING CYRILLIC LETTER FITA -// 2df5 COMBINING CYRILLIC LETTER ES-TE -// 2df6 COMBINING CYRILLIC LETTER A -// 2df7 COMBINING CYRILLIC LETTER IE -// 2df8 COMBINING CYRILLIC LETTER DJERV -// 2df9 COMBINING CYRILLIC LETTER MONOGRAPH UK -// 2dfa COMBINING CYRILLIC LETTER YAT -// 2dfb COMBINING CYRILLIC LETTER YU -// 2dfc COMBINING CYRILLIC LETTER IOTIFIED A -// 2dfd COMBINING CYRILLIC LETTER LITTLE YUS -// 2dfe COMBINING CYRILLIC LETTER BIG YUS -// 2dff COMBINING CYRILLIC LETTER IOTIFIED BIG YUS - { 0x2DE0, 0x20, 0x0, 0, 0 }, -// 2e00 RIGHT ANGLE SUBSTITUTION MARKER -// 2e01 RIGHT ANGLE DOTTED SUBSTITUTION MARKER -// 2e02 LEFT SUBSTITUTION BRACKET -// 2e03 RIGHT SUBSTITUTION BRACKET -// 2e04 LEFT DOTTED SUBSTITUTION BRACKET -// 2e05 RIGHT DOTTED SUBSTITUTION BRACKET -// 2e06 RAISED INTERPOLATION MARKER -// 2e07 RAISED DOTTED INTERPOLATION MARKER -// 2e08 DOTTED TRANSPOSITION MARKER -// 2e09 LEFT TRANSPOSITION BRACKET -// 2e0a RIGHT TRANSPOSITION BRACKET -// 2e0b RAISED SQUARE -// 2e0c LEFT RAISED OMISSION BRACKET -// 2e0d RIGHT RAISED OMISSION BRACKET -// 2e0e EDITORIAL CORONIS -// 2e0f PARAGRAPHOS -// 2e10 FORKED PARAGRAPHOS -// 2e11 REVERSED FORKED PARAGRAPHOS -// 2e12 HYPODIASTOLE -// 2e13 DOTTED OBELOS -// 2e14 DOWNWARDS ANCORA -// 2e15 UPWARDS ANCORA -// 2e16 DOTTED RIGHT-POINTING ANGLE -// 2e17 DOUBLE OBLIQUE HYPHEN -// 2e18 INVERTED INTERROBANG -// 2e19 PALM BRANCH -// 2e1a HYPHEN WITH DIAERESIS -// 2e1b TILDE WITH RING ABOVE -// 2e1c LEFT LOW PARAPHRASE BRACKET -// 2e1d RIGHT LOW PARAPHRASE BRACKET -// 2e1e TILDE WITH DOT ABOVE -// 2e1f TILDE WITH DOT BELOW -// 2e20 LEFT VERTICAL BAR WITH QUILL -// 2e21 RIGHT VERTICAL BAR WITH QUILL -// 2e22 TOP LEFT HALF BRACKET -// 2e23 TOP RIGHT HALF BRACKET -// 2e24 BOTTOM LEFT HALF BRACKET -// 2e25 BOTTOM RIGHT HALF BRACKET -// 2e26 LEFT SIDEWAYS U BRACKET -// 2e27 RIGHT SIDEWAYS U BRACKET -// 2e28 LEFT DOUBLE PARENTHESIS -// 2e29 RIGHT DOUBLE PARENTHESIS -// 2e2a TWO DOTS OVER ONE DOT PUNCTUATION -// 2e2b ONE DOT OVER TWO DOTS PUNCTUATION -// 2e2c SQUARED FOUR DOT PUNCTUATION -// 2e2d FIVE DOT MARK -// 2e2e REVERSED QUESTION MARK - { 0x2E00, 0x2F, 0x18, 0, 0 }, -// 2e2f VERTICAL TILDE - { 0x2E2F, 0x1, 0x9, 0, 0 }, -// 2e30 RING POINT -// 2e31 WORD SEPARATOR MIDDLE DOT -// 2e32 TURNED COMMA -// 2e33 RAISED DOT -// 2e34 RAISED COMMA -// 2e35 TURNED SEMICOLON -// 2e36 DAGGER WITH LEFT GUARD -// 2e37 DAGGER WITH RIGHT GUARD -// 2e38 TURNED DAGGER -// 2e39 TOP HALF SECTION SIGN -// 2e3a TWO-EM DASH -// 2e3b THREE-EM DASH -// 2e3c STENOGRAPHIC FULL STOP -// 2e3d VERTICAL SIX DOTS -// 2e3e WIGGLY VERTICAL LINE -// 2e3f CAPITULUM -// 2e40 DOUBLE HYPHEN -// 2e41 REVERSED COMMA -// 2e42 DOUBLE LOW-REVERSED-9 QUOTATION MARK - { 0x2E30, 0x13, 0x18, 0, 0 }, -// 2e80 CJK RADICAL REPEAT -// 2e81 CJK RADICAL CLIFF -// 2e82 CJK RADICAL SECOND ONE -// 2e83 CJK RADICAL SECOND TWO -// 2e84 CJK RADICAL SECOND THREE -// 2e85 CJK RADICAL PERSON -// 2e86 CJK RADICAL BOX -// 2e87 CJK RADICAL TABLE -// 2e88 CJK RADICAL KNIFE ONE -// 2e89 CJK RADICAL KNIFE TWO -// 2e8a CJK RADICAL DIVINATION -// 2e8b CJK RADICAL SEAL -// 2e8c CJK RADICAL SMALL ONE -// 2e8d CJK RADICAL SMALL TWO -// 2e8e CJK RADICAL LAME ONE -// 2e8f CJK RADICAL LAME TWO -// 2e90 CJK RADICAL LAME THREE -// 2e91 CJK RADICAL LAME FOUR -// 2e92 CJK RADICAL SNAKE -// 2e93 CJK RADICAL THREAD -// 2e94 CJK RADICAL SNOUT ONE -// 2e95 CJK RADICAL SNOUT TWO -// 2e96 CJK RADICAL HEART ONE -// 2e97 CJK RADICAL HEART TWO -// 2e98 CJK RADICAL HAND -// 2e99 CJK RADICAL RAP - { 0x2E80, 0x1A, 0x8, 0, 0 }, -// 2e9b CJK RADICAL CHOKE -// 2e9c CJK RADICAL SUN -// 2e9d CJK RADICAL MOON -// 2e9e CJK RADICAL DEATH -// 2e9f CJK RADICAL MOTHER -// 2ea0 CJK RADICAL CIVILIAN -// 2ea1 CJK RADICAL WATER ONE -// 2ea2 CJK RADICAL WATER TWO -// 2ea3 CJK RADICAL FIRE -// 2ea4 CJK RADICAL PAW ONE -// 2ea5 CJK RADICAL PAW TWO -// 2ea6 CJK RADICAL SIMPLIFIED HALF TREE TRUNK -// 2ea7 CJK RADICAL COW -// 2ea8 CJK RADICAL DOG -// 2ea9 CJK RADICAL JADE -// 2eaa CJK RADICAL BOLT OF CLOTH -// 2eab CJK RADICAL EYE -// 2eac CJK RADICAL SPIRIT ONE -// 2ead CJK RADICAL SPIRIT TWO -// 2eae CJK RADICAL BAMBOO -// 2eaf CJK RADICAL SILK -// 2eb0 CJK RADICAL C-SIMPLIFIED SILK -// 2eb1 CJK RADICAL NET ONE -// 2eb2 CJK RADICAL NET TWO -// 2eb3 CJK RADICAL NET THREE -// 2eb4 CJK RADICAL NET FOUR -// 2eb5 CJK RADICAL MESH -// 2eb6 CJK RADICAL SHEEP -// 2eb7 CJK RADICAL RAM -// 2eb8 CJK RADICAL EWE -// 2eb9 CJK RADICAL OLD -// 2eba CJK RADICAL BRUSH ONE -// 2ebb CJK RADICAL BRUSH TWO -// 2ebc CJK RADICAL MEAT -// 2ebd CJK RADICAL MORTAR -// 2ebe CJK RADICAL GRASS ONE -// 2ebf CJK RADICAL GRASS TWO -// 2ec0 CJK RADICAL GRASS THREE -// 2ec1 CJK RADICAL TIGER -// 2ec2 CJK RADICAL CLOTHES -// 2ec3 CJK RADICAL WEST ONE -// 2ec4 CJK RADICAL WEST TWO -// 2ec5 CJK RADICAL C-SIMPLIFIED SEE -// 2ec6 CJK RADICAL SIMPLIFIED HORN -// 2ec7 CJK RADICAL HORN -// 2ec8 CJK RADICAL C-SIMPLIFIED SPEECH -// 2ec9 CJK RADICAL C-SIMPLIFIED SHELL -// 2eca CJK RADICAL FOOT -// 2ecb CJK RADICAL C-SIMPLIFIED CART -// 2ecc CJK RADICAL SIMPLIFIED WALK -// 2ecd CJK RADICAL WALK ONE -// 2ece CJK RADICAL WALK TWO -// 2ecf CJK RADICAL CITY -// 2ed0 CJK RADICAL C-SIMPLIFIED GOLD -// 2ed1 CJK RADICAL LONG ONE -// 2ed2 CJK RADICAL LONG TWO -// 2ed3 CJK RADICAL C-SIMPLIFIED LONG -// 2ed4 CJK RADICAL C-SIMPLIFIED GATE -// 2ed5 CJK RADICAL MOUND ONE -// 2ed6 CJK RADICAL MOUND TWO -// 2ed7 CJK RADICAL RAIN -// 2ed8 CJK RADICAL BLUE -// 2ed9 CJK RADICAL C-SIMPLIFIED TANNED LEATHER -// 2eda CJK RADICAL C-SIMPLIFIED LEAF -// 2edb CJK RADICAL C-SIMPLIFIED WIND -// 2edc CJK RADICAL C-SIMPLIFIED FLY -// 2edd CJK RADICAL EAT ONE -// 2ede CJK RADICAL EAT TWO -// 2edf CJK RADICAL EAT THREE -// 2ee0 CJK RADICAL C-SIMPLIFIED EAT -// 2ee1 CJK RADICAL HEAD -// 2ee2 CJK RADICAL C-SIMPLIFIED HORSE -// 2ee3 CJK RADICAL BONE -// 2ee4 CJK RADICAL GHOST -// 2ee5 CJK RADICAL C-SIMPLIFIED FISH -// 2ee6 CJK RADICAL C-SIMPLIFIED BIRD -// 2ee7 CJK RADICAL C-SIMPLIFIED SALT -// 2ee8 CJK RADICAL SIMPLIFIED WHEAT -// 2ee9 CJK RADICAL SIMPLIFIED YELLOW -// 2eea CJK RADICAL C-SIMPLIFIED FROG -// 2eeb CJK RADICAL J-SIMPLIFIED EVEN -// 2eec CJK RADICAL C-SIMPLIFIED EVEN -// 2eed CJK RADICAL J-SIMPLIFIED TOOTH -// 2eee CJK RADICAL C-SIMPLIFIED TOOTH -// 2eef CJK RADICAL J-SIMPLIFIED DRAGON -// 2ef0 CJK RADICAL C-SIMPLIFIED DRAGON -// 2ef1 CJK RADICAL TURTLE -// 2ef2 CJK RADICAL J-SIMPLIFIED TURTLE -// 2ef3 CJK RADICAL C-SIMPLIFIED TURTLE - { 0x2E9B, 0x59, 0x8, 0, 0 }, -// 2f00 KANGXI RADICAL ONE -// 2f01 KANGXI RADICAL LINE -// 2f02 KANGXI RADICAL DOT -// 2f03 KANGXI RADICAL SLASH -// 2f04 KANGXI RADICAL SECOND -// 2f05 KANGXI RADICAL HOOK -// 2f06 KANGXI RADICAL TWO -// 2f07 KANGXI RADICAL LID -// 2f08 KANGXI RADICAL MAN -// 2f09 KANGXI RADICAL LEGS -// 2f0a KANGXI RADICAL ENTER -// 2f0b KANGXI RADICAL EIGHT -// 2f0c KANGXI RADICAL DOWN BOX -// 2f0d KANGXI RADICAL COVER -// 2f0e KANGXI RADICAL ICE -// 2f0f KANGXI RADICAL TABLE -// 2f10 KANGXI RADICAL OPEN BOX -// 2f11 KANGXI RADICAL KNIFE -// 2f12 KANGXI RADICAL POWER -// 2f13 KANGXI RADICAL WRAP -// 2f14 KANGXI RADICAL SPOON -// 2f15 KANGXI RADICAL RIGHT OPEN BOX -// 2f16 KANGXI RADICAL HIDING ENCLOSURE -// 2f17 KANGXI RADICAL TEN -// 2f18 KANGXI RADICAL DIVINATION -// 2f19 KANGXI RADICAL SEAL -// 2f1a KANGXI RADICAL CLIFF -// 2f1b KANGXI RADICAL PRIVATE -// 2f1c KANGXI RADICAL AGAIN -// 2f1d KANGXI RADICAL MOUTH -// 2f1e KANGXI RADICAL ENCLOSURE -// 2f1f KANGXI RADICAL EARTH -// 2f20 KANGXI RADICAL SCHOLAR -// 2f21 KANGXI RADICAL GO -// 2f22 KANGXI RADICAL GO SLOWLY -// 2f23 KANGXI RADICAL EVENING -// 2f24 KANGXI RADICAL BIG -// 2f25 KANGXI RADICAL WOMAN -// 2f26 KANGXI RADICAL CHILD -// 2f27 KANGXI RADICAL ROOF -// 2f28 KANGXI RADICAL INCH -// 2f29 KANGXI RADICAL SMALL -// 2f2a KANGXI RADICAL LAME -// 2f2b KANGXI RADICAL CORPSE -// 2f2c KANGXI RADICAL SPROUT -// 2f2d KANGXI RADICAL MOUNTAIN -// 2f2e KANGXI RADICAL RIVER -// 2f2f KANGXI RADICAL WORK -// 2f30 KANGXI RADICAL ONESELF -// 2f31 KANGXI RADICAL TURBAN -// 2f32 KANGXI RADICAL DRY -// 2f33 KANGXI RADICAL SHORT THREAD -// 2f34 KANGXI RADICAL DOTTED CLIFF -// 2f35 KANGXI RADICAL LONG STRIDE -// 2f36 KANGXI RADICAL TWO HANDS -// 2f37 KANGXI RADICAL SHOOT -// 2f38 KANGXI RADICAL BOW -// 2f39 KANGXI RADICAL SNOUT -// 2f3a KANGXI RADICAL BRISTLE -// 2f3b KANGXI RADICAL STEP -// 2f3c KANGXI RADICAL HEART -// 2f3d KANGXI RADICAL HALBERD -// 2f3e KANGXI RADICAL DOOR -// 2f3f KANGXI RADICAL HAND -// 2f40 KANGXI RADICAL BRANCH -// 2f41 KANGXI RADICAL RAP -// 2f42 KANGXI RADICAL SCRIPT -// 2f43 KANGXI RADICAL DIPPER -// 2f44 KANGXI RADICAL AXE -// 2f45 KANGXI RADICAL SQUARE -// 2f46 KANGXI RADICAL NOT -// 2f47 KANGXI RADICAL SUN -// 2f48 KANGXI RADICAL SAY -// 2f49 KANGXI RADICAL MOON -// 2f4a KANGXI RADICAL TREE -// 2f4b KANGXI RADICAL LACK -// 2f4c KANGXI RADICAL STOP -// 2f4d KANGXI RADICAL DEATH -// 2f4e KANGXI RADICAL WEAPON -// 2f4f KANGXI RADICAL DO NOT -// 2f50 KANGXI RADICAL COMPARE -// 2f51 KANGXI RADICAL FUR -// 2f52 KANGXI RADICAL CLAN -// 2f53 KANGXI RADICAL STEAM -// 2f54 KANGXI RADICAL WATER -// 2f55 KANGXI RADICAL FIRE -// 2f56 KANGXI RADICAL CLAW -// 2f57 KANGXI RADICAL FATHER -// 2f58 KANGXI RADICAL DOUBLE X -// 2f59 KANGXI RADICAL HALF TREE TRUNK -// 2f5a KANGXI RADICAL SLICE -// 2f5b KANGXI RADICAL FANG -// 2f5c KANGXI RADICAL COW -// 2f5d KANGXI RADICAL DOG -// 2f5e KANGXI RADICAL PROFOUND -// 2f5f KANGXI RADICAL JADE -// 2f60 KANGXI RADICAL MELON -// 2f61 KANGXI RADICAL TILE -// 2f62 KANGXI RADICAL SWEET -// 2f63 KANGXI RADICAL LIFE -// 2f64 KANGXI RADICAL USE -// 2f65 KANGXI RADICAL FIELD -// 2f66 KANGXI RADICAL BOLT OF CLOTH -// 2f67 KANGXI RADICAL SICKNESS -// 2f68 KANGXI RADICAL DOTTED TENT -// 2f69 KANGXI RADICAL WHITE -// 2f6a KANGXI RADICAL SKIN -// 2f6b KANGXI RADICAL DISH -// 2f6c KANGXI RADICAL EYE -// 2f6d KANGXI RADICAL SPEAR -// 2f6e KANGXI RADICAL ARROW -// 2f6f KANGXI RADICAL STONE -// 2f70 KANGXI RADICAL SPIRIT -// 2f71 KANGXI RADICAL TRACK -// 2f72 KANGXI RADICAL GRAIN -// 2f73 KANGXI RADICAL CAVE -// 2f74 KANGXI RADICAL STAND -// 2f75 KANGXI RADICAL BAMBOO -// 2f76 KANGXI RADICAL RICE -// 2f77 KANGXI RADICAL SILK -// 2f78 KANGXI RADICAL JAR -// 2f79 KANGXI RADICAL NET -// 2f7a KANGXI RADICAL SHEEP -// 2f7b KANGXI RADICAL FEATHER -// 2f7c KANGXI RADICAL OLD -// 2f7d KANGXI RADICAL AND -// 2f7e KANGXI RADICAL PLOW -// 2f7f KANGXI RADICAL EAR -// 2f80 KANGXI RADICAL BRUSH -// 2f81 KANGXI RADICAL MEAT -// 2f82 KANGXI RADICAL MINISTER -// 2f83 KANGXI RADICAL SELF -// 2f84 KANGXI RADICAL ARRIVE -// 2f85 KANGXI RADICAL MORTAR -// 2f86 KANGXI RADICAL TONGUE -// 2f87 KANGXI RADICAL OPPOSE -// 2f88 KANGXI RADICAL BOAT -// 2f89 KANGXI RADICAL STOPPING -// 2f8a KANGXI RADICAL COLOR -// 2f8b KANGXI RADICAL GRASS -// 2f8c KANGXI RADICAL TIGER -// 2f8d KANGXI RADICAL INSECT -// 2f8e KANGXI RADICAL BLOOD -// 2f8f KANGXI RADICAL WALK ENCLOSURE -// 2f90 KANGXI RADICAL CLOTHES -// 2f91 KANGXI RADICAL WEST -// 2f92 KANGXI RADICAL SEE -// 2f93 KANGXI RADICAL HORN -// 2f94 KANGXI RADICAL SPEECH -// 2f95 KANGXI RADICAL VALLEY -// 2f96 KANGXI RADICAL BEAN -// 2f97 KANGXI RADICAL PIG -// 2f98 KANGXI RADICAL BADGER -// 2f99 KANGXI RADICAL SHELL -// 2f9a KANGXI RADICAL RED -// 2f9b KANGXI RADICAL RUN -// 2f9c KANGXI RADICAL FOOT -// 2f9d KANGXI RADICAL BODY -// 2f9e KANGXI RADICAL CART -// 2f9f KANGXI RADICAL BITTER -// 2fa0 KANGXI RADICAL MORNING -// 2fa1 KANGXI RADICAL WALK -// 2fa2 KANGXI RADICAL CITY -// 2fa3 KANGXI RADICAL WINE -// 2fa4 KANGXI RADICAL DISTINGUISH -// 2fa5 KANGXI RADICAL VILLAGE -// 2fa6 KANGXI RADICAL GOLD -// 2fa7 KANGXI RADICAL LONG -// 2fa8 KANGXI RADICAL GATE -// 2fa9 KANGXI RADICAL MOUND -// 2faa KANGXI RADICAL SLAVE -// 2fab KANGXI RADICAL SHORT TAILED BIRD -// 2fac KANGXI RADICAL RAIN -// 2fad KANGXI RADICAL BLUE -// 2fae KANGXI RADICAL WRONG -// 2faf KANGXI RADICAL FACE -// 2fb0 KANGXI RADICAL LEATHER -// 2fb1 KANGXI RADICAL TANNED LEATHER -// 2fb2 KANGXI RADICAL LEEK -// 2fb3 KANGXI RADICAL SOUND -// 2fb4 KANGXI RADICAL LEAF -// 2fb5 KANGXI RADICAL WIND -// 2fb6 KANGXI RADICAL FLY -// 2fb7 KANGXI RADICAL EAT -// 2fb8 KANGXI RADICAL HEAD -// 2fb9 KANGXI RADICAL FRAGRANT -// 2fba KANGXI RADICAL HORSE -// 2fbb KANGXI RADICAL BONE -// 2fbc KANGXI RADICAL TALL -// 2fbd KANGXI RADICAL HAIR -// 2fbe KANGXI RADICAL FIGHT -// 2fbf KANGXI RADICAL SACRIFICIAL WINE -// 2fc0 KANGXI RADICAL CAULDRON -// 2fc1 KANGXI RADICAL GHOST -// 2fc2 KANGXI RADICAL FISH -// 2fc3 KANGXI RADICAL BIRD -// 2fc4 KANGXI RADICAL SALT -// 2fc5 KANGXI RADICAL DEER -// 2fc6 KANGXI RADICAL WHEAT -// 2fc7 KANGXI RADICAL HEMP -// 2fc8 KANGXI RADICAL YELLOW -// 2fc9 KANGXI RADICAL MILLET -// 2fca KANGXI RADICAL BLACK -// 2fcb KANGXI RADICAL EMBROIDERY -// 2fcc KANGXI RADICAL FROG -// 2fcd KANGXI RADICAL TRIPOD -// 2fce KANGXI RADICAL DRUM -// 2fcf KANGXI RADICAL RAT -// 2fd0 KANGXI RADICAL NOSE -// 2fd1 KANGXI RADICAL EVEN -// 2fd2 KANGXI RADICAL TOOTH -// 2fd3 KANGXI RADICAL DRAGON -// 2fd4 KANGXI RADICAL TURTLE -// 2fd5 KANGXI RADICAL FLUTE - { 0x2F00, 0xD6, 0x8, 0, 0 }, -// 2ff0 IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT -// 2ff1 IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW -// 2ff2 IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT -// 2ff3 IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW -// 2ff4 IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND -// 2ff5 IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE -// 2ff6 IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW -// 2ff7 IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT -// 2ff8 IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT -// 2ff9 IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT -// 2ffa IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT -// 2ffb IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID - { 0x2FF0, 0xC, 0x8, 0, 0 }, -// 3000 IDEOGRAPHIC SPACE - { 0x3000, 0x1, 0x20, 0, 0 }, -// 3001 IDEOGRAPHIC COMMA -// 3002 IDEOGRAPHIC FULL STOP -// 3003 DITTO MARK - { 0x3001, 0x3, 0x18, 0, 0 }, -// 3004 JAPANESE INDUSTRIAL STANDARD SYMBOL - { 0x3004, 0x1, 0x8, 0, 0 }, -// 3005 IDEOGRAPHIC ITERATION MARK -// 3006 IDEOGRAPHIC CLOSING MARK - { 0x3005, 0x2, 0x9, 0, 0 }, -// 3007 IDEOGRAPHIC NUMBER ZERO - { 0x3007, 0x1, 0x8, 0, 0 }, -// 3008 LEFT ANGLE BRACKET -// 3009 RIGHT ANGLE BRACKET -// 300a LEFT DOUBLE ANGLE BRACKET -// 300b RIGHT DOUBLE ANGLE BRACKET -// 300c LEFT CORNER BRACKET -// 300d RIGHT CORNER BRACKET -// 300e LEFT WHITE CORNER BRACKET -// 300f RIGHT WHITE CORNER BRACKET -// 3010 LEFT BLACK LENTICULAR BRACKET -// 3011 RIGHT BLACK LENTICULAR BRACKET - { 0x3008, 0xA, 0x18, 0, 0 }, -// 3012 POSTAL MARK -// 3013 GETA MARK - { 0x3012, 0x2, 0x8, 0, 0 }, -// 3014 LEFT TORTOISE SHELL BRACKET -// 3015 RIGHT TORTOISE SHELL BRACKET -// 3016 LEFT WHITE LENTICULAR BRACKET -// 3017 RIGHT WHITE LENTICULAR BRACKET -// 3018 LEFT WHITE TORTOISE SHELL BRACKET -// 3019 RIGHT WHITE TORTOISE SHELL BRACKET -// 301a LEFT WHITE SQUARE BRACKET -// 301b RIGHT WHITE SQUARE BRACKET -// 301c WAVE DASH -// 301d REVERSED DOUBLE PRIME QUOTATION MARK -// 301e DOUBLE PRIME QUOTATION MARK -// 301f LOW DOUBLE PRIME QUOTATION MARK - { 0x3014, 0xC, 0x18, 0, 0 }, -// 3020 POSTAL MARK FACE -// 3021 HANGZHOU NUMERAL ONE -// 3022 HANGZHOU NUMERAL TWO -// 3023 HANGZHOU NUMERAL THREE -// 3024 HANGZHOU NUMERAL FOUR -// 3025 HANGZHOU NUMERAL FIVE -// 3026 HANGZHOU NUMERAL SIX -// 3027 HANGZHOU NUMERAL SEVEN -// 3028 HANGZHOU NUMERAL EIGHT -// 3029 HANGZHOU NUMERAL NINE - { 0x3020, 0xA, 0x8, 0, 0 }, -// 302a IDEOGRAPHIC LEVEL TONE MARK -// 302b IDEOGRAPHIC RISING TONE MARK -// 302c IDEOGRAPHIC DEPARTING TONE MARK -// 302d IDEOGRAPHIC ENTERING TONE MARK -// 302e HANGUL SINGLE DOT TONE MARK -// 302f HANGUL DOUBLE DOT TONE MARK - { 0x302A, 0x6, 0x0, 0, 0 }, -// 3030 WAVY DASH - { 0x3030, 0x1, 0x18, 0, 0 }, -// 3031 VERTICAL KANA REPEAT MARK -// 3032 VERTICAL KANA REPEAT WITH VOICED SOUND MARK -// 3033 VERTICAL KANA REPEAT MARK UPPER HALF -// 3034 VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF -// 3035 VERTICAL KANA REPEAT MARK LOWER HALF - { 0x3031, 0x5, 0x9, 0, 0 }, -// 3036 CIRCLED POSTAL MARK -// 3037 IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL -// 3038 HANGZHOU NUMERAL TEN -// 3039 HANGZHOU NUMERAL TWENTY -// 303a HANGZHOU NUMERAL THIRTY - { 0x3036, 0x5, 0x8, 0, 0 }, -// 303b VERTICAL IDEOGRAPHIC ITERATION MARK -// 303c MASU MARK - { 0x303B, 0x2, 0x9, 0, 0 }, -// 303d PART ALTERNATION MARK - { 0x303D, 0x1, 0x18, 0, 0 }, -// 303e IDEOGRAPHIC VARIATION INDICATOR -// 303f IDEOGRAPHIC HALF FILL SPACE - { 0x303E, 0x2, 0x8, 0, 0 }, -// 3041 HIRAGANA LETTER SMALL A -// 3042 HIRAGANA LETTER A -// 3043 HIRAGANA LETTER SMALL I -// 3044 HIRAGANA LETTER I -// 3045 HIRAGANA LETTER SMALL U -// 3046 HIRAGANA LETTER U -// 3047 HIRAGANA LETTER SMALL E -// 3048 HIRAGANA LETTER E -// 3049 HIRAGANA LETTER SMALL O -// 304a HIRAGANA LETTER O -// 304b HIRAGANA LETTER KA -// 304c HIRAGANA LETTER GA -// 304d HIRAGANA LETTER KI -// 304e HIRAGANA LETTER GI -// 304f HIRAGANA LETTER KU -// 3050 HIRAGANA LETTER GU -// 3051 HIRAGANA LETTER KE -// 3052 HIRAGANA LETTER GE -// 3053 HIRAGANA LETTER KO -// 3054 HIRAGANA LETTER GO -// 3055 HIRAGANA LETTER SA -// 3056 HIRAGANA LETTER ZA -// 3057 HIRAGANA LETTER SI -// 3058 HIRAGANA LETTER ZI -// 3059 HIRAGANA LETTER SU -// 305a HIRAGANA LETTER ZU -// 305b HIRAGANA LETTER SE -// 305c HIRAGANA LETTER ZE -// 305d HIRAGANA LETTER SO -// 305e HIRAGANA LETTER ZO -// 305f HIRAGANA LETTER TA -// 3060 HIRAGANA LETTER DA -// 3061 HIRAGANA LETTER TI -// 3062 HIRAGANA LETTER DI -// 3063 HIRAGANA LETTER SMALL TU -// 3064 HIRAGANA LETTER TU -// 3065 HIRAGANA LETTER DU -// 3066 HIRAGANA LETTER TE -// 3067 HIRAGANA LETTER DE -// 3068 HIRAGANA LETTER TO -// 3069 HIRAGANA LETTER DO -// 306a HIRAGANA LETTER NA -// 306b HIRAGANA LETTER NI -// 306c HIRAGANA LETTER NU -// 306d HIRAGANA LETTER NE -// 306e HIRAGANA LETTER NO -// 306f HIRAGANA LETTER HA -// 3070 HIRAGANA LETTER BA -// 3071 HIRAGANA LETTER PA -// 3072 HIRAGANA LETTER HI -// 3073 HIRAGANA LETTER BI -// 3074 HIRAGANA LETTER PI -// 3075 HIRAGANA LETTER HU -// 3076 HIRAGANA LETTER BU -// 3077 HIRAGANA LETTER PU -// 3078 HIRAGANA LETTER HE -// 3079 HIRAGANA LETTER BE -// 307a HIRAGANA LETTER PE -// 307b HIRAGANA LETTER HO -// 307c HIRAGANA LETTER BO -// 307d HIRAGANA LETTER PO -// 307e HIRAGANA LETTER MA -// 307f HIRAGANA LETTER MI -// 3080 HIRAGANA LETTER MU -// 3081 HIRAGANA LETTER ME -// 3082 HIRAGANA LETTER MO -// 3083 HIRAGANA LETTER SMALL YA -// 3084 HIRAGANA LETTER YA -// 3085 HIRAGANA LETTER SMALL YU -// 3086 HIRAGANA LETTER YU -// 3087 HIRAGANA LETTER SMALL YO -// 3088 HIRAGANA LETTER YO -// 3089 HIRAGANA LETTER RA -// 308a HIRAGANA LETTER RI -// 308b HIRAGANA LETTER RU -// 308c HIRAGANA LETTER RE -// 308d HIRAGANA LETTER RO -// 308e HIRAGANA LETTER SMALL WA -// 308f HIRAGANA LETTER WA -// 3090 HIRAGANA LETTER WI -// 3091 HIRAGANA LETTER WE -// 3092 HIRAGANA LETTER WO -// 3093 HIRAGANA LETTER N -// 3094 HIRAGANA LETTER VU -// 3095 HIRAGANA LETTER SMALL KA -// 3096 HIRAGANA LETTER SMALL KE - { 0x3041, 0x56, 0x9, 0, 0 }, -// 3099 COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK -// 309a COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK - { 0x3099, 0x2, 0x0, 0, 0 }, -// 309b KATAKANA-HIRAGANA VOICED SOUND MARK -// 309c KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK - { 0x309B, 0x2, 0x8, 0, 0 }, -// 309d HIRAGANA ITERATION MARK -// 309e HIRAGANA VOICED ITERATION MARK -// 309f HIRAGANA DIGRAPH YORI - { 0x309D, 0x3, 0x9, 0, 0 }, -// 30a0 KATAKANA-HIRAGANA DOUBLE HYPHEN - { 0x30A0, 0x1, 0x18, 0, 0 }, -// 30a1 KATAKANA LETTER SMALL A -// 30a2 KATAKANA LETTER A -// 30a3 KATAKANA LETTER SMALL I -// 30a4 KATAKANA LETTER I -// 30a5 KATAKANA LETTER SMALL U -// 30a6 KATAKANA LETTER U -// 30a7 KATAKANA LETTER SMALL E -// 30a8 KATAKANA LETTER E -// 30a9 KATAKANA LETTER SMALL O -// 30aa KATAKANA LETTER O -// 30ab KATAKANA LETTER KA -// 30ac KATAKANA LETTER GA -// 30ad KATAKANA LETTER KI -// 30ae KATAKANA LETTER GI -// 30af KATAKANA LETTER KU -// 30b0 KATAKANA LETTER GU -// 30b1 KATAKANA LETTER KE -// 30b2 KATAKANA LETTER GE -// 30b3 KATAKANA LETTER KO -// 30b4 KATAKANA LETTER GO -// 30b5 KATAKANA LETTER SA -// 30b6 KATAKANA LETTER ZA -// 30b7 KATAKANA LETTER SI -// 30b8 KATAKANA LETTER ZI -// 30b9 KATAKANA LETTER SU -// 30ba KATAKANA LETTER ZU -// 30bb KATAKANA LETTER SE -// 30bc KATAKANA LETTER ZE -// 30bd KATAKANA LETTER SO -// 30be KATAKANA LETTER ZO -// 30bf KATAKANA LETTER TA -// 30c0 KATAKANA LETTER DA -// 30c1 KATAKANA LETTER TI -// 30c2 KATAKANA LETTER DI -// 30c3 KATAKANA LETTER SMALL TU -// 30c4 KATAKANA LETTER TU -// 30c5 KATAKANA LETTER DU -// 30c6 KATAKANA LETTER TE -// 30c7 KATAKANA LETTER DE -// 30c8 KATAKANA LETTER TO -// 30c9 KATAKANA LETTER DO -// 30ca KATAKANA LETTER NA -// 30cb KATAKANA LETTER NI -// 30cc KATAKANA LETTER NU -// 30cd KATAKANA LETTER NE -// 30ce KATAKANA LETTER NO -// 30cf KATAKANA LETTER HA -// 30d0 KATAKANA LETTER BA -// 30d1 KATAKANA LETTER PA -// 30d2 KATAKANA LETTER HI -// 30d3 KATAKANA LETTER BI -// 30d4 KATAKANA LETTER PI -// 30d5 KATAKANA LETTER HU -// 30d6 KATAKANA LETTER BU -// 30d7 KATAKANA LETTER PU -// 30d8 KATAKANA LETTER HE -// 30d9 KATAKANA LETTER BE -// 30da KATAKANA LETTER PE -// 30db KATAKANA LETTER HO -// 30dc KATAKANA LETTER BO -// 30dd KATAKANA LETTER PO -// 30de KATAKANA LETTER MA -// 30df KATAKANA LETTER MI -// 30e0 KATAKANA LETTER MU -// 30e1 KATAKANA LETTER ME -// 30e2 KATAKANA LETTER MO -// 30e3 KATAKANA LETTER SMALL YA -// 30e4 KATAKANA LETTER YA -// 30e5 KATAKANA LETTER SMALL YU -// 30e6 KATAKANA LETTER YU -// 30e7 KATAKANA LETTER SMALL YO -// 30e8 KATAKANA LETTER YO -// 30e9 KATAKANA LETTER RA -// 30ea KATAKANA LETTER RI -// 30eb KATAKANA LETTER RU -// 30ec KATAKANA LETTER RE -// 30ed KATAKANA LETTER RO -// 30ee KATAKANA LETTER SMALL WA -// 30ef KATAKANA LETTER WA -// 30f0 KATAKANA LETTER WI -// 30f1 KATAKANA LETTER WE -// 30f2 KATAKANA LETTER WO -// 30f3 KATAKANA LETTER N -// 30f4 KATAKANA LETTER VU -// 30f5 KATAKANA LETTER SMALL KA -// 30f6 KATAKANA LETTER SMALL KE -// 30f7 KATAKANA LETTER VA -// 30f8 KATAKANA LETTER VI -// 30f9 KATAKANA LETTER VE -// 30fa KATAKANA LETTER VO - { 0x30A1, 0x5A, 0x9, 0, 0 }, -// 30fb KATAKANA MIDDLE DOT - { 0x30FB, 0x1, 0x18, 0, 0 }, -// 30fc KATAKANA-HIRAGANA PROLONGED SOUND MARK -// 30fd KATAKANA ITERATION MARK -// 30fe KATAKANA VOICED ITERATION MARK -// 30ff KATAKANA DIGRAPH KOTO - { 0x30FC, 0x4, 0x9, 0, 0 }, -// 3105 BOPOMOFO LETTER B -// 3106 BOPOMOFO LETTER P -// 3107 BOPOMOFO LETTER M -// 3108 BOPOMOFO LETTER F -// 3109 BOPOMOFO LETTER D -// 310a BOPOMOFO LETTER T -// 310b BOPOMOFO LETTER N -// 310c BOPOMOFO LETTER L -// 310d BOPOMOFO LETTER G -// 310e BOPOMOFO LETTER K -// 310f BOPOMOFO LETTER H -// 3110 BOPOMOFO LETTER J -// 3111 BOPOMOFO LETTER Q -// 3112 BOPOMOFO LETTER X -// 3113 BOPOMOFO LETTER ZH -// 3114 BOPOMOFO LETTER CH -// 3115 BOPOMOFO LETTER SH -// 3116 BOPOMOFO LETTER R -// 3117 BOPOMOFO LETTER Z -// 3118 BOPOMOFO LETTER C -// 3119 BOPOMOFO LETTER S -// 311a BOPOMOFO LETTER A -// 311b BOPOMOFO LETTER O -// 311c BOPOMOFO LETTER E -// 311d BOPOMOFO LETTER EH -// 311e BOPOMOFO LETTER AI -// 311f BOPOMOFO LETTER EI -// 3120 BOPOMOFO LETTER AU -// 3121 BOPOMOFO LETTER OU -// 3122 BOPOMOFO LETTER AN -// 3123 BOPOMOFO LETTER EN -// 3124 BOPOMOFO LETTER ANG -// 3125 BOPOMOFO LETTER ENG -// 3126 BOPOMOFO LETTER ER -// 3127 BOPOMOFO LETTER I -// 3128 BOPOMOFO LETTER U -// 3129 BOPOMOFO LETTER IU -// 312a BOPOMOFO LETTER V -// 312b BOPOMOFO LETTER NG -// 312c BOPOMOFO LETTER GN -// 312d BOPOMOFO LETTER IH - { 0x3105, 0x29, 0x9, 0, 0 }, -// 3131 HANGUL LETTER KIYEOK -// 3132 HANGUL LETTER SSANGKIYEOK -// 3133 HANGUL LETTER KIYEOK-SIOS -// 3134 HANGUL LETTER NIEUN -// 3135 HANGUL LETTER NIEUN-CIEUC -// 3136 HANGUL LETTER NIEUN-HIEUH -// 3137 HANGUL LETTER TIKEUT -// 3138 HANGUL LETTER SSANGTIKEUT -// 3139 HANGUL LETTER RIEUL -// 313a HANGUL LETTER RIEUL-KIYEOK -// 313b HANGUL LETTER RIEUL-MIEUM -// 313c HANGUL LETTER RIEUL-PIEUP -// 313d HANGUL LETTER RIEUL-SIOS -// 313e HANGUL LETTER RIEUL-THIEUTH -// 313f HANGUL LETTER RIEUL-PHIEUPH -// 3140 HANGUL LETTER RIEUL-HIEUH -// 3141 HANGUL LETTER MIEUM -// 3142 HANGUL LETTER PIEUP -// 3143 HANGUL LETTER SSANGPIEUP -// 3144 HANGUL LETTER PIEUP-SIOS -// 3145 HANGUL LETTER SIOS -// 3146 HANGUL LETTER SSANGSIOS -// 3147 HANGUL LETTER IEUNG -// 3148 HANGUL LETTER CIEUC -// 3149 HANGUL LETTER SSANGCIEUC -// 314a HANGUL LETTER CHIEUCH -// 314b HANGUL LETTER KHIEUKH -// 314c HANGUL LETTER THIEUTH -// 314d HANGUL LETTER PHIEUPH -// 314e HANGUL LETTER HIEUH -// 314f HANGUL LETTER A -// 3150 HANGUL LETTER AE -// 3151 HANGUL LETTER YA -// 3152 HANGUL LETTER YAE -// 3153 HANGUL LETTER EO -// 3154 HANGUL LETTER E -// 3155 HANGUL LETTER YEO -// 3156 HANGUL LETTER YE -// 3157 HANGUL LETTER O -// 3158 HANGUL LETTER WA -// 3159 HANGUL LETTER WAE -// 315a HANGUL LETTER OE -// 315b HANGUL LETTER YO -// 315c HANGUL LETTER U -// 315d HANGUL LETTER WEO -// 315e HANGUL LETTER WE -// 315f HANGUL LETTER WI -// 3160 HANGUL LETTER YU -// 3161 HANGUL LETTER EU -// 3162 HANGUL LETTER YI -// 3163 HANGUL LETTER I -// 3164 HANGUL FILLER -// 3165 HANGUL LETTER SSANGNIEUN -// 3166 HANGUL LETTER NIEUN-TIKEUT -// 3167 HANGUL LETTER NIEUN-SIOS -// 3168 HANGUL LETTER NIEUN-PANSIOS -// 3169 HANGUL LETTER RIEUL-KIYEOK-SIOS -// 316a HANGUL LETTER RIEUL-TIKEUT -// 316b HANGUL LETTER RIEUL-PIEUP-SIOS -// 316c HANGUL LETTER RIEUL-PANSIOS -// 316d HANGUL LETTER RIEUL-YEORINHIEUH -// 316e HANGUL LETTER MIEUM-PIEUP -// 316f HANGUL LETTER MIEUM-SIOS -// 3170 HANGUL LETTER MIEUM-PANSIOS -// 3171 HANGUL LETTER KAPYEOUNMIEUM -// 3172 HANGUL LETTER PIEUP-KIYEOK -// 3173 HANGUL LETTER PIEUP-TIKEUT -// 3174 HANGUL LETTER PIEUP-SIOS-KIYEOK -// 3175 HANGUL LETTER PIEUP-SIOS-TIKEUT -// 3176 HANGUL LETTER PIEUP-CIEUC -// 3177 HANGUL LETTER PIEUP-THIEUTH -// 3178 HANGUL LETTER KAPYEOUNPIEUP -// 3179 HANGUL LETTER KAPYEOUNSSANGPIEUP -// 317a HANGUL LETTER SIOS-KIYEOK -// 317b HANGUL LETTER SIOS-NIEUN -// 317c HANGUL LETTER SIOS-TIKEUT -// 317d HANGUL LETTER SIOS-PIEUP -// 317e HANGUL LETTER SIOS-CIEUC -// 317f HANGUL LETTER PANSIOS -// 3180 HANGUL LETTER SSANGIEUNG -// 3181 HANGUL LETTER YESIEUNG -// 3182 HANGUL LETTER YESIEUNG-SIOS -// 3183 HANGUL LETTER YESIEUNG-PANSIOS -// 3184 HANGUL LETTER KAPYEOUNPHIEUPH -// 3185 HANGUL LETTER SSANGHIEUH -// 3186 HANGUL LETTER YEORINHIEUH -// 3187 HANGUL LETTER YO-YA -// 3188 HANGUL LETTER YO-YAE -// 3189 HANGUL LETTER YO-I -// 318a HANGUL LETTER YU-YEO -// 318b HANGUL LETTER YU-YE -// 318c HANGUL LETTER YU-I -// 318d HANGUL LETTER ARAEA -// 318e HANGUL LETTER ARAEAE - { 0x3131, 0x5E, 0x9, 0, 0 }, -// 3190 IDEOGRAPHIC ANNOTATION LINKING MARK -// 3191 IDEOGRAPHIC ANNOTATION REVERSE MARK -// 3192 IDEOGRAPHIC ANNOTATION ONE MARK -// 3193 IDEOGRAPHIC ANNOTATION TWO MARK -// 3194 IDEOGRAPHIC ANNOTATION THREE MARK -// 3195 IDEOGRAPHIC ANNOTATION FOUR MARK -// 3196 IDEOGRAPHIC ANNOTATION TOP MARK -// 3197 IDEOGRAPHIC ANNOTATION MIDDLE MARK -// 3198 IDEOGRAPHIC ANNOTATION BOTTOM MARK -// 3199 IDEOGRAPHIC ANNOTATION FIRST MARK -// 319a IDEOGRAPHIC ANNOTATION SECOND MARK -// 319b IDEOGRAPHIC ANNOTATION THIRD MARK -// 319c IDEOGRAPHIC ANNOTATION FOURTH MARK -// 319d IDEOGRAPHIC ANNOTATION HEAVEN MARK -// 319e IDEOGRAPHIC ANNOTATION EARTH MARK -// 319f IDEOGRAPHIC ANNOTATION MAN MARK - { 0x3190, 0x10, 0x8, 0, 0 }, -// 31a0 BOPOMOFO LETTER BU -// 31a1 BOPOMOFO LETTER ZI -// 31a2 BOPOMOFO LETTER JI -// 31a3 BOPOMOFO LETTER GU -// 31a4 BOPOMOFO LETTER EE -// 31a5 BOPOMOFO LETTER ENN -// 31a6 BOPOMOFO LETTER OO -// 31a7 BOPOMOFO LETTER ONN -// 31a8 BOPOMOFO LETTER IR -// 31a9 BOPOMOFO LETTER ANN -// 31aa BOPOMOFO LETTER INN -// 31ab BOPOMOFO LETTER UNN -// 31ac BOPOMOFO LETTER IM -// 31ad BOPOMOFO LETTER NGG -// 31ae BOPOMOFO LETTER AINN -// 31af BOPOMOFO LETTER AUNN -// 31b0 BOPOMOFO LETTER AM -// 31b1 BOPOMOFO LETTER OM -// 31b2 BOPOMOFO LETTER ONG -// 31b3 BOPOMOFO LETTER INNN -// 31b4 BOPOMOFO FINAL LETTER P -// 31b5 BOPOMOFO FINAL LETTER T -// 31b6 BOPOMOFO FINAL LETTER K -// 31b7 BOPOMOFO FINAL LETTER H -// 31b8 BOPOMOFO LETTER GH -// 31b9 BOPOMOFO LETTER LH -// 31ba BOPOMOFO LETTER ZY - { 0x31A0, 0x1B, 0x9, 0, 0 }, -// 31c0 CJK STROKE T -// 31c1 CJK STROKE WG -// 31c2 CJK STROKE XG -// 31c3 CJK STROKE BXG -// 31c4 CJK STROKE SW -// 31c5 CJK STROKE HZZ -// 31c6 CJK STROKE HZG -// 31c7 CJK STROKE HP -// 31c8 CJK STROKE HZWG -// 31c9 CJK STROKE SZWG -// 31ca CJK STROKE HZT -// 31cb CJK STROKE HZZP -// 31cc CJK STROKE HPWG -// 31cd CJK STROKE HZW -// 31ce CJK STROKE HZZZ -// 31cf CJK STROKE N -// 31d0 CJK STROKE H -// 31d1 CJK STROKE S -// 31d2 CJK STROKE P -// 31d3 CJK STROKE SP -// 31d4 CJK STROKE D -// 31d5 CJK STROKE HZ -// 31d6 CJK STROKE HG -// 31d7 CJK STROKE SZ -// 31d8 CJK STROKE SWZ -// 31d9 CJK STROKE ST -// 31da CJK STROKE SG -// 31db CJK STROKE PD -// 31dc CJK STROKE PZ -// 31dd CJK STROKE TN -// 31de CJK STROKE SZZ -// 31df CJK STROKE SWG -// 31e0 CJK STROKE HXWG -// 31e1 CJK STROKE HZZZG -// 31e2 CJK STROKE PG -// 31e3 CJK STROKE Q - { 0x31C0, 0x24, 0x8, 0, 0 }, -// 31f0 KATAKANA LETTER SMALL KU -// 31f1 KATAKANA LETTER SMALL SI -// 31f2 KATAKANA LETTER SMALL SU -// 31f3 KATAKANA LETTER SMALL TO -// 31f4 KATAKANA LETTER SMALL NU -// 31f5 KATAKANA LETTER SMALL HA -// 31f6 KATAKANA LETTER SMALL HI -// 31f7 KATAKANA LETTER SMALL HU -// 31f8 KATAKANA LETTER SMALL HE -// 31f9 KATAKANA LETTER SMALL HO -// 31fa KATAKANA LETTER SMALL MU -// 31fb KATAKANA LETTER SMALL RA -// 31fc KATAKANA LETTER SMALL RI -// 31fd KATAKANA LETTER SMALL RU -// 31fe KATAKANA LETTER SMALL RE -// 31ff KATAKANA LETTER SMALL RO - { 0x31F0, 0x10, 0x9, 0, 0 }, -// 3200 PARENTHESIZED HANGUL KIYEOK -// 3201 PARENTHESIZED HANGUL NIEUN -// 3202 PARENTHESIZED HANGUL TIKEUT -// 3203 PARENTHESIZED HANGUL RIEUL -// 3204 PARENTHESIZED HANGUL MIEUM -// 3205 PARENTHESIZED HANGUL PIEUP -// 3206 PARENTHESIZED HANGUL SIOS -// 3207 PARENTHESIZED HANGUL IEUNG -// 3208 PARENTHESIZED HANGUL CIEUC -// 3209 PARENTHESIZED HANGUL CHIEUCH -// 320a PARENTHESIZED HANGUL KHIEUKH -// 320b PARENTHESIZED HANGUL THIEUTH -// 320c PARENTHESIZED HANGUL PHIEUPH -// 320d PARENTHESIZED HANGUL HIEUH -// 320e PARENTHESIZED HANGUL KIYEOK A -// 320f PARENTHESIZED HANGUL NIEUN A -// 3210 PARENTHESIZED HANGUL TIKEUT A -// 3211 PARENTHESIZED HANGUL RIEUL A -// 3212 PARENTHESIZED HANGUL MIEUM A -// 3213 PARENTHESIZED HANGUL PIEUP A -// 3214 PARENTHESIZED HANGUL SIOS A -// 3215 PARENTHESIZED HANGUL IEUNG A -// 3216 PARENTHESIZED HANGUL CIEUC A -// 3217 PARENTHESIZED HANGUL CHIEUCH A -// 3218 PARENTHESIZED HANGUL KHIEUKH A -// 3219 PARENTHESIZED HANGUL THIEUTH A -// 321a PARENTHESIZED HANGUL PHIEUPH A -// 321b PARENTHESIZED HANGUL HIEUH A -// 321c PARENTHESIZED HANGUL CIEUC U -// 321d PARENTHESIZED KOREAN CHARACTER OJEON -// 321e PARENTHESIZED KOREAN CHARACTER O HU - { 0x3200, 0x1F, 0x8, 0, 0 }, -// 3220 PARENTHESIZED IDEOGRAPH ONE -// 3221 PARENTHESIZED IDEOGRAPH TWO -// 3222 PARENTHESIZED IDEOGRAPH THREE -// 3223 PARENTHESIZED IDEOGRAPH FOUR -// 3224 PARENTHESIZED IDEOGRAPH FIVE -// 3225 PARENTHESIZED IDEOGRAPH SIX -// 3226 PARENTHESIZED IDEOGRAPH SEVEN -// 3227 PARENTHESIZED IDEOGRAPH EIGHT -// 3228 PARENTHESIZED IDEOGRAPH NINE -// 3229 PARENTHESIZED IDEOGRAPH TEN -// 322a PARENTHESIZED IDEOGRAPH MOON -// 322b PARENTHESIZED IDEOGRAPH FIRE -// 322c PARENTHESIZED IDEOGRAPH WATER -// 322d PARENTHESIZED IDEOGRAPH WOOD -// 322e PARENTHESIZED IDEOGRAPH METAL -// 322f PARENTHESIZED IDEOGRAPH EARTH -// 3230 PARENTHESIZED IDEOGRAPH SUN -// 3231 PARENTHESIZED IDEOGRAPH STOCK -// 3232 PARENTHESIZED IDEOGRAPH HAVE -// 3233 PARENTHESIZED IDEOGRAPH SOCIETY -// 3234 PARENTHESIZED IDEOGRAPH NAME -// 3235 PARENTHESIZED IDEOGRAPH SPECIAL -// 3236 PARENTHESIZED IDEOGRAPH FINANCIAL -// 3237 PARENTHESIZED IDEOGRAPH CONGRATULATION -// 3238 PARENTHESIZED IDEOGRAPH LABOR -// 3239 PARENTHESIZED IDEOGRAPH REPRESENT -// 323a PARENTHESIZED IDEOGRAPH CALL -// 323b PARENTHESIZED IDEOGRAPH STUDY -// 323c PARENTHESIZED IDEOGRAPH SUPERVISE -// 323d PARENTHESIZED IDEOGRAPH ENTERPRISE -// 323e PARENTHESIZED IDEOGRAPH RESOURCE -// 323f PARENTHESIZED IDEOGRAPH ALLIANCE -// 3240 PARENTHESIZED IDEOGRAPH FESTIVAL -// 3241 PARENTHESIZED IDEOGRAPH REST -// 3242 PARENTHESIZED IDEOGRAPH SELF -// 3243 PARENTHESIZED IDEOGRAPH REACH -// 3244 CIRCLED IDEOGRAPH QUESTION -// 3245 CIRCLED IDEOGRAPH KINDERGARTEN -// 3246 CIRCLED IDEOGRAPH SCHOOL -// 3247 CIRCLED IDEOGRAPH KOTO -// 3248 CIRCLED NUMBER TEN ON BLACK SQUARE -// 3249 CIRCLED NUMBER TWENTY ON BLACK SQUARE -// 324a CIRCLED NUMBER THIRTY ON BLACK SQUARE -// 324b CIRCLED NUMBER FORTY ON BLACK SQUARE -// 324c CIRCLED NUMBER FIFTY ON BLACK SQUARE -// 324d CIRCLED NUMBER SIXTY ON BLACK SQUARE -// 324e CIRCLED NUMBER SEVENTY ON BLACK SQUARE -// 324f CIRCLED NUMBER EIGHTY ON BLACK SQUARE -// 3250 PARTNERSHIP SIGN -// 3251 CIRCLED NUMBER TWENTY ONE -// 3252 CIRCLED NUMBER TWENTY TWO -// 3253 CIRCLED NUMBER TWENTY THREE -// 3254 CIRCLED NUMBER TWENTY FOUR -// 3255 CIRCLED NUMBER TWENTY FIVE -// 3256 CIRCLED NUMBER TWENTY SIX -// 3257 CIRCLED NUMBER TWENTY SEVEN -// 3258 CIRCLED NUMBER TWENTY EIGHT -// 3259 CIRCLED NUMBER TWENTY NINE -// 325a CIRCLED NUMBER THIRTY -// 325b CIRCLED NUMBER THIRTY ONE -// 325c CIRCLED NUMBER THIRTY TWO -// 325d CIRCLED NUMBER THIRTY THREE -// 325e CIRCLED NUMBER THIRTY FOUR -// 325f CIRCLED NUMBER THIRTY FIVE -// 3260 CIRCLED HANGUL KIYEOK -// 3261 CIRCLED HANGUL NIEUN -// 3262 CIRCLED HANGUL TIKEUT -// 3263 CIRCLED HANGUL RIEUL -// 3264 CIRCLED HANGUL MIEUM -// 3265 CIRCLED HANGUL PIEUP -// 3266 CIRCLED HANGUL SIOS -// 3267 CIRCLED HANGUL IEUNG -// 3268 CIRCLED HANGUL CIEUC -// 3269 CIRCLED HANGUL CHIEUCH -// 326a CIRCLED HANGUL KHIEUKH -// 326b CIRCLED HANGUL THIEUTH -// 326c CIRCLED HANGUL PHIEUPH -// 326d CIRCLED HANGUL HIEUH -// 326e CIRCLED HANGUL KIYEOK A -// 326f CIRCLED HANGUL NIEUN A -// 3270 CIRCLED HANGUL TIKEUT A -// 3271 CIRCLED HANGUL RIEUL A -// 3272 CIRCLED HANGUL MIEUM A -// 3273 CIRCLED HANGUL PIEUP A -// 3274 CIRCLED HANGUL SIOS A -// 3275 CIRCLED HANGUL IEUNG A -// 3276 CIRCLED HANGUL CIEUC A -// 3277 CIRCLED HANGUL CHIEUCH A -// 3278 CIRCLED HANGUL KHIEUKH A -// 3279 CIRCLED HANGUL THIEUTH A -// 327a CIRCLED HANGUL PHIEUPH A -// 327b CIRCLED HANGUL HIEUH A -// 327c CIRCLED KOREAN CHARACTER CHAMKO -// 327d CIRCLED KOREAN CHARACTER JUEUI -// 327e CIRCLED HANGUL IEUNG U -// 327f KOREAN STANDARD SYMBOL -// 3280 CIRCLED IDEOGRAPH ONE -// 3281 CIRCLED IDEOGRAPH TWO -// 3282 CIRCLED IDEOGRAPH THREE -// 3283 CIRCLED IDEOGRAPH FOUR -// 3284 CIRCLED IDEOGRAPH FIVE -// 3285 CIRCLED IDEOGRAPH SIX -// 3286 CIRCLED IDEOGRAPH SEVEN -// 3287 CIRCLED IDEOGRAPH EIGHT -// 3288 CIRCLED IDEOGRAPH NINE -// 3289 CIRCLED IDEOGRAPH TEN -// 328a CIRCLED IDEOGRAPH MOON -// 328b CIRCLED IDEOGRAPH FIRE -// 328c CIRCLED IDEOGRAPH WATER -// 328d CIRCLED IDEOGRAPH WOOD -// 328e CIRCLED IDEOGRAPH METAL -// 328f CIRCLED IDEOGRAPH EARTH -// 3290 CIRCLED IDEOGRAPH SUN -// 3291 CIRCLED IDEOGRAPH STOCK -// 3292 CIRCLED IDEOGRAPH HAVE -// 3293 CIRCLED IDEOGRAPH SOCIETY -// 3294 CIRCLED IDEOGRAPH NAME -// 3295 CIRCLED IDEOGRAPH SPECIAL -// 3296 CIRCLED IDEOGRAPH FINANCIAL -// 3297 CIRCLED IDEOGRAPH CONGRATULATION -// 3298 CIRCLED IDEOGRAPH LABOR -// 3299 CIRCLED IDEOGRAPH SECRET -// 329a CIRCLED IDEOGRAPH MALE -// 329b CIRCLED IDEOGRAPH FEMALE -// 329c CIRCLED IDEOGRAPH SUITABLE -// 329d CIRCLED IDEOGRAPH EXCELLENT -// 329e CIRCLED IDEOGRAPH PRINT -// 329f CIRCLED IDEOGRAPH ATTENTION -// 32a0 CIRCLED IDEOGRAPH ITEM -// 32a1 CIRCLED IDEOGRAPH REST -// 32a2 CIRCLED IDEOGRAPH COPY -// 32a3 CIRCLED IDEOGRAPH CORRECT -// 32a4 CIRCLED IDEOGRAPH HIGH -// 32a5 CIRCLED IDEOGRAPH CENTRE -// 32a6 CIRCLED IDEOGRAPH LOW -// 32a7 CIRCLED IDEOGRAPH LEFT -// 32a8 CIRCLED IDEOGRAPH RIGHT -// 32a9 CIRCLED IDEOGRAPH MEDICINE -// 32aa CIRCLED IDEOGRAPH RELIGION -// 32ab CIRCLED IDEOGRAPH STUDY -// 32ac CIRCLED IDEOGRAPH SUPERVISE -// 32ad CIRCLED IDEOGRAPH ENTERPRISE -// 32ae CIRCLED IDEOGRAPH RESOURCE -// 32af CIRCLED IDEOGRAPH ALLIANCE -// 32b0 CIRCLED IDEOGRAPH NIGHT -// 32b1 CIRCLED NUMBER THIRTY SIX -// 32b2 CIRCLED NUMBER THIRTY SEVEN -// 32b3 CIRCLED NUMBER THIRTY EIGHT -// 32b4 CIRCLED NUMBER THIRTY NINE -// 32b5 CIRCLED NUMBER FORTY -// 32b6 CIRCLED NUMBER FORTY ONE -// 32b7 CIRCLED NUMBER FORTY TWO -// 32b8 CIRCLED NUMBER FORTY THREE -// 32b9 CIRCLED NUMBER FORTY FOUR -// 32ba CIRCLED NUMBER FORTY FIVE -// 32bb CIRCLED NUMBER FORTY SIX -// 32bc CIRCLED NUMBER FORTY SEVEN -// 32bd CIRCLED NUMBER FORTY EIGHT -// 32be CIRCLED NUMBER FORTY NINE -// 32bf CIRCLED NUMBER FIFTY -// 32c0 IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY -// 32c1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY -// 32c2 IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH -// 32c3 IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL -// 32c4 IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY -// 32c5 IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE -// 32c6 IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY -// 32c7 IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST -// 32c8 IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER -// 32c9 IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER -// 32ca IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER -// 32cb IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER -// 32cc SQUARE HG -// 32cd SQUARE ERG -// 32ce SQUARE EV -// 32cf LIMITED LIABILITY SIGN -// 32d0 CIRCLED KATAKANA A -// 32d1 CIRCLED KATAKANA I -// 32d2 CIRCLED KATAKANA U -// 32d3 CIRCLED KATAKANA E -// 32d4 CIRCLED KATAKANA O -// 32d5 CIRCLED KATAKANA KA -// 32d6 CIRCLED KATAKANA KI -// 32d7 CIRCLED KATAKANA KU -// 32d8 CIRCLED KATAKANA KE -// 32d9 CIRCLED KATAKANA KO -// 32da CIRCLED KATAKANA SA -// 32db CIRCLED KATAKANA SI -// 32dc CIRCLED KATAKANA SU -// 32dd CIRCLED KATAKANA SE -// 32de CIRCLED KATAKANA SO -// 32df CIRCLED KATAKANA TA -// 32e0 CIRCLED KATAKANA TI -// 32e1 CIRCLED KATAKANA TU -// 32e2 CIRCLED KATAKANA TE -// 32e3 CIRCLED KATAKANA TO -// 32e4 CIRCLED KATAKANA NA -// 32e5 CIRCLED KATAKANA NI -// 32e6 CIRCLED KATAKANA NU -// 32e7 CIRCLED KATAKANA NE -// 32e8 CIRCLED KATAKANA NO -// 32e9 CIRCLED KATAKANA HA -// 32ea CIRCLED KATAKANA HI -// 32eb CIRCLED KATAKANA HU -// 32ec CIRCLED KATAKANA HE -// 32ed CIRCLED KATAKANA HO -// 32ee CIRCLED KATAKANA MA -// 32ef CIRCLED KATAKANA MI -// 32f0 CIRCLED KATAKANA MU -// 32f1 CIRCLED KATAKANA ME -// 32f2 CIRCLED KATAKANA MO -// 32f3 CIRCLED KATAKANA YA -// 32f4 CIRCLED KATAKANA YU -// 32f5 CIRCLED KATAKANA YO -// 32f6 CIRCLED KATAKANA RA -// 32f7 CIRCLED KATAKANA RI -// 32f8 CIRCLED KATAKANA RU -// 32f9 CIRCLED KATAKANA RE -// 32fa CIRCLED KATAKANA RO -// 32fb CIRCLED KATAKANA WA -// 32fc CIRCLED KATAKANA WI -// 32fd CIRCLED KATAKANA WE -// 32fe CIRCLED KATAKANA WO - { 0x3220, 0xDF, 0x8, 0, 0 }, -// 3300 SQUARE APAATO -// 3301 SQUARE ARUHUA -// 3302 SQUARE ANPEA -// 3303 SQUARE AARU -// 3304 SQUARE ININGU -// 3305 SQUARE INTI -// 3306 SQUARE UON -// 3307 SQUARE ESUKUUDO -// 3308 SQUARE EEKAA -// 3309 SQUARE ONSU -// 330a SQUARE OOMU -// 330b SQUARE KAIRI -// 330c SQUARE KARATTO -// 330d SQUARE KARORII -// 330e SQUARE GARON -// 330f SQUARE GANMA -// 3310 SQUARE GIGA -// 3311 SQUARE GINII -// 3312 SQUARE KYURII -// 3313 SQUARE GIRUDAA -// 3314 SQUARE KIRO -// 3315 SQUARE KIROGURAMU -// 3316 SQUARE KIROMEETORU -// 3317 SQUARE KIROWATTO -// 3318 SQUARE GURAMU -// 3319 SQUARE GURAMUTON -// 331a SQUARE KURUZEIRO -// 331b SQUARE KUROONE -// 331c SQUARE KEESU -// 331d SQUARE KORUNA -// 331e SQUARE KOOPO -// 331f SQUARE SAIKURU -// 3320 SQUARE SANTIIMU -// 3321 SQUARE SIRINGU -// 3322 SQUARE SENTI -// 3323 SQUARE SENTO -// 3324 SQUARE DAASU -// 3325 SQUARE DESI -// 3326 SQUARE DORU -// 3327 SQUARE TON -// 3328 SQUARE NANO -// 3329 SQUARE NOTTO -// 332a SQUARE HAITU -// 332b SQUARE PAASENTO -// 332c SQUARE PAATU -// 332d SQUARE BAARERU -// 332e SQUARE PIASUTORU -// 332f SQUARE PIKURU -// 3330 SQUARE PIKO -// 3331 SQUARE BIRU -// 3332 SQUARE HUARADDO -// 3333 SQUARE HUIITO -// 3334 SQUARE BUSSYERU -// 3335 SQUARE HURAN -// 3336 SQUARE HEKUTAARU -// 3337 SQUARE PESO -// 3338 SQUARE PENIHI -// 3339 SQUARE HERUTU -// 333a SQUARE PENSU -// 333b SQUARE PEEZI -// 333c SQUARE BEETA -// 333d SQUARE POINTO -// 333e SQUARE BORUTO -// 333f SQUARE HON -// 3340 SQUARE PONDO -// 3341 SQUARE HOORU -// 3342 SQUARE HOON -// 3343 SQUARE MAIKURO -// 3344 SQUARE MAIRU -// 3345 SQUARE MAHHA -// 3346 SQUARE MARUKU -// 3347 SQUARE MANSYON -// 3348 SQUARE MIKURON -// 3349 SQUARE MIRI -// 334a SQUARE MIRIBAARU -// 334b SQUARE MEGA -// 334c SQUARE MEGATON -// 334d SQUARE MEETORU -// 334e SQUARE YAADO -// 334f SQUARE YAARU -// 3350 SQUARE YUAN -// 3351 SQUARE RITTORU -// 3352 SQUARE RIRA -// 3353 SQUARE RUPII -// 3354 SQUARE RUUBURU -// 3355 SQUARE REMU -// 3356 SQUARE RENTOGEN -// 3357 SQUARE WATTO -// 3358 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO -// 3359 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE -// 335a IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO -// 335b IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE -// 335c IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR -// 335d IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE -// 335e IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX -// 335f IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN -// 3360 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT -// 3361 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE -// 3362 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN -// 3363 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN -// 3364 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE -// 3365 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN -// 3366 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN -// 3367 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN -// 3368 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN -// 3369 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN -// 336a IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN -// 336b IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN -// 336c IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY -// 336d IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE -// 336e IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO -// 336f IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE -// 3370 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR -// 3371 SQUARE HPA -// 3372 SQUARE DA -// 3373 SQUARE AU -// 3374 SQUARE BAR -// 3375 SQUARE OV -// 3376 SQUARE PC -// 3377 SQUARE DM -// 3378 SQUARE DM SQUARED -// 3379 SQUARE DM CUBED -// 337a SQUARE IU -// 337b SQUARE ERA NAME HEISEI -// 337c SQUARE ERA NAME SYOUWA -// 337d SQUARE ERA NAME TAISYOU -// 337e SQUARE ERA NAME MEIZI -// 337f SQUARE CORPORATION -// 3380 SQUARE PA AMPS -// 3381 SQUARE NA -// 3382 SQUARE MU A -// 3383 SQUARE MA -// 3384 SQUARE KA -// 3385 SQUARE KB -// 3386 SQUARE MB -// 3387 SQUARE GB -// 3388 SQUARE CAL -// 3389 SQUARE KCAL -// 338a SQUARE PF -// 338b SQUARE NF -// 338c SQUARE MU F -// 338d SQUARE MU G -// 338e SQUARE MG -// 338f SQUARE KG -// 3390 SQUARE HZ -// 3391 SQUARE KHZ -// 3392 SQUARE MHZ -// 3393 SQUARE GHZ -// 3394 SQUARE THZ -// 3395 SQUARE MU L -// 3396 SQUARE ML -// 3397 SQUARE DL -// 3398 SQUARE KL -// 3399 SQUARE FM -// 339a SQUARE NM -// 339b SQUARE MU M -// 339c SQUARE MM -// 339d SQUARE CM -// 339e SQUARE KM -// 339f SQUARE MM SQUARED -// 33a0 SQUARE CM SQUARED -// 33a1 SQUARE M SQUARED -// 33a2 SQUARE KM SQUARED -// 33a3 SQUARE MM CUBED -// 33a4 SQUARE CM CUBED -// 33a5 SQUARE M CUBED -// 33a6 SQUARE KM CUBED -// 33a7 SQUARE M OVER S -// 33a8 SQUARE M OVER S SQUARED -// 33a9 SQUARE PA -// 33aa SQUARE KPA -// 33ab SQUARE MPA -// 33ac SQUARE GPA -// 33ad SQUARE RAD -// 33ae SQUARE RAD OVER S -// 33af SQUARE RAD OVER S SQUARED -// 33b0 SQUARE PS -// 33b1 SQUARE NS -// 33b2 SQUARE MU S -// 33b3 SQUARE MS -// 33b4 SQUARE PV -// 33b5 SQUARE NV -// 33b6 SQUARE MU V -// 33b7 SQUARE MV -// 33b8 SQUARE KV -// 33b9 SQUARE MV MEGA -// 33ba SQUARE PW -// 33bb SQUARE NW -// 33bc SQUARE MU W -// 33bd SQUARE MW -// 33be SQUARE KW -// 33bf SQUARE MW MEGA -// 33c0 SQUARE K OHM -// 33c1 SQUARE M OHM -// 33c2 SQUARE AM -// 33c3 SQUARE BQ -// 33c4 SQUARE CC -// 33c5 SQUARE CD -// 33c6 SQUARE C OVER KG -// 33c7 SQUARE CO -// 33c8 SQUARE DB -// 33c9 SQUARE GY -// 33ca SQUARE HA -// 33cb SQUARE HP -// 33cc SQUARE IN -// 33cd SQUARE KK -// 33ce SQUARE KM CAPITAL -// 33cf SQUARE KT -// 33d0 SQUARE LM -// 33d1 SQUARE LN -// 33d2 SQUARE LOG -// 33d3 SQUARE LX -// 33d4 SQUARE MB SMALL -// 33d5 SQUARE MIL -// 33d6 SQUARE MOL -// 33d7 SQUARE PH -// 33d8 SQUARE PM -// 33d9 SQUARE PPM -// 33da SQUARE PR -// 33db SQUARE SR -// 33dc SQUARE SV -// 33dd SQUARE WB -// 33de SQUARE V OVER M -// 33df SQUARE A OVER M -// 33e0 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE -// 33e1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO -// 33e2 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE -// 33e3 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR -// 33e4 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE -// 33e5 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX -// 33e6 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN -// 33e7 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT -// 33e8 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE -// 33e9 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN -// 33ea IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN -// 33eb IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE -// 33ec IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN -// 33ed IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN -// 33ee IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN -// 33ef IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN -// 33f0 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN -// 33f1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN -// 33f2 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN -// 33f3 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY -// 33f4 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE -// 33f5 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO -// 33f6 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE -// 33f7 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR -// 33f8 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE -// 33f9 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX -// 33fa IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN -// 33fb IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT -// 33fc IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE -// 33fd IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY -// 33fe IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE -// 33ff SQUARE GAL - { 0x3300, 0x100, 0x8, 0, 0 }, -// 3400 - { 0x3400, 0x1, 0x9, 0, 0 }, -// 4db5 - { 0x4DB5, 0x1, 0x9, 0, 0 }, -// 4dc0 HEXAGRAM FOR THE CREATIVE HEAVEN -// 4dc1 HEXAGRAM FOR THE RECEPTIVE EARTH -// 4dc2 HEXAGRAM FOR DIFFICULTY AT THE BEGINNING -// 4dc3 HEXAGRAM FOR YOUTHFUL FOLLY -// 4dc4 HEXAGRAM FOR WAITING -// 4dc5 HEXAGRAM FOR CONFLICT -// 4dc6 HEXAGRAM FOR THE ARMY -// 4dc7 HEXAGRAM FOR HOLDING TOGETHER -// 4dc8 HEXAGRAM FOR SMALL TAMING -// 4dc9 HEXAGRAM FOR TREADING -// 4dca HEXAGRAM FOR PEACE -// 4dcb HEXAGRAM FOR STANDSTILL -// 4dcc HEXAGRAM FOR FELLOWSHIP -// 4dcd HEXAGRAM FOR GREAT POSSESSION -// 4dce HEXAGRAM FOR MODESTY -// 4dcf HEXAGRAM FOR ENTHUSIASM -// 4dd0 HEXAGRAM FOR FOLLOWING -// 4dd1 HEXAGRAM FOR WORK ON THE DECAYED -// 4dd2 HEXAGRAM FOR APPROACH -// 4dd3 HEXAGRAM FOR CONTEMPLATION -// 4dd4 HEXAGRAM FOR BITING THROUGH -// 4dd5 HEXAGRAM FOR GRACE -// 4dd6 HEXAGRAM FOR SPLITTING APART -// 4dd7 HEXAGRAM FOR RETURN -// 4dd8 HEXAGRAM FOR INNOCENCE -// 4dd9 HEXAGRAM FOR GREAT TAMING -// 4dda HEXAGRAM FOR MOUTH CORNERS -// 4ddb HEXAGRAM FOR GREAT PREPONDERANCE -// 4ddc HEXAGRAM FOR THE ABYSMAL WATER -// 4ddd HEXAGRAM FOR THE CLINGING FIRE -// 4dde HEXAGRAM FOR INFLUENCE -// 4ddf HEXAGRAM FOR DURATION -// 4de0 HEXAGRAM FOR RETREAT -// 4de1 HEXAGRAM FOR GREAT POWER -// 4de2 HEXAGRAM FOR PROGRESS -// 4de3 HEXAGRAM FOR DARKENING OF THE LIGHT -// 4de4 HEXAGRAM FOR THE FAMILY -// 4de5 HEXAGRAM FOR OPPOSITION -// 4de6 HEXAGRAM FOR OBSTRUCTION -// 4de7 HEXAGRAM FOR DELIVERANCE -// 4de8 HEXAGRAM FOR DECREASE -// 4de9 HEXAGRAM FOR INCREASE -// 4dea HEXAGRAM FOR BREAKTHROUGH -// 4deb HEXAGRAM FOR COMING TO MEET -// 4dec HEXAGRAM FOR GATHERING TOGETHER -// 4ded HEXAGRAM FOR PUSHING UPWARD -// 4dee HEXAGRAM FOR OPPRESSION -// 4def HEXAGRAM FOR THE WELL -// 4df0 HEXAGRAM FOR REVOLUTION -// 4df1 HEXAGRAM FOR THE CAULDRON -// 4df2 HEXAGRAM FOR THE AROUSING THUNDER -// 4df3 HEXAGRAM FOR THE KEEPING STILL MOUNTAIN -// 4df4 HEXAGRAM FOR DEVELOPMENT -// 4df5 HEXAGRAM FOR THE MARRYING MAIDEN -// 4df6 HEXAGRAM FOR ABUNDANCE -// 4df7 HEXAGRAM FOR THE WANDERER -// 4df8 HEXAGRAM FOR THE GENTLE WIND -// 4df9 HEXAGRAM FOR THE JOYOUS LAKE -// 4dfa HEXAGRAM FOR DISPERSION -// 4dfb HEXAGRAM FOR LIMITATION -// 4dfc HEXAGRAM FOR INNER TRUTH -// 4dfd HEXAGRAM FOR SMALL PREPONDERANCE -// 4dfe HEXAGRAM FOR AFTER COMPLETION -// 4dff HEXAGRAM FOR BEFORE COMPLETION - { 0x4DC0, 0x40, 0x8, 0, 0 }, -// 4e00 - { 0x4E00, 0x1, 0x9, 0, 0 }, -// 9fcc - { 0x9FCC, 0x1, 0x9, 0, 0 }, -// a000 YI SYLLABLE IT -// a001 YI SYLLABLE IX -// a002 YI SYLLABLE I -// a003 YI SYLLABLE IP -// a004 YI SYLLABLE IET -// a005 YI SYLLABLE IEX -// a006 YI SYLLABLE IE -// a007 YI SYLLABLE IEP -// a008 YI SYLLABLE AT -// a009 YI SYLLABLE AX -// a00a YI SYLLABLE A -// a00b YI SYLLABLE AP -// a00c YI SYLLABLE UOX -// a00d YI SYLLABLE UO -// a00e YI SYLLABLE UOP -// a00f YI SYLLABLE OT -// a010 YI SYLLABLE OX -// a011 YI SYLLABLE O -// a012 YI SYLLABLE OP -// a013 YI SYLLABLE EX -// a014 YI SYLLABLE E -// a015 YI SYLLABLE WU -// a016 YI SYLLABLE BIT -// a017 YI SYLLABLE BIX -// a018 YI SYLLABLE BI -// a019 YI SYLLABLE BIP -// a01a YI SYLLABLE BIET -// a01b YI SYLLABLE BIEX -// a01c YI SYLLABLE BIE -// a01d YI SYLLABLE BIEP -// a01e YI SYLLABLE BAT -// a01f YI SYLLABLE BAX -// a020 YI SYLLABLE BA -// a021 YI SYLLABLE BAP -// a022 YI SYLLABLE BUOX -// a023 YI SYLLABLE BUO -// a024 YI SYLLABLE BUOP -// a025 YI SYLLABLE BOT -// a026 YI SYLLABLE BOX -// a027 YI SYLLABLE BO -// a028 YI SYLLABLE BOP -// a029 YI SYLLABLE BEX -// a02a YI SYLLABLE BE -// a02b YI SYLLABLE BEP -// a02c YI SYLLABLE BUT -// a02d YI SYLLABLE BUX -// a02e YI SYLLABLE BU -// a02f YI SYLLABLE BUP -// a030 YI SYLLABLE BURX -// a031 YI SYLLABLE BUR -// a032 YI SYLLABLE BYT -// a033 YI SYLLABLE BYX -// a034 YI SYLLABLE BY -// a035 YI SYLLABLE BYP -// a036 YI SYLLABLE BYRX -// a037 YI SYLLABLE BYR -// a038 YI SYLLABLE PIT -// a039 YI SYLLABLE PIX -// a03a YI SYLLABLE PI -// a03b YI SYLLABLE PIP -// a03c YI SYLLABLE PIEX -// a03d YI SYLLABLE PIE -// a03e YI SYLLABLE PIEP -// a03f YI SYLLABLE PAT -// a040 YI SYLLABLE PAX -// a041 YI SYLLABLE PA -// a042 YI SYLLABLE PAP -// a043 YI SYLLABLE PUOX -// a044 YI SYLLABLE PUO -// a045 YI SYLLABLE PUOP -// a046 YI SYLLABLE POT -// a047 YI SYLLABLE POX -// a048 YI SYLLABLE PO -// a049 YI SYLLABLE POP -// a04a YI SYLLABLE PUT -// a04b YI SYLLABLE PUX -// a04c YI SYLLABLE PU -// a04d YI SYLLABLE PUP -// a04e YI SYLLABLE PURX -// a04f YI SYLLABLE PUR -// a050 YI SYLLABLE PYT -// a051 YI SYLLABLE PYX -// a052 YI SYLLABLE PY -// a053 YI SYLLABLE PYP -// a054 YI SYLLABLE PYRX -// a055 YI SYLLABLE PYR -// a056 YI SYLLABLE BBIT -// a057 YI SYLLABLE BBIX -// a058 YI SYLLABLE BBI -// a059 YI SYLLABLE BBIP -// a05a YI SYLLABLE BBIET -// a05b YI SYLLABLE BBIEX -// a05c YI SYLLABLE BBIE -// a05d YI SYLLABLE BBIEP -// a05e YI SYLLABLE BBAT -// a05f YI SYLLABLE BBAX -// a060 YI SYLLABLE BBA -// a061 YI SYLLABLE BBAP -// a062 YI SYLLABLE BBUOX -// a063 YI SYLLABLE BBUO -// a064 YI SYLLABLE BBUOP -// a065 YI SYLLABLE BBOT -// a066 YI SYLLABLE BBOX -// a067 YI SYLLABLE BBO -// a068 YI SYLLABLE BBOP -// a069 YI SYLLABLE BBEX -// a06a YI SYLLABLE BBE -// a06b YI SYLLABLE BBEP -// a06c YI SYLLABLE BBUT -// a06d YI SYLLABLE BBUX -// a06e YI SYLLABLE BBU -// a06f YI SYLLABLE BBUP -// a070 YI SYLLABLE BBURX -// a071 YI SYLLABLE BBUR -// a072 YI SYLLABLE BBYT -// a073 YI SYLLABLE BBYX -// a074 YI SYLLABLE BBY -// a075 YI SYLLABLE BBYP -// a076 YI SYLLABLE NBIT -// a077 YI SYLLABLE NBIX -// a078 YI SYLLABLE NBI -// a079 YI SYLLABLE NBIP -// a07a YI SYLLABLE NBIEX -// a07b YI SYLLABLE NBIE -// a07c YI SYLLABLE NBIEP -// a07d YI SYLLABLE NBAT -// a07e YI SYLLABLE NBAX -// a07f YI SYLLABLE NBA -// a080 YI SYLLABLE NBAP -// a081 YI SYLLABLE NBOT -// a082 YI SYLLABLE NBOX -// a083 YI SYLLABLE NBO -// a084 YI SYLLABLE NBOP -// a085 YI SYLLABLE NBUT -// a086 YI SYLLABLE NBUX -// a087 YI SYLLABLE NBU -// a088 YI SYLLABLE NBUP -// a089 YI SYLLABLE NBURX -// a08a YI SYLLABLE NBUR -// a08b YI SYLLABLE NBYT -// a08c YI SYLLABLE NBYX -// a08d YI SYLLABLE NBY -// a08e YI SYLLABLE NBYP -// a08f YI SYLLABLE NBYRX -// a090 YI SYLLABLE NBYR -// a091 YI SYLLABLE HMIT -// a092 YI SYLLABLE HMIX -// a093 YI SYLLABLE HMI -// a094 YI SYLLABLE HMIP -// a095 YI SYLLABLE HMIEX -// a096 YI SYLLABLE HMIE -// a097 YI SYLLABLE HMIEP -// a098 YI SYLLABLE HMAT -// a099 YI SYLLABLE HMAX -// a09a YI SYLLABLE HMA -// a09b YI SYLLABLE HMAP -// a09c YI SYLLABLE HMUOX -// a09d YI SYLLABLE HMUO -// a09e YI SYLLABLE HMUOP -// a09f YI SYLLABLE HMOT -// a0a0 YI SYLLABLE HMOX -// a0a1 YI SYLLABLE HMO -// a0a2 YI SYLLABLE HMOP -// a0a3 YI SYLLABLE HMUT -// a0a4 YI SYLLABLE HMUX -// a0a5 YI SYLLABLE HMU -// a0a6 YI SYLLABLE HMUP -// a0a7 YI SYLLABLE HMURX -// a0a8 YI SYLLABLE HMUR -// a0a9 YI SYLLABLE HMYX -// a0aa YI SYLLABLE HMY -// a0ab YI SYLLABLE HMYP -// a0ac YI SYLLABLE HMYRX -// a0ad YI SYLLABLE HMYR -// a0ae YI SYLLABLE MIT -// a0af YI SYLLABLE MIX -// a0b0 YI SYLLABLE MI -// a0b1 YI SYLLABLE MIP -// a0b2 YI SYLLABLE MIEX -// a0b3 YI SYLLABLE MIE -// a0b4 YI SYLLABLE MIEP -// a0b5 YI SYLLABLE MAT -// a0b6 YI SYLLABLE MAX -// a0b7 YI SYLLABLE MA -// a0b8 YI SYLLABLE MAP -// a0b9 YI SYLLABLE MUOT -// a0ba YI SYLLABLE MUOX -// a0bb YI SYLLABLE MUO -// a0bc YI SYLLABLE MUOP -// a0bd YI SYLLABLE MOT -// a0be YI SYLLABLE MOX -// a0bf YI SYLLABLE MO -// a0c0 YI SYLLABLE MOP -// a0c1 YI SYLLABLE MEX -// a0c2 YI SYLLABLE ME -// a0c3 YI SYLLABLE MUT -// a0c4 YI SYLLABLE MUX -// a0c5 YI SYLLABLE MU -// a0c6 YI SYLLABLE MUP -// a0c7 YI SYLLABLE MURX -// a0c8 YI SYLLABLE MUR -// a0c9 YI SYLLABLE MYT -// a0ca YI SYLLABLE MYX -// a0cb YI SYLLABLE MY -// a0cc YI SYLLABLE MYP -// a0cd YI SYLLABLE FIT -// a0ce YI SYLLABLE FIX -// a0cf YI SYLLABLE FI -// a0d0 YI SYLLABLE FIP -// a0d1 YI SYLLABLE FAT -// a0d2 YI SYLLABLE FAX -// a0d3 YI SYLLABLE FA -// a0d4 YI SYLLABLE FAP -// a0d5 YI SYLLABLE FOX -// a0d6 YI SYLLABLE FO -// a0d7 YI SYLLABLE FOP -// a0d8 YI SYLLABLE FUT -// a0d9 YI SYLLABLE FUX -// a0da YI SYLLABLE FU -// a0db YI SYLLABLE FUP -// a0dc YI SYLLABLE FURX -// a0dd YI SYLLABLE FUR -// a0de YI SYLLABLE FYT -// a0df YI SYLLABLE FYX -// a0e0 YI SYLLABLE FY -// a0e1 YI SYLLABLE FYP -// a0e2 YI SYLLABLE VIT -// a0e3 YI SYLLABLE VIX -// a0e4 YI SYLLABLE VI -// a0e5 YI SYLLABLE VIP -// a0e6 YI SYLLABLE VIET -// a0e7 YI SYLLABLE VIEX -// a0e8 YI SYLLABLE VIE -// a0e9 YI SYLLABLE VIEP -// a0ea YI SYLLABLE VAT -// a0eb YI SYLLABLE VAX -// a0ec YI SYLLABLE VA -// a0ed YI SYLLABLE VAP -// a0ee YI SYLLABLE VOT -// a0ef YI SYLLABLE VOX -// a0f0 YI SYLLABLE VO -// a0f1 YI SYLLABLE VOP -// a0f2 YI SYLLABLE VEX -// a0f3 YI SYLLABLE VEP -// a0f4 YI SYLLABLE VUT -// a0f5 YI SYLLABLE VUX -// a0f6 YI SYLLABLE VU -// a0f7 YI SYLLABLE VUP -// a0f8 YI SYLLABLE VURX -// a0f9 YI SYLLABLE VUR -// a0fa YI SYLLABLE VYT -// a0fb YI SYLLABLE VYX -// a0fc YI SYLLABLE VY -// a0fd YI SYLLABLE VYP -// a0fe YI SYLLABLE VYRX -// a0ff YI SYLLABLE VYR -// a100 YI SYLLABLE DIT -// a101 YI SYLLABLE DIX -// a102 YI SYLLABLE DI -// a103 YI SYLLABLE DIP -// a104 YI SYLLABLE DIEX -// a105 YI SYLLABLE DIE -// a106 YI SYLLABLE DIEP -// a107 YI SYLLABLE DAT -// a108 YI SYLLABLE DAX -// a109 YI SYLLABLE DA -// a10a YI SYLLABLE DAP -// a10b YI SYLLABLE DUOX -// a10c YI SYLLABLE DUO -// a10d YI SYLLABLE DOT -// a10e YI SYLLABLE DOX -// a10f YI SYLLABLE DO -// a110 YI SYLLABLE DOP -// a111 YI SYLLABLE DEX -// a112 YI SYLLABLE DE -// a113 YI SYLLABLE DEP -// a114 YI SYLLABLE DUT -// a115 YI SYLLABLE DUX -// a116 YI SYLLABLE DU -// a117 YI SYLLABLE DUP -// a118 YI SYLLABLE DURX -// a119 YI SYLLABLE DUR -// a11a YI SYLLABLE TIT -// a11b YI SYLLABLE TIX -// a11c YI SYLLABLE TI -// a11d YI SYLLABLE TIP -// a11e YI SYLLABLE TIEX -// a11f YI SYLLABLE TIE -// a120 YI SYLLABLE TIEP -// a121 YI SYLLABLE TAT -// a122 YI SYLLABLE TAX -// a123 YI SYLLABLE TA -// a124 YI SYLLABLE TAP -// a125 YI SYLLABLE TUOT -// a126 YI SYLLABLE TUOX -// a127 YI SYLLABLE TUO -// a128 YI SYLLABLE TUOP -// a129 YI SYLLABLE TOT -// a12a YI SYLLABLE TOX -// a12b YI SYLLABLE TO -// a12c YI SYLLABLE TOP -// a12d YI SYLLABLE TEX -// a12e YI SYLLABLE TE -// a12f YI SYLLABLE TEP -// a130 YI SYLLABLE TUT -// a131 YI SYLLABLE TUX -// a132 YI SYLLABLE TU -// a133 YI SYLLABLE TUP -// a134 YI SYLLABLE TURX -// a135 YI SYLLABLE TUR -// a136 YI SYLLABLE DDIT -// a137 YI SYLLABLE DDIX -// a138 YI SYLLABLE DDI -// a139 YI SYLLABLE DDIP -// a13a YI SYLLABLE DDIEX -// a13b YI SYLLABLE DDIE -// a13c YI SYLLABLE DDIEP -// a13d YI SYLLABLE DDAT -// a13e YI SYLLABLE DDAX -// a13f YI SYLLABLE DDA -// a140 YI SYLLABLE DDAP -// a141 YI SYLLABLE DDUOX -// a142 YI SYLLABLE DDUO -// a143 YI SYLLABLE DDUOP -// a144 YI SYLLABLE DDOT -// a145 YI SYLLABLE DDOX -// a146 YI SYLLABLE DDO -// a147 YI SYLLABLE DDOP -// a148 YI SYLLABLE DDEX -// a149 YI SYLLABLE DDE -// a14a YI SYLLABLE DDEP -// a14b YI SYLLABLE DDUT -// a14c YI SYLLABLE DDUX -// a14d YI SYLLABLE DDU -// a14e YI SYLLABLE DDUP -// a14f YI SYLLABLE DDURX -// a150 YI SYLLABLE DDUR -// a151 YI SYLLABLE NDIT -// a152 YI SYLLABLE NDIX -// a153 YI SYLLABLE NDI -// a154 YI SYLLABLE NDIP -// a155 YI SYLLABLE NDIEX -// a156 YI SYLLABLE NDIE -// a157 YI SYLLABLE NDAT -// a158 YI SYLLABLE NDAX -// a159 YI SYLLABLE NDA -// a15a YI SYLLABLE NDAP -// a15b YI SYLLABLE NDOT -// a15c YI SYLLABLE NDOX -// a15d YI SYLLABLE NDO -// a15e YI SYLLABLE NDOP -// a15f YI SYLLABLE NDEX -// a160 YI SYLLABLE NDE -// a161 YI SYLLABLE NDEP -// a162 YI SYLLABLE NDUT -// a163 YI SYLLABLE NDUX -// a164 YI SYLLABLE NDU -// a165 YI SYLLABLE NDUP -// a166 YI SYLLABLE NDURX -// a167 YI SYLLABLE NDUR -// a168 YI SYLLABLE HNIT -// a169 YI SYLLABLE HNIX -// a16a YI SYLLABLE HNI -// a16b YI SYLLABLE HNIP -// a16c YI SYLLABLE HNIET -// a16d YI SYLLABLE HNIEX -// a16e YI SYLLABLE HNIE -// a16f YI SYLLABLE HNIEP -// a170 YI SYLLABLE HNAT -// a171 YI SYLLABLE HNAX -// a172 YI SYLLABLE HNA -// a173 YI SYLLABLE HNAP -// a174 YI SYLLABLE HNUOX -// a175 YI SYLLABLE HNUO -// a176 YI SYLLABLE HNOT -// a177 YI SYLLABLE HNOX -// a178 YI SYLLABLE HNOP -// a179 YI SYLLABLE HNEX -// a17a YI SYLLABLE HNE -// a17b YI SYLLABLE HNEP -// a17c YI SYLLABLE HNUT -// a17d YI SYLLABLE NIT -// a17e YI SYLLABLE NIX -// a17f YI SYLLABLE NI -// a180 YI SYLLABLE NIP -// a181 YI SYLLABLE NIEX -// a182 YI SYLLABLE NIE -// a183 YI SYLLABLE NIEP -// a184 YI SYLLABLE NAX -// a185 YI SYLLABLE NA -// a186 YI SYLLABLE NAP -// a187 YI SYLLABLE NUOX -// a188 YI SYLLABLE NUO -// a189 YI SYLLABLE NUOP -// a18a YI SYLLABLE NOT -// a18b YI SYLLABLE NOX -// a18c YI SYLLABLE NO -// a18d YI SYLLABLE NOP -// a18e YI SYLLABLE NEX -// a18f YI SYLLABLE NE -// a190 YI SYLLABLE NEP -// a191 YI SYLLABLE NUT -// a192 YI SYLLABLE NUX -// a193 YI SYLLABLE NU -// a194 YI SYLLABLE NUP -// a195 YI SYLLABLE NURX -// a196 YI SYLLABLE NUR -// a197 YI SYLLABLE HLIT -// a198 YI SYLLABLE HLIX -// a199 YI SYLLABLE HLI -// a19a YI SYLLABLE HLIP -// a19b YI SYLLABLE HLIEX -// a19c YI SYLLABLE HLIE -// a19d YI SYLLABLE HLIEP -// a19e YI SYLLABLE HLAT -// a19f YI SYLLABLE HLAX -// a1a0 YI SYLLABLE HLA -// a1a1 YI SYLLABLE HLAP -// a1a2 YI SYLLABLE HLUOX -// a1a3 YI SYLLABLE HLUO -// a1a4 YI SYLLABLE HLUOP -// a1a5 YI SYLLABLE HLOX -// a1a6 YI SYLLABLE HLO -// a1a7 YI SYLLABLE HLOP -// a1a8 YI SYLLABLE HLEX -// a1a9 YI SYLLABLE HLE -// a1aa YI SYLLABLE HLEP -// a1ab YI SYLLABLE HLUT -// a1ac YI SYLLABLE HLUX -// a1ad YI SYLLABLE HLU -// a1ae YI SYLLABLE HLUP -// a1af YI SYLLABLE HLURX -// a1b0 YI SYLLABLE HLUR -// a1b1 YI SYLLABLE HLYT -// a1b2 YI SYLLABLE HLYX -// a1b3 YI SYLLABLE HLY -// a1b4 YI SYLLABLE HLYP -// a1b5 YI SYLLABLE HLYRX -// a1b6 YI SYLLABLE HLYR -// a1b7 YI SYLLABLE LIT -// a1b8 YI SYLLABLE LIX -// a1b9 YI SYLLABLE LI -// a1ba YI SYLLABLE LIP -// a1bb YI SYLLABLE LIET -// a1bc YI SYLLABLE LIEX -// a1bd YI SYLLABLE LIE -// a1be YI SYLLABLE LIEP -// a1bf YI SYLLABLE LAT -// a1c0 YI SYLLABLE LAX -// a1c1 YI SYLLABLE LA -// a1c2 YI SYLLABLE LAP -// a1c3 YI SYLLABLE LUOT -// a1c4 YI SYLLABLE LUOX -// a1c5 YI SYLLABLE LUO -// a1c6 YI SYLLABLE LUOP -// a1c7 YI SYLLABLE LOT -// a1c8 YI SYLLABLE LOX -// a1c9 YI SYLLABLE LO -// a1ca YI SYLLABLE LOP -// a1cb YI SYLLABLE LEX -// a1cc YI SYLLABLE LE -// a1cd YI SYLLABLE LEP -// a1ce YI SYLLABLE LUT -// a1cf YI SYLLABLE LUX -// a1d0 YI SYLLABLE LU -// a1d1 YI SYLLABLE LUP -// a1d2 YI SYLLABLE LURX -// a1d3 YI SYLLABLE LUR -// a1d4 YI SYLLABLE LYT -// a1d5 YI SYLLABLE LYX -// a1d6 YI SYLLABLE LY -// a1d7 YI SYLLABLE LYP -// a1d8 YI SYLLABLE LYRX -// a1d9 YI SYLLABLE LYR -// a1da YI SYLLABLE GIT -// a1db YI SYLLABLE GIX -// a1dc YI SYLLABLE GI -// a1dd YI SYLLABLE GIP -// a1de YI SYLLABLE GIET -// a1df YI SYLLABLE GIEX -// a1e0 YI SYLLABLE GIE -// a1e1 YI SYLLABLE GIEP -// a1e2 YI SYLLABLE GAT -// a1e3 YI SYLLABLE GAX -// a1e4 YI SYLLABLE GA -// a1e5 YI SYLLABLE GAP -// a1e6 YI SYLLABLE GUOT -// a1e7 YI SYLLABLE GUOX -// a1e8 YI SYLLABLE GUO -// a1e9 YI SYLLABLE GUOP -// a1ea YI SYLLABLE GOT -// a1eb YI SYLLABLE GOX -// a1ec YI SYLLABLE GO -// a1ed YI SYLLABLE GOP -// a1ee YI SYLLABLE GET -// a1ef YI SYLLABLE GEX -// a1f0 YI SYLLABLE GE -// a1f1 YI SYLLABLE GEP -// a1f2 YI SYLLABLE GUT -// a1f3 YI SYLLABLE GUX -// a1f4 YI SYLLABLE GU -// a1f5 YI SYLLABLE GUP -// a1f6 YI SYLLABLE GURX -// a1f7 YI SYLLABLE GUR -// a1f8 YI SYLLABLE KIT -// a1f9 YI SYLLABLE KIX -// a1fa YI SYLLABLE KI -// a1fb YI SYLLABLE KIP -// a1fc YI SYLLABLE KIEX -// a1fd YI SYLLABLE KIE -// a1fe YI SYLLABLE KIEP -// a1ff YI SYLLABLE KAT -// a200 YI SYLLABLE KAX -// a201 YI SYLLABLE KA -// a202 YI SYLLABLE KAP -// a203 YI SYLLABLE KUOX -// a204 YI SYLLABLE KUO -// a205 YI SYLLABLE KUOP -// a206 YI SYLLABLE KOT -// a207 YI SYLLABLE KOX -// a208 YI SYLLABLE KO -// a209 YI SYLLABLE KOP -// a20a YI SYLLABLE KET -// a20b YI SYLLABLE KEX -// a20c YI SYLLABLE KE -// a20d YI SYLLABLE KEP -// a20e YI SYLLABLE KUT -// a20f YI SYLLABLE KUX -// a210 YI SYLLABLE KU -// a211 YI SYLLABLE KUP -// a212 YI SYLLABLE KURX -// a213 YI SYLLABLE KUR -// a214 YI SYLLABLE GGIT -// a215 YI SYLLABLE GGIX -// a216 YI SYLLABLE GGI -// a217 YI SYLLABLE GGIEX -// a218 YI SYLLABLE GGIE -// a219 YI SYLLABLE GGIEP -// a21a YI SYLLABLE GGAT -// a21b YI SYLLABLE GGAX -// a21c YI SYLLABLE GGA -// a21d YI SYLLABLE GGAP -// a21e YI SYLLABLE GGUOT -// a21f YI SYLLABLE GGUOX -// a220 YI SYLLABLE GGUO -// a221 YI SYLLABLE GGUOP -// a222 YI SYLLABLE GGOT -// a223 YI SYLLABLE GGOX -// a224 YI SYLLABLE GGO -// a225 YI SYLLABLE GGOP -// a226 YI SYLLABLE GGET -// a227 YI SYLLABLE GGEX -// a228 YI SYLLABLE GGE -// a229 YI SYLLABLE GGEP -// a22a YI SYLLABLE GGUT -// a22b YI SYLLABLE GGUX -// a22c YI SYLLABLE GGU -// a22d YI SYLLABLE GGUP -// a22e YI SYLLABLE GGURX -// a22f YI SYLLABLE GGUR -// a230 YI SYLLABLE MGIEX -// a231 YI SYLLABLE MGIE -// a232 YI SYLLABLE MGAT -// a233 YI SYLLABLE MGAX -// a234 YI SYLLABLE MGA -// a235 YI SYLLABLE MGAP -// a236 YI SYLLABLE MGUOX -// a237 YI SYLLABLE MGUO -// a238 YI SYLLABLE MGUOP -// a239 YI SYLLABLE MGOT -// a23a YI SYLLABLE MGOX -// a23b YI SYLLABLE MGO -// a23c YI SYLLABLE MGOP -// a23d YI SYLLABLE MGEX -// a23e YI SYLLABLE MGE -// a23f YI SYLLABLE MGEP -// a240 YI SYLLABLE MGUT -// a241 YI SYLLABLE MGUX -// a242 YI SYLLABLE MGU -// a243 YI SYLLABLE MGUP -// a244 YI SYLLABLE MGURX -// a245 YI SYLLABLE MGUR -// a246 YI SYLLABLE HXIT -// a247 YI SYLLABLE HXIX -// a248 YI SYLLABLE HXI -// a249 YI SYLLABLE HXIP -// a24a YI SYLLABLE HXIET -// a24b YI SYLLABLE HXIEX -// a24c YI SYLLABLE HXIE -// a24d YI SYLLABLE HXIEP -// a24e YI SYLLABLE HXAT -// a24f YI SYLLABLE HXAX -// a250 YI SYLLABLE HXA -// a251 YI SYLLABLE HXAP -// a252 YI SYLLABLE HXUOT -// a253 YI SYLLABLE HXUOX -// a254 YI SYLLABLE HXUO -// a255 YI SYLLABLE HXUOP -// a256 YI SYLLABLE HXOT -// a257 YI SYLLABLE HXOX -// a258 YI SYLLABLE HXO -// a259 YI SYLLABLE HXOP -// a25a YI SYLLABLE HXEX -// a25b YI SYLLABLE HXE -// a25c YI SYLLABLE HXEP -// a25d YI SYLLABLE NGIEX -// a25e YI SYLLABLE NGIE -// a25f YI SYLLABLE NGIEP -// a260 YI SYLLABLE NGAT -// a261 YI SYLLABLE NGAX -// a262 YI SYLLABLE NGA -// a263 YI SYLLABLE NGAP -// a264 YI SYLLABLE NGUOT -// a265 YI SYLLABLE NGUOX -// a266 YI SYLLABLE NGUO -// a267 YI SYLLABLE NGOT -// a268 YI SYLLABLE NGOX -// a269 YI SYLLABLE NGO -// a26a YI SYLLABLE NGOP -// a26b YI SYLLABLE NGEX -// a26c YI SYLLABLE NGE -// a26d YI SYLLABLE NGEP -// a26e YI SYLLABLE HIT -// a26f YI SYLLABLE HIEX -// a270 YI SYLLABLE HIE -// a271 YI SYLLABLE HAT -// a272 YI SYLLABLE HAX -// a273 YI SYLLABLE HA -// a274 YI SYLLABLE HAP -// a275 YI SYLLABLE HUOT -// a276 YI SYLLABLE HUOX -// a277 YI SYLLABLE HUO -// a278 YI SYLLABLE HUOP -// a279 YI SYLLABLE HOT -// a27a YI SYLLABLE HOX -// a27b YI SYLLABLE HO -// a27c YI SYLLABLE HOP -// a27d YI SYLLABLE HEX -// a27e YI SYLLABLE HE -// a27f YI SYLLABLE HEP -// a280 YI SYLLABLE WAT -// a281 YI SYLLABLE WAX -// a282 YI SYLLABLE WA -// a283 YI SYLLABLE WAP -// a284 YI SYLLABLE WUOX -// a285 YI SYLLABLE WUO -// a286 YI SYLLABLE WUOP -// a287 YI SYLLABLE WOX -// a288 YI SYLLABLE WO -// a289 YI SYLLABLE WOP -// a28a YI SYLLABLE WEX -// a28b YI SYLLABLE WE -// a28c YI SYLLABLE WEP -// a28d YI SYLLABLE ZIT -// a28e YI SYLLABLE ZIX -// a28f YI SYLLABLE ZI -// a290 YI SYLLABLE ZIP -// a291 YI SYLLABLE ZIEX -// a292 YI SYLLABLE ZIE -// a293 YI SYLLABLE ZIEP -// a294 YI SYLLABLE ZAT -// a295 YI SYLLABLE ZAX -// a296 YI SYLLABLE ZA -// a297 YI SYLLABLE ZAP -// a298 YI SYLLABLE ZUOX -// a299 YI SYLLABLE ZUO -// a29a YI SYLLABLE ZUOP -// a29b YI SYLLABLE ZOT -// a29c YI SYLLABLE ZOX -// a29d YI SYLLABLE ZO -// a29e YI SYLLABLE ZOP -// a29f YI SYLLABLE ZEX -// a2a0 YI SYLLABLE ZE -// a2a1 YI SYLLABLE ZEP -// a2a2 YI SYLLABLE ZUT -// a2a3 YI SYLLABLE ZUX -// a2a4 YI SYLLABLE ZU -// a2a5 YI SYLLABLE ZUP -// a2a6 YI SYLLABLE ZURX -// a2a7 YI SYLLABLE ZUR -// a2a8 YI SYLLABLE ZYT -// a2a9 YI SYLLABLE ZYX -// a2aa YI SYLLABLE ZY -// a2ab YI SYLLABLE ZYP -// a2ac YI SYLLABLE ZYRX -// a2ad YI SYLLABLE ZYR -// a2ae YI SYLLABLE CIT -// a2af YI SYLLABLE CIX -// a2b0 YI SYLLABLE CI -// a2b1 YI SYLLABLE CIP -// a2b2 YI SYLLABLE CIET -// a2b3 YI SYLLABLE CIEX -// a2b4 YI SYLLABLE CIE -// a2b5 YI SYLLABLE CIEP -// a2b6 YI SYLLABLE CAT -// a2b7 YI SYLLABLE CAX -// a2b8 YI SYLLABLE CA -// a2b9 YI SYLLABLE CAP -// a2ba YI SYLLABLE CUOX -// a2bb YI SYLLABLE CUO -// a2bc YI SYLLABLE CUOP -// a2bd YI SYLLABLE COT -// a2be YI SYLLABLE COX -// a2bf YI SYLLABLE CO -// a2c0 YI SYLLABLE COP -// a2c1 YI SYLLABLE CEX -// a2c2 YI SYLLABLE CE -// a2c3 YI SYLLABLE CEP -// a2c4 YI SYLLABLE CUT -// a2c5 YI SYLLABLE CUX -// a2c6 YI SYLLABLE CU -// a2c7 YI SYLLABLE CUP -// a2c8 YI SYLLABLE CURX -// a2c9 YI SYLLABLE CUR -// a2ca YI SYLLABLE CYT -// a2cb YI SYLLABLE CYX -// a2cc YI SYLLABLE CY -// a2cd YI SYLLABLE CYP -// a2ce YI SYLLABLE CYRX -// a2cf YI SYLLABLE CYR -// a2d0 YI SYLLABLE ZZIT -// a2d1 YI SYLLABLE ZZIX -// a2d2 YI SYLLABLE ZZI -// a2d3 YI SYLLABLE ZZIP -// a2d4 YI SYLLABLE ZZIET -// a2d5 YI SYLLABLE ZZIEX -// a2d6 YI SYLLABLE ZZIE -// a2d7 YI SYLLABLE ZZIEP -// a2d8 YI SYLLABLE ZZAT -// a2d9 YI SYLLABLE ZZAX -// a2da YI SYLLABLE ZZA -// a2db YI SYLLABLE ZZAP -// a2dc YI SYLLABLE ZZOX -// a2dd YI SYLLABLE ZZO -// a2de YI SYLLABLE ZZOP -// a2df YI SYLLABLE ZZEX -// a2e0 YI SYLLABLE ZZE -// a2e1 YI SYLLABLE ZZEP -// a2e2 YI SYLLABLE ZZUX -// a2e3 YI SYLLABLE ZZU -// a2e4 YI SYLLABLE ZZUP -// a2e5 YI SYLLABLE ZZURX -// a2e6 YI SYLLABLE ZZUR -// a2e7 YI SYLLABLE ZZYT -// a2e8 YI SYLLABLE ZZYX -// a2e9 YI SYLLABLE ZZY -// a2ea YI SYLLABLE ZZYP -// a2eb YI SYLLABLE ZZYRX -// a2ec YI SYLLABLE ZZYR -// a2ed YI SYLLABLE NZIT -// a2ee YI SYLLABLE NZIX -// a2ef YI SYLLABLE NZI -// a2f0 YI SYLLABLE NZIP -// a2f1 YI SYLLABLE NZIEX -// a2f2 YI SYLLABLE NZIE -// a2f3 YI SYLLABLE NZIEP -// a2f4 YI SYLLABLE NZAT -// a2f5 YI SYLLABLE NZAX -// a2f6 YI SYLLABLE NZA -// a2f7 YI SYLLABLE NZAP -// a2f8 YI SYLLABLE NZUOX -// a2f9 YI SYLLABLE NZUO -// a2fa YI SYLLABLE NZOX -// a2fb YI SYLLABLE NZOP -// a2fc YI SYLLABLE NZEX -// a2fd YI SYLLABLE NZE -// a2fe YI SYLLABLE NZUX -// a2ff YI SYLLABLE NZU -// a300 YI SYLLABLE NZUP -// a301 YI SYLLABLE NZURX -// a302 YI SYLLABLE NZUR -// a303 YI SYLLABLE NZYT -// a304 YI SYLLABLE NZYX -// a305 YI SYLLABLE NZY -// a306 YI SYLLABLE NZYP -// a307 YI SYLLABLE NZYRX -// a308 YI SYLLABLE NZYR -// a309 YI SYLLABLE SIT -// a30a YI SYLLABLE SIX -// a30b YI SYLLABLE SI -// a30c YI SYLLABLE SIP -// a30d YI SYLLABLE SIEX -// a30e YI SYLLABLE SIE -// a30f YI SYLLABLE SIEP -// a310 YI SYLLABLE SAT -// a311 YI SYLLABLE SAX -// a312 YI SYLLABLE SA -// a313 YI SYLLABLE SAP -// a314 YI SYLLABLE SUOX -// a315 YI SYLLABLE SUO -// a316 YI SYLLABLE SUOP -// a317 YI SYLLABLE SOT -// a318 YI SYLLABLE SOX -// a319 YI SYLLABLE SO -// a31a YI SYLLABLE SOP -// a31b YI SYLLABLE SEX -// a31c YI SYLLABLE SE -// a31d YI SYLLABLE SEP -// a31e YI SYLLABLE SUT -// a31f YI SYLLABLE SUX -// a320 YI SYLLABLE SU -// a321 YI SYLLABLE SUP -// a322 YI SYLLABLE SURX -// a323 YI SYLLABLE SUR -// a324 YI SYLLABLE SYT -// a325 YI SYLLABLE SYX -// a326 YI SYLLABLE SY -// a327 YI SYLLABLE SYP -// a328 YI SYLLABLE SYRX -// a329 YI SYLLABLE SYR -// a32a YI SYLLABLE SSIT -// a32b YI SYLLABLE SSIX -// a32c YI SYLLABLE SSI -// a32d YI SYLLABLE SSIP -// a32e YI SYLLABLE SSIEX -// a32f YI SYLLABLE SSIE -// a330 YI SYLLABLE SSIEP -// a331 YI SYLLABLE SSAT -// a332 YI SYLLABLE SSAX -// a333 YI SYLLABLE SSA -// a334 YI SYLLABLE SSAP -// a335 YI SYLLABLE SSOT -// a336 YI SYLLABLE SSOX -// a337 YI SYLLABLE SSO -// a338 YI SYLLABLE SSOP -// a339 YI SYLLABLE SSEX -// a33a YI SYLLABLE SSE -// a33b YI SYLLABLE SSEP -// a33c YI SYLLABLE SSUT -// a33d YI SYLLABLE SSUX -// a33e YI SYLLABLE SSU -// a33f YI SYLLABLE SSUP -// a340 YI SYLLABLE SSYT -// a341 YI SYLLABLE SSYX -// a342 YI SYLLABLE SSY -// a343 YI SYLLABLE SSYP -// a344 YI SYLLABLE SSYRX -// a345 YI SYLLABLE SSYR -// a346 YI SYLLABLE ZHAT -// a347 YI SYLLABLE ZHAX -// a348 YI SYLLABLE ZHA -// a349 YI SYLLABLE ZHAP -// a34a YI SYLLABLE ZHUOX -// a34b YI SYLLABLE ZHUO -// a34c YI SYLLABLE ZHUOP -// a34d YI SYLLABLE ZHOT -// a34e YI SYLLABLE ZHOX -// a34f YI SYLLABLE ZHO -// a350 YI SYLLABLE ZHOP -// a351 YI SYLLABLE ZHET -// a352 YI SYLLABLE ZHEX -// a353 YI SYLLABLE ZHE -// a354 YI SYLLABLE ZHEP -// a355 YI SYLLABLE ZHUT -// a356 YI SYLLABLE ZHUX -// a357 YI SYLLABLE ZHU -// a358 YI SYLLABLE ZHUP -// a359 YI SYLLABLE ZHURX -// a35a YI SYLLABLE ZHUR -// a35b YI SYLLABLE ZHYT -// a35c YI SYLLABLE ZHYX -// a35d YI SYLLABLE ZHY -// a35e YI SYLLABLE ZHYP -// a35f YI SYLLABLE ZHYRX -// a360 YI SYLLABLE ZHYR -// a361 YI SYLLABLE CHAT -// a362 YI SYLLABLE CHAX -// a363 YI SYLLABLE CHA -// a364 YI SYLLABLE CHAP -// a365 YI SYLLABLE CHUOT -// a366 YI SYLLABLE CHUOX -// a367 YI SYLLABLE CHUO -// a368 YI SYLLABLE CHUOP -// a369 YI SYLLABLE CHOT -// a36a YI SYLLABLE CHOX -// a36b YI SYLLABLE CHO -// a36c YI SYLLABLE CHOP -// a36d YI SYLLABLE CHET -// a36e YI SYLLABLE CHEX -// a36f YI SYLLABLE CHE -// a370 YI SYLLABLE CHEP -// a371 YI SYLLABLE CHUX -// a372 YI SYLLABLE CHU -// a373 YI SYLLABLE CHUP -// a374 YI SYLLABLE CHURX -// a375 YI SYLLABLE CHUR -// a376 YI SYLLABLE CHYT -// a377 YI SYLLABLE CHYX -// a378 YI SYLLABLE CHY -// a379 YI SYLLABLE CHYP -// a37a YI SYLLABLE CHYRX -// a37b YI SYLLABLE CHYR -// a37c YI SYLLABLE RRAX -// a37d YI SYLLABLE RRA -// a37e YI SYLLABLE RRUOX -// a37f YI SYLLABLE RRUO -// a380 YI SYLLABLE RROT -// a381 YI SYLLABLE RROX -// a382 YI SYLLABLE RRO -// a383 YI SYLLABLE RROP -// a384 YI SYLLABLE RRET -// a385 YI SYLLABLE RREX -// a386 YI SYLLABLE RRE -// a387 YI SYLLABLE RREP -// a388 YI SYLLABLE RRUT -// a389 YI SYLLABLE RRUX -// a38a YI SYLLABLE RRU -// a38b YI SYLLABLE RRUP -// a38c YI SYLLABLE RRURX -// a38d YI SYLLABLE RRUR -// a38e YI SYLLABLE RRYT -// a38f YI SYLLABLE RRYX -// a390 YI SYLLABLE RRY -// a391 YI SYLLABLE RRYP -// a392 YI SYLLABLE RRYRX -// a393 YI SYLLABLE RRYR -// a394 YI SYLLABLE NRAT -// a395 YI SYLLABLE NRAX -// a396 YI SYLLABLE NRA -// a397 YI SYLLABLE NRAP -// a398 YI SYLLABLE NROX -// a399 YI SYLLABLE NRO -// a39a YI SYLLABLE NROP -// a39b YI SYLLABLE NRET -// a39c YI SYLLABLE NREX -// a39d YI SYLLABLE NRE -// a39e YI SYLLABLE NREP -// a39f YI SYLLABLE NRUT -// a3a0 YI SYLLABLE NRUX -// a3a1 YI SYLLABLE NRU -// a3a2 YI SYLLABLE NRUP -// a3a3 YI SYLLABLE NRURX -// a3a4 YI SYLLABLE NRUR -// a3a5 YI SYLLABLE NRYT -// a3a6 YI SYLLABLE NRYX -// a3a7 YI SYLLABLE NRY -// a3a8 YI SYLLABLE NRYP -// a3a9 YI SYLLABLE NRYRX -// a3aa YI SYLLABLE NRYR -// a3ab YI SYLLABLE SHAT -// a3ac YI SYLLABLE SHAX -// a3ad YI SYLLABLE SHA -// a3ae YI SYLLABLE SHAP -// a3af YI SYLLABLE SHUOX -// a3b0 YI SYLLABLE SHUO -// a3b1 YI SYLLABLE SHUOP -// a3b2 YI SYLLABLE SHOT -// a3b3 YI SYLLABLE SHOX -// a3b4 YI SYLLABLE SHO -// a3b5 YI SYLLABLE SHOP -// a3b6 YI SYLLABLE SHET -// a3b7 YI SYLLABLE SHEX -// a3b8 YI SYLLABLE SHE -// a3b9 YI SYLLABLE SHEP -// a3ba YI SYLLABLE SHUT -// a3bb YI SYLLABLE SHUX -// a3bc YI SYLLABLE SHU -// a3bd YI SYLLABLE SHUP -// a3be YI SYLLABLE SHURX -// a3bf YI SYLLABLE SHUR -// a3c0 YI SYLLABLE SHYT -// a3c1 YI SYLLABLE SHYX -// a3c2 YI SYLLABLE SHY -// a3c3 YI SYLLABLE SHYP -// a3c4 YI SYLLABLE SHYRX -// a3c5 YI SYLLABLE SHYR -// a3c6 YI SYLLABLE RAT -// a3c7 YI SYLLABLE RAX -// a3c8 YI SYLLABLE RA -// a3c9 YI SYLLABLE RAP -// a3ca YI SYLLABLE RUOX -// a3cb YI SYLLABLE RUO -// a3cc YI SYLLABLE RUOP -// a3cd YI SYLLABLE ROT -// a3ce YI SYLLABLE ROX -// a3cf YI SYLLABLE RO -// a3d0 YI SYLLABLE ROP -// a3d1 YI SYLLABLE REX -// a3d2 YI SYLLABLE RE -// a3d3 YI SYLLABLE REP -// a3d4 YI SYLLABLE RUT -// a3d5 YI SYLLABLE RUX -// a3d6 YI SYLLABLE RU -// a3d7 YI SYLLABLE RUP -// a3d8 YI SYLLABLE RURX -// a3d9 YI SYLLABLE RUR -// a3da YI SYLLABLE RYT -// a3db YI SYLLABLE RYX -// a3dc YI SYLLABLE RY -// a3dd YI SYLLABLE RYP -// a3de YI SYLLABLE RYRX -// a3df YI SYLLABLE RYR -// a3e0 YI SYLLABLE JIT -// a3e1 YI SYLLABLE JIX -// a3e2 YI SYLLABLE JI -// a3e3 YI SYLLABLE JIP -// a3e4 YI SYLLABLE JIET -// a3e5 YI SYLLABLE JIEX -// a3e6 YI SYLLABLE JIE -// a3e7 YI SYLLABLE JIEP -// a3e8 YI SYLLABLE JUOT -// a3e9 YI SYLLABLE JUOX -// a3ea YI SYLLABLE JUO -// a3eb YI SYLLABLE JUOP -// a3ec YI SYLLABLE JOT -// a3ed YI SYLLABLE JOX -// a3ee YI SYLLABLE JO -// a3ef YI SYLLABLE JOP -// a3f0 YI SYLLABLE JUT -// a3f1 YI SYLLABLE JUX -// a3f2 YI SYLLABLE JU -// a3f3 YI SYLLABLE JUP -// a3f4 YI SYLLABLE JURX -// a3f5 YI SYLLABLE JUR -// a3f6 YI SYLLABLE JYT -// a3f7 YI SYLLABLE JYX -// a3f8 YI SYLLABLE JY -// a3f9 YI SYLLABLE JYP -// a3fa YI SYLLABLE JYRX -// a3fb YI SYLLABLE JYR -// a3fc YI SYLLABLE QIT -// a3fd YI SYLLABLE QIX -// a3fe YI SYLLABLE QI -// a3ff YI SYLLABLE QIP -// a400 YI SYLLABLE QIET -// a401 YI SYLLABLE QIEX -// a402 YI SYLLABLE QIE -// a403 YI SYLLABLE QIEP -// a404 YI SYLLABLE QUOT -// a405 YI SYLLABLE QUOX -// a406 YI SYLLABLE QUO -// a407 YI SYLLABLE QUOP -// a408 YI SYLLABLE QOT -// a409 YI SYLLABLE QOX -// a40a YI SYLLABLE QO -// a40b YI SYLLABLE QOP -// a40c YI SYLLABLE QUT -// a40d YI SYLLABLE QUX -// a40e YI SYLLABLE QU -// a40f YI SYLLABLE QUP -// a410 YI SYLLABLE QURX -// a411 YI SYLLABLE QUR -// a412 YI SYLLABLE QYT -// a413 YI SYLLABLE QYX -// a414 YI SYLLABLE QY -// a415 YI SYLLABLE QYP -// a416 YI SYLLABLE QYRX -// a417 YI SYLLABLE QYR -// a418 YI SYLLABLE JJIT -// a419 YI SYLLABLE JJIX -// a41a YI SYLLABLE JJI -// a41b YI SYLLABLE JJIP -// a41c YI SYLLABLE JJIET -// a41d YI SYLLABLE JJIEX -// a41e YI SYLLABLE JJIE -// a41f YI SYLLABLE JJIEP -// a420 YI SYLLABLE JJUOX -// a421 YI SYLLABLE JJUO -// a422 YI SYLLABLE JJUOP -// a423 YI SYLLABLE JJOT -// a424 YI SYLLABLE JJOX -// a425 YI SYLLABLE JJO -// a426 YI SYLLABLE JJOP -// a427 YI SYLLABLE JJUT -// a428 YI SYLLABLE JJUX -// a429 YI SYLLABLE JJU -// a42a YI SYLLABLE JJUP -// a42b YI SYLLABLE JJURX -// a42c YI SYLLABLE JJUR -// a42d YI SYLLABLE JJYT -// a42e YI SYLLABLE JJYX -// a42f YI SYLLABLE JJY -// a430 YI SYLLABLE JJYP -// a431 YI SYLLABLE NJIT -// a432 YI SYLLABLE NJIX -// a433 YI SYLLABLE NJI -// a434 YI SYLLABLE NJIP -// a435 YI SYLLABLE NJIET -// a436 YI SYLLABLE NJIEX -// a437 YI SYLLABLE NJIE -// a438 YI SYLLABLE NJIEP -// a439 YI SYLLABLE NJUOX -// a43a YI SYLLABLE NJUO -// a43b YI SYLLABLE NJOT -// a43c YI SYLLABLE NJOX -// a43d YI SYLLABLE NJO -// a43e YI SYLLABLE NJOP -// a43f YI SYLLABLE NJUX -// a440 YI SYLLABLE NJU -// a441 YI SYLLABLE NJUP -// a442 YI SYLLABLE NJURX -// a443 YI SYLLABLE NJUR -// a444 YI SYLLABLE NJYT -// a445 YI SYLLABLE NJYX -// a446 YI SYLLABLE NJY -// a447 YI SYLLABLE NJYP -// a448 YI SYLLABLE NJYRX -// a449 YI SYLLABLE NJYR -// a44a YI SYLLABLE NYIT -// a44b YI SYLLABLE NYIX -// a44c YI SYLLABLE NYI -// a44d YI SYLLABLE NYIP -// a44e YI SYLLABLE NYIET -// a44f YI SYLLABLE NYIEX -// a450 YI SYLLABLE NYIE -// a451 YI SYLLABLE NYIEP -// a452 YI SYLLABLE NYUOX -// a453 YI SYLLABLE NYUO -// a454 YI SYLLABLE NYUOP -// a455 YI SYLLABLE NYOT -// a456 YI SYLLABLE NYOX -// a457 YI SYLLABLE NYO -// a458 YI SYLLABLE NYOP -// a459 YI SYLLABLE NYUT -// a45a YI SYLLABLE NYUX -// a45b YI SYLLABLE NYU -// a45c YI SYLLABLE NYUP -// a45d YI SYLLABLE XIT -// a45e YI SYLLABLE XIX -// a45f YI SYLLABLE XI -// a460 YI SYLLABLE XIP -// a461 YI SYLLABLE XIET -// a462 YI SYLLABLE XIEX -// a463 YI SYLLABLE XIE -// a464 YI SYLLABLE XIEP -// a465 YI SYLLABLE XUOX -// a466 YI SYLLABLE XUO -// a467 YI SYLLABLE XOT -// a468 YI SYLLABLE XOX -// a469 YI SYLLABLE XO -// a46a YI SYLLABLE XOP -// a46b YI SYLLABLE XYT -// a46c YI SYLLABLE XYX -// a46d YI SYLLABLE XY -// a46e YI SYLLABLE XYP -// a46f YI SYLLABLE XYRX -// a470 YI SYLLABLE XYR -// a471 YI SYLLABLE YIT -// a472 YI SYLLABLE YIX -// a473 YI SYLLABLE YI -// a474 YI SYLLABLE YIP -// a475 YI SYLLABLE YIET -// a476 YI SYLLABLE YIEX -// a477 YI SYLLABLE YIE -// a478 YI SYLLABLE YIEP -// a479 YI SYLLABLE YUOT -// a47a YI SYLLABLE YUOX -// a47b YI SYLLABLE YUO -// a47c YI SYLLABLE YUOP -// a47d YI SYLLABLE YOT -// a47e YI SYLLABLE YOX -// a47f YI SYLLABLE YO -// a480 YI SYLLABLE YOP -// a481 YI SYLLABLE YUT -// a482 YI SYLLABLE YUX -// a483 YI SYLLABLE YU -// a484 YI SYLLABLE YUP -// a485 YI SYLLABLE YURX -// a486 YI SYLLABLE YUR -// a487 YI SYLLABLE YYT -// a488 YI SYLLABLE YYX -// a489 YI SYLLABLE YY -// a48a YI SYLLABLE YYP -// a48b YI SYLLABLE YYRX -// a48c YI SYLLABLE YYR - { 0xA000, 0x48D, 0x9, 0, 0 }, -// a490 YI RADICAL QOT -// a491 YI RADICAL LI -// a492 YI RADICAL KIT -// a493 YI RADICAL NYIP -// a494 YI RADICAL CYP -// a495 YI RADICAL SSI -// a496 YI RADICAL GGOP -// a497 YI RADICAL GEP -// a498 YI RADICAL MI -// a499 YI RADICAL HXIT -// a49a YI RADICAL LYR -// a49b YI RADICAL BBUT -// a49c YI RADICAL MOP -// a49d YI RADICAL YO -// a49e YI RADICAL PUT -// a49f YI RADICAL HXUO -// a4a0 YI RADICAL TAT -// a4a1 YI RADICAL GA -// a4a2 YI RADICAL ZUP -// a4a3 YI RADICAL CYT -// a4a4 YI RADICAL DDUR -// a4a5 YI RADICAL BUR -// a4a6 YI RADICAL GGUO -// a4a7 YI RADICAL NYOP -// a4a8 YI RADICAL TU -// a4a9 YI RADICAL OP -// a4aa YI RADICAL JJUT -// a4ab YI RADICAL ZOT -// a4ac YI RADICAL PYT -// a4ad YI RADICAL HMO -// a4ae YI RADICAL YIT -// a4af YI RADICAL VUR -// a4b0 YI RADICAL SHY -// a4b1 YI RADICAL VEP -// a4b2 YI RADICAL ZA -// a4b3 YI RADICAL JO -// a4b4 YI RADICAL NZUP -// a4b5 YI RADICAL JJY -// a4b6 YI RADICAL GOT -// a4b7 YI RADICAL JJIE -// a4b8 YI RADICAL WO -// a4b9 YI RADICAL DU -// a4ba YI RADICAL SHUR -// a4bb YI RADICAL LIE -// a4bc YI RADICAL CY -// a4bd YI RADICAL CUOP -// a4be YI RADICAL CIP -// a4bf YI RADICAL HXOP -// a4c0 YI RADICAL SHAT -// a4c1 YI RADICAL ZUR -// a4c2 YI RADICAL SHOP -// a4c3 YI RADICAL CHE -// a4c4 YI RADICAL ZZIET -// a4c5 YI RADICAL NBIE -// a4c6 YI RADICAL KE - { 0xA490, 0x37, 0x8, 0, 0 }, -// a4d0 LISU LETTER BA -// a4d1 LISU LETTER PA -// a4d2 LISU LETTER PHA -// a4d3 LISU LETTER DA -// a4d4 LISU LETTER TA -// a4d5 LISU LETTER THA -// a4d6 LISU LETTER GA -// a4d7 LISU LETTER KA -// a4d8 LISU LETTER KHA -// a4d9 LISU LETTER JA -// a4da LISU LETTER CA -// a4db LISU LETTER CHA -// a4dc LISU LETTER DZA -// a4dd LISU LETTER TSA -// a4de LISU LETTER TSHA -// a4df LISU LETTER MA -// a4e0 LISU LETTER NA -// a4e1 LISU LETTER LA -// a4e2 LISU LETTER SA -// a4e3 LISU LETTER ZHA -// a4e4 LISU LETTER ZA -// a4e5 LISU LETTER NGA -// a4e6 LISU LETTER HA -// a4e7 LISU LETTER XA -// a4e8 LISU LETTER HHA -// a4e9 LISU LETTER FA -// a4ea LISU LETTER WA -// a4eb LISU LETTER SHA -// a4ec LISU LETTER YA -// a4ed LISU LETTER GHA -// a4ee LISU LETTER A -// a4ef LISU LETTER AE -// a4f0 LISU LETTER E -// a4f1 LISU LETTER EU -// a4f2 LISU LETTER I -// a4f3 LISU LETTER O -// a4f4 LISU LETTER U -// a4f5 LISU LETTER UE -// a4f6 LISU LETTER UH -// a4f7 LISU LETTER OE -// a4f8 LISU LETTER TONE MYA TI -// a4f9 LISU LETTER TONE NA PO -// a4fa LISU LETTER TONE MYA CYA -// a4fb LISU LETTER TONE MYA BO -// a4fc LISU LETTER TONE MYA NA -// a4fd LISU LETTER TONE MYA JEU - { 0xA4D0, 0x2E, 0x9, 0, 0 }, -// a4fe LISU PUNCTUATION COMMA -// a4ff LISU PUNCTUATION FULL STOP - { 0xA4FE, 0x2, 0x18, 0, 0 }, -// a500 VAI SYLLABLE EE -// a501 VAI SYLLABLE EEN -// a502 VAI SYLLABLE HEE -// a503 VAI SYLLABLE WEE -// a504 VAI SYLLABLE WEEN -// a505 VAI SYLLABLE PEE -// a506 VAI SYLLABLE BHEE -// a507 VAI SYLLABLE BEE -// a508 VAI SYLLABLE MBEE -// a509 VAI SYLLABLE KPEE -// a50a VAI SYLLABLE MGBEE -// a50b VAI SYLLABLE GBEE -// a50c VAI SYLLABLE FEE -// a50d VAI SYLLABLE VEE -// a50e VAI SYLLABLE TEE -// a50f VAI SYLLABLE THEE -// a510 VAI SYLLABLE DHEE -// a511 VAI SYLLABLE DHHEE -// a512 VAI SYLLABLE LEE -// a513 VAI SYLLABLE REE -// a514 VAI SYLLABLE DEE -// a515 VAI SYLLABLE NDEE -// a516 VAI SYLLABLE SEE -// a517 VAI SYLLABLE SHEE -// a518 VAI SYLLABLE ZEE -// a519 VAI SYLLABLE ZHEE -// a51a VAI SYLLABLE CEE -// a51b VAI SYLLABLE JEE -// a51c VAI SYLLABLE NJEE -// a51d VAI SYLLABLE YEE -// a51e VAI SYLLABLE KEE -// a51f VAI SYLLABLE NGGEE -// a520 VAI SYLLABLE GEE -// a521 VAI SYLLABLE MEE -// a522 VAI SYLLABLE NEE -// a523 VAI SYLLABLE NYEE -// a524 VAI SYLLABLE I -// a525 VAI SYLLABLE IN -// a526 VAI SYLLABLE HI -// a527 VAI SYLLABLE HIN -// a528 VAI SYLLABLE WI -// a529 VAI SYLLABLE WIN -// a52a VAI SYLLABLE PI -// a52b VAI SYLLABLE BHI -// a52c VAI SYLLABLE BI -// a52d VAI SYLLABLE MBI -// a52e VAI SYLLABLE KPI -// a52f VAI SYLLABLE MGBI -// a530 VAI SYLLABLE GBI -// a531 VAI SYLLABLE FI -// a532 VAI SYLLABLE VI -// a533 VAI SYLLABLE TI -// a534 VAI SYLLABLE THI -// a535 VAI SYLLABLE DHI -// a536 VAI SYLLABLE DHHI -// a537 VAI SYLLABLE LI -// a538 VAI SYLLABLE RI -// a539 VAI SYLLABLE DI -// a53a VAI SYLLABLE NDI -// a53b VAI SYLLABLE SI -// a53c VAI SYLLABLE SHI -// a53d VAI SYLLABLE ZI -// a53e VAI SYLLABLE ZHI -// a53f VAI SYLLABLE CI -// a540 VAI SYLLABLE JI -// a541 VAI SYLLABLE NJI -// a542 VAI SYLLABLE YI -// a543 VAI SYLLABLE KI -// a544 VAI SYLLABLE NGGI -// a545 VAI SYLLABLE GI -// a546 VAI SYLLABLE MI -// a547 VAI SYLLABLE NI -// a548 VAI SYLLABLE NYI -// a549 VAI SYLLABLE A -// a54a VAI SYLLABLE AN -// a54b VAI SYLLABLE NGAN -// a54c VAI SYLLABLE HA -// a54d VAI SYLLABLE HAN -// a54e VAI SYLLABLE WA -// a54f VAI SYLLABLE WAN -// a550 VAI SYLLABLE PA -// a551 VAI SYLLABLE BHA -// a552 VAI SYLLABLE BA -// a553 VAI SYLLABLE MBA -// a554 VAI SYLLABLE KPA -// a555 VAI SYLLABLE KPAN -// a556 VAI SYLLABLE MGBA -// a557 VAI SYLLABLE GBA -// a558 VAI SYLLABLE FA -// a559 VAI SYLLABLE VA -// a55a VAI SYLLABLE TA -// a55b VAI SYLLABLE THA -// a55c VAI SYLLABLE DHA -// a55d VAI SYLLABLE DHHA -// a55e VAI SYLLABLE LA -// a55f VAI SYLLABLE RA -// a560 VAI SYLLABLE DA -// a561 VAI SYLLABLE NDA -// a562 VAI SYLLABLE SA -// a563 VAI SYLLABLE SHA -// a564 VAI SYLLABLE ZA -// a565 VAI SYLLABLE ZHA -// a566 VAI SYLLABLE CA -// a567 VAI SYLLABLE JA -// a568 VAI SYLLABLE NJA -// a569 VAI SYLLABLE YA -// a56a VAI SYLLABLE KA -// a56b VAI SYLLABLE KAN -// a56c VAI SYLLABLE NGGA -// a56d VAI SYLLABLE GA -// a56e VAI SYLLABLE MA -// a56f VAI SYLLABLE NA -// a570 VAI SYLLABLE NYA -// a571 VAI SYLLABLE OO -// a572 VAI SYLLABLE OON -// a573 VAI SYLLABLE HOO -// a574 VAI SYLLABLE WOO -// a575 VAI SYLLABLE WOON -// a576 VAI SYLLABLE POO -// a577 VAI SYLLABLE BHOO -// a578 VAI SYLLABLE BOO -// a579 VAI SYLLABLE MBOO -// a57a VAI SYLLABLE KPOO -// a57b VAI SYLLABLE MGBOO -// a57c VAI SYLLABLE GBOO -// a57d VAI SYLLABLE FOO -// a57e VAI SYLLABLE VOO -// a57f VAI SYLLABLE TOO -// a580 VAI SYLLABLE THOO -// a581 VAI SYLLABLE DHOO -// a582 VAI SYLLABLE DHHOO -// a583 VAI SYLLABLE LOO -// a584 VAI SYLLABLE ROO -// a585 VAI SYLLABLE DOO -// a586 VAI SYLLABLE NDOO -// a587 VAI SYLLABLE SOO -// a588 VAI SYLLABLE SHOO -// a589 VAI SYLLABLE ZOO -// a58a VAI SYLLABLE ZHOO -// a58b VAI SYLLABLE COO -// a58c VAI SYLLABLE JOO -// a58d VAI SYLLABLE NJOO -// a58e VAI SYLLABLE YOO -// a58f VAI SYLLABLE KOO -// a590 VAI SYLLABLE NGGOO -// a591 VAI SYLLABLE GOO -// a592 VAI SYLLABLE MOO -// a593 VAI SYLLABLE NOO -// a594 VAI SYLLABLE NYOO -// a595 VAI SYLLABLE U -// a596 VAI SYLLABLE UN -// a597 VAI SYLLABLE HU -// a598 VAI SYLLABLE HUN -// a599 VAI SYLLABLE WU -// a59a VAI SYLLABLE WUN -// a59b VAI SYLLABLE PU -// a59c VAI SYLLABLE BHU -// a59d VAI SYLLABLE BU -// a59e VAI SYLLABLE MBU -// a59f VAI SYLLABLE KPU -// a5a0 VAI SYLLABLE MGBU -// a5a1 VAI SYLLABLE GBU -// a5a2 VAI SYLLABLE FU -// a5a3 VAI SYLLABLE VU -// a5a4 VAI SYLLABLE TU -// a5a5 VAI SYLLABLE THU -// a5a6 VAI SYLLABLE DHU -// a5a7 VAI SYLLABLE DHHU -// a5a8 VAI SYLLABLE LU -// a5a9 VAI SYLLABLE RU -// a5aa VAI SYLLABLE DU -// a5ab VAI SYLLABLE NDU -// a5ac VAI SYLLABLE SU -// a5ad VAI SYLLABLE SHU -// a5ae VAI SYLLABLE ZU -// a5af VAI SYLLABLE ZHU -// a5b0 VAI SYLLABLE CU -// a5b1 VAI SYLLABLE JU -// a5b2 VAI SYLLABLE NJU -// a5b3 VAI SYLLABLE YU -// a5b4 VAI SYLLABLE KU -// a5b5 VAI SYLLABLE NGGU -// a5b6 VAI SYLLABLE GU -// a5b7 VAI SYLLABLE MU -// a5b8 VAI SYLLABLE NU -// a5b9 VAI SYLLABLE NYU -// a5ba VAI SYLLABLE O -// a5bb VAI SYLLABLE ON -// a5bc VAI SYLLABLE NGON -// a5bd VAI SYLLABLE HO -// a5be VAI SYLLABLE HON -// a5bf VAI SYLLABLE WO -// a5c0 VAI SYLLABLE WON -// a5c1 VAI SYLLABLE PO -// a5c2 VAI SYLLABLE BHO -// a5c3 VAI SYLLABLE BO -// a5c4 VAI SYLLABLE MBO -// a5c5 VAI SYLLABLE KPO -// a5c6 VAI SYLLABLE MGBO -// a5c7 VAI SYLLABLE GBO -// a5c8 VAI SYLLABLE GBON -// a5c9 VAI SYLLABLE FO -// a5ca VAI SYLLABLE VO -// a5cb VAI SYLLABLE TO -// a5cc VAI SYLLABLE THO -// a5cd VAI SYLLABLE DHO -// a5ce VAI SYLLABLE DHHO -// a5cf VAI SYLLABLE LO -// a5d0 VAI SYLLABLE RO -// a5d1 VAI SYLLABLE DO -// a5d2 VAI SYLLABLE NDO -// a5d3 VAI SYLLABLE SO -// a5d4 VAI SYLLABLE SHO -// a5d5 VAI SYLLABLE ZO -// a5d6 VAI SYLLABLE ZHO -// a5d7 VAI SYLLABLE CO -// a5d8 VAI SYLLABLE JO -// a5d9 VAI SYLLABLE NJO -// a5da VAI SYLLABLE YO -// a5db VAI SYLLABLE KO -// a5dc VAI SYLLABLE NGGO -// a5dd VAI SYLLABLE GO -// a5de VAI SYLLABLE MO -// a5df VAI SYLLABLE NO -// a5e0 VAI SYLLABLE NYO -// a5e1 VAI SYLLABLE E -// a5e2 VAI SYLLABLE EN -// a5e3 VAI SYLLABLE NGEN -// a5e4 VAI SYLLABLE HE -// a5e5 VAI SYLLABLE HEN -// a5e6 VAI SYLLABLE WE -// a5e7 VAI SYLLABLE WEN -// a5e8 VAI SYLLABLE PE -// a5e9 VAI SYLLABLE BHE -// a5ea VAI SYLLABLE BE -// a5eb VAI SYLLABLE MBE -// a5ec VAI SYLLABLE KPE -// a5ed VAI SYLLABLE KPEN -// a5ee VAI SYLLABLE MGBE -// a5ef VAI SYLLABLE GBE -// a5f0 VAI SYLLABLE GBEN -// a5f1 VAI SYLLABLE FE -// a5f2 VAI SYLLABLE VE -// a5f3 VAI SYLLABLE TE -// a5f4 VAI SYLLABLE THE -// a5f5 VAI SYLLABLE DHE -// a5f6 VAI SYLLABLE DHHE -// a5f7 VAI SYLLABLE LE -// a5f8 VAI SYLLABLE RE -// a5f9 VAI SYLLABLE DE -// a5fa VAI SYLLABLE NDE -// a5fb VAI SYLLABLE SE -// a5fc VAI SYLLABLE SHE -// a5fd VAI SYLLABLE ZE -// a5fe VAI SYLLABLE ZHE -// a5ff VAI SYLLABLE CE -// a600 VAI SYLLABLE JE -// a601 VAI SYLLABLE NJE -// a602 VAI SYLLABLE YE -// a603 VAI SYLLABLE KE -// a604 VAI SYLLABLE NGGE -// a605 VAI SYLLABLE NGGEN -// a606 VAI SYLLABLE GE -// a607 VAI SYLLABLE GEN -// a608 VAI SYLLABLE ME -// a609 VAI SYLLABLE NE -// a60a VAI SYLLABLE NYE -// a60b VAI SYLLABLE NG -// a60c VAI SYLLABLE LENGTHENER - { 0xA500, 0x10D, 0x9, 0, 0 }, -// a60d VAI COMMA -// a60e VAI FULL STOP -// a60f VAI QUESTION MARK - { 0xA60D, 0x3, 0x18, 0, 0 }, -// a610 VAI SYLLABLE NDOLE FA -// a611 VAI SYLLABLE NDOLE KA -// a612 VAI SYLLABLE NDOLE SOO -// a613 VAI SYMBOL FEENG -// a614 VAI SYMBOL KEENG -// a615 VAI SYMBOL TING -// a616 VAI SYMBOL NII -// a617 VAI SYMBOL BANG -// a618 VAI SYMBOL FAA -// a619 VAI SYMBOL TAA -// a61a VAI SYMBOL DANG -// a61b VAI SYMBOL DOONG -// a61c VAI SYMBOL KUNG -// a61d VAI SYMBOL TONG -// a61e VAI SYMBOL DO-O -// a61f VAI SYMBOL JONG - { 0xA610, 0x10, 0x9, 0, 0 }, -// a620 VAI DIGIT ZERO -// a621 VAI DIGIT ONE -// a622 VAI DIGIT TWO -// a623 VAI DIGIT THREE -// a624 VAI DIGIT FOUR -// a625 VAI DIGIT FIVE -// a626 VAI DIGIT SIX -// a627 VAI DIGIT SEVEN -// a628 VAI DIGIT EIGHT -// a629 VAI DIGIT NINE - { 0xA620, 0xA, 0x108, 0, 0 }, -// a62a VAI SYLLABLE NDOLE MA -// a62b VAI SYLLABLE NDOLE DO - { 0xA62A, 0x2, 0x9, 0, 0 }, -// a640 CYRILLIC CAPITAL LETTER ZEMLYA - { 0xA640, 0x1, 0x89, 1, 0 }, -// a641 CYRILLIC SMALL LETTER ZEMLYA - { 0xA641, 0x1, 0x49, 0, -1 }, -// a642 CYRILLIC CAPITAL LETTER DZELO - { 0xA642, 0x1, 0x89, 1, 0 }, -// a643 CYRILLIC SMALL LETTER DZELO - { 0xA643, 0x1, 0x49, 0, -1 }, -// a644 CYRILLIC CAPITAL LETTER REVERSED DZE - { 0xA644, 0x1, 0x89, 1, 0 }, -// a645 CYRILLIC SMALL LETTER REVERSED DZE - { 0xA645, 0x1, 0x49, 0, -1 }, -// a646 CYRILLIC CAPITAL LETTER IOTA - { 0xA646, 0x1, 0x89, 1, 0 }, -// a647 CYRILLIC SMALL LETTER IOTA - { 0xA647, 0x1, 0x49, 0, -1 }, -// a648 CYRILLIC CAPITAL LETTER DJERV - { 0xA648, 0x1, 0x89, 1, 0 }, -// a649 CYRILLIC SMALL LETTER DJERV - { 0xA649, 0x1, 0x49, 0, -1 }, -// a64a CYRILLIC CAPITAL LETTER MONOGRAPH UK - { 0xA64A, 0x1, 0x89, 1, 0 }, -// a64b CYRILLIC SMALL LETTER MONOGRAPH UK - { 0xA64B, 0x1, 0x49, 0, -1 }, -// a64c CYRILLIC CAPITAL LETTER BROAD OMEGA - { 0xA64C, 0x1, 0x89, 1, 0 }, -// a64d CYRILLIC SMALL LETTER BROAD OMEGA - { 0xA64D, 0x1, 0x49, 0, -1 }, -// a64e CYRILLIC CAPITAL LETTER NEUTRAL YER - { 0xA64E, 0x1, 0x89, 1, 0 }, -// a64f CYRILLIC SMALL LETTER NEUTRAL YER - { 0xA64F, 0x1, 0x49, 0, -1 }, -// a650 CYRILLIC CAPITAL LETTER YERU WITH BACK YER - { 0xA650, 0x1, 0x89, 1, 0 }, -// a651 CYRILLIC SMALL LETTER YERU WITH BACK YER - { 0xA651, 0x1, 0x49, 0, -1 }, -// a652 CYRILLIC CAPITAL LETTER IOTIFIED YAT - { 0xA652, 0x1, 0x89, 1, 0 }, -// a653 CYRILLIC SMALL LETTER IOTIFIED YAT - { 0xA653, 0x1, 0x49, 0, -1 }, -// a654 CYRILLIC CAPITAL LETTER REVERSED YU - { 0xA654, 0x1, 0x89, 1, 0 }, -// a655 CYRILLIC SMALL LETTER REVERSED YU - { 0xA655, 0x1, 0x49, 0, -1 }, -// a656 CYRILLIC CAPITAL LETTER IOTIFIED A - { 0xA656, 0x1, 0x89, 1, 0 }, -// a657 CYRILLIC SMALL LETTER IOTIFIED A - { 0xA657, 0x1, 0x49, 0, -1 }, -// a658 CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS - { 0xA658, 0x1, 0x89, 1, 0 }, -// a659 CYRILLIC SMALL LETTER CLOSED LITTLE YUS - { 0xA659, 0x1, 0x49, 0, -1 }, -// a65a CYRILLIC CAPITAL LETTER BLENDED YUS - { 0xA65A, 0x1, 0x89, 1, 0 }, -// a65b CYRILLIC SMALL LETTER BLENDED YUS - { 0xA65B, 0x1, 0x49, 0, -1 }, -// a65c CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS - { 0xA65C, 0x1, 0x89, 1, 0 }, -// a65d CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS - { 0xA65D, 0x1, 0x49, 0, -1 }, -// a65e CYRILLIC CAPITAL LETTER YN - { 0xA65E, 0x1, 0x89, 1, 0 }, -// a65f CYRILLIC SMALL LETTER YN - { 0xA65F, 0x1, 0x49, 0, -1 }, -// a660 CYRILLIC CAPITAL LETTER REVERSED TSE - { 0xA660, 0x1, 0x89, 1, 0 }, -// a661 CYRILLIC SMALL LETTER REVERSED TSE - { 0xA661, 0x1, 0x49, 0, -1 }, -// a662 CYRILLIC CAPITAL LETTER SOFT DE - { 0xA662, 0x1, 0x89, 1, 0 }, -// a663 CYRILLIC SMALL LETTER SOFT DE - { 0xA663, 0x1, 0x49, 0, -1 }, -// a664 CYRILLIC CAPITAL LETTER SOFT EL - { 0xA664, 0x1, 0x89, 1, 0 }, -// a665 CYRILLIC SMALL LETTER SOFT EL - { 0xA665, 0x1, 0x49, 0, -1 }, -// a666 CYRILLIC CAPITAL LETTER SOFT EM - { 0xA666, 0x1, 0x89, 1, 0 }, -// a667 CYRILLIC SMALL LETTER SOFT EM - { 0xA667, 0x1, 0x49, 0, -1 }, -// a668 CYRILLIC CAPITAL LETTER MONOCULAR O - { 0xA668, 0x1, 0x89, 1, 0 }, -// a669 CYRILLIC SMALL LETTER MONOCULAR O - { 0xA669, 0x1, 0x49, 0, -1 }, -// a66a CYRILLIC CAPITAL LETTER BINOCULAR O - { 0xA66A, 0x1, 0x89, 1, 0 }, -// a66b CYRILLIC SMALL LETTER BINOCULAR O - { 0xA66B, 0x1, 0x49, 0, -1 }, -// a66c CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O - { 0xA66C, 0x1, 0x89, 1, 0 }, -// a66d CYRILLIC SMALL LETTER DOUBLE MONOCULAR O - { 0xA66D, 0x1, 0x49, 0, -1 }, -// a66e CYRILLIC LETTER MULTIOCULAR O - { 0xA66E, 0x1, 0x9, 0, 0 }, -// a66f COMBINING CYRILLIC VZMET -// a670 COMBINING CYRILLIC TEN MILLIONS SIGN -// a671 COMBINING CYRILLIC HUNDRED MILLIONS SIGN -// a672 COMBINING CYRILLIC THOUSAND MILLIONS SIGN - { 0xA66F, 0x4, 0x0, 0, 0 }, -// a673 SLAVONIC ASTERISK - { 0xA673, 0x1, 0x18, 0, 0 }, -// a674 COMBINING CYRILLIC LETTER UKRAINIAN IE -// a675 COMBINING CYRILLIC LETTER I -// a676 COMBINING CYRILLIC LETTER YI -// a677 COMBINING CYRILLIC LETTER U -// a678 COMBINING CYRILLIC LETTER HARD SIGN -// a679 COMBINING CYRILLIC LETTER YERU -// a67a COMBINING CYRILLIC LETTER SOFT SIGN -// a67b COMBINING CYRILLIC LETTER OMEGA -// a67c COMBINING CYRILLIC KAVYKA -// a67d COMBINING CYRILLIC PAYEROK - { 0xA674, 0xA, 0x0, 0, 0 }, -// a67e CYRILLIC KAVYKA - { 0xA67E, 0x1, 0x18, 0, 0 }, -// a67f CYRILLIC PAYEROK - { 0xA67F, 0x1, 0x9, 0, 0 }, -// a680 CYRILLIC CAPITAL LETTER DWE - { 0xA680, 0x1, 0x89, 1, 0 }, -// a681 CYRILLIC SMALL LETTER DWE - { 0xA681, 0x1, 0x49, 0, -1 }, -// a682 CYRILLIC CAPITAL LETTER DZWE - { 0xA682, 0x1, 0x89, 1, 0 }, -// a683 CYRILLIC SMALL LETTER DZWE - { 0xA683, 0x1, 0x49, 0, -1 }, -// a684 CYRILLIC CAPITAL LETTER ZHWE - { 0xA684, 0x1, 0x89, 1, 0 }, -// a685 CYRILLIC SMALL LETTER ZHWE - { 0xA685, 0x1, 0x49, 0, -1 }, -// a686 CYRILLIC CAPITAL LETTER CCHE - { 0xA686, 0x1, 0x89, 1, 0 }, -// a687 CYRILLIC SMALL LETTER CCHE - { 0xA687, 0x1, 0x49, 0, -1 }, -// a688 CYRILLIC CAPITAL LETTER DZZE - { 0xA688, 0x1, 0x89, 1, 0 }, -// a689 CYRILLIC SMALL LETTER DZZE - { 0xA689, 0x1, 0x49, 0, -1 }, -// a68a CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK - { 0xA68A, 0x1, 0x89, 1, 0 }, -// a68b CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK - { 0xA68B, 0x1, 0x49, 0, -1 }, -// a68c CYRILLIC CAPITAL LETTER TWE - { 0xA68C, 0x1, 0x89, 1, 0 }, -// a68d CYRILLIC SMALL LETTER TWE - { 0xA68D, 0x1, 0x49, 0, -1 }, -// a68e CYRILLIC CAPITAL LETTER TSWE - { 0xA68E, 0x1, 0x89, 1, 0 }, -// a68f CYRILLIC SMALL LETTER TSWE - { 0xA68F, 0x1, 0x49, 0, -1 }, -// a690 CYRILLIC CAPITAL LETTER TSSE - { 0xA690, 0x1, 0x89, 1, 0 }, -// a691 CYRILLIC SMALL LETTER TSSE - { 0xA691, 0x1, 0x49, 0, -1 }, -// a692 CYRILLIC CAPITAL LETTER TCHE - { 0xA692, 0x1, 0x89, 1, 0 }, -// a693 CYRILLIC SMALL LETTER TCHE - { 0xA693, 0x1, 0x49, 0, -1 }, -// a694 CYRILLIC CAPITAL LETTER HWE - { 0xA694, 0x1, 0x89, 1, 0 }, -// a695 CYRILLIC SMALL LETTER HWE - { 0xA695, 0x1, 0x49, 0, -1 }, -// a696 CYRILLIC CAPITAL LETTER SHWE - { 0xA696, 0x1, 0x89, 1, 0 }, -// a697 CYRILLIC SMALL LETTER SHWE - { 0xA697, 0x1, 0x49, 0, -1 }, -// a698 CYRILLIC CAPITAL LETTER DOUBLE O - { 0xA698, 0x1, 0x89, 1, 0 }, -// a699 CYRILLIC SMALL LETTER DOUBLE O - { 0xA699, 0x1, 0x49, 0, -1 }, -// a69a CYRILLIC CAPITAL LETTER CROSSED O - { 0xA69A, 0x1, 0x89, 1, 0 }, -// a69b CYRILLIC SMALL LETTER CROSSED O - { 0xA69B, 0x1, 0x49, 0, -1 }, -// a69c MODIFIER LETTER CYRILLIC HARD SIGN -// a69d MODIFIER LETTER CYRILLIC SOFT SIGN - { 0xA69C, 0x2, 0x9, 0, 0 }, -// a69f COMBINING CYRILLIC LETTER IOTIFIED E - { 0xA69F, 0x1, 0x0, 0, 0 }, -// a6a0 BAMUM LETTER A -// a6a1 BAMUM LETTER KA -// a6a2 BAMUM LETTER U -// a6a3 BAMUM LETTER KU -// a6a4 BAMUM LETTER EE -// a6a5 BAMUM LETTER REE -// a6a6 BAMUM LETTER TAE -// a6a7 BAMUM LETTER O -// a6a8 BAMUM LETTER NYI -// a6a9 BAMUM LETTER I -// a6aa BAMUM LETTER LA -// a6ab BAMUM LETTER PA -// a6ac BAMUM LETTER RII -// a6ad BAMUM LETTER RIEE -// a6ae BAMUM LETTER LEEEE -// a6af BAMUM LETTER MEEEE -// a6b0 BAMUM LETTER TAA -// a6b1 BAMUM LETTER NDAA -// a6b2 BAMUM LETTER NJAEM -// a6b3 BAMUM LETTER M -// a6b4 BAMUM LETTER SUU -// a6b5 BAMUM LETTER MU -// a6b6 BAMUM LETTER SHII -// a6b7 BAMUM LETTER SI -// a6b8 BAMUM LETTER SHEUX -// a6b9 BAMUM LETTER SEUX -// a6ba BAMUM LETTER KYEE -// a6bb BAMUM LETTER KET -// a6bc BAMUM LETTER NUAE -// a6bd BAMUM LETTER NU -// a6be BAMUM LETTER NJUAE -// a6bf BAMUM LETTER YOQ -// a6c0 BAMUM LETTER SHU -// a6c1 BAMUM LETTER YUQ -// a6c2 BAMUM LETTER YA -// a6c3 BAMUM LETTER NSHA -// a6c4 BAMUM LETTER KEUX -// a6c5 BAMUM LETTER PEUX -// a6c6 BAMUM LETTER NJEE -// a6c7 BAMUM LETTER NTEE -// a6c8 BAMUM LETTER PUE -// a6c9 BAMUM LETTER WUE -// a6ca BAMUM LETTER PEE -// a6cb BAMUM LETTER FEE -// a6cc BAMUM LETTER RU -// a6cd BAMUM LETTER LU -// a6ce BAMUM LETTER MI -// a6cf BAMUM LETTER NI -// a6d0 BAMUM LETTER REUX -// a6d1 BAMUM LETTER RAE -// a6d2 BAMUM LETTER KEN -// a6d3 BAMUM LETTER NGKWAEN -// a6d4 BAMUM LETTER NGGA -// a6d5 BAMUM LETTER NGA -// a6d6 BAMUM LETTER SHO -// a6d7 BAMUM LETTER PUAE -// a6d8 BAMUM LETTER FU -// a6d9 BAMUM LETTER FOM -// a6da BAMUM LETTER WA -// a6db BAMUM LETTER NA -// a6dc BAMUM LETTER LI -// a6dd BAMUM LETTER PI -// a6de BAMUM LETTER LOQ -// a6df BAMUM LETTER KO -// a6e0 BAMUM LETTER MBEN -// a6e1 BAMUM LETTER REN -// a6e2 BAMUM LETTER MEN -// a6e3 BAMUM LETTER MA -// a6e4 BAMUM LETTER TI -// a6e5 BAMUM LETTER KI - { 0xA6A0, 0x46, 0x9, 0, 0 }, -// a6e6 BAMUM LETTER MO -// a6e7 BAMUM LETTER MBAA -// a6e8 BAMUM LETTER TET -// a6e9 BAMUM LETTER KPA -// a6ea BAMUM LETTER TEN -// a6eb BAMUM LETTER NTUU -// a6ec BAMUM LETTER SAMBA -// a6ed BAMUM LETTER FAAMAE -// a6ee BAMUM LETTER KOVUU -// a6ef BAMUM LETTER KOGHOM - { 0xA6E6, 0xA, 0x8, 0, 0 }, -// a6f0 BAMUM COMBINING MARK KOQNDON -// a6f1 BAMUM COMBINING MARK TUKWENTIS - { 0xA6F0, 0x2, 0x0, 0, 0 }, -// a6f2 BAMUM NJAEMLI -// a6f3 BAMUM FULL STOP -// a6f4 BAMUM COLON -// a6f5 BAMUM COMMA -// a6f6 BAMUM SEMICOLON -// a6f7 BAMUM QUESTION MARK - { 0xA6F2, 0x6, 0x18, 0, 0 }, -// a700 MODIFIER LETTER CHINESE TONE YIN PING -// a701 MODIFIER LETTER CHINESE TONE YANG PING -// a702 MODIFIER LETTER CHINESE TONE YIN SHANG -// a703 MODIFIER LETTER CHINESE TONE YANG SHANG -// a704 MODIFIER LETTER CHINESE TONE YIN QU -// a705 MODIFIER LETTER CHINESE TONE YANG QU -// a706 MODIFIER LETTER CHINESE TONE YIN RU -// a707 MODIFIER LETTER CHINESE TONE YANG RU -// a708 MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR -// a709 MODIFIER LETTER HIGH DOTTED TONE BAR -// a70a MODIFIER LETTER MID DOTTED TONE BAR -// a70b MODIFIER LETTER LOW DOTTED TONE BAR -// a70c MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR -// a70d MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR -// a70e MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR -// a70f MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR -// a710 MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR -// a711 MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR -// a712 MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR -// a713 MODIFIER LETTER HIGH LEFT-STEM TONE BAR -// a714 MODIFIER LETTER MID LEFT-STEM TONE BAR -// a715 MODIFIER LETTER LOW LEFT-STEM TONE BAR -// a716 MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR - { 0xA700, 0x17, 0x8, 0, 0 }, -// a717 MODIFIER LETTER DOT VERTICAL BAR -// a718 MODIFIER LETTER DOT SLASH -// a719 MODIFIER LETTER DOT HORIZONTAL BAR -// a71a MODIFIER LETTER LOWER RIGHT CORNER ANGLE -// a71b MODIFIER LETTER RAISED UP ARROW -// a71c MODIFIER LETTER RAISED DOWN ARROW -// a71d MODIFIER LETTER RAISED EXCLAMATION MARK -// a71e MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK -// a71f MODIFIER LETTER LOW INVERTED EXCLAMATION MARK - { 0xA717, 0x9, 0x9, 0, 0 }, -// a720 MODIFIER LETTER STRESS AND HIGH TONE -// a721 MODIFIER LETTER STRESS AND LOW TONE - { 0xA720, 0x2, 0x8, 0, 0 }, -// a722 LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF - { 0xA722, 0x1, 0x89, 1, 0 }, -// a723 LATIN SMALL LETTER EGYPTOLOGICAL ALEF - { 0xA723, 0x1, 0x49, 0, -1 }, -// a724 LATIN CAPITAL LETTER EGYPTOLOGICAL AIN - { 0xA724, 0x1, 0x89, 1, 0 }, -// a725 LATIN SMALL LETTER EGYPTOLOGICAL AIN - { 0xA725, 0x1, 0x49, 0, -1 }, -// a726 LATIN CAPITAL LETTER HENG - { 0xA726, 0x1, 0x89, 1, 0 }, -// a727 LATIN SMALL LETTER HENG - { 0xA727, 0x1, 0x49, 0, -1 }, -// a728 LATIN CAPITAL LETTER TZ - { 0xA728, 0x1, 0x89, 1, 0 }, -// a729 LATIN SMALL LETTER TZ - { 0xA729, 0x1, 0x49, 0, -1 }, -// a72a LATIN CAPITAL LETTER TRESILLO - { 0xA72A, 0x1, 0x89, 1, 0 }, -// a72b LATIN SMALL LETTER TRESILLO - { 0xA72B, 0x1, 0x49, 0, -1 }, -// a72c LATIN CAPITAL LETTER CUATRILLO - { 0xA72C, 0x1, 0x89, 1, 0 }, -// a72d LATIN SMALL LETTER CUATRILLO - { 0xA72D, 0x1, 0x49, 0, -1 }, -// a72e LATIN CAPITAL LETTER CUATRILLO WITH COMMA - { 0xA72E, 0x1, 0x89, 1, 0 }, -// a72f LATIN SMALL LETTER CUATRILLO WITH COMMA - { 0xA72F, 0x1, 0x49, 0, -1 }, -// a730 LATIN LETTER SMALL CAPITAL F -// a731 LATIN LETTER SMALL CAPITAL S - { 0xA730, 0x2, 0x49, 0, 0 }, -// a732 LATIN CAPITAL LETTER AA - { 0xA732, 0x1, 0x89, 1, 0 }, -// a733 LATIN SMALL LETTER AA - { 0xA733, 0x1, 0x49, 0, -1 }, -// a734 LATIN CAPITAL LETTER AO - { 0xA734, 0x1, 0x89, 1, 0 }, -// a735 LATIN SMALL LETTER AO - { 0xA735, 0x1, 0x49, 0, -1 }, -// a736 LATIN CAPITAL LETTER AU - { 0xA736, 0x1, 0x89, 1, 0 }, -// a737 LATIN SMALL LETTER AU - { 0xA737, 0x1, 0x49, 0, -1 }, -// a738 LATIN CAPITAL LETTER AV - { 0xA738, 0x1, 0x89, 1, 0 }, -// a739 LATIN SMALL LETTER AV - { 0xA739, 0x1, 0x49, 0, -1 }, -// a73a LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR - { 0xA73A, 0x1, 0x89, 1, 0 }, -// a73b LATIN SMALL LETTER AV WITH HORIZONTAL BAR - { 0xA73B, 0x1, 0x49, 0, -1 }, -// a73c LATIN CAPITAL LETTER AY - { 0xA73C, 0x1, 0x89, 1, 0 }, -// a73d LATIN SMALL LETTER AY - { 0xA73D, 0x1, 0x49, 0, -1 }, -// a73e LATIN CAPITAL LETTER REVERSED C WITH DOT - { 0xA73E, 0x1, 0x89, 1, 0 }, -// a73f LATIN SMALL LETTER REVERSED C WITH DOT - { 0xA73F, 0x1, 0x49, 0, -1 }, -// a740 LATIN CAPITAL LETTER K WITH STROKE - { 0xA740, 0x1, 0x89, 1, 0 }, -// a741 LATIN SMALL LETTER K WITH STROKE - { 0xA741, 0x1, 0x49, 0, -1 }, -// a742 LATIN CAPITAL LETTER K WITH DIAGONAL STROKE - { 0xA742, 0x1, 0x89, 1, 0 }, -// a743 LATIN SMALL LETTER K WITH DIAGONAL STROKE - { 0xA743, 0x1, 0x49, 0, -1 }, -// a744 LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE - { 0xA744, 0x1, 0x89, 1, 0 }, -// a745 LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE - { 0xA745, 0x1, 0x49, 0, -1 }, -// a746 LATIN CAPITAL LETTER BROKEN L - { 0xA746, 0x1, 0x89, 1, 0 }, -// a747 LATIN SMALL LETTER BROKEN L - { 0xA747, 0x1, 0x49, 0, -1 }, -// a748 LATIN CAPITAL LETTER L WITH HIGH STROKE - { 0xA748, 0x1, 0x89, 1, 0 }, -// a749 LATIN SMALL LETTER L WITH HIGH STROKE - { 0xA749, 0x1, 0x49, 0, -1 }, -// a74a LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY - { 0xA74A, 0x1, 0x89, 1, 0 }, -// a74b LATIN SMALL LETTER O WITH LONG STROKE OVERLAY - { 0xA74B, 0x1, 0x49, 0, -1 }, -// a74c LATIN CAPITAL LETTER O WITH LOOP - { 0xA74C, 0x1, 0x89, 1, 0 }, -// a74d LATIN SMALL LETTER O WITH LOOP - { 0xA74D, 0x1, 0x49, 0, -1 }, -// a74e LATIN CAPITAL LETTER OO - { 0xA74E, 0x1, 0x89, 1, 0 }, -// a74f LATIN SMALL LETTER OO - { 0xA74F, 0x1, 0x49, 0, -1 }, -// a750 LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER - { 0xA750, 0x1, 0x89, 1, 0 }, -// a751 LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER - { 0xA751, 0x1, 0x49, 0, -1 }, -// a752 LATIN CAPITAL LETTER P WITH FLOURISH - { 0xA752, 0x1, 0x89, 1, 0 }, -// a753 LATIN SMALL LETTER P WITH FLOURISH - { 0xA753, 0x1, 0x49, 0, -1 }, -// a754 LATIN CAPITAL LETTER P WITH SQUIRREL TAIL - { 0xA754, 0x1, 0x89, 1, 0 }, -// a755 LATIN SMALL LETTER P WITH SQUIRREL TAIL - { 0xA755, 0x1, 0x49, 0, -1 }, -// a756 LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER - { 0xA756, 0x1, 0x89, 1, 0 }, -// a757 LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER - { 0xA757, 0x1, 0x49, 0, -1 }, -// a758 LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE - { 0xA758, 0x1, 0x89, 1, 0 }, -// a759 LATIN SMALL LETTER Q WITH DIAGONAL STROKE - { 0xA759, 0x1, 0x49, 0, -1 }, -// a75a LATIN CAPITAL LETTER R ROTUNDA - { 0xA75A, 0x1, 0x89, 1, 0 }, -// a75b LATIN SMALL LETTER R ROTUNDA - { 0xA75B, 0x1, 0x49, 0, -1 }, -// a75c LATIN CAPITAL LETTER RUM ROTUNDA - { 0xA75C, 0x1, 0x89, 1, 0 }, -// a75d LATIN SMALL LETTER RUM ROTUNDA - { 0xA75D, 0x1, 0x49, 0, -1 }, -// a75e LATIN CAPITAL LETTER V WITH DIAGONAL STROKE - { 0xA75E, 0x1, 0x89, 1, 0 }, -// a75f LATIN SMALL LETTER V WITH DIAGONAL STROKE - { 0xA75F, 0x1, 0x49, 0, -1 }, -// a760 LATIN CAPITAL LETTER VY - { 0xA760, 0x1, 0x89, 1, 0 }, -// a761 LATIN SMALL LETTER VY - { 0xA761, 0x1, 0x49, 0, -1 }, -// a762 LATIN CAPITAL LETTER VISIGOTHIC Z - { 0xA762, 0x1, 0x89, 1, 0 }, -// a763 LATIN SMALL LETTER VISIGOTHIC Z - { 0xA763, 0x1, 0x49, 0, -1 }, -// a764 LATIN CAPITAL LETTER THORN WITH STROKE - { 0xA764, 0x1, 0x89, 1, 0 }, -// a765 LATIN SMALL LETTER THORN WITH STROKE - { 0xA765, 0x1, 0x49, 0, -1 }, -// a766 LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER - { 0xA766, 0x1, 0x89, 1, 0 }, -// a767 LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER - { 0xA767, 0x1, 0x49, 0, -1 }, -// a768 LATIN CAPITAL LETTER VEND - { 0xA768, 0x1, 0x89, 1, 0 }, -// a769 LATIN SMALL LETTER VEND - { 0xA769, 0x1, 0x49, 0, -1 }, -// a76a LATIN CAPITAL LETTER ET - { 0xA76A, 0x1, 0x89, 1, 0 }, -// a76b LATIN SMALL LETTER ET - { 0xA76B, 0x1, 0x49, 0, -1 }, -// a76c LATIN CAPITAL LETTER IS - { 0xA76C, 0x1, 0x89, 1, 0 }, -// a76d LATIN SMALL LETTER IS - { 0xA76D, 0x1, 0x49, 0, -1 }, -// a76e LATIN CAPITAL LETTER CON - { 0xA76E, 0x1, 0x89, 1, 0 }, -// a76f LATIN SMALL LETTER CON - { 0xA76F, 0x1, 0x49, 0, -1 }, -// a770 MODIFIER LETTER US - { 0xA770, 0x1, 0x9, 0, 0 }, -// a771 LATIN SMALL LETTER DUM -// a772 LATIN SMALL LETTER LUM -// a773 LATIN SMALL LETTER MUM -// a774 LATIN SMALL LETTER NUM -// a775 LATIN SMALL LETTER RUM -// a776 LATIN LETTER SMALL CAPITAL RUM -// a777 LATIN SMALL LETTER TUM -// a778 LATIN SMALL LETTER UM - { 0xA771, 0x8, 0x49, 0, 0 }, -// a779 LATIN CAPITAL LETTER INSULAR D - { 0xA779, 0x1, 0x89, 1, 0 }, -// a77a LATIN SMALL LETTER INSULAR D - { 0xA77A, 0x1, 0x49, 0, -1 }, -// a77b LATIN CAPITAL LETTER INSULAR F - { 0xA77B, 0x1, 0x89, 1, 0 }, -// a77c LATIN SMALL LETTER INSULAR F - { 0xA77C, 0x1, 0x49, 0, -1 }, -// a77d LATIN CAPITAL LETTER INSULAR G - { 0xA77D, 0x1, 0x89, -35332, 0 }, -// a77e LATIN CAPITAL LETTER TURNED INSULAR G - { 0xA77E, 0x1, 0x89, 1, 0 }, -// a77f LATIN SMALL LETTER TURNED INSULAR G - { 0xA77F, 0x1, 0x49, 0, -1 }, -// a780 LATIN CAPITAL LETTER TURNED L - { 0xA780, 0x1, 0x89, 1, 0 }, -// a781 LATIN SMALL LETTER TURNED L - { 0xA781, 0x1, 0x49, 0, -1 }, -// a782 LATIN CAPITAL LETTER INSULAR R - { 0xA782, 0x1, 0x89, 1, 0 }, -// a783 LATIN SMALL LETTER INSULAR R - { 0xA783, 0x1, 0x49, 0, -1 }, -// a784 LATIN CAPITAL LETTER INSULAR S - { 0xA784, 0x1, 0x89, 1, 0 }, -// a785 LATIN SMALL LETTER INSULAR S - { 0xA785, 0x1, 0x49, 0, -1 }, -// a786 LATIN CAPITAL LETTER INSULAR T - { 0xA786, 0x1, 0x89, 1, 0 }, -// a787 LATIN SMALL LETTER INSULAR T - { 0xA787, 0x1, 0x49, 0, -1 }, -// a788 MODIFIER LETTER LOW CIRCUMFLEX ACCENT - { 0xA788, 0x1, 0x9, 0, 0 }, -// a789 MODIFIER LETTER COLON -// a78a MODIFIER LETTER SHORT EQUALS SIGN - { 0xA789, 0x2, 0x8, 0, 0 }, -// a78b LATIN CAPITAL LETTER SALTILLO - { 0xA78B, 0x1, 0x89, 1, 0 }, -// a78c LATIN SMALL LETTER SALTILLO - { 0xA78C, 0x1, 0x49, 0, -1 }, -// a78d LATIN CAPITAL LETTER TURNED H - { 0xA78D, 0x1, 0x89, -42280, 0 }, -// a78e LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT - { 0xA78E, 0x1, 0x49, 0, 0 }, -// a790 LATIN CAPITAL LETTER N WITH DESCENDER - { 0xA790, 0x1, 0x89, 1, 0 }, -// a791 LATIN SMALL LETTER N WITH DESCENDER - { 0xA791, 0x1, 0x49, 0, -1 }, -// a792 LATIN CAPITAL LETTER C WITH BAR - { 0xA792, 0x1, 0x89, 1, 0 }, -// a793 LATIN SMALL LETTER C WITH BAR - { 0xA793, 0x1, 0x49, 0, -1 }, -// a794 LATIN SMALL LETTER C WITH PALATAL HOOK -// a795 LATIN SMALL LETTER H WITH PALATAL HOOK - { 0xA794, 0x2, 0x49, 0, 0 }, -// a796 LATIN CAPITAL LETTER B WITH FLOURISH - { 0xA796, 0x1, 0x89, 1, 0 }, -// a797 LATIN SMALL LETTER B WITH FLOURISH - { 0xA797, 0x1, 0x49, 0, -1 }, -// a798 LATIN CAPITAL LETTER F WITH STROKE - { 0xA798, 0x1, 0x89, 1, 0 }, -// a799 LATIN SMALL LETTER F WITH STROKE - { 0xA799, 0x1, 0x49, 0, -1 }, -// a79a LATIN CAPITAL LETTER VOLAPUK AE - { 0xA79A, 0x1, 0x89, 1, 0 }, -// a79b LATIN SMALL LETTER VOLAPUK AE - { 0xA79B, 0x1, 0x49, 0, -1 }, -// a79c LATIN CAPITAL LETTER VOLAPUK OE - { 0xA79C, 0x1, 0x89, 1, 0 }, -// a79d LATIN SMALL LETTER VOLAPUK OE - { 0xA79D, 0x1, 0x49, 0, -1 }, -// a79e LATIN CAPITAL LETTER VOLAPUK UE - { 0xA79E, 0x1, 0x89, 1, 0 }, -// a79f LATIN SMALL LETTER VOLAPUK UE - { 0xA79F, 0x1, 0x49, 0, -1 }, -// a7a0 LATIN CAPITAL LETTER G WITH OBLIQUE STROKE - { 0xA7A0, 0x1, 0x89, 1, 0 }, -// a7a1 LATIN SMALL LETTER G WITH OBLIQUE STROKE - { 0xA7A1, 0x1, 0x49, 0, -1 }, -// a7a2 LATIN CAPITAL LETTER K WITH OBLIQUE STROKE - { 0xA7A2, 0x1, 0x89, 1, 0 }, -// a7a3 LATIN SMALL LETTER K WITH OBLIQUE STROKE - { 0xA7A3, 0x1, 0x49, 0, -1 }, -// a7a4 LATIN CAPITAL LETTER N WITH OBLIQUE STROKE - { 0xA7A4, 0x1, 0x89, 1, 0 }, -// a7a5 LATIN SMALL LETTER N WITH OBLIQUE STROKE - { 0xA7A5, 0x1, 0x49, 0, -1 }, -// a7a6 LATIN CAPITAL LETTER R WITH OBLIQUE STROKE - { 0xA7A6, 0x1, 0x89, 1, 0 }, -// a7a7 LATIN SMALL LETTER R WITH OBLIQUE STROKE - { 0xA7A7, 0x1, 0x49, 0, -1 }, -// a7a8 LATIN CAPITAL LETTER S WITH OBLIQUE STROKE - { 0xA7A8, 0x1, 0x89, 1, 0 }, -// a7a9 LATIN SMALL LETTER S WITH OBLIQUE STROKE - { 0xA7A9, 0x1, 0x49, 0, -1 }, -// a7aa LATIN CAPITAL LETTER H WITH HOOK - { 0xA7AA, 0x1, 0x89, -42308, 0 }, -// a7ab LATIN CAPITAL LETTER REVERSED OPEN E - { 0xA7AB, 0x1, 0x89, -42319, 0 }, -// a7ac LATIN CAPITAL LETTER SCRIPT G - { 0xA7AC, 0x1, 0x89, -42315, 0 }, -// a7ad LATIN CAPITAL LETTER L WITH BELT - { 0xA7AD, 0x1, 0x89, -42305, 0 }, -// a7b0 LATIN CAPITAL LETTER TURNED K - { 0xA7B0, 0x1, 0x89, -42258, 0 }, -// a7b1 LATIN CAPITAL LETTER TURNED T - { 0xA7B1, 0x1, 0x89, -42282, 0 }, -// a7f7 LATIN EPIGRAPHIC LETTER SIDEWAYS I -// a7f8 MODIFIER LETTER CAPITAL H WITH STROKE -// a7f9 MODIFIER LETTER SMALL LIGATURE OE - { 0xA7F7, 0x3, 0x9, 0, 0 }, -// a7fa LATIN LETTER SMALL CAPITAL TURNED M - { 0xA7FA, 0x1, 0x49, 0, 0 }, -// a7fb LATIN EPIGRAPHIC LETTER REVERSED F -// a7fc LATIN EPIGRAPHIC LETTER REVERSED P -// a7fd LATIN EPIGRAPHIC LETTER INVERTED M -// a7fe LATIN EPIGRAPHIC LETTER I LONGA -// a7ff LATIN EPIGRAPHIC LETTER ARCHAIC M -// a800 SYLOTI NAGRI LETTER A -// a801 SYLOTI NAGRI LETTER I - { 0xA7FB, 0x7, 0x9, 0, 0 }, -// a802 SYLOTI NAGRI SIGN DVISVARA - { 0xA802, 0x1, 0x0, 0, 0 }, -// a803 SYLOTI NAGRI LETTER U -// a804 SYLOTI NAGRI LETTER E -// a805 SYLOTI NAGRI LETTER O - { 0xA803, 0x3, 0x9, 0, 0 }, -// a806 SYLOTI NAGRI SIGN HASANTA - { 0xA806, 0x1, 0x0, 0, 0 }, -// a807 SYLOTI NAGRI LETTER KO -// a808 SYLOTI NAGRI LETTER KHO -// a809 SYLOTI NAGRI LETTER GO -// a80a SYLOTI NAGRI LETTER GHO - { 0xA807, 0x4, 0x9, 0, 0 }, -// a80b SYLOTI NAGRI SIGN ANUSVARA - { 0xA80B, 0x1, 0x0, 0, 0 }, -// a80c SYLOTI NAGRI LETTER CO -// a80d SYLOTI NAGRI LETTER CHO -// a80e SYLOTI NAGRI LETTER JO -// a80f SYLOTI NAGRI LETTER JHO -// a810 SYLOTI NAGRI LETTER TTO -// a811 SYLOTI NAGRI LETTER TTHO -// a812 SYLOTI NAGRI LETTER DDO -// a813 SYLOTI NAGRI LETTER DDHO -// a814 SYLOTI NAGRI LETTER TO -// a815 SYLOTI NAGRI LETTER THO -// a816 SYLOTI NAGRI LETTER DO -// a817 SYLOTI NAGRI LETTER DHO -// a818 SYLOTI NAGRI LETTER NO -// a819 SYLOTI NAGRI LETTER PO -// a81a SYLOTI NAGRI LETTER PHO -// a81b SYLOTI NAGRI LETTER BO -// a81c SYLOTI NAGRI LETTER BHO -// a81d SYLOTI NAGRI LETTER MO -// a81e SYLOTI NAGRI LETTER RO -// a81f SYLOTI NAGRI LETTER LO -// a820 SYLOTI NAGRI LETTER RRO -// a821 SYLOTI NAGRI LETTER SO -// a822 SYLOTI NAGRI LETTER HO - { 0xA80C, 0x17, 0x9, 0, 0 }, -// a823 SYLOTI NAGRI VOWEL SIGN A -// a824 SYLOTI NAGRI VOWEL SIGN I -// a825 SYLOTI NAGRI VOWEL SIGN U -// a826 SYLOTI NAGRI VOWEL SIGN E -// a827 SYLOTI NAGRI VOWEL SIGN OO - { 0xA823, 0x5, 0x0, 0, 0 }, -// a828 SYLOTI NAGRI POETRY MARK-1 -// a829 SYLOTI NAGRI POETRY MARK-2 -// a82a SYLOTI NAGRI POETRY MARK-3 -// a82b SYLOTI NAGRI POETRY MARK-4 - { 0xA828, 0x4, 0x8, 0, 0 }, -// a830 NORTH INDIC FRACTION ONE QUARTER -// a831 NORTH INDIC FRACTION ONE HALF -// a832 NORTH INDIC FRACTION THREE QUARTERS -// a833 NORTH INDIC FRACTION ONE SIXTEENTH -// a834 NORTH INDIC FRACTION ONE EIGHTH -// a835 NORTH INDIC FRACTION THREE SIXTEENTHS -// a836 NORTH INDIC QUARTER MARK -// a837 NORTH INDIC PLACEHOLDER MARK -// a838 NORTH INDIC RUPEE MARK -// a839 NORTH INDIC QUANTITY MARK - { 0xA830, 0xA, 0x8, 0, 0 }, -// a840 PHAGS-PA LETTER KA -// a841 PHAGS-PA LETTER KHA -// a842 PHAGS-PA LETTER GA -// a843 PHAGS-PA LETTER NGA -// a844 PHAGS-PA LETTER CA -// a845 PHAGS-PA LETTER CHA -// a846 PHAGS-PA LETTER JA -// a847 PHAGS-PA LETTER NYA -// a848 PHAGS-PA LETTER TA -// a849 PHAGS-PA LETTER THA -// a84a PHAGS-PA LETTER DA -// a84b PHAGS-PA LETTER NA -// a84c PHAGS-PA LETTER PA -// a84d PHAGS-PA LETTER PHA -// a84e PHAGS-PA LETTER BA -// a84f PHAGS-PA LETTER MA -// a850 PHAGS-PA LETTER TSA -// a851 PHAGS-PA LETTER TSHA -// a852 PHAGS-PA LETTER DZA -// a853 PHAGS-PA LETTER WA -// a854 PHAGS-PA LETTER ZHA -// a855 PHAGS-PA LETTER ZA -// a856 PHAGS-PA LETTER SMALL A -// a857 PHAGS-PA LETTER YA -// a858 PHAGS-PA LETTER RA -// a859 PHAGS-PA LETTER LA -// a85a PHAGS-PA LETTER SHA -// a85b PHAGS-PA LETTER SA -// a85c PHAGS-PA LETTER HA -// a85d PHAGS-PA LETTER A -// a85e PHAGS-PA LETTER I -// a85f PHAGS-PA LETTER U -// a860 PHAGS-PA LETTER E -// a861 PHAGS-PA LETTER O -// a862 PHAGS-PA LETTER QA -// a863 PHAGS-PA LETTER XA -// a864 PHAGS-PA LETTER FA -// a865 PHAGS-PA LETTER GGA -// a866 PHAGS-PA LETTER EE -// a867 PHAGS-PA SUBJOINED LETTER WA -// a868 PHAGS-PA SUBJOINED LETTER YA -// a869 PHAGS-PA LETTER TTA -// a86a PHAGS-PA LETTER TTHA -// a86b PHAGS-PA LETTER DDA -// a86c PHAGS-PA LETTER NNA -// a86d PHAGS-PA LETTER ALTERNATE YA -// a86e PHAGS-PA LETTER VOICELESS SHA -// a86f PHAGS-PA LETTER VOICED HA -// a870 PHAGS-PA LETTER ASPIRATED FA -// a871 PHAGS-PA SUBJOINED LETTER RA -// a872 PHAGS-PA SUPERFIXED LETTER RA -// a873 PHAGS-PA LETTER CANDRABINDU - { 0xA840, 0x34, 0x9, 0, 0 }, -// a874 PHAGS-PA SINGLE HEAD MARK -// a875 PHAGS-PA DOUBLE HEAD MARK -// a876 PHAGS-PA MARK SHAD -// a877 PHAGS-PA MARK DOUBLE SHAD - { 0xA874, 0x4, 0x18, 0, 0 }, -// a880 SAURASHTRA SIGN ANUSVARA -// a881 SAURASHTRA SIGN VISARGA - { 0xA880, 0x2, 0x0, 0, 0 }, -// a882 SAURASHTRA LETTER A -// a883 SAURASHTRA LETTER AA -// a884 SAURASHTRA LETTER I -// a885 SAURASHTRA LETTER II -// a886 SAURASHTRA LETTER U -// a887 SAURASHTRA LETTER UU -// a888 SAURASHTRA LETTER VOCALIC R -// a889 SAURASHTRA LETTER VOCALIC RR -// a88a SAURASHTRA LETTER VOCALIC L -// a88b SAURASHTRA LETTER VOCALIC LL -// a88c SAURASHTRA LETTER E -// a88d SAURASHTRA LETTER EE -// a88e SAURASHTRA LETTER AI -// a88f SAURASHTRA LETTER O -// a890 SAURASHTRA LETTER OO -// a891 SAURASHTRA LETTER AU -// a892 SAURASHTRA LETTER KA -// a893 SAURASHTRA LETTER KHA -// a894 SAURASHTRA LETTER GA -// a895 SAURASHTRA LETTER GHA -// a896 SAURASHTRA LETTER NGA -// a897 SAURASHTRA LETTER CA -// a898 SAURASHTRA LETTER CHA -// a899 SAURASHTRA LETTER JA -// a89a SAURASHTRA LETTER JHA -// a89b SAURASHTRA LETTER NYA -// a89c SAURASHTRA LETTER TTA -// a89d SAURASHTRA LETTER TTHA -// a89e SAURASHTRA LETTER DDA -// a89f SAURASHTRA LETTER DDHA -// a8a0 SAURASHTRA LETTER NNA -// a8a1 SAURASHTRA LETTER TA -// a8a2 SAURASHTRA LETTER THA -// a8a3 SAURASHTRA LETTER DA -// a8a4 SAURASHTRA LETTER DHA -// a8a5 SAURASHTRA LETTER NA -// a8a6 SAURASHTRA LETTER PA -// a8a7 SAURASHTRA LETTER PHA -// a8a8 SAURASHTRA LETTER BA -// a8a9 SAURASHTRA LETTER BHA -// a8aa SAURASHTRA LETTER MA -// a8ab SAURASHTRA LETTER YA -// a8ac SAURASHTRA LETTER RA -// a8ad SAURASHTRA LETTER LA -// a8ae SAURASHTRA LETTER VA -// a8af SAURASHTRA LETTER SHA -// a8b0 SAURASHTRA LETTER SSA -// a8b1 SAURASHTRA LETTER SA -// a8b2 SAURASHTRA LETTER HA -// a8b3 SAURASHTRA LETTER LLA - { 0xA882, 0x32, 0x9, 0, 0 }, -// a8b4 SAURASHTRA CONSONANT SIGN HAARU -// a8b5 SAURASHTRA VOWEL SIGN AA -// a8b6 SAURASHTRA VOWEL SIGN I -// a8b7 SAURASHTRA VOWEL SIGN II -// a8b8 SAURASHTRA VOWEL SIGN U -// a8b9 SAURASHTRA VOWEL SIGN UU -// a8ba SAURASHTRA VOWEL SIGN VOCALIC R -// a8bb SAURASHTRA VOWEL SIGN VOCALIC RR -// a8bc SAURASHTRA VOWEL SIGN VOCALIC L -// a8bd SAURASHTRA VOWEL SIGN VOCALIC LL -// a8be SAURASHTRA VOWEL SIGN E -// a8bf SAURASHTRA VOWEL SIGN EE -// a8c0 SAURASHTRA VOWEL SIGN AI -// a8c1 SAURASHTRA VOWEL SIGN O -// a8c2 SAURASHTRA VOWEL SIGN OO -// a8c3 SAURASHTRA VOWEL SIGN AU -// a8c4 SAURASHTRA SIGN VIRAMA - { 0xA8B4, 0x11, 0x0, 0, 0 }, -// a8ce SAURASHTRA DANDA -// a8cf SAURASHTRA DOUBLE DANDA - { 0xA8CE, 0x2, 0x18, 0, 0 }, -// a8d0 SAURASHTRA DIGIT ZERO -// a8d1 SAURASHTRA DIGIT ONE -// a8d2 SAURASHTRA DIGIT TWO -// a8d3 SAURASHTRA DIGIT THREE -// a8d4 SAURASHTRA DIGIT FOUR -// a8d5 SAURASHTRA DIGIT FIVE -// a8d6 SAURASHTRA DIGIT SIX -// a8d7 SAURASHTRA DIGIT SEVEN -// a8d8 SAURASHTRA DIGIT EIGHT -// a8d9 SAURASHTRA DIGIT NINE - { 0xA8D0, 0xA, 0x108, 0, 0 }, -// a8e0 COMBINING DEVANAGARI DIGIT ZERO -// a8e1 COMBINING DEVANAGARI DIGIT ONE -// a8e2 COMBINING DEVANAGARI DIGIT TWO -// a8e3 COMBINING DEVANAGARI DIGIT THREE -// a8e4 COMBINING DEVANAGARI DIGIT FOUR -// a8e5 COMBINING DEVANAGARI DIGIT FIVE -// a8e6 COMBINING DEVANAGARI DIGIT SIX -// a8e7 COMBINING DEVANAGARI DIGIT SEVEN -// a8e8 COMBINING DEVANAGARI DIGIT EIGHT -// a8e9 COMBINING DEVANAGARI DIGIT NINE -// a8ea COMBINING DEVANAGARI LETTER A -// a8eb COMBINING DEVANAGARI LETTER U -// a8ec COMBINING DEVANAGARI LETTER KA -// a8ed COMBINING DEVANAGARI LETTER NA -// a8ee COMBINING DEVANAGARI LETTER PA -// a8ef COMBINING DEVANAGARI LETTER RA -// a8f0 COMBINING DEVANAGARI LETTER VI -// a8f1 COMBINING DEVANAGARI SIGN AVAGRAHA - { 0xA8E0, 0x12, 0x0, 0, 0 }, -// a8f2 DEVANAGARI SIGN SPACING CANDRABINDU -// a8f3 DEVANAGARI SIGN CANDRABINDU VIRAMA -// a8f4 DEVANAGARI SIGN DOUBLE CANDRABINDU VIRAMA -// a8f5 DEVANAGARI SIGN CANDRABINDU TWO -// a8f6 DEVANAGARI SIGN CANDRABINDU THREE -// a8f7 DEVANAGARI SIGN CANDRABINDU AVAGRAHA - { 0xA8F2, 0x6, 0x9, 0, 0 }, -// a8f8 DEVANAGARI SIGN PUSHPIKA -// a8f9 DEVANAGARI GAP FILLER -// a8fa DEVANAGARI CARET - { 0xA8F8, 0x3, 0x18, 0, 0 }, -// a8fb DEVANAGARI HEADSTROKE - { 0xA8FB, 0x1, 0x9, 0, 0 }, -// a900 KAYAH LI DIGIT ZERO -// a901 KAYAH LI DIGIT ONE -// a902 KAYAH LI DIGIT TWO -// a903 KAYAH LI DIGIT THREE -// a904 KAYAH LI DIGIT FOUR -// a905 KAYAH LI DIGIT FIVE -// a906 KAYAH LI DIGIT SIX -// a907 KAYAH LI DIGIT SEVEN -// a908 KAYAH LI DIGIT EIGHT -// a909 KAYAH LI DIGIT NINE - { 0xA900, 0xA, 0x108, 0, 0 }, -// a90a KAYAH LI LETTER KA -// a90b KAYAH LI LETTER KHA -// a90c KAYAH LI LETTER GA -// a90d KAYAH LI LETTER NGA -// a90e KAYAH LI LETTER SA -// a90f KAYAH LI LETTER SHA -// a910 KAYAH LI LETTER ZA -// a911 KAYAH LI LETTER NYA -// a912 KAYAH LI LETTER TA -// a913 KAYAH LI LETTER HTA -// a914 KAYAH LI LETTER NA -// a915 KAYAH LI LETTER PA -// a916 KAYAH LI LETTER PHA -// a917 KAYAH LI LETTER MA -// a918 KAYAH LI LETTER DA -// a919 KAYAH LI LETTER BA -// a91a KAYAH LI LETTER RA -// a91b KAYAH LI LETTER YA -// a91c KAYAH LI LETTER LA -// a91d KAYAH LI LETTER WA -// a91e KAYAH LI LETTER THA -// a91f KAYAH LI LETTER HA -// a920 KAYAH LI LETTER VA -// a921 KAYAH LI LETTER CA -// a922 KAYAH LI LETTER A -// a923 KAYAH LI LETTER OE -// a924 KAYAH LI LETTER I -// a925 KAYAH LI LETTER OO - { 0xA90A, 0x1C, 0x9, 0, 0 }, -// a926 KAYAH LI VOWEL UE -// a927 KAYAH LI VOWEL E -// a928 KAYAH LI VOWEL U -// a929 KAYAH LI VOWEL EE -// a92a KAYAH LI VOWEL O -// a92b KAYAH LI TONE PLOPHU -// a92c KAYAH LI TONE CALYA -// a92d KAYAH LI TONE CALYA PLOPHU - { 0xA926, 0x8, 0x0, 0, 0 }, -// a92e KAYAH LI SIGN CWI -// a92f KAYAH LI SIGN SHYA - { 0xA92E, 0x2, 0x18, 0, 0 }, -// a930 REJANG LETTER KA -// a931 REJANG LETTER GA -// a932 REJANG LETTER NGA -// a933 REJANG LETTER TA -// a934 REJANG LETTER DA -// a935 REJANG LETTER NA -// a936 REJANG LETTER PA -// a937 REJANG LETTER BA -// a938 REJANG LETTER MA -// a939 REJANG LETTER CA -// a93a REJANG LETTER JA -// a93b REJANG LETTER NYA -// a93c REJANG LETTER SA -// a93d REJANG LETTER RA -// a93e REJANG LETTER LA -// a93f REJANG LETTER YA -// a940 REJANG LETTER WA -// a941 REJANG LETTER HA -// a942 REJANG LETTER MBA -// a943 REJANG LETTER NGGA -// a944 REJANG LETTER NDA -// a945 REJANG LETTER NYJA -// a946 REJANG LETTER A - { 0xA930, 0x17, 0x9, 0, 0 }, -// a947 REJANG VOWEL SIGN I -// a948 REJANG VOWEL SIGN U -// a949 REJANG VOWEL SIGN E -// a94a REJANG VOWEL SIGN AI -// a94b REJANG VOWEL SIGN O -// a94c REJANG VOWEL SIGN AU -// a94d REJANG VOWEL SIGN EU -// a94e REJANG VOWEL SIGN EA -// a94f REJANG CONSONANT SIGN NG -// a950 REJANG CONSONANT SIGN N -// a951 REJANG CONSONANT SIGN R -// a952 REJANG CONSONANT SIGN H -// a953 REJANG VIRAMA - { 0xA947, 0xD, 0x0, 0, 0 }, -// a95f REJANG SECTION MARK - { 0xA95F, 0x1, 0x18, 0, 0 }, -// a960 HANGUL CHOSEONG TIKEUT-MIEUM -// a961 HANGUL CHOSEONG TIKEUT-PIEUP -// a962 HANGUL CHOSEONG TIKEUT-SIOS -// a963 HANGUL CHOSEONG TIKEUT-CIEUC -// a964 HANGUL CHOSEONG RIEUL-KIYEOK -// a965 HANGUL CHOSEONG RIEUL-SSANGKIYEOK -// a966 HANGUL CHOSEONG RIEUL-TIKEUT -// a967 HANGUL CHOSEONG RIEUL-SSANGTIKEUT -// a968 HANGUL CHOSEONG RIEUL-MIEUM -// a969 HANGUL CHOSEONG RIEUL-PIEUP -// a96a HANGUL CHOSEONG RIEUL-SSANGPIEUP -// a96b HANGUL CHOSEONG RIEUL-KAPYEOUNPIEUP -// a96c HANGUL CHOSEONG RIEUL-SIOS -// a96d HANGUL CHOSEONG RIEUL-CIEUC -// a96e HANGUL CHOSEONG RIEUL-KHIEUKH -// a96f HANGUL CHOSEONG MIEUM-KIYEOK -// a970 HANGUL CHOSEONG MIEUM-TIKEUT -// a971 HANGUL CHOSEONG MIEUM-SIOS -// a972 HANGUL CHOSEONG PIEUP-SIOS-THIEUTH -// a973 HANGUL CHOSEONG PIEUP-KHIEUKH -// a974 HANGUL CHOSEONG PIEUP-HIEUH -// a975 HANGUL CHOSEONG SSANGSIOS-PIEUP -// a976 HANGUL CHOSEONG IEUNG-RIEUL -// a977 HANGUL CHOSEONG IEUNG-HIEUH -// a978 HANGUL CHOSEONG SSANGCIEUC-HIEUH -// a979 HANGUL CHOSEONG SSANGTHIEUTH -// a97a HANGUL CHOSEONG PHIEUPH-HIEUH -// a97b HANGUL CHOSEONG HIEUH-SIOS -// a97c HANGUL CHOSEONG SSANGYEORINHIEUH - { 0xA960, 0x1D, 0x9, 0, 0 }, -// a980 JAVANESE SIGN PANYANGGA -// a981 JAVANESE SIGN CECAK -// a982 JAVANESE SIGN LAYAR -// a983 JAVANESE SIGN WIGNYAN - { 0xA980, 0x4, 0x0, 0, 0 }, -// a984 JAVANESE LETTER A -// a985 JAVANESE LETTER I KAWI -// a986 JAVANESE LETTER I -// a987 JAVANESE LETTER II -// a988 JAVANESE LETTER U -// a989 JAVANESE LETTER PA CEREK -// a98a JAVANESE LETTER NGA LELET -// a98b JAVANESE LETTER NGA LELET RASWADI -// a98c JAVANESE LETTER E -// a98d JAVANESE LETTER AI -// a98e JAVANESE LETTER O -// a98f JAVANESE LETTER KA -// a990 JAVANESE LETTER KA SASAK -// a991 JAVANESE LETTER KA MURDA -// a992 JAVANESE LETTER GA -// a993 JAVANESE LETTER GA MURDA -// a994 JAVANESE LETTER NGA -// a995 JAVANESE LETTER CA -// a996 JAVANESE LETTER CA MURDA -// a997 JAVANESE LETTER JA -// a998 JAVANESE LETTER NYA MURDA -// a999 JAVANESE LETTER JA MAHAPRANA -// a99a JAVANESE LETTER NYA -// a99b JAVANESE LETTER TTA -// a99c JAVANESE LETTER TTA MAHAPRANA -// a99d JAVANESE LETTER DDA -// a99e JAVANESE LETTER DDA MAHAPRANA -// a99f JAVANESE LETTER NA MURDA -// a9a0 JAVANESE LETTER TA -// a9a1 JAVANESE LETTER TA MURDA -// a9a2 JAVANESE LETTER DA -// a9a3 JAVANESE LETTER DA MAHAPRANA -// a9a4 JAVANESE LETTER NA -// a9a5 JAVANESE LETTER PA -// a9a6 JAVANESE LETTER PA MURDA -// a9a7 JAVANESE LETTER BA -// a9a8 JAVANESE LETTER BA MURDA -// a9a9 JAVANESE LETTER MA -// a9aa JAVANESE LETTER YA -// a9ab JAVANESE LETTER RA -// a9ac JAVANESE LETTER RA AGUNG -// a9ad JAVANESE LETTER LA -// a9ae JAVANESE LETTER WA -// a9af JAVANESE LETTER SA MURDA -// a9b0 JAVANESE LETTER SA MAHAPRANA -// a9b1 JAVANESE LETTER SA -// a9b2 JAVANESE LETTER HA - { 0xA984, 0x2F, 0x9, 0, 0 }, -// a9b3 JAVANESE SIGN CECAK TELU -// a9b4 JAVANESE VOWEL SIGN TARUNG -// a9b5 JAVANESE VOWEL SIGN TOLONG -// a9b6 JAVANESE VOWEL SIGN WULU -// a9b7 JAVANESE VOWEL SIGN WULU MELIK -// a9b8 JAVANESE VOWEL SIGN SUKU -// a9b9 JAVANESE VOWEL SIGN SUKU MENDUT -// a9ba JAVANESE VOWEL SIGN TALING -// a9bb JAVANESE VOWEL SIGN DIRGA MURE -// a9bc JAVANESE VOWEL SIGN PEPET -// a9bd JAVANESE CONSONANT SIGN KERET -// a9be JAVANESE CONSONANT SIGN PENGKAL -// a9bf JAVANESE CONSONANT SIGN CAKRA -// a9c0 JAVANESE PANGKON - { 0xA9B3, 0xE, 0x0, 0, 0 }, -// a9c1 JAVANESE LEFT RERENGGAN -// a9c2 JAVANESE RIGHT RERENGGAN -// a9c3 JAVANESE PADA ANDAP -// a9c4 JAVANESE PADA MADYA -// a9c5 JAVANESE PADA LUHUR -// a9c6 JAVANESE PADA WINDU -// a9c7 JAVANESE PADA PANGKAT -// a9c8 JAVANESE PADA LINGSA -// a9c9 JAVANESE PADA LUNGSI -// a9ca JAVANESE PADA ADEG -// a9cb JAVANESE PADA ADEG ADEG -// a9cc JAVANESE PADA PISELEH -// a9cd JAVANESE TURNED PADA PISELEH - { 0xA9C1, 0xD, 0x18, 0, 0 }, -// a9cf JAVANESE PANGRANGKEP - { 0xA9CF, 0x1, 0x9, 0, 0 }, -// a9d0 JAVANESE DIGIT ZERO -// a9d1 JAVANESE DIGIT ONE -// a9d2 JAVANESE DIGIT TWO -// a9d3 JAVANESE DIGIT THREE -// a9d4 JAVANESE DIGIT FOUR -// a9d5 JAVANESE DIGIT FIVE -// a9d6 JAVANESE DIGIT SIX -// a9d7 JAVANESE DIGIT SEVEN -// a9d8 JAVANESE DIGIT EIGHT -// a9d9 JAVANESE DIGIT NINE - { 0xA9D0, 0xA, 0x108, 0, 0 }, -// a9de JAVANESE PADA TIRTA TUMETES -// a9df JAVANESE PADA ISEN-ISEN - { 0xA9DE, 0x2, 0x18, 0, 0 }, -// a9e0 MYANMAR LETTER SHAN GHA -// a9e1 MYANMAR LETTER SHAN CHA -// a9e2 MYANMAR LETTER SHAN JHA -// a9e3 MYANMAR LETTER SHAN NNA -// a9e4 MYANMAR LETTER SHAN BHA - { 0xA9E0, 0x5, 0x9, 0, 0 }, -// a9e5 MYANMAR SIGN SHAN SAW - { 0xA9E5, 0x1, 0x0, 0, 0 }, -// a9e6 MYANMAR MODIFIER LETTER SHAN REDUPLICATION -// a9e7 MYANMAR LETTER TAI LAING NYA -// a9e8 MYANMAR LETTER TAI LAING FA -// a9e9 MYANMAR LETTER TAI LAING GA -// a9ea MYANMAR LETTER TAI LAING GHA -// a9eb MYANMAR LETTER TAI LAING JA -// a9ec MYANMAR LETTER TAI LAING JHA -// a9ed MYANMAR LETTER TAI LAING DDA -// a9ee MYANMAR LETTER TAI LAING DDHA -// a9ef MYANMAR LETTER TAI LAING NNA - { 0xA9E6, 0xA, 0x9, 0, 0 }, -// a9f0 MYANMAR TAI LAING DIGIT ZERO -// a9f1 MYANMAR TAI LAING DIGIT ONE -// a9f2 MYANMAR TAI LAING DIGIT TWO -// a9f3 MYANMAR TAI LAING DIGIT THREE -// a9f4 MYANMAR TAI LAING DIGIT FOUR -// a9f5 MYANMAR TAI LAING DIGIT FIVE -// a9f6 MYANMAR TAI LAING DIGIT SIX -// a9f7 MYANMAR TAI LAING DIGIT SEVEN -// a9f8 MYANMAR TAI LAING DIGIT EIGHT -// a9f9 MYANMAR TAI LAING DIGIT NINE - { 0xA9F0, 0xA, 0x108, 0, 0 }, -// a9fa MYANMAR LETTER TAI LAING LLA -// a9fb MYANMAR LETTER TAI LAING DA -// a9fc MYANMAR LETTER TAI LAING DHA -// a9fd MYANMAR LETTER TAI LAING BA -// a9fe MYANMAR LETTER TAI LAING BHA - { 0xA9FA, 0x5, 0x9, 0, 0 }, -// aa00 CHAM LETTER A -// aa01 CHAM LETTER I -// aa02 CHAM LETTER U -// aa03 CHAM LETTER E -// aa04 CHAM LETTER AI -// aa05 CHAM LETTER O -// aa06 CHAM LETTER KA -// aa07 CHAM LETTER KHA -// aa08 CHAM LETTER GA -// aa09 CHAM LETTER GHA -// aa0a CHAM LETTER NGUE -// aa0b CHAM LETTER NGA -// aa0c CHAM LETTER CHA -// aa0d CHAM LETTER CHHA -// aa0e CHAM LETTER JA -// aa0f CHAM LETTER JHA -// aa10 CHAM LETTER NHUE -// aa11 CHAM LETTER NHA -// aa12 CHAM LETTER NHJA -// aa13 CHAM LETTER TA -// aa14 CHAM LETTER THA -// aa15 CHAM LETTER DA -// aa16 CHAM LETTER DHA -// aa17 CHAM LETTER NUE -// aa18 CHAM LETTER NA -// aa19 CHAM LETTER DDA -// aa1a CHAM LETTER PA -// aa1b CHAM LETTER PPA -// aa1c CHAM LETTER PHA -// aa1d CHAM LETTER BA -// aa1e CHAM LETTER BHA -// aa1f CHAM LETTER MUE -// aa20 CHAM LETTER MA -// aa21 CHAM LETTER BBA -// aa22 CHAM LETTER YA -// aa23 CHAM LETTER RA -// aa24 CHAM LETTER LA -// aa25 CHAM LETTER VA -// aa26 CHAM LETTER SSA -// aa27 CHAM LETTER SA -// aa28 CHAM LETTER HA - { 0xAA00, 0x29, 0x9, 0, 0 }, -// aa29 CHAM VOWEL SIGN AA -// aa2a CHAM VOWEL SIGN I -// aa2b CHAM VOWEL SIGN II -// aa2c CHAM VOWEL SIGN EI -// aa2d CHAM VOWEL SIGN U -// aa2e CHAM VOWEL SIGN OE -// aa2f CHAM VOWEL SIGN O -// aa30 CHAM VOWEL SIGN AI -// aa31 CHAM VOWEL SIGN AU -// aa32 CHAM VOWEL SIGN UE -// aa33 CHAM CONSONANT SIGN YA -// aa34 CHAM CONSONANT SIGN RA -// aa35 CHAM CONSONANT SIGN LA -// aa36 CHAM CONSONANT SIGN WA - { 0xAA29, 0xE, 0x0, 0, 0 }, -// aa40 CHAM LETTER FINAL K -// aa41 CHAM LETTER FINAL G -// aa42 CHAM LETTER FINAL NG - { 0xAA40, 0x3, 0x9, 0, 0 }, -// aa43 CHAM CONSONANT SIGN FINAL NG - { 0xAA43, 0x1, 0x0, 0, 0 }, -// aa44 CHAM LETTER FINAL CH -// aa45 CHAM LETTER FINAL T -// aa46 CHAM LETTER FINAL N -// aa47 CHAM LETTER FINAL P -// aa48 CHAM LETTER FINAL Y -// aa49 CHAM LETTER FINAL R -// aa4a CHAM LETTER FINAL L -// aa4b CHAM LETTER FINAL SS - { 0xAA44, 0x8, 0x9, 0, 0 }, -// aa4c CHAM CONSONANT SIGN FINAL M -// aa4d CHAM CONSONANT SIGN FINAL H - { 0xAA4C, 0x2, 0x0, 0, 0 }, -// aa50 CHAM DIGIT ZERO -// aa51 CHAM DIGIT ONE -// aa52 CHAM DIGIT TWO -// aa53 CHAM DIGIT THREE -// aa54 CHAM DIGIT FOUR -// aa55 CHAM DIGIT FIVE -// aa56 CHAM DIGIT SIX -// aa57 CHAM DIGIT SEVEN -// aa58 CHAM DIGIT EIGHT -// aa59 CHAM DIGIT NINE - { 0xAA50, 0xA, 0x108, 0, 0 }, -// aa5c CHAM PUNCTUATION SPIRAL -// aa5d CHAM PUNCTUATION DANDA -// aa5e CHAM PUNCTUATION DOUBLE DANDA -// aa5f CHAM PUNCTUATION TRIPLE DANDA - { 0xAA5C, 0x4, 0x18, 0, 0 }, -// aa60 MYANMAR LETTER KHAMTI GA -// aa61 MYANMAR LETTER KHAMTI CA -// aa62 MYANMAR LETTER KHAMTI CHA -// aa63 MYANMAR LETTER KHAMTI JA -// aa64 MYANMAR LETTER KHAMTI JHA -// aa65 MYANMAR LETTER KHAMTI NYA -// aa66 MYANMAR LETTER KHAMTI TTA -// aa67 MYANMAR LETTER KHAMTI TTHA -// aa68 MYANMAR LETTER KHAMTI DDA -// aa69 MYANMAR LETTER KHAMTI DDHA -// aa6a MYANMAR LETTER KHAMTI DHA -// aa6b MYANMAR LETTER KHAMTI NA -// aa6c MYANMAR LETTER KHAMTI SA -// aa6d MYANMAR LETTER KHAMTI HA -// aa6e MYANMAR LETTER KHAMTI HHA -// aa6f MYANMAR LETTER KHAMTI FA -// aa70 MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION -// aa71 MYANMAR LETTER KHAMTI XA -// aa72 MYANMAR LETTER KHAMTI ZA -// aa73 MYANMAR LETTER KHAMTI RA -// aa74 MYANMAR LOGOGRAM KHAMTI OAY -// aa75 MYANMAR LOGOGRAM KHAMTI QN -// aa76 MYANMAR LOGOGRAM KHAMTI HM - { 0xAA60, 0x17, 0x9, 0, 0 }, -// aa77 MYANMAR SYMBOL AITON EXCLAMATION -// aa78 MYANMAR SYMBOL AITON ONE -// aa79 MYANMAR SYMBOL AITON TWO - { 0xAA77, 0x3, 0x8, 0, 0 }, -// aa7a MYANMAR LETTER AITON RA - { 0xAA7A, 0x1, 0x9, 0, 0 }, -// aa7b MYANMAR SIGN PAO KAREN TONE -// aa7c MYANMAR SIGN TAI LAING TONE-2 -// aa7d MYANMAR SIGN TAI LAING TONE-5 - { 0xAA7B, 0x3, 0x0, 0, 0 }, -// aa7e MYANMAR LETTER SHWE PALAUNG CHA -// aa7f MYANMAR LETTER SHWE PALAUNG SHA -// aa80 TAI VIET LETTER LOW KO -// aa81 TAI VIET LETTER HIGH KO -// aa82 TAI VIET LETTER LOW KHO -// aa83 TAI VIET LETTER HIGH KHO -// aa84 TAI VIET LETTER LOW KHHO -// aa85 TAI VIET LETTER HIGH KHHO -// aa86 TAI VIET LETTER LOW GO -// aa87 TAI VIET LETTER HIGH GO -// aa88 TAI VIET LETTER LOW NGO -// aa89 TAI VIET LETTER HIGH NGO -// aa8a TAI VIET LETTER LOW CO -// aa8b TAI VIET LETTER HIGH CO -// aa8c TAI VIET LETTER LOW CHO -// aa8d TAI VIET LETTER HIGH CHO -// aa8e TAI VIET LETTER LOW SO -// aa8f TAI VIET LETTER HIGH SO -// aa90 TAI VIET LETTER LOW NYO -// aa91 TAI VIET LETTER HIGH NYO -// aa92 TAI VIET LETTER LOW DO -// aa93 TAI VIET LETTER HIGH DO -// aa94 TAI VIET LETTER LOW TO -// aa95 TAI VIET LETTER HIGH TO -// aa96 TAI VIET LETTER LOW THO -// aa97 TAI VIET LETTER HIGH THO -// aa98 TAI VIET LETTER LOW NO -// aa99 TAI VIET LETTER HIGH NO -// aa9a TAI VIET LETTER LOW BO -// aa9b TAI VIET LETTER HIGH BO -// aa9c TAI VIET LETTER LOW PO -// aa9d TAI VIET LETTER HIGH PO -// aa9e TAI VIET LETTER LOW PHO -// aa9f TAI VIET LETTER HIGH PHO -// aaa0 TAI VIET LETTER LOW FO -// aaa1 TAI VIET LETTER HIGH FO -// aaa2 TAI VIET LETTER LOW MO -// aaa3 TAI VIET LETTER HIGH MO -// aaa4 TAI VIET LETTER LOW YO -// aaa5 TAI VIET LETTER HIGH YO -// aaa6 TAI VIET LETTER LOW RO -// aaa7 TAI VIET LETTER HIGH RO -// aaa8 TAI VIET LETTER LOW LO -// aaa9 TAI VIET LETTER HIGH LO -// aaaa TAI VIET LETTER LOW VO -// aaab TAI VIET LETTER HIGH VO -// aaac TAI VIET LETTER LOW HO -// aaad TAI VIET LETTER HIGH HO -// aaae TAI VIET LETTER LOW O -// aaaf TAI VIET LETTER HIGH O - { 0xAA7E, 0x32, 0x9, 0, 0 }, -// aab0 TAI VIET MAI KANG - { 0xAAB0, 0x1, 0x0, 0, 0 }, -// aab1 TAI VIET VOWEL AA - { 0xAAB1, 0x1, 0x9, 0, 0 }, -// aab2 TAI VIET VOWEL I -// aab3 TAI VIET VOWEL UE -// aab4 TAI VIET VOWEL U - { 0xAAB2, 0x3, 0x0, 0, 0 }, -// aab5 TAI VIET VOWEL E -// aab6 TAI VIET VOWEL O - { 0xAAB5, 0x2, 0x9, 0, 0 }, -// aab7 TAI VIET MAI KHIT -// aab8 TAI VIET VOWEL IA - { 0xAAB7, 0x2, 0x0, 0, 0 }, -// aab9 TAI VIET VOWEL UEA -// aaba TAI VIET VOWEL UA -// aabb TAI VIET VOWEL AUE -// aabc TAI VIET VOWEL AY -// aabd TAI VIET VOWEL AN - { 0xAAB9, 0x5, 0x9, 0, 0 }, -// aabe TAI VIET VOWEL AM -// aabf TAI VIET TONE MAI EK - { 0xAABE, 0x2, 0x0, 0, 0 }, -// aac0 TAI VIET TONE MAI NUENG - { 0xAAC0, 0x1, 0x9, 0, 0 }, -// aac1 TAI VIET TONE MAI THO - { 0xAAC1, 0x1, 0x0, 0, 0 }, -// aac2 TAI VIET TONE MAI SONG - { 0xAAC2, 0x1, 0x9, 0, 0 }, -// aadb TAI VIET SYMBOL KON -// aadc TAI VIET SYMBOL NUENG -// aadd TAI VIET SYMBOL SAM - { 0xAADB, 0x3, 0x9, 0, 0 }, -// aade TAI VIET SYMBOL HO HOI -// aadf TAI VIET SYMBOL KOI KOI - { 0xAADE, 0x2, 0x18, 0, 0 }, -// aae0 MEETEI MAYEK LETTER E -// aae1 MEETEI MAYEK LETTER O -// aae2 MEETEI MAYEK LETTER CHA -// aae3 MEETEI MAYEK LETTER NYA -// aae4 MEETEI MAYEK LETTER TTA -// aae5 MEETEI MAYEK LETTER TTHA -// aae6 MEETEI MAYEK LETTER DDA -// aae7 MEETEI MAYEK LETTER DDHA -// aae8 MEETEI MAYEK LETTER NNA -// aae9 MEETEI MAYEK LETTER SHA -// aaea MEETEI MAYEK LETTER SSA - { 0xAAE0, 0xB, 0x9, 0, 0 }, -// aaeb MEETEI MAYEK VOWEL SIGN II -// aaec MEETEI MAYEK VOWEL SIGN UU -// aaed MEETEI MAYEK VOWEL SIGN AAI -// aaee MEETEI MAYEK VOWEL SIGN AU -// aaef MEETEI MAYEK VOWEL SIGN AAU - { 0xAAEB, 0x5, 0x0, 0, 0 }, -// aaf0 MEETEI MAYEK CHEIKHAN -// aaf1 MEETEI MAYEK AHANG KHUDAM - { 0xAAF0, 0x2, 0x18, 0, 0 }, -// aaf2 MEETEI MAYEK ANJI -// aaf3 MEETEI MAYEK SYLLABLE REPETITION MARK -// aaf4 MEETEI MAYEK WORD REPETITION MARK - { 0xAAF2, 0x3, 0x9, 0, 0 }, -// aaf5 MEETEI MAYEK VOWEL SIGN VISARGA -// aaf6 MEETEI MAYEK VIRAMA - { 0xAAF5, 0x2, 0x0, 0, 0 }, -// ab01 ETHIOPIC SYLLABLE TTHU -// ab02 ETHIOPIC SYLLABLE TTHI -// ab03 ETHIOPIC SYLLABLE TTHAA -// ab04 ETHIOPIC SYLLABLE TTHEE -// ab05 ETHIOPIC SYLLABLE TTHE -// ab06 ETHIOPIC SYLLABLE TTHO - { 0xAB01, 0x6, 0x9, 0, 0 }, -// ab09 ETHIOPIC SYLLABLE DDHU -// ab0a ETHIOPIC SYLLABLE DDHI -// ab0b ETHIOPIC SYLLABLE DDHAA -// ab0c ETHIOPIC SYLLABLE DDHEE -// ab0d ETHIOPIC SYLLABLE DDHE -// ab0e ETHIOPIC SYLLABLE DDHO - { 0xAB09, 0x6, 0x9, 0, 0 }, -// ab11 ETHIOPIC SYLLABLE DZU -// ab12 ETHIOPIC SYLLABLE DZI -// ab13 ETHIOPIC SYLLABLE DZAA -// ab14 ETHIOPIC SYLLABLE DZEE -// ab15 ETHIOPIC SYLLABLE DZE -// ab16 ETHIOPIC SYLLABLE DZO - { 0xAB11, 0x6, 0x9, 0, 0 }, -// ab20 ETHIOPIC SYLLABLE CCHHA -// ab21 ETHIOPIC SYLLABLE CCHHU -// ab22 ETHIOPIC SYLLABLE CCHHI -// ab23 ETHIOPIC SYLLABLE CCHHAA -// ab24 ETHIOPIC SYLLABLE CCHHEE -// ab25 ETHIOPIC SYLLABLE CCHHE -// ab26 ETHIOPIC SYLLABLE CCHHO - { 0xAB20, 0x7, 0x9, 0, 0 }, -// ab28 ETHIOPIC SYLLABLE BBA -// ab29 ETHIOPIC SYLLABLE BBU -// ab2a ETHIOPIC SYLLABLE BBI -// ab2b ETHIOPIC SYLLABLE BBAA -// ab2c ETHIOPIC SYLLABLE BBEE -// ab2d ETHIOPIC SYLLABLE BBE -// ab2e ETHIOPIC SYLLABLE BBO - { 0xAB28, 0x7, 0x9, 0, 0 }, -// ab30 LATIN SMALL LETTER BARRED ALPHA -// ab31 LATIN SMALL LETTER A REVERSED-SCHWA -// ab32 LATIN SMALL LETTER BLACKLETTER E -// ab33 LATIN SMALL LETTER BARRED E -// ab34 LATIN SMALL LETTER E WITH FLOURISH -// ab35 LATIN SMALL LETTER LENIS F -// ab36 LATIN SMALL LETTER SCRIPT G WITH CROSSED-TAIL -// ab37 LATIN SMALL LETTER L WITH INVERTED LAZY S -// ab38 LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE -// ab39 LATIN SMALL LETTER L WITH MIDDLE RING -// ab3a LATIN SMALL LETTER M WITH CROSSED-TAIL -// ab3b LATIN SMALL LETTER N WITH CROSSED-TAIL -// ab3c LATIN SMALL LETTER ENG WITH CROSSED-TAIL -// ab3d LATIN SMALL LETTER BLACKLETTER O -// ab3e LATIN SMALL LETTER BLACKLETTER O WITH STROKE -// ab3f LATIN SMALL LETTER OPEN O WITH STROKE -// ab40 LATIN SMALL LETTER INVERTED OE -// ab41 LATIN SMALL LETTER TURNED OE WITH STROKE -// ab42 LATIN SMALL LETTER TURNED OE WITH HORIZONTAL STROKE -// ab43 LATIN SMALL LETTER TURNED O OPEN-O -// ab44 LATIN SMALL LETTER TURNED O OPEN-O WITH STROKE -// ab45 LATIN SMALL LETTER STIRRUP R -// ab46 LATIN LETTER SMALL CAPITAL R WITH RIGHT LEG -// ab47 LATIN SMALL LETTER R WITHOUT HANDLE -// ab48 LATIN SMALL LETTER DOUBLE R -// ab49 LATIN SMALL LETTER R WITH CROSSED-TAIL -// ab4a LATIN SMALL LETTER DOUBLE R WITH CROSSED-TAIL -// ab4b LATIN SMALL LETTER SCRIPT R -// ab4c LATIN SMALL LETTER SCRIPT R WITH RING -// ab4d LATIN SMALL LETTER BASELINE ESH -// ab4e LATIN SMALL LETTER U WITH SHORT RIGHT LEG -// ab4f LATIN SMALL LETTER U BAR WITH SHORT RIGHT LEG -// ab50 LATIN SMALL LETTER UI -// ab51 LATIN SMALL LETTER TURNED UI -// ab52 LATIN SMALL LETTER U WITH LEFT HOOK -// ab53 LATIN SMALL LETTER CHI -// ab54 LATIN SMALL LETTER CHI WITH LOW RIGHT RING -// ab55 LATIN SMALL LETTER CHI WITH LOW LEFT SERIF -// ab56 LATIN SMALL LETTER X WITH LOW RIGHT RING -// ab57 LATIN SMALL LETTER X WITH LONG LEFT LEG -// ab58 LATIN SMALL LETTER X WITH LONG LEFT LEG AND LOW RIGHT RING -// ab59 LATIN SMALL LETTER X WITH LONG LEFT LEG WITH SERIF -// ab5a LATIN SMALL LETTER Y WITH SHORT RIGHT LEG - { 0xAB30, 0x2B, 0x49, 0, 0 }, -// ab5b MODIFIER BREVE WITH INVERTED BREVE - { 0xAB5B, 0x1, 0x8, 0, 0 }, -// ab5c MODIFIER LETTER SMALL HENG -// ab5d MODIFIER LETTER SMALL L WITH INVERTED LAZY S -// ab5e MODIFIER LETTER SMALL L WITH MIDDLE TILDE -// ab5f MODIFIER LETTER SMALL U WITH LEFT HOOK - { 0xAB5C, 0x4, 0x9, 0, 0 }, -// ab64 LATIN SMALL LETTER INVERTED ALPHA -// ab65 GREEK LETTER SMALL CAPITAL OMEGA - { 0xAB64, 0x2, 0x49, 0, 0 }, -// abc0 MEETEI MAYEK LETTER KOK -// abc1 MEETEI MAYEK LETTER SAM -// abc2 MEETEI MAYEK LETTER LAI -// abc3 MEETEI MAYEK LETTER MIT -// abc4 MEETEI MAYEK LETTER PA -// abc5 MEETEI MAYEK LETTER NA -// abc6 MEETEI MAYEK LETTER CHIL -// abc7 MEETEI MAYEK LETTER TIL -// abc8 MEETEI MAYEK LETTER KHOU -// abc9 MEETEI MAYEK LETTER NGOU -// abca MEETEI MAYEK LETTER THOU -// abcb MEETEI MAYEK LETTER WAI -// abcc MEETEI MAYEK LETTER YANG -// abcd MEETEI MAYEK LETTER HUK -// abce MEETEI MAYEK LETTER UN -// abcf MEETEI MAYEK LETTER I -// abd0 MEETEI MAYEK LETTER PHAM -// abd1 MEETEI MAYEK LETTER ATIYA -// abd2 MEETEI MAYEK LETTER GOK -// abd3 MEETEI MAYEK LETTER JHAM -// abd4 MEETEI MAYEK LETTER RAI -// abd5 MEETEI MAYEK LETTER BA -// abd6 MEETEI MAYEK LETTER JIL -// abd7 MEETEI MAYEK LETTER DIL -// abd8 MEETEI MAYEK LETTER GHOU -// abd9 MEETEI MAYEK LETTER DHOU -// abda MEETEI MAYEK LETTER BHAM -// abdb MEETEI MAYEK LETTER KOK LONSUM -// abdc MEETEI MAYEK LETTER LAI LONSUM -// abdd MEETEI MAYEK LETTER MIT LONSUM -// abde MEETEI MAYEK LETTER PA LONSUM -// abdf MEETEI MAYEK LETTER NA LONSUM -// abe0 MEETEI MAYEK LETTER TIL LONSUM -// abe1 MEETEI MAYEK LETTER NGOU LONSUM -// abe2 MEETEI MAYEK LETTER I LONSUM - { 0xABC0, 0x23, 0x9, 0, 0 }, -// abe3 MEETEI MAYEK VOWEL SIGN ONAP -// abe4 MEETEI MAYEK VOWEL SIGN INAP -// abe5 MEETEI MAYEK VOWEL SIGN ANAP -// abe6 MEETEI MAYEK VOWEL SIGN YENAP -// abe7 MEETEI MAYEK VOWEL SIGN SOUNAP -// abe8 MEETEI MAYEK VOWEL SIGN UNAP -// abe9 MEETEI MAYEK VOWEL SIGN CHEINAP -// abea MEETEI MAYEK VOWEL SIGN NUNG - { 0xABE3, 0x8, 0x0, 0, 0 }, -// abeb MEETEI MAYEK CHEIKHEI - { 0xABEB, 0x1, 0x18, 0, 0 }, -// abec MEETEI MAYEK LUM IYEK -// abed MEETEI MAYEK APUN IYEK - { 0xABEC, 0x2, 0x0, 0, 0 }, -// abf0 MEETEI MAYEK DIGIT ZERO -// abf1 MEETEI MAYEK DIGIT ONE -// abf2 MEETEI MAYEK DIGIT TWO -// abf3 MEETEI MAYEK DIGIT THREE -// abf4 MEETEI MAYEK DIGIT FOUR -// abf5 MEETEI MAYEK DIGIT FIVE -// abf6 MEETEI MAYEK DIGIT SIX -// abf7 MEETEI MAYEK DIGIT SEVEN -// abf8 MEETEI MAYEK DIGIT EIGHT -// abf9 MEETEI MAYEK DIGIT NINE - { 0xABF0, 0xA, 0x108, 0, 0 }, -// ac00 - { 0xAC00, 0x1, 0x9, 0, 0 }, -// d7a3 - { 0xD7A3, 0x1, 0x9, 0, 0 }, -// d7b0 HANGUL JUNGSEONG O-YEO -// d7b1 HANGUL JUNGSEONG O-O-I -// d7b2 HANGUL JUNGSEONG YO-A -// d7b3 HANGUL JUNGSEONG YO-AE -// d7b4 HANGUL JUNGSEONG YO-EO -// d7b5 HANGUL JUNGSEONG U-YEO -// d7b6 HANGUL JUNGSEONG U-I-I -// d7b7 HANGUL JUNGSEONG YU-AE -// d7b8 HANGUL JUNGSEONG YU-O -// d7b9 HANGUL JUNGSEONG EU-A -// d7ba HANGUL JUNGSEONG EU-EO -// d7bb HANGUL JUNGSEONG EU-E -// d7bc HANGUL JUNGSEONG EU-O -// d7bd HANGUL JUNGSEONG I-YA-O -// d7be HANGUL JUNGSEONG I-YAE -// d7bf HANGUL JUNGSEONG I-YEO -// d7c0 HANGUL JUNGSEONG I-YE -// d7c1 HANGUL JUNGSEONG I-O-I -// d7c2 HANGUL JUNGSEONG I-YO -// d7c3 HANGUL JUNGSEONG I-YU -// d7c4 HANGUL JUNGSEONG I-I -// d7c5 HANGUL JUNGSEONG ARAEA-A -// d7c6 HANGUL JUNGSEONG ARAEA-E - { 0xD7B0, 0x17, 0x9, 0, 0 }, -// d7cb HANGUL JONGSEONG NIEUN-RIEUL -// d7cc HANGUL JONGSEONG NIEUN-CHIEUCH -// d7cd HANGUL JONGSEONG SSANGTIKEUT -// d7ce HANGUL JONGSEONG SSANGTIKEUT-PIEUP -// d7cf HANGUL JONGSEONG TIKEUT-PIEUP -// d7d0 HANGUL JONGSEONG TIKEUT-SIOS -// d7d1 HANGUL JONGSEONG TIKEUT-SIOS-KIYEOK -// d7d2 HANGUL JONGSEONG TIKEUT-CIEUC -// d7d3 HANGUL JONGSEONG TIKEUT-CHIEUCH -// d7d4 HANGUL JONGSEONG TIKEUT-THIEUTH -// d7d5 HANGUL JONGSEONG RIEUL-SSANGKIYEOK -// d7d6 HANGUL JONGSEONG RIEUL-KIYEOK-HIEUH -// d7d7 HANGUL JONGSEONG SSANGRIEUL-KHIEUKH -// d7d8 HANGUL JONGSEONG RIEUL-MIEUM-HIEUH -// d7d9 HANGUL JONGSEONG RIEUL-PIEUP-TIKEUT -// d7da HANGUL JONGSEONG RIEUL-PIEUP-PHIEUPH -// d7db HANGUL JONGSEONG RIEUL-YESIEUNG -// d7dc HANGUL JONGSEONG RIEUL-YEORINHIEUH-HIEUH -// d7dd HANGUL JONGSEONG KAPYEOUNRIEUL -// d7de HANGUL JONGSEONG MIEUM-NIEUN -// d7df HANGUL JONGSEONG MIEUM-SSANGNIEUN -// d7e0 HANGUL JONGSEONG SSANGMIEUM -// d7e1 HANGUL JONGSEONG MIEUM-PIEUP-SIOS -// d7e2 HANGUL JONGSEONG MIEUM-CIEUC -// d7e3 HANGUL JONGSEONG PIEUP-TIKEUT -// d7e4 HANGUL JONGSEONG PIEUP-RIEUL-PHIEUPH -// d7e5 HANGUL JONGSEONG PIEUP-MIEUM -// d7e6 HANGUL JONGSEONG SSANGPIEUP -// d7e7 HANGUL JONGSEONG PIEUP-SIOS-TIKEUT -// d7e8 HANGUL JONGSEONG PIEUP-CIEUC -// d7e9 HANGUL JONGSEONG PIEUP-CHIEUCH -// d7ea HANGUL JONGSEONG SIOS-MIEUM -// d7eb HANGUL JONGSEONG SIOS-KAPYEOUNPIEUP -// d7ec HANGUL JONGSEONG SSANGSIOS-KIYEOK -// d7ed HANGUL JONGSEONG SSANGSIOS-TIKEUT -// d7ee HANGUL JONGSEONG SIOS-PANSIOS -// d7ef HANGUL JONGSEONG SIOS-CIEUC -// d7f0 HANGUL JONGSEONG SIOS-CHIEUCH -// d7f1 HANGUL JONGSEONG SIOS-THIEUTH -// d7f2 HANGUL JONGSEONG SIOS-HIEUH -// d7f3 HANGUL JONGSEONG PANSIOS-PIEUP -// d7f4 HANGUL JONGSEONG PANSIOS-KAPYEOUNPIEUP -// d7f5 HANGUL JONGSEONG YESIEUNG-MIEUM -// d7f6 HANGUL JONGSEONG YESIEUNG-HIEUH -// d7f7 HANGUL JONGSEONG CIEUC-PIEUP -// d7f8 HANGUL JONGSEONG CIEUC-SSANGPIEUP -// d7f9 HANGUL JONGSEONG SSANGCIEUC -// d7fa HANGUL JONGSEONG PHIEUPH-SIOS -// d7fb HANGUL JONGSEONG PHIEUPH-THIEUTH - { 0xD7CB, 0x31, 0x9, 0, 0 }, -// d800 - { 0xD800, 0x1, 0x0, 0, 0 }, -// db7f -// db80 - { 0xDB7F, 0x2, 0x0, 0, 0 }, -// dbff -// dc00 - { 0xDBFF, 0x2, 0x0, 0, 0 }, -// dfff -// e000 - { 0xDFFF, 0x2, 0x0, 0, 0 }, -// f8ff - { 0xF8FF, 0x1, 0x0, 0, 0 }, -// f900 CJK COMPATIBILITY IDEOGRAPH-F900 -// f901 CJK COMPATIBILITY IDEOGRAPH-F901 -// f902 CJK COMPATIBILITY IDEOGRAPH-F902 -// f903 CJK COMPATIBILITY IDEOGRAPH-F903 -// f904 CJK COMPATIBILITY IDEOGRAPH-F904 -// f905 CJK COMPATIBILITY IDEOGRAPH-F905 -// f906 CJK COMPATIBILITY IDEOGRAPH-F906 -// f907 CJK COMPATIBILITY IDEOGRAPH-F907 -// f908 CJK COMPATIBILITY IDEOGRAPH-F908 -// f909 CJK COMPATIBILITY IDEOGRAPH-F909 -// f90a CJK COMPATIBILITY IDEOGRAPH-F90A -// f90b CJK COMPATIBILITY IDEOGRAPH-F90B -// f90c CJK COMPATIBILITY IDEOGRAPH-F90C -// f90d CJK COMPATIBILITY IDEOGRAPH-F90D -// f90e CJK COMPATIBILITY IDEOGRAPH-F90E -// f90f CJK COMPATIBILITY IDEOGRAPH-F90F -// f910 CJK COMPATIBILITY IDEOGRAPH-F910 -// f911 CJK COMPATIBILITY IDEOGRAPH-F911 -// f912 CJK COMPATIBILITY IDEOGRAPH-F912 -// f913 CJK COMPATIBILITY IDEOGRAPH-F913 -// f914 CJK COMPATIBILITY IDEOGRAPH-F914 -// f915 CJK COMPATIBILITY IDEOGRAPH-F915 -// f916 CJK COMPATIBILITY IDEOGRAPH-F916 -// f917 CJK COMPATIBILITY IDEOGRAPH-F917 -// f918 CJK COMPATIBILITY IDEOGRAPH-F918 -// f919 CJK COMPATIBILITY IDEOGRAPH-F919 -// f91a CJK COMPATIBILITY IDEOGRAPH-F91A -// f91b CJK COMPATIBILITY IDEOGRAPH-F91B -// f91c CJK COMPATIBILITY IDEOGRAPH-F91C -// f91d CJK COMPATIBILITY IDEOGRAPH-F91D -// f91e CJK COMPATIBILITY IDEOGRAPH-F91E -// f91f CJK COMPATIBILITY IDEOGRAPH-F91F -// f920 CJK COMPATIBILITY IDEOGRAPH-F920 -// f921 CJK COMPATIBILITY IDEOGRAPH-F921 -// f922 CJK COMPATIBILITY IDEOGRAPH-F922 -// f923 CJK COMPATIBILITY IDEOGRAPH-F923 -// f924 CJK COMPATIBILITY IDEOGRAPH-F924 -// f925 CJK COMPATIBILITY IDEOGRAPH-F925 -// f926 CJK COMPATIBILITY IDEOGRAPH-F926 -// f927 CJK COMPATIBILITY IDEOGRAPH-F927 -// f928 CJK COMPATIBILITY IDEOGRAPH-F928 -// f929 CJK COMPATIBILITY IDEOGRAPH-F929 -// f92a CJK COMPATIBILITY IDEOGRAPH-F92A -// f92b CJK COMPATIBILITY IDEOGRAPH-F92B -// f92c CJK COMPATIBILITY IDEOGRAPH-F92C -// f92d CJK COMPATIBILITY IDEOGRAPH-F92D -// f92e CJK COMPATIBILITY IDEOGRAPH-F92E -// f92f CJK COMPATIBILITY IDEOGRAPH-F92F -// f930 CJK COMPATIBILITY IDEOGRAPH-F930 -// f931 CJK COMPATIBILITY IDEOGRAPH-F931 -// f932 CJK COMPATIBILITY IDEOGRAPH-F932 -// f933 CJK COMPATIBILITY IDEOGRAPH-F933 -// f934 CJK COMPATIBILITY IDEOGRAPH-F934 -// f935 CJK COMPATIBILITY IDEOGRAPH-F935 -// f936 CJK COMPATIBILITY IDEOGRAPH-F936 -// f937 CJK COMPATIBILITY IDEOGRAPH-F937 -// f938 CJK COMPATIBILITY IDEOGRAPH-F938 -// f939 CJK COMPATIBILITY IDEOGRAPH-F939 -// f93a CJK COMPATIBILITY IDEOGRAPH-F93A -// f93b CJK COMPATIBILITY IDEOGRAPH-F93B -// f93c CJK COMPATIBILITY IDEOGRAPH-F93C -// f93d CJK COMPATIBILITY IDEOGRAPH-F93D -// f93e CJK COMPATIBILITY IDEOGRAPH-F93E -// f93f CJK COMPATIBILITY IDEOGRAPH-F93F -// f940 CJK COMPATIBILITY IDEOGRAPH-F940 -// f941 CJK COMPATIBILITY IDEOGRAPH-F941 -// f942 CJK COMPATIBILITY IDEOGRAPH-F942 -// f943 CJK COMPATIBILITY IDEOGRAPH-F943 -// f944 CJK COMPATIBILITY IDEOGRAPH-F944 -// f945 CJK COMPATIBILITY IDEOGRAPH-F945 -// f946 CJK COMPATIBILITY IDEOGRAPH-F946 -// f947 CJK COMPATIBILITY IDEOGRAPH-F947 -// f948 CJK COMPATIBILITY IDEOGRAPH-F948 -// f949 CJK COMPATIBILITY IDEOGRAPH-F949 -// f94a CJK COMPATIBILITY IDEOGRAPH-F94A -// f94b CJK COMPATIBILITY IDEOGRAPH-F94B -// f94c CJK COMPATIBILITY IDEOGRAPH-F94C -// f94d CJK COMPATIBILITY IDEOGRAPH-F94D -// f94e CJK COMPATIBILITY IDEOGRAPH-F94E -// f94f CJK COMPATIBILITY IDEOGRAPH-F94F -// f950 CJK COMPATIBILITY IDEOGRAPH-F950 -// f951 CJK COMPATIBILITY IDEOGRAPH-F951 -// f952 CJK COMPATIBILITY IDEOGRAPH-F952 -// f953 CJK COMPATIBILITY IDEOGRAPH-F953 -// f954 CJK COMPATIBILITY IDEOGRAPH-F954 -// f955 CJK COMPATIBILITY IDEOGRAPH-F955 -// f956 CJK COMPATIBILITY IDEOGRAPH-F956 -// f957 CJK COMPATIBILITY IDEOGRAPH-F957 -// f958 CJK COMPATIBILITY IDEOGRAPH-F958 -// f959 CJK COMPATIBILITY IDEOGRAPH-F959 -// f95a CJK COMPATIBILITY IDEOGRAPH-F95A -// f95b CJK COMPATIBILITY IDEOGRAPH-F95B -// f95c CJK COMPATIBILITY IDEOGRAPH-F95C -// f95d CJK COMPATIBILITY IDEOGRAPH-F95D -// f95e CJK COMPATIBILITY IDEOGRAPH-F95E -// f95f CJK COMPATIBILITY IDEOGRAPH-F95F -// f960 CJK COMPATIBILITY IDEOGRAPH-F960 -// f961 CJK COMPATIBILITY IDEOGRAPH-F961 -// f962 CJK COMPATIBILITY IDEOGRAPH-F962 -// f963 CJK COMPATIBILITY IDEOGRAPH-F963 -// f964 CJK COMPATIBILITY IDEOGRAPH-F964 -// f965 CJK COMPATIBILITY IDEOGRAPH-F965 -// f966 CJK COMPATIBILITY IDEOGRAPH-F966 -// f967 CJK COMPATIBILITY IDEOGRAPH-F967 -// f968 CJK COMPATIBILITY IDEOGRAPH-F968 -// f969 CJK COMPATIBILITY IDEOGRAPH-F969 -// f96a CJK COMPATIBILITY IDEOGRAPH-F96A -// f96b CJK COMPATIBILITY IDEOGRAPH-F96B -// f96c CJK COMPATIBILITY IDEOGRAPH-F96C -// f96d CJK COMPATIBILITY IDEOGRAPH-F96D -// f96e CJK COMPATIBILITY IDEOGRAPH-F96E -// f96f CJK COMPATIBILITY IDEOGRAPH-F96F -// f970 CJK COMPATIBILITY IDEOGRAPH-F970 -// f971 CJK COMPATIBILITY IDEOGRAPH-F971 -// f972 CJK COMPATIBILITY IDEOGRAPH-F972 -// f973 CJK COMPATIBILITY IDEOGRAPH-F973 -// f974 CJK COMPATIBILITY IDEOGRAPH-F974 -// f975 CJK COMPATIBILITY IDEOGRAPH-F975 -// f976 CJK COMPATIBILITY IDEOGRAPH-F976 -// f977 CJK COMPATIBILITY IDEOGRAPH-F977 -// f978 CJK COMPATIBILITY IDEOGRAPH-F978 -// f979 CJK COMPATIBILITY IDEOGRAPH-F979 -// f97a CJK COMPATIBILITY IDEOGRAPH-F97A -// f97b CJK COMPATIBILITY IDEOGRAPH-F97B -// f97c CJK COMPATIBILITY IDEOGRAPH-F97C -// f97d CJK COMPATIBILITY IDEOGRAPH-F97D -// f97e CJK COMPATIBILITY IDEOGRAPH-F97E -// f97f CJK COMPATIBILITY IDEOGRAPH-F97F -// f980 CJK COMPATIBILITY IDEOGRAPH-F980 -// f981 CJK COMPATIBILITY IDEOGRAPH-F981 -// f982 CJK COMPATIBILITY IDEOGRAPH-F982 -// f983 CJK COMPATIBILITY IDEOGRAPH-F983 -// f984 CJK COMPATIBILITY IDEOGRAPH-F984 -// f985 CJK COMPATIBILITY IDEOGRAPH-F985 -// f986 CJK COMPATIBILITY IDEOGRAPH-F986 -// f987 CJK COMPATIBILITY IDEOGRAPH-F987 -// f988 CJK COMPATIBILITY IDEOGRAPH-F988 -// f989 CJK COMPATIBILITY IDEOGRAPH-F989 -// f98a CJK COMPATIBILITY IDEOGRAPH-F98A -// f98b CJK COMPATIBILITY IDEOGRAPH-F98B -// f98c CJK COMPATIBILITY IDEOGRAPH-F98C -// f98d CJK COMPATIBILITY IDEOGRAPH-F98D -// f98e CJK COMPATIBILITY IDEOGRAPH-F98E -// f98f CJK COMPATIBILITY IDEOGRAPH-F98F -// f990 CJK COMPATIBILITY IDEOGRAPH-F990 -// f991 CJK COMPATIBILITY IDEOGRAPH-F991 -// f992 CJK COMPATIBILITY IDEOGRAPH-F992 -// f993 CJK COMPATIBILITY IDEOGRAPH-F993 -// f994 CJK COMPATIBILITY IDEOGRAPH-F994 -// f995 CJK COMPATIBILITY IDEOGRAPH-F995 -// f996 CJK COMPATIBILITY IDEOGRAPH-F996 -// f997 CJK COMPATIBILITY IDEOGRAPH-F997 -// f998 CJK COMPATIBILITY IDEOGRAPH-F998 -// f999 CJK COMPATIBILITY IDEOGRAPH-F999 -// f99a CJK COMPATIBILITY IDEOGRAPH-F99A -// f99b CJK COMPATIBILITY IDEOGRAPH-F99B -// f99c CJK COMPATIBILITY IDEOGRAPH-F99C -// f99d CJK COMPATIBILITY IDEOGRAPH-F99D -// f99e CJK COMPATIBILITY IDEOGRAPH-F99E -// f99f CJK COMPATIBILITY IDEOGRAPH-F99F -// f9a0 CJK COMPATIBILITY IDEOGRAPH-F9A0 -// f9a1 CJK COMPATIBILITY IDEOGRAPH-F9A1 -// f9a2 CJK COMPATIBILITY IDEOGRAPH-F9A2 -// f9a3 CJK COMPATIBILITY IDEOGRAPH-F9A3 -// f9a4 CJK COMPATIBILITY IDEOGRAPH-F9A4 -// f9a5 CJK COMPATIBILITY IDEOGRAPH-F9A5 -// f9a6 CJK COMPATIBILITY IDEOGRAPH-F9A6 -// f9a7 CJK COMPATIBILITY IDEOGRAPH-F9A7 -// f9a8 CJK COMPATIBILITY IDEOGRAPH-F9A8 -// f9a9 CJK COMPATIBILITY IDEOGRAPH-F9A9 -// f9aa CJK COMPATIBILITY IDEOGRAPH-F9AA -// f9ab CJK COMPATIBILITY IDEOGRAPH-F9AB -// f9ac CJK COMPATIBILITY IDEOGRAPH-F9AC -// f9ad CJK COMPATIBILITY IDEOGRAPH-F9AD -// f9ae CJK COMPATIBILITY IDEOGRAPH-F9AE -// f9af CJK COMPATIBILITY IDEOGRAPH-F9AF -// f9b0 CJK COMPATIBILITY IDEOGRAPH-F9B0 -// f9b1 CJK COMPATIBILITY IDEOGRAPH-F9B1 -// f9b2 CJK COMPATIBILITY IDEOGRAPH-F9B2 -// f9b3 CJK COMPATIBILITY IDEOGRAPH-F9B3 -// f9b4 CJK COMPATIBILITY IDEOGRAPH-F9B4 -// f9b5 CJK COMPATIBILITY IDEOGRAPH-F9B5 -// f9b6 CJK COMPATIBILITY IDEOGRAPH-F9B6 -// f9b7 CJK COMPATIBILITY IDEOGRAPH-F9B7 -// f9b8 CJK COMPATIBILITY IDEOGRAPH-F9B8 -// f9b9 CJK COMPATIBILITY IDEOGRAPH-F9B9 -// f9ba CJK COMPATIBILITY IDEOGRAPH-F9BA -// f9bb CJK COMPATIBILITY IDEOGRAPH-F9BB -// f9bc CJK COMPATIBILITY IDEOGRAPH-F9BC -// f9bd CJK COMPATIBILITY IDEOGRAPH-F9BD -// f9be CJK COMPATIBILITY IDEOGRAPH-F9BE -// f9bf CJK COMPATIBILITY IDEOGRAPH-F9BF -// f9c0 CJK COMPATIBILITY IDEOGRAPH-F9C0 -// f9c1 CJK COMPATIBILITY IDEOGRAPH-F9C1 -// f9c2 CJK COMPATIBILITY IDEOGRAPH-F9C2 -// f9c3 CJK COMPATIBILITY IDEOGRAPH-F9C3 -// f9c4 CJK COMPATIBILITY IDEOGRAPH-F9C4 -// f9c5 CJK COMPATIBILITY IDEOGRAPH-F9C5 -// f9c6 CJK COMPATIBILITY IDEOGRAPH-F9C6 -// f9c7 CJK COMPATIBILITY IDEOGRAPH-F9C7 -// f9c8 CJK COMPATIBILITY IDEOGRAPH-F9C8 -// f9c9 CJK COMPATIBILITY IDEOGRAPH-F9C9 -// f9ca CJK COMPATIBILITY IDEOGRAPH-F9CA -// f9cb CJK COMPATIBILITY IDEOGRAPH-F9CB -// f9cc CJK COMPATIBILITY IDEOGRAPH-F9CC -// f9cd CJK COMPATIBILITY IDEOGRAPH-F9CD -// f9ce CJK COMPATIBILITY IDEOGRAPH-F9CE -// f9cf CJK COMPATIBILITY IDEOGRAPH-F9CF -// f9d0 CJK COMPATIBILITY IDEOGRAPH-F9D0 -// f9d1 CJK COMPATIBILITY IDEOGRAPH-F9D1 -// f9d2 CJK COMPATIBILITY IDEOGRAPH-F9D2 -// f9d3 CJK COMPATIBILITY IDEOGRAPH-F9D3 -// f9d4 CJK COMPATIBILITY IDEOGRAPH-F9D4 -// f9d5 CJK COMPATIBILITY IDEOGRAPH-F9D5 -// f9d6 CJK COMPATIBILITY IDEOGRAPH-F9D6 -// f9d7 CJK COMPATIBILITY IDEOGRAPH-F9D7 -// f9d8 CJK COMPATIBILITY IDEOGRAPH-F9D8 -// f9d9 CJK COMPATIBILITY IDEOGRAPH-F9D9 -// f9da CJK COMPATIBILITY IDEOGRAPH-F9DA -// f9db CJK COMPATIBILITY IDEOGRAPH-F9DB -// f9dc CJK COMPATIBILITY IDEOGRAPH-F9DC -// f9dd CJK COMPATIBILITY IDEOGRAPH-F9DD -// f9de CJK COMPATIBILITY IDEOGRAPH-F9DE -// f9df CJK COMPATIBILITY IDEOGRAPH-F9DF -// f9e0 CJK COMPATIBILITY IDEOGRAPH-F9E0 -// f9e1 CJK COMPATIBILITY IDEOGRAPH-F9E1 -// f9e2 CJK COMPATIBILITY IDEOGRAPH-F9E2 -// f9e3 CJK COMPATIBILITY IDEOGRAPH-F9E3 -// f9e4 CJK COMPATIBILITY IDEOGRAPH-F9E4 -// f9e5 CJK COMPATIBILITY IDEOGRAPH-F9E5 -// f9e6 CJK COMPATIBILITY IDEOGRAPH-F9E6 -// f9e7 CJK COMPATIBILITY IDEOGRAPH-F9E7 -// f9e8 CJK COMPATIBILITY IDEOGRAPH-F9E8 -// f9e9 CJK COMPATIBILITY IDEOGRAPH-F9E9 -// f9ea CJK COMPATIBILITY IDEOGRAPH-F9EA -// f9eb CJK COMPATIBILITY IDEOGRAPH-F9EB -// f9ec CJK COMPATIBILITY IDEOGRAPH-F9EC -// f9ed CJK COMPATIBILITY IDEOGRAPH-F9ED -// f9ee CJK COMPATIBILITY IDEOGRAPH-F9EE -// f9ef CJK COMPATIBILITY IDEOGRAPH-F9EF -// f9f0 CJK COMPATIBILITY IDEOGRAPH-F9F0 -// f9f1 CJK COMPATIBILITY IDEOGRAPH-F9F1 -// f9f2 CJK COMPATIBILITY IDEOGRAPH-F9F2 -// f9f3 CJK COMPATIBILITY IDEOGRAPH-F9F3 -// f9f4 CJK COMPATIBILITY IDEOGRAPH-F9F4 -// f9f5 CJK COMPATIBILITY IDEOGRAPH-F9F5 -// f9f6 CJK COMPATIBILITY IDEOGRAPH-F9F6 -// f9f7 CJK COMPATIBILITY IDEOGRAPH-F9F7 -// f9f8 CJK COMPATIBILITY IDEOGRAPH-F9F8 -// f9f9 CJK COMPATIBILITY IDEOGRAPH-F9F9 -// f9fa CJK COMPATIBILITY IDEOGRAPH-F9FA -// f9fb CJK COMPATIBILITY IDEOGRAPH-F9FB -// f9fc CJK COMPATIBILITY IDEOGRAPH-F9FC -// f9fd CJK COMPATIBILITY IDEOGRAPH-F9FD -// f9fe CJK COMPATIBILITY IDEOGRAPH-F9FE -// f9ff CJK COMPATIBILITY IDEOGRAPH-F9FF -// fa00 CJK COMPATIBILITY IDEOGRAPH-FA00 -// fa01 CJK COMPATIBILITY IDEOGRAPH-FA01 -// fa02 CJK COMPATIBILITY IDEOGRAPH-FA02 -// fa03 CJK COMPATIBILITY IDEOGRAPH-FA03 -// fa04 CJK COMPATIBILITY IDEOGRAPH-FA04 -// fa05 CJK COMPATIBILITY IDEOGRAPH-FA05 -// fa06 CJK COMPATIBILITY IDEOGRAPH-FA06 -// fa07 CJK COMPATIBILITY IDEOGRAPH-FA07 -// fa08 CJK COMPATIBILITY IDEOGRAPH-FA08 -// fa09 CJK COMPATIBILITY IDEOGRAPH-FA09 -// fa0a CJK COMPATIBILITY IDEOGRAPH-FA0A -// fa0b CJK COMPATIBILITY IDEOGRAPH-FA0B -// fa0c CJK COMPATIBILITY IDEOGRAPH-FA0C -// fa0d CJK COMPATIBILITY IDEOGRAPH-FA0D -// fa0e CJK COMPATIBILITY IDEOGRAPH-FA0E -// fa0f CJK COMPATIBILITY IDEOGRAPH-FA0F -// fa10 CJK COMPATIBILITY IDEOGRAPH-FA10 -// fa11 CJK COMPATIBILITY IDEOGRAPH-FA11 -// fa12 CJK COMPATIBILITY IDEOGRAPH-FA12 -// fa13 CJK COMPATIBILITY IDEOGRAPH-FA13 -// fa14 CJK COMPATIBILITY IDEOGRAPH-FA14 -// fa15 CJK COMPATIBILITY IDEOGRAPH-FA15 -// fa16 CJK COMPATIBILITY IDEOGRAPH-FA16 -// fa17 CJK COMPATIBILITY IDEOGRAPH-FA17 -// fa18 CJK COMPATIBILITY IDEOGRAPH-FA18 -// fa19 CJK COMPATIBILITY IDEOGRAPH-FA19 -// fa1a CJK COMPATIBILITY IDEOGRAPH-FA1A -// fa1b CJK COMPATIBILITY IDEOGRAPH-FA1B -// fa1c CJK COMPATIBILITY IDEOGRAPH-FA1C -// fa1d CJK COMPATIBILITY IDEOGRAPH-FA1D -// fa1e CJK COMPATIBILITY IDEOGRAPH-FA1E -// fa1f CJK COMPATIBILITY IDEOGRAPH-FA1F -// fa20 CJK COMPATIBILITY IDEOGRAPH-FA20 -// fa21 CJK COMPATIBILITY IDEOGRAPH-FA21 -// fa22 CJK COMPATIBILITY IDEOGRAPH-FA22 -// fa23 CJK COMPATIBILITY IDEOGRAPH-FA23 -// fa24 CJK COMPATIBILITY IDEOGRAPH-FA24 -// fa25 CJK COMPATIBILITY IDEOGRAPH-FA25 -// fa26 CJK COMPATIBILITY IDEOGRAPH-FA26 -// fa27 CJK COMPATIBILITY IDEOGRAPH-FA27 -// fa28 CJK COMPATIBILITY IDEOGRAPH-FA28 -// fa29 CJK COMPATIBILITY IDEOGRAPH-FA29 -// fa2a CJK COMPATIBILITY IDEOGRAPH-FA2A -// fa2b CJK COMPATIBILITY IDEOGRAPH-FA2B -// fa2c CJK COMPATIBILITY IDEOGRAPH-FA2C -// fa2d CJK COMPATIBILITY IDEOGRAPH-FA2D -// fa2e CJK COMPATIBILITY IDEOGRAPH-FA2E -// fa2f CJK COMPATIBILITY IDEOGRAPH-FA2F -// fa30 CJK COMPATIBILITY IDEOGRAPH-FA30 -// fa31 CJK COMPATIBILITY IDEOGRAPH-FA31 -// fa32 CJK COMPATIBILITY IDEOGRAPH-FA32 -// fa33 CJK COMPATIBILITY IDEOGRAPH-FA33 -// fa34 CJK COMPATIBILITY IDEOGRAPH-FA34 -// fa35 CJK COMPATIBILITY IDEOGRAPH-FA35 -// fa36 CJK COMPATIBILITY IDEOGRAPH-FA36 -// fa37 CJK COMPATIBILITY IDEOGRAPH-FA37 -// fa38 CJK COMPATIBILITY IDEOGRAPH-FA38 -// fa39 CJK COMPATIBILITY IDEOGRAPH-FA39 -// fa3a CJK COMPATIBILITY IDEOGRAPH-FA3A -// fa3b CJK COMPATIBILITY IDEOGRAPH-FA3B -// fa3c CJK COMPATIBILITY IDEOGRAPH-FA3C -// fa3d CJK COMPATIBILITY IDEOGRAPH-FA3D -// fa3e CJK COMPATIBILITY IDEOGRAPH-FA3E -// fa3f CJK COMPATIBILITY IDEOGRAPH-FA3F -// fa40 CJK COMPATIBILITY IDEOGRAPH-FA40 -// fa41 CJK COMPATIBILITY IDEOGRAPH-FA41 -// fa42 CJK COMPATIBILITY IDEOGRAPH-FA42 -// fa43 CJK COMPATIBILITY IDEOGRAPH-FA43 -// fa44 CJK COMPATIBILITY IDEOGRAPH-FA44 -// fa45 CJK COMPATIBILITY IDEOGRAPH-FA45 -// fa46 CJK COMPATIBILITY IDEOGRAPH-FA46 -// fa47 CJK COMPATIBILITY IDEOGRAPH-FA47 -// fa48 CJK COMPATIBILITY IDEOGRAPH-FA48 -// fa49 CJK COMPATIBILITY IDEOGRAPH-FA49 -// fa4a CJK COMPATIBILITY IDEOGRAPH-FA4A -// fa4b CJK COMPATIBILITY IDEOGRAPH-FA4B -// fa4c CJK COMPATIBILITY IDEOGRAPH-FA4C -// fa4d CJK COMPATIBILITY IDEOGRAPH-FA4D -// fa4e CJK COMPATIBILITY IDEOGRAPH-FA4E -// fa4f CJK COMPATIBILITY IDEOGRAPH-FA4F -// fa50 CJK COMPATIBILITY IDEOGRAPH-FA50 -// fa51 CJK COMPATIBILITY IDEOGRAPH-FA51 -// fa52 CJK COMPATIBILITY IDEOGRAPH-FA52 -// fa53 CJK COMPATIBILITY IDEOGRAPH-FA53 -// fa54 CJK COMPATIBILITY IDEOGRAPH-FA54 -// fa55 CJK COMPATIBILITY IDEOGRAPH-FA55 -// fa56 CJK COMPATIBILITY IDEOGRAPH-FA56 -// fa57 CJK COMPATIBILITY IDEOGRAPH-FA57 -// fa58 CJK COMPATIBILITY IDEOGRAPH-FA58 -// fa59 CJK COMPATIBILITY IDEOGRAPH-FA59 -// fa5a CJK COMPATIBILITY IDEOGRAPH-FA5A -// fa5b CJK COMPATIBILITY IDEOGRAPH-FA5B -// fa5c CJK COMPATIBILITY IDEOGRAPH-FA5C -// fa5d CJK COMPATIBILITY IDEOGRAPH-FA5D -// fa5e CJK COMPATIBILITY IDEOGRAPH-FA5E -// fa5f CJK COMPATIBILITY IDEOGRAPH-FA5F -// fa60 CJK COMPATIBILITY IDEOGRAPH-FA60 -// fa61 CJK COMPATIBILITY IDEOGRAPH-FA61 -// fa62 CJK COMPATIBILITY IDEOGRAPH-FA62 -// fa63 CJK COMPATIBILITY IDEOGRAPH-FA63 -// fa64 CJK COMPATIBILITY IDEOGRAPH-FA64 -// fa65 CJK COMPATIBILITY IDEOGRAPH-FA65 -// fa66 CJK COMPATIBILITY IDEOGRAPH-FA66 -// fa67 CJK COMPATIBILITY IDEOGRAPH-FA67 -// fa68 CJK COMPATIBILITY IDEOGRAPH-FA68 -// fa69 CJK COMPATIBILITY IDEOGRAPH-FA69 -// fa6a CJK COMPATIBILITY IDEOGRAPH-FA6A -// fa6b CJK COMPATIBILITY IDEOGRAPH-FA6B -// fa6c CJK COMPATIBILITY IDEOGRAPH-FA6C -// fa6d CJK COMPATIBILITY IDEOGRAPH-FA6D - { 0xF900, 0x16E, 0x9, 0, 0 }, -// fa70 CJK COMPATIBILITY IDEOGRAPH-FA70 -// fa71 CJK COMPATIBILITY IDEOGRAPH-FA71 -// fa72 CJK COMPATIBILITY IDEOGRAPH-FA72 -// fa73 CJK COMPATIBILITY IDEOGRAPH-FA73 -// fa74 CJK COMPATIBILITY IDEOGRAPH-FA74 -// fa75 CJK COMPATIBILITY IDEOGRAPH-FA75 -// fa76 CJK COMPATIBILITY IDEOGRAPH-FA76 -// fa77 CJK COMPATIBILITY IDEOGRAPH-FA77 -// fa78 CJK COMPATIBILITY IDEOGRAPH-FA78 -// fa79 CJK COMPATIBILITY IDEOGRAPH-FA79 -// fa7a CJK COMPATIBILITY IDEOGRAPH-FA7A -// fa7b CJK COMPATIBILITY IDEOGRAPH-FA7B -// fa7c CJK COMPATIBILITY IDEOGRAPH-FA7C -// fa7d CJK COMPATIBILITY IDEOGRAPH-FA7D -// fa7e CJK COMPATIBILITY IDEOGRAPH-FA7E -// fa7f CJK COMPATIBILITY IDEOGRAPH-FA7F -// fa80 CJK COMPATIBILITY IDEOGRAPH-FA80 -// fa81 CJK COMPATIBILITY IDEOGRAPH-FA81 -// fa82 CJK COMPATIBILITY IDEOGRAPH-FA82 -// fa83 CJK COMPATIBILITY IDEOGRAPH-FA83 -// fa84 CJK COMPATIBILITY IDEOGRAPH-FA84 -// fa85 CJK COMPATIBILITY IDEOGRAPH-FA85 -// fa86 CJK COMPATIBILITY IDEOGRAPH-FA86 -// fa87 CJK COMPATIBILITY IDEOGRAPH-FA87 -// fa88 CJK COMPATIBILITY IDEOGRAPH-FA88 -// fa89 CJK COMPATIBILITY IDEOGRAPH-FA89 -// fa8a CJK COMPATIBILITY IDEOGRAPH-FA8A -// fa8b CJK COMPATIBILITY IDEOGRAPH-FA8B -// fa8c CJK COMPATIBILITY IDEOGRAPH-FA8C -// fa8d CJK COMPATIBILITY IDEOGRAPH-FA8D -// fa8e CJK COMPATIBILITY IDEOGRAPH-FA8E -// fa8f CJK COMPATIBILITY IDEOGRAPH-FA8F -// fa90 CJK COMPATIBILITY IDEOGRAPH-FA90 -// fa91 CJK COMPATIBILITY IDEOGRAPH-FA91 -// fa92 CJK COMPATIBILITY IDEOGRAPH-FA92 -// fa93 CJK COMPATIBILITY IDEOGRAPH-FA93 -// fa94 CJK COMPATIBILITY IDEOGRAPH-FA94 -// fa95 CJK COMPATIBILITY IDEOGRAPH-FA95 -// fa96 CJK COMPATIBILITY IDEOGRAPH-FA96 -// fa97 CJK COMPATIBILITY IDEOGRAPH-FA97 -// fa98 CJK COMPATIBILITY IDEOGRAPH-FA98 -// fa99 CJK COMPATIBILITY IDEOGRAPH-FA99 -// fa9a CJK COMPATIBILITY IDEOGRAPH-FA9A -// fa9b CJK COMPATIBILITY IDEOGRAPH-FA9B -// fa9c CJK COMPATIBILITY IDEOGRAPH-FA9C -// fa9d CJK COMPATIBILITY IDEOGRAPH-FA9D -// fa9e CJK COMPATIBILITY IDEOGRAPH-FA9E -// fa9f CJK COMPATIBILITY IDEOGRAPH-FA9F -// faa0 CJK COMPATIBILITY IDEOGRAPH-FAA0 -// faa1 CJK COMPATIBILITY IDEOGRAPH-FAA1 -// faa2 CJK COMPATIBILITY IDEOGRAPH-FAA2 -// faa3 CJK COMPATIBILITY IDEOGRAPH-FAA3 -// faa4 CJK COMPATIBILITY IDEOGRAPH-FAA4 -// faa5 CJK COMPATIBILITY IDEOGRAPH-FAA5 -// faa6 CJK COMPATIBILITY IDEOGRAPH-FAA6 -// faa7 CJK COMPATIBILITY IDEOGRAPH-FAA7 -// faa8 CJK COMPATIBILITY IDEOGRAPH-FAA8 -// faa9 CJK COMPATIBILITY IDEOGRAPH-FAA9 -// faaa CJK COMPATIBILITY IDEOGRAPH-FAAA -// faab CJK COMPATIBILITY IDEOGRAPH-FAAB -// faac CJK COMPATIBILITY IDEOGRAPH-FAAC -// faad CJK COMPATIBILITY IDEOGRAPH-FAAD -// faae CJK COMPATIBILITY IDEOGRAPH-FAAE -// faaf CJK COMPATIBILITY IDEOGRAPH-FAAF -// fab0 CJK COMPATIBILITY IDEOGRAPH-FAB0 -// fab1 CJK COMPATIBILITY IDEOGRAPH-FAB1 -// fab2 CJK COMPATIBILITY IDEOGRAPH-FAB2 -// fab3 CJK COMPATIBILITY IDEOGRAPH-FAB3 -// fab4 CJK COMPATIBILITY IDEOGRAPH-FAB4 -// fab5 CJK COMPATIBILITY IDEOGRAPH-FAB5 -// fab6 CJK COMPATIBILITY IDEOGRAPH-FAB6 -// fab7 CJK COMPATIBILITY IDEOGRAPH-FAB7 -// fab8 CJK COMPATIBILITY IDEOGRAPH-FAB8 -// fab9 CJK COMPATIBILITY IDEOGRAPH-FAB9 -// faba CJK COMPATIBILITY IDEOGRAPH-FABA -// fabb CJK COMPATIBILITY IDEOGRAPH-FABB -// fabc CJK COMPATIBILITY IDEOGRAPH-FABC -// fabd CJK COMPATIBILITY IDEOGRAPH-FABD -// fabe CJK COMPATIBILITY IDEOGRAPH-FABE -// fabf CJK COMPATIBILITY IDEOGRAPH-FABF -// fac0 CJK COMPATIBILITY IDEOGRAPH-FAC0 -// fac1 CJK COMPATIBILITY IDEOGRAPH-FAC1 -// fac2 CJK COMPATIBILITY IDEOGRAPH-FAC2 -// fac3 CJK COMPATIBILITY IDEOGRAPH-FAC3 -// fac4 CJK COMPATIBILITY IDEOGRAPH-FAC4 -// fac5 CJK COMPATIBILITY IDEOGRAPH-FAC5 -// fac6 CJK COMPATIBILITY IDEOGRAPH-FAC6 -// fac7 CJK COMPATIBILITY IDEOGRAPH-FAC7 -// fac8 CJK COMPATIBILITY IDEOGRAPH-FAC8 -// fac9 CJK COMPATIBILITY IDEOGRAPH-FAC9 -// faca CJK COMPATIBILITY IDEOGRAPH-FACA -// facb CJK COMPATIBILITY IDEOGRAPH-FACB -// facc CJK COMPATIBILITY IDEOGRAPH-FACC -// facd CJK COMPATIBILITY IDEOGRAPH-FACD -// face CJK COMPATIBILITY IDEOGRAPH-FACE -// facf CJK COMPATIBILITY IDEOGRAPH-FACF -// fad0 CJK COMPATIBILITY IDEOGRAPH-FAD0 -// fad1 CJK COMPATIBILITY IDEOGRAPH-FAD1 -// fad2 CJK COMPATIBILITY IDEOGRAPH-FAD2 -// fad3 CJK COMPATIBILITY IDEOGRAPH-FAD3 -// fad4 CJK COMPATIBILITY IDEOGRAPH-FAD4 -// fad5 CJK COMPATIBILITY IDEOGRAPH-FAD5 -// fad6 CJK COMPATIBILITY IDEOGRAPH-FAD6 -// fad7 CJK COMPATIBILITY IDEOGRAPH-FAD7 -// fad8 CJK COMPATIBILITY IDEOGRAPH-FAD8 -// fad9 CJK COMPATIBILITY IDEOGRAPH-FAD9 - { 0xFA70, 0x6A, 0x9, 0, 0 }, -// fb00 LATIN SMALL LIGATURE FF -// fb01 LATIN SMALL LIGATURE FI -// fb02 LATIN SMALL LIGATURE FL -// fb03 LATIN SMALL LIGATURE FFI -// fb04 LATIN SMALL LIGATURE FFL -// fb05 LATIN SMALL LIGATURE LONG S T -// fb06 LATIN SMALL LIGATURE ST - { 0xFB00, 0x7, 0x49, 0, 0 }, -// fb13 ARMENIAN SMALL LIGATURE MEN NOW -// fb14 ARMENIAN SMALL LIGATURE MEN ECH -// fb15 ARMENIAN SMALL LIGATURE MEN INI -// fb16 ARMENIAN SMALL LIGATURE VEW NOW -// fb17 ARMENIAN SMALL LIGATURE MEN XEH - { 0xFB13, 0x5, 0x49, 0, 0 }, -// fb1d HEBREW LETTER YOD WITH HIRIQ - { 0xFB1D, 0x1, 0x9, 0, 0 }, -// fb1e HEBREW POINT JUDEO-SPANISH VARIKA - { 0xFB1E, 0x1, 0x0, 0, 0 }, -// fb1f HEBREW LIGATURE YIDDISH YOD YOD PATAH -// fb20 HEBREW LETTER ALTERNATIVE AYIN -// fb21 HEBREW LETTER WIDE ALEF -// fb22 HEBREW LETTER WIDE DALET -// fb23 HEBREW LETTER WIDE HE -// fb24 HEBREW LETTER WIDE KAF -// fb25 HEBREW LETTER WIDE LAMED -// fb26 HEBREW LETTER WIDE FINAL MEM -// fb27 HEBREW LETTER WIDE RESH -// fb28 HEBREW LETTER WIDE TAV - { 0xFB1F, 0xA, 0x9, 0, 0 }, -// fb29 HEBREW LETTER ALTERNATIVE PLUS SIGN - { 0xFB29, 0x1, 0x8, 0, 0 }, -// fb2a HEBREW LETTER SHIN WITH SHIN DOT -// fb2b HEBREW LETTER SHIN WITH SIN DOT -// fb2c HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT -// fb2d HEBREW LETTER SHIN WITH DAGESH AND SIN DOT -// fb2e HEBREW LETTER ALEF WITH PATAH -// fb2f HEBREW LETTER ALEF WITH QAMATS -// fb30 HEBREW LETTER ALEF WITH MAPIQ -// fb31 HEBREW LETTER BET WITH DAGESH -// fb32 HEBREW LETTER GIMEL WITH DAGESH -// fb33 HEBREW LETTER DALET WITH DAGESH -// fb34 HEBREW LETTER HE WITH MAPIQ -// fb35 HEBREW LETTER VAV WITH DAGESH -// fb36 HEBREW LETTER ZAYIN WITH DAGESH - { 0xFB2A, 0xD, 0x9, 0, 0 }, -// fb38 HEBREW LETTER TET WITH DAGESH -// fb39 HEBREW LETTER YOD WITH DAGESH -// fb3a HEBREW LETTER FINAL KAF WITH DAGESH -// fb3b HEBREW LETTER KAF WITH DAGESH -// fb3c HEBREW LETTER LAMED WITH DAGESH - { 0xFB38, 0x5, 0x9, 0, 0 }, -// fb3e HEBREW LETTER MEM WITH DAGESH - { 0xFB3E, 0x1, 0x9, 0, 0 }, -// fb40 HEBREW LETTER NUN WITH DAGESH -// fb41 HEBREW LETTER SAMEKH WITH DAGESH - { 0xFB40, 0x2, 0x9, 0, 0 }, -// fb43 HEBREW LETTER FINAL PE WITH DAGESH -// fb44 HEBREW LETTER PE WITH DAGESH - { 0xFB43, 0x2, 0x9, 0, 0 }, -// fb46 HEBREW LETTER TSADI WITH DAGESH -// fb47 HEBREW LETTER QOF WITH DAGESH -// fb48 HEBREW LETTER RESH WITH DAGESH -// fb49 HEBREW LETTER SHIN WITH DAGESH -// fb4a HEBREW LETTER TAV WITH DAGESH -// fb4b HEBREW LETTER VAV WITH HOLAM -// fb4c HEBREW LETTER BET WITH RAFE -// fb4d HEBREW LETTER KAF WITH RAFE -// fb4e HEBREW LETTER PE WITH RAFE -// fb4f HEBREW LIGATURE ALEF LAMED -// fb50 ARABIC LETTER ALEF WASLA ISOLATED FORM -// fb51 ARABIC LETTER ALEF WASLA FINAL FORM -// fb52 ARABIC LETTER BEEH ISOLATED FORM -// fb53 ARABIC LETTER BEEH FINAL FORM -// fb54 ARABIC LETTER BEEH INITIAL FORM -// fb55 ARABIC LETTER BEEH MEDIAL FORM -// fb56 ARABIC LETTER PEH ISOLATED FORM -// fb57 ARABIC LETTER PEH FINAL FORM -// fb58 ARABIC LETTER PEH INITIAL FORM -// fb59 ARABIC LETTER PEH MEDIAL FORM -// fb5a ARABIC LETTER BEHEH ISOLATED FORM -// fb5b ARABIC LETTER BEHEH FINAL FORM -// fb5c ARABIC LETTER BEHEH INITIAL FORM -// fb5d ARABIC LETTER BEHEH MEDIAL FORM -// fb5e ARABIC LETTER TTEHEH ISOLATED FORM -// fb5f ARABIC LETTER TTEHEH FINAL FORM -// fb60 ARABIC LETTER TTEHEH INITIAL FORM -// fb61 ARABIC LETTER TTEHEH MEDIAL FORM -// fb62 ARABIC LETTER TEHEH ISOLATED FORM -// fb63 ARABIC LETTER TEHEH FINAL FORM -// fb64 ARABIC LETTER TEHEH INITIAL FORM -// fb65 ARABIC LETTER TEHEH MEDIAL FORM -// fb66 ARABIC LETTER TTEH ISOLATED FORM -// fb67 ARABIC LETTER TTEH FINAL FORM -// fb68 ARABIC LETTER TTEH INITIAL FORM -// fb69 ARABIC LETTER TTEH MEDIAL FORM -// fb6a ARABIC LETTER VEH ISOLATED FORM -// fb6b ARABIC LETTER VEH FINAL FORM -// fb6c ARABIC LETTER VEH INITIAL FORM -// fb6d ARABIC LETTER VEH MEDIAL FORM -// fb6e ARABIC LETTER PEHEH ISOLATED FORM -// fb6f ARABIC LETTER PEHEH FINAL FORM -// fb70 ARABIC LETTER PEHEH INITIAL FORM -// fb71 ARABIC LETTER PEHEH MEDIAL FORM -// fb72 ARABIC LETTER DYEH ISOLATED FORM -// fb73 ARABIC LETTER DYEH FINAL FORM -// fb74 ARABIC LETTER DYEH INITIAL FORM -// fb75 ARABIC LETTER DYEH MEDIAL FORM -// fb76 ARABIC LETTER NYEH ISOLATED FORM -// fb77 ARABIC LETTER NYEH FINAL FORM -// fb78 ARABIC LETTER NYEH INITIAL FORM -// fb79 ARABIC LETTER NYEH MEDIAL FORM -// fb7a ARABIC LETTER TCHEH ISOLATED FORM -// fb7b ARABIC LETTER TCHEH FINAL FORM -// fb7c ARABIC LETTER TCHEH INITIAL FORM -// fb7d ARABIC LETTER TCHEH MEDIAL FORM -// fb7e ARABIC LETTER TCHEHEH ISOLATED FORM -// fb7f ARABIC LETTER TCHEHEH FINAL FORM -// fb80 ARABIC LETTER TCHEHEH INITIAL FORM -// fb81 ARABIC LETTER TCHEHEH MEDIAL FORM -// fb82 ARABIC LETTER DDAHAL ISOLATED FORM -// fb83 ARABIC LETTER DDAHAL FINAL FORM -// fb84 ARABIC LETTER DAHAL ISOLATED FORM -// fb85 ARABIC LETTER DAHAL FINAL FORM -// fb86 ARABIC LETTER DUL ISOLATED FORM -// fb87 ARABIC LETTER DUL FINAL FORM -// fb88 ARABIC LETTER DDAL ISOLATED FORM -// fb89 ARABIC LETTER DDAL FINAL FORM -// fb8a ARABIC LETTER JEH ISOLATED FORM -// fb8b ARABIC LETTER JEH FINAL FORM -// fb8c ARABIC LETTER RREH ISOLATED FORM -// fb8d ARABIC LETTER RREH FINAL FORM -// fb8e ARABIC LETTER KEHEH ISOLATED FORM -// fb8f ARABIC LETTER KEHEH FINAL FORM -// fb90 ARABIC LETTER KEHEH INITIAL FORM -// fb91 ARABIC LETTER KEHEH MEDIAL FORM -// fb92 ARABIC LETTER GAF ISOLATED FORM -// fb93 ARABIC LETTER GAF FINAL FORM -// fb94 ARABIC LETTER GAF INITIAL FORM -// fb95 ARABIC LETTER GAF MEDIAL FORM -// fb96 ARABIC LETTER GUEH ISOLATED FORM -// fb97 ARABIC LETTER GUEH FINAL FORM -// fb98 ARABIC LETTER GUEH INITIAL FORM -// fb99 ARABIC LETTER GUEH MEDIAL FORM -// fb9a ARABIC LETTER NGOEH ISOLATED FORM -// fb9b ARABIC LETTER NGOEH FINAL FORM -// fb9c ARABIC LETTER NGOEH INITIAL FORM -// fb9d ARABIC LETTER NGOEH MEDIAL FORM -// fb9e ARABIC LETTER NOON GHUNNA ISOLATED FORM -// fb9f ARABIC LETTER NOON GHUNNA FINAL FORM -// fba0 ARABIC LETTER RNOON ISOLATED FORM -// fba1 ARABIC LETTER RNOON FINAL FORM -// fba2 ARABIC LETTER RNOON INITIAL FORM -// fba3 ARABIC LETTER RNOON MEDIAL FORM -// fba4 ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM -// fba5 ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM -// fba6 ARABIC LETTER HEH GOAL ISOLATED FORM -// fba7 ARABIC LETTER HEH GOAL FINAL FORM -// fba8 ARABIC LETTER HEH GOAL INITIAL FORM -// fba9 ARABIC LETTER HEH GOAL MEDIAL FORM -// fbaa ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM -// fbab ARABIC LETTER HEH DOACHASHMEE FINAL FORM -// fbac ARABIC LETTER HEH DOACHASHMEE INITIAL FORM -// fbad ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM -// fbae ARABIC LETTER YEH BARREE ISOLATED FORM -// fbaf ARABIC LETTER YEH BARREE FINAL FORM -// fbb0 ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM -// fbb1 ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM - { 0xFB46, 0x6C, 0x9, 0, 0 }, -// fbb2 ARABIC SYMBOL DOT ABOVE -// fbb3 ARABIC SYMBOL DOT BELOW -// fbb4 ARABIC SYMBOL TWO DOTS ABOVE -// fbb5 ARABIC SYMBOL TWO DOTS BELOW -// fbb6 ARABIC SYMBOL THREE DOTS ABOVE -// fbb7 ARABIC SYMBOL THREE DOTS BELOW -// fbb8 ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS ABOVE -// fbb9 ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS BELOW -// fbba ARABIC SYMBOL FOUR DOTS ABOVE -// fbbb ARABIC SYMBOL FOUR DOTS BELOW -// fbbc ARABIC SYMBOL DOUBLE VERTICAL BAR BELOW -// fbbd ARABIC SYMBOL TWO DOTS VERTICALLY ABOVE -// fbbe ARABIC SYMBOL TWO DOTS VERTICALLY BELOW -// fbbf ARABIC SYMBOL RING -// fbc0 ARABIC SYMBOL SMALL TAH ABOVE -// fbc1 ARABIC SYMBOL SMALL TAH BELOW - { 0xFBB2, 0x10, 0x8, 0, 0 }, -// fbd3 ARABIC LETTER NG ISOLATED FORM -// fbd4 ARABIC LETTER NG FINAL FORM -// fbd5 ARABIC LETTER NG INITIAL FORM -// fbd6 ARABIC LETTER NG MEDIAL FORM -// fbd7 ARABIC LETTER U ISOLATED FORM -// fbd8 ARABIC LETTER U FINAL FORM -// fbd9 ARABIC LETTER OE ISOLATED FORM -// fbda ARABIC LETTER OE FINAL FORM -// fbdb ARABIC LETTER YU ISOLATED FORM -// fbdc ARABIC LETTER YU FINAL FORM -// fbdd ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM -// fbde ARABIC LETTER VE ISOLATED FORM -// fbdf ARABIC LETTER VE FINAL FORM -// fbe0 ARABIC LETTER KIRGHIZ OE ISOLATED FORM -// fbe1 ARABIC LETTER KIRGHIZ OE FINAL FORM -// fbe2 ARABIC LETTER KIRGHIZ YU ISOLATED FORM -// fbe3 ARABIC LETTER KIRGHIZ YU FINAL FORM -// fbe4 ARABIC LETTER E ISOLATED FORM -// fbe5 ARABIC LETTER E FINAL FORM -// fbe6 ARABIC LETTER E INITIAL FORM -// fbe7 ARABIC LETTER E MEDIAL FORM -// fbe8 ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM -// fbe9 ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM -// fbea ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM -// fbeb ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM -// fbec ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM -// fbed ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM -// fbee ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM -// fbef ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM -// fbf0 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM -// fbf1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM -// fbf2 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM -// fbf3 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM -// fbf4 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM -// fbf5 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM -// fbf6 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM -// fbf7 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM -// fbf8 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM -// fbf9 ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM -// fbfa ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM -// fbfb ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM -// fbfc ARABIC LETTER FARSI YEH ISOLATED FORM -// fbfd ARABIC LETTER FARSI YEH FINAL FORM -// fbfe ARABIC LETTER FARSI YEH INITIAL FORM -// fbff ARABIC LETTER FARSI YEH MEDIAL FORM -// fc00 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM -// fc01 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM -// fc02 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM -// fc03 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM -// fc04 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM -// fc05 ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM -// fc06 ARABIC LIGATURE BEH WITH HAH ISOLATED FORM -// fc07 ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM -// fc08 ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM -// fc09 ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM -// fc0a ARABIC LIGATURE BEH WITH YEH ISOLATED FORM -// fc0b ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM -// fc0c ARABIC LIGATURE TEH WITH HAH ISOLATED FORM -// fc0d ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM -// fc0e ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM -// fc0f ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM -// fc10 ARABIC LIGATURE TEH WITH YEH ISOLATED FORM -// fc11 ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM -// fc12 ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM -// fc13 ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM -// fc14 ARABIC LIGATURE THEH WITH YEH ISOLATED FORM -// fc15 ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM -// fc16 ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM -// fc17 ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM -// fc18 ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM -// fc19 ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM -// fc1a ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM -// fc1b ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM -// fc1c ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM -// fc1d ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM -// fc1e ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM -// fc1f ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM -// fc20 ARABIC LIGATURE SAD WITH HAH ISOLATED FORM -// fc21 ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM -// fc22 ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM -// fc23 ARABIC LIGATURE DAD WITH HAH ISOLATED FORM -// fc24 ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM -// fc25 ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM -// fc26 ARABIC LIGATURE TAH WITH HAH ISOLATED FORM -// fc27 ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM -// fc28 ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM -// fc29 ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM -// fc2a ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM -// fc2b ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM -// fc2c ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM -// fc2d ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM -// fc2e ARABIC LIGATURE FEH WITH HAH ISOLATED FORM -// fc2f ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM -// fc30 ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM -// fc31 ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM -// fc32 ARABIC LIGATURE FEH WITH YEH ISOLATED FORM -// fc33 ARABIC LIGATURE QAF WITH HAH ISOLATED FORM -// fc34 ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM -// fc35 ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM -// fc36 ARABIC LIGATURE QAF WITH YEH ISOLATED FORM -// fc37 ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM -// fc38 ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM -// fc39 ARABIC LIGATURE KAF WITH HAH ISOLATED FORM -// fc3a ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM -// fc3b ARABIC LIGATURE KAF WITH LAM ISOLATED FORM -// fc3c ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM -// fc3d ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM -// fc3e ARABIC LIGATURE KAF WITH YEH ISOLATED FORM -// fc3f ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM -// fc40 ARABIC LIGATURE LAM WITH HAH ISOLATED FORM -// fc41 ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM -// fc42 ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM -// fc43 ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM -// fc44 ARABIC LIGATURE LAM WITH YEH ISOLATED FORM -// fc45 ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM -// fc46 ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM -// fc47 ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM -// fc48 ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM -// fc49 ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM -// fc4a ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM -// fc4b ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM -// fc4c ARABIC LIGATURE NOON WITH HAH ISOLATED FORM -// fc4d ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM -// fc4e ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM -// fc4f ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM -// fc50 ARABIC LIGATURE NOON WITH YEH ISOLATED FORM -// fc51 ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM -// fc52 ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM -// fc53 ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM -// fc54 ARABIC LIGATURE HEH WITH YEH ISOLATED FORM -// fc55 ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM -// fc56 ARABIC LIGATURE YEH WITH HAH ISOLATED FORM -// fc57 ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM -// fc58 ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM -// fc59 ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM -// fc5a ARABIC LIGATURE YEH WITH YEH ISOLATED FORM -// fc5b ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM -// fc5c ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM -// fc5d ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM -// fc5e ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM -// fc5f ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM -// fc60 ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM -// fc61 ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM -// fc62 ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM -// fc63 ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM -// fc64 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM -// fc65 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM -// fc66 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM -// fc67 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM -// fc68 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM -// fc69 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM -// fc6a ARABIC LIGATURE BEH WITH REH FINAL FORM -// fc6b ARABIC LIGATURE BEH WITH ZAIN FINAL FORM -// fc6c ARABIC LIGATURE BEH WITH MEEM FINAL FORM -// fc6d ARABIC LIGATURE BEH WITH NOON FINAL FORM -// fc6e ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM -// fc6f ARABIC LIGATURE BEH WITH YEH FINAL FORM -// fc70 ARABIC LIGATURE TEH WITH REH FINAL FORM -// fc71 ARABIC LIGATURE TEH WITH ZAIN FINAL FORM -// fc72 ARABIC LIGATURE TEH WITH MEEM FINAL FORM -// fc73 ARABIC LIGATURE TEH WITH NOON FINAL FORM -// fc74 ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM -// fc75 ARABIC LIGATURE TEH WITH YEH FINAL FORM -// fc76 ARABIC LIGATURE THEH WITH REH FINAL FORM -// fc77 ARABIC LIGATURE THEH WITH ZAIN FINAL FORM -// fc78 ARABIC LIGATURE THEH WITH MEEM FINAL FORM -// fc79 ARABIC LIGATURE THEH WITH NOON FINAL FORM -// fc7a ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM -// fc7b ARABIC LIGATURE THEH WITH YEH FINAL FORM -// fc7c ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM -// fc7d ARABIC LIGATURE FEH WITH YEH FINAL FORM -// fc7e ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM -// fc7f ARABIC LIGATURE QAF WITH YEH FINAL FORM -// fc80 ARABIC LIGATURE KAF WITH ALEF FINAL FORM -// fc81 ARABIC LIGATURE KAF WITH LAM FINAL FORM -// fc82 ARABIC LIGATURE KAF WITH MEEM FINAL FORM -// fc83 ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM -// fc84 ARABIC LIGATURE KAF WITH YEH FINAL FORM -// fc85 ARABIC LIGATURE LAM WITH MEEM FINAL FORM -// fc86 ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM -// fc87 ARABIC LIGATURE LAM WITH YEH FINAL FORM -// fc88 ARABIC LIGATURE MEEM WITH ALEF FINAL FORM -// fc89 ARABIC LIGATURE MEEM WITH MEEM FINAL FORM -// fc8a ARABIC LIGATURE NOON WITH REH FINAL FORM -// fc8b ARABIC LIGATURE NOON WITH ZAIN FINAL FORM -// fc8c ARABIC LIGATURE NOON WITH MEEM FINAL FORM -// fc8d ARABIC LIGATURE NOON WITH NOON FINAL FORM -// fc8e ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM -// fc8f ARABIC LIGATURE NOON WITH YEH FINAL FORM -// fc90 ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM -// fc91 ARABIC LIGATURE YEH WITH REH FINAL FORM -// fc92 ARABIC LIGATURE YEH WITH ZAIN FINAL FORM -// fc93 ARABIC LIGATURE YEH WITH MEEM FINAL FORM -// fc94 ARABIC LIGATURE YEH WITH NOON FINAL FORM -// fc95 ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM -// fc96 ARABIC LIGATURE YEH WITH YEH FINAL FORM -// fc97 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM -// fc98 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM -// fc99 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM -// fc9a ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM -// fc9b ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM -// fc9c ARABIC LIGATURE BEH WITH JEEM INITIAL FORM -// fc9d ARABIC LIGATURE BEH WITH HAH INITIAL FORM -// fc9e ARABIC LIGATURE BEH WITH KHAH INITIAL FORM -// fc9f ARABIC LIGATURE BEH WITH MEEM INITIAL FORM -// fca0 ARABIC LIGATURE BEH WITH HEH INITIAL FORM -// fca1 ARABIC LIGATURE TEH WITH JEEM INITIAL FORM -// fca2 ARABIC LIGATURE TEH WITH HAH INITIAL FORM -// fca3 ARABIC LIGATURE TEH WITH KHAH INITIAL FORM -// fca4 ARABIC LIGATURE TEH WITH MEEM INITIAL FORM -// fca5 ARABIC LIGATURE TEH WITH HEH INITIAL FORM -// fca6 ARABIC LIGATURE THEH WITH MEEM INITIAL FORM -// fca7 ARABIC LIGATURE JEEM WITH HAH INITIAL FORM -// fca8 ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM -// fca9 ARABIC LIGATURE HAH WITH JEEM INITIAL FORM -// fcaa ARABIC LIGATURE HAH WITH MEEM INITIAL FORM -// fcab ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM -// fcac ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM -// fcad ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM -// fcae ARABIC LIGATURE SEEN WITH HAH INITIAL FORM -// fcaf ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM -// fcb0 ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM -// fcb1 ARABIC LIGATURE SAD WITH HAH INITIAL FORM -// fcb2 ARABIC LIGATURE SAD WITH KHAH INITIAL FORM -// fcb3 ARABIC LIGATURE SAD WITH MEEM INITIAL FORM -// fcb4 ARABIC LIGATURE DAD WITH JEEM INITIAL FORM -// fcb5 ARABIC LIGATURE DAD WITH HAH INITIAL FORM -// fcb6 ARABIC LIGATURE DAD WITH KHAH INITIAL FORM -// fcb7 ARABIC LIGATURE DAD WITH MEEM INITIAL FORM -// fcb8 ARABIC LIGATURE TAH WITH HAH INITIAL FORM -// fcb9 ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM -// fcba ARABIC LIGATURE AIN WITH JEEM INITIAL FORM -// fcbb ARABIC LIGATURE AIN WITH MEEM INITIAL FORM -// fcbc ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM -// fcbd ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM -// fcbe ARABIC LIGATURE FEH WITH JEEM INITIAL FORM -// fcbf ARABIC LIGATURE FEH WITH HAH INITIAL FORM -// fcc0 ARABIC LIGATURE FEH WITH KHAH INITIAL FORM -// fcc1 ARABIC LIGATURE FEH WITH MEEM INITIAL FORM -// fcc2 ARABIC LIGATURE QAF WITH HAH INITIAL FORM -// fcc3 ARABIC LIGATURE QAF WITH MEEM INITIAL FORM -// fcc4 ARABIC LIGATURE KAF WITH JEEM INITIAL FORM -// fcc5 ARABIC LIGATURE KAF WITH HAH INITIAL FORM -// fcc6 ARABIC LIGATURE KAF WITH KHAH INITIAL FORM -// fcc7 ARABIC LIGATURE KAF WITH LAM INITIAL FORM -// fcc8 ARABIC LIGATURE KAF WITH MEEM INITIAL FORM -// fcc9 ARABIC LIGATURE LAM WITH JEEM INITIAL FORM -// fcca ARABIC LIGATURE LAM WITH HAH INITIAL FORM -// fccb ARABIC LIGATURE LAM WITH KHAH INITIAL FORM -// fccc ARABIC LIGATURE LAM WITH MEEM INITIAL FORM -// fccd ARABIC LIGATURE LAM WITH HEH INITIAL FORM -// fcce ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM -// fccf ARABIC LIGATURE MEEM WITH HAH INITIAL FORM -// fcd0 ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM -// fcd1 ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM -// fcd2 ARABIC LIGATURE NOON WITH JEEM INITIAL FORM -// fcd3 ARABIC LIGATURE NOON WITH HAH INITIAL FORM -// fcd4 ARABIC LIGATURE NOON WITH KHAH INITIAL FORM -// fcd5 ARABIC LIGATURE NOON WITH MEEM INITIAL FORM -// fcd6 ARABIC LIGATURE NOON WITH HEH INITIAL FORM -// fcd7 ARABIC LIGATURE HEH WITH JEEM INITIAL FORM -// fcd8 ARABIC LIGATURE HEH WITH MEEM INITIAL FORM -// fcd9 ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM -// fcda ARABIC LIGATURE YEH WITH JEEM INITIAL FORM -// fcdb ARABIC LIGATURE YEH WITH HAH INITIAL FORM -// fcdc ARABIC LIGATURE YEH WITH KHAH INITIAL FORM -// fcdd ARABIC LIGATURE YEH WITH MEEM INITIAL FORM -// fcde ARABIC LIGATURE YEH WITH HEH INITIAL FORM -// fcdf ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM -// fce0 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM -// fce1 ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM -// fce2 ARABIC LIGATURE BEH WITH HEH MEDIAL FORM -// fce3 ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM -// fce4 ARABIC LIGATURE TEH WITH HEH MEDIAL FORM -// fce5 ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM -// fce6 ARABIC LIGATURE THEH WITH HEH MEDIAL FORM -// fce7 ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM -// fce8 ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM -// fce9 ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM -// fcea ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM -// fceb ARABIC LIGATURE KAF WITH LAM MEDIAL FORM -// fcec ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM -// fced ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM -// fcee ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM -// fcef ARABIC LIGATURE NOON WITH HEH MEDIAL FORM -// fcf0 ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM -// fcf1 ARABIC LIGATURE YEH WITH HEH MEDIAL FORM -// fcf2 ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM -// fcf3 ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM -// fcf4 ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM -// fcf5 ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM -// fcf6 ARABIC LIGATURE TAH WITH YEH ISOLATED FORM -// fcf7 ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM -// fcf8 ARABIC LIGATURE AIN WITH YEH ISOLATED FORM -// fcf9 ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM -// fcfa ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM -// fcfb ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM -// fcfc ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM -// fcfd ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM -// fcfe ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM -// fcff ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM -// fd00 ARABIC LIGATURE HAH WITH YEH ISOLATED FORM -// fd01 ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM -// fd02 ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM -// fd03 ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM -// fd04 ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM -// fd05 ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM -// fd06 ARABIC LIGATURE SAD WITH YEH ISOLATED FORM -// fd07 ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM -// fd08 ARABIC LIGATURE DAD WITH YEH ISOLATED FORM -// fd09 ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM -// fd0a ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM -// fd0b ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM -// fd0c ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM -// fd0d ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM -// fd0e ARABIC LIGATURE SEEN WITH REH ISOLATED FORM -// fd0f ARABIC LIGATURE SAD WITH REH ISOLATED FORM -// fd10 ARABIC LIGATURE DAD WITH REH ISOLATED FORM -// fd11 ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM -// fd12 ARABIC LIGATURE TAH WITH YEH FINAL FORM -// fd13 ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM -// fd14 ARABIC LIGATURE AIN WITH YEH FINAL FORM -// fd15 ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM -// fd16 ARABIC LIGATURE GHAIN WITH YEH FINAL FORM -// fd17 ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM -// fd18 ARABIC LIGATURE SEEN WITH YEH FINAL FORM -// fd19 ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM -// fd1a ARABIC LIGATURE SHEEN WITH YEH FINAL FORM -// fd1b ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM -// fd1c ARABIC LIGATURE HAH WITH YEH FINAL FORM -// fd1d ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM -// fd1e ARABIC LIGATURE JEEM WITH YEH FINAL FORM -// fd1f ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM -// fd20 ARABIC LIGATURE KHAH WITH YEH FINAL FORM -// fd21 ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM -// fd22 ARABIC LIGATURE SAD WITH YEH FINAL FORM -// fd23 ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM -// fd24 ARABIC LIGATURE DAD WITH YEH FINAL FORM -// fd25 ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM -// fd26 ARABIC LIGATURE SHEEN WITH HAH FINAL FORM -// fd27 ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM -// fd28 ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM -// fd29 ARABIC LIGATURE SHEEN WITH REH FINAL FORM -// fd2a ARABIC LIGATURE SEEN WITH REH FINAL FORM -// fd2b ARABIC LIGATURE SAD WITH REH FINAL FORM -// fd2c ARABIC LIGATURE DAD WITH REH FINAL FORM -// fd2d ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM -// fd2e ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM -// fd2f ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM -// fd30 ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM -// fd31 ARABIC LIGATURE SEEN WITH HEH INITIAL FORM -// fd32 ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM -// fd33 ARABIC LIGATURE TAH WITH MEEM INITIAL FORM -// fd34 ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM -// fd35 ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM -// fd36 ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM -// fd37 ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM -// fd38 ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM -// fd39 ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM -// fd3a ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM -// fd3b ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM -// fd3c ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM -// fd3d ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM - { 0xFBD3, 0x16B, 0x9, 0, 0 }, -// fd3e ORNATE LEFT PARENTHESIS -// fd3f ORNATE RIGHT PARENTHESIS - { 0xFD3E, 0x2, 0x18, 0, 0 }, -// fd50 ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM -// fd51 ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM -// fd52 ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM -// fd53 ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM -// fd54 ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM -// fd55 ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM -// fd56 ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM -// fd57 ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM -// fd58 ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM -// fd59 ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM -// fd5a ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM -// fd5b ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM -// fd5c ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM -// fd5d ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM -// fd5e ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM -// fd5f ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM -// fd60 ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM -// fd61 ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM -// fd62 ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM -// fd63 ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM -// fd64 ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM -// fd65 ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM -// fd66 ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM -// fd67 ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM -// fd68 ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM -// fd69 ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM -// fd6a ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM -// fd6b ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM -// fd6c ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM -// fd6d ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM -// fd6e ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM -// fd6f ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM -// fd70 ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM -// fd71 ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM -// fd72 ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM -// fd73 ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM -// fd74 ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM -// fd75 ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM -// fd76 ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM -// fd77 ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM -// fd78 ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM -// fd79 ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM -// fd7a ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM -// fd7b ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM -// fd7c ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM -// fd7d ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM -// fd7e ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM -// fd7f ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM -// fd80 ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM -// fd81 ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM -// fd82 ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM -// fd83 ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM -// fd84 ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM -// fd85 ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM -// fd86 ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM -// fd87 ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM -// fd88 ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM -// fd89 ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM -// fd8a ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM -// fd8b ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM -// fd8c ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM -// fd8d ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM -// fd8e ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM -// fd8f ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM - { 0xFD50, 0x40, 0x9, 0, 0 }, -// fd92 ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM -// fd93 ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM -// fd94 ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM -// fd95 ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM -// fd96 ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM -// fd97 ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM -// fd98 ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM -// fd99 ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM -// fd9a ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM -// fd9b ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM -// fd9c ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM -// fd9d ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM -// fd9e ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM -// fd9f ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM -// fda0 ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM -// fda1 ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM -// fda2 ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM -// fda3 ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM -// fda4 ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM -// fda5 ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM -// fda6 ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM -// fda7 ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM -// fda8 ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM -// fda9 ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM -// fdaa ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM -// fdab ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM -// fdac ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM -// fdad ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM -// fdae ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM -// fdaf ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM -// fdb0 ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM -// fdb1 ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM -// fdb2 ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM -// fdb3 ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM -// fdb4 ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM -// fdb5 ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM -// fdb6 ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM -// fdb7 ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM -// fdb8 ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM -// fdb9 ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM -// fdba ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM -// fdbb ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM -// fdbc ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM -// fdbd ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM -// fdbe ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM -// fdbf ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM -// fdc0 ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM -// fdc1 ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM -// fdc2 ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM -// fdc3 ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM -// fdc4 ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM -// fdc5 ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM -// fdc6 ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM -// fdc7 ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM - { 0xFD92, 0x36, 0x9, 0, 0 }, -// fdf0 ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM -// fdf1 ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM -// fdf2 ARABIC LIGATURE ALLAH ISOLATED FORM -// fdf3 ARABIC LIGATURE AKBAR ISOLATED FORM -// fdf4 ARABIC LIGATURE MOHAMMAD ISOLATED FORM -// fdf5 ARABIC LIGATURE SALAM ISOLATED FORM -// fdf6 ARABIC LIGATURE RASOUL ISOLATED FORM -// fdf7 ARABIC LIGATURE ALAYHE ISOLATED FORM -// fdf8 ARABIC LIGATURE WASALLAM ISOLATED FORM -// fdf9 ARABIC LIGATURE SALLA ISOLATED FORM -// fdfa ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM -// fdfb ARABIC LIGATURE JALLAJALALOUHOU - { 0xFDF0, 0xC, 0x9, 0, 0 }, -// fdfc RIAL SIGN -// fdfd ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM - { 0xFDFC, 0x2, 0x8, 0, 0 }, -// fe00 VARIATION SELECTOR-1 -// fe01 VARIATION SELECTOR-2 -// fe02 VARIATION SELECTOR-3 -// fe03 VARIATION SELECTOR-4 -// fe04 VARIATION SELECTOR-5 -// fe05 VARIATION SELECTOR-6 -// fe06 VARIATION SELECTOR-7 -// fe07 VARIATION SELECTOR-8 -// fe08 VARIATION SELECTOR-9 -// fe09 VARIATION SELECTOR-10 -// fe0a VARIATION SELECTOR-11 -// fe0b VARIATION SELECTOR-12 -// fe0c VARIATION SELECTOR-13 -// fe0d VARIATION SELECTOR-14 -// fe0e VARIATION SELECTOR-15 -// fe0f VARIATION SELECTOR-16 - { 0xFE00, 0x10, 0x0, 0, 0 }, -// fe10 PRESENTATION FORM FOR VERTICAL COMMA -// fe11 PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA -// fe12 PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP -// fe13 PRESENTATION FORM FOR VERTICAL COLON -// fe14 PRESENTATION FORM FOR VERTICAL SEMICOLON -// fe15 PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK -// fe16 PRESENTATION FORM FOR VERTICAL QUESTION MARK -// fe17 PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET -// fe18 PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET -// fe19 PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS - { 0xFE10, 0xA, 0x18, 0, 0 }, -// fe20 COMBINING LIGATURE LEFT HALF -// fe21 COMBINING LIGATURE RIGHT HALF -// fe22 COMBINING DOUBLE TILDE LEFT HALF -// fe23 COMBINING DOUBLE TILDE RIGHT HALF -// fe24 COMBINING MACRON LEFT HALF -// fe25 COMBINING MACRON RIGHT HALF -// fe26 COMBINING CONJOINING MACRON -// fe27 COMBINING LIGATURE LEFT HALF BELOW -// fe28 COMBINING LIGATURE RIGHT HALF BELOW -// fe29 COMBINING TILDE LEFT HALF BELOW -// fe2a COMBINING TILDE RIGHT HALF BELOW -// fe2b COMBINING MACRON LEFT HALF BELOW -// fe2c COMBINING MACRON RIGHT HALF BELOW -// fe2d COMBINING CONJOINING MACRON BELOW - { 0xFE20, 0xE, 0x0, 0, 0 }, -// fe30 PRESENTATION FORM FOR VERTICAL TWO DOT LEADER -// fe31 PRESENTATION FORM FOR VERTICAL EM DASH -// fe32 PRESENTATION FORM FOR VERTICAL EN DASH -// fe33 PRESENTATION FORM FOR VERTICAL LOW LINE -// fe34 PRESENTATION FORM FOR VERTICAL WAVY LOW LINE -// fe35 PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS -// fe36 PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS -// fe37 PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET -// fe38 PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET -// fe39 PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET -// fe3a PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET -// fe3b PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET -// fe3c PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET -// fe3d PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET -// fe3e PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET -// fe3f PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET -// fe40 PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET -// fe41 PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET -// fe42 PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET -// fe43 PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET -// fe44 PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET -// fe45 SESAME DOT -// fe46 WHITE SESAME DOT -// fe47 PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET -// fe48 PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET -// fe49 DASHED OVERLINE -// fe4a CENTRELINE OVERLINE -// fe4b WAVY OVERLINE -// fe4c DOUBLE WAVY OVERLINE -// fe4d DASHED LOW LINE -// fe4e CENTRELINE LOW LINE -// fe4f WAVY LOW LINE -// fe50 SMALL COMMA -// fe51 SMALL IDEOGRAPHIC COMMA -// fe52 SMALL FULL STOP - { 0xFE30, 0x23, 0x18, 0, 0 }, -// fe54 SMALL SEMICOLON -// fe55 SMALL COLON -// fe56 SMALL QUESTION MARK -// fe57 SMALL EXCLAMATION MARK -// fe58 SMALL EM DASH -// fe59 SMALL LEFT PARENTHESIS -// fe5a SMALL RIGHT PARENTHESIS -// fe5b SMALL LEFT CURLY BRACKET -// fe5c SMALL RIGHT CURLY BRACKET -// fe5d SMALL LEFT TORTOISE SHELL BRACKET -// fe5e SMALL RIGHT TORTOISE SHELL BRACKET -// fe5f SMALL NUMBER SIGN -// fe60 SMALL AMPERSAND -// fe61 SMALL ASTERISK - { 0xFE54, 0xE, 0x18, 0, 0 }, -// fe62 SMALL PLUS SIGN - { 0xFE62, 0x1, 0x8, 0, 0 }, -// fe63 SMALL HYPHEN-MINUS - { 0xFE63, 0x1, 0x18, 0, 0 }, -// fe64 SMALL LESS-THAN SIGN -// fe65 SMALL GREATER-THAN SIGN -// fe66 SMALL EQUALS SIGN - { 0xFE64, 0x3, 0x8, 0, 0 }, -// fe68 SMALL REVERSE SOLIDUS - { 0xFE68, 0x1, 0x18, 0, 0 }, -// fe69 SMALL DOLLAR SIGN - { 0xFE69, 0x1, 0x8, 0, 0 }, -// fe6a SMALL PERCENT SIGN -// fe6b SMALL COMMERCIAL AT - { 0xFE6A, 0x2, 0x18, 0, 0 }, -// fe70 ARABIC FATHATAN ISOLATED FORM -// fe71 ARABIC TATWEEL WITH FATHATAN ABOVE -// fe72 ARABIC DAMMATAN ISOLATED FORM -// fe73 ARABIC TAIL FRAGMENT -// fe74 ARABIC KASRATAN ISOLATED FORM - { 0xFE70, 0x5, 0x9, 0, 0 }, -// fe76 ARABIC FATHA ISOLATED FORM -// fe77 ARABIC FATHA MEDIAL FORM -// fe78 ARABIC DAMMA ISOLATED FORM -// fe79 ARABIC DAMMA MEDIAL FORM -// fe7a ARABIC KASRA ISOLATED FORM -// fe7b ARABIC KASRA MEDIAL FORM -// fe7c ARABIC SHADDA ISOLATED FORM -// fe7d ARABIC SHADDA MEDIAL FORM -// fe7e ARABIC SUKUN ISOLATED FORM -// fe7f ARABIC SUKUN MEDIAL FORM -// fe80 ARABIC LETTER HAMZA ISOLATED FORM -// fe81 ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM -// fe82 ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM -// fe83 ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM -// fe84 ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM -// fe85 ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM -// fe86 ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM -// fe87 ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM -// fe88 ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM -// fe89 ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM -// fe8a ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM -// fe8b ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM -// fe8c ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM -// fe8d ARABIC LETTER ALEF ISOLATED FORM -// fe8e ARABIC LETTER ALEF FINAL FORM -// fe8f ARABIC LETTER BEH ISOLATED FORM -// fe90 ARABIC LETTER BEH FINAL FORM -// fe91 ARABIC LETTER BEH INITIAL FORM -// fe92 ARABIC LETTER BEH MEDIAL FORM -// fe93 ARABIC LETTER TEH MARBUTA ISOLATED FORM -// fe94 ARABIC LETTER TEH MARBUTA FINAL FORM -// fe95 ARABIC LETTER TEH ISOLATED FORM -// fe96 ARABIC LETTER TEH FINAL FORM -// fe97 ARABIC LETTER TEH INITIAL FORM -// fe98 ARABIC LETTER TEH MEDIAL FORM -// fe99 ARABIC LETTER THEH ISOLATED FORM -// fe9a ARABIC LETTER THEH FINAL FORM -// fe9b ARABIC LETTER THEH INITIAL FORM -// fe9c ARABIC LETTER THEH MEDIAL FORM -// fe9d ARABIC LETTER JEEM ISOLATED FORM -// fe9e ARABIC LETTER JEEM FINAL FORM -// fe9f ARABIC LETTER JEEM INITIAL FORM -// fea0 ARABIC LETTER JEEM MEDIAL FORM -// fea1 ARABIC LETTER HAH ISOLATED FORM -// fea2 ARABIC LETTER HAH FINAL FORM -// fea3 ARABIC LETTER HAH INITIAL FORM -// fea4 ARABIC LETTER HAH MEDIAL FORM -// fea5 ARABIC LETTER KHAH ISOLATED FORM -// fea6 ARABIC LETTER KHAH FINAL FORM -// fea7 ARABIC LETTER KHAH INITIAL FORM -// fea8 ARABIC LETTER KHAH MEDIAL FORM -// fea9 ARABIC LETTER DAL ISOLATED FORM -// feaa ARABIC LETTER DAL FINAL FORM -// feab ARABIC LETTER THAL ISOLATED FORM -// feac ARABIC LETTER THAL FINAL FORM -// fead ARABIC LETTER REH ISOLATED FORM -// feae ARABIC LETTER REH FINAL FORM -// feaf ARABIC LETTER ZAIN ISOLATED FORM -// feb0 ARABIC LETTER ZAIN FINAL FORM -// feb1 ARABIC LETTER SEEN ISOLATED FORM -// feb2 ARABIC LETTER SEEN FINAL FORM -// feb3 ARABIC LETTER SEEN INITIAL FORM -// feb4 ARABIC LETTER SEEN MEDIAL FORM -// feb5 ARABIC LETTER SHEEN ISOLATED FORM -// feb6 ARABIC LETTER SHEEN FINAL FORM -// feb7 ARABIC LETTER SHEEN INITIAL FORM -// feb8 ARABIC LETTER SHEEN MEDIAL FORM -// feb9 ARABIC LETTER SAD ISOLATED FORM -// feba ARABIC LETTER SAD FINAL FORM -// febb ARABIC LETTER SAD INITIAL FORM -// febc ARABIC LETTER SAD MEDIAL FORM -// febd ARABIC LETTER DAD ISOLATED FORM -// febe ARABIC LETTER DAD FINAL FORM -// febf ARABIC LETTER DAD INITIAL FORM -// fec0 ARABIC LETTER DAD MEDIAL FORM -// fec1 ARABIC LETTER TAH ISOLATED FORM -// fec2 ARABIC LETTER TAH FINAL FORM -// fec3 ARABIC LETTER TAH INITIAL FORM -// fec4 ARABIC LETTER TAH MEDIAL FORM -// fec5 ARABIC LETTER ZAH ISOLATED FORM -// fec6 ARABIC LETTER ZAH FINAL FORM -// fec7 ARABIC LETTER ZAH INITIAL FORM -// fec8 ARABIC LETTER ZAH MEDIAL FORM -// fec9 ARABIC LETTER AIN ISOLATED FORM -// feca ARABIC LETTER AIN FINAL FORM -// fecb ARABIC LETTER AIN INITIAL FORM -// fecc ARABIC LETTER AIN MEDIAL FORM -// fecd ARABIC LETTER GHAIN ISOLATED FORM -// fece ARABIC LETTER GHAIN FINAL FORM -// fecf ARABIC LETTER GHAIN INITIAL FORM -// fed0 ARABIC LETTER GHAIN MEDIAL FORM -// fed1 ARABIC LETTER FEH ISOLATED FORM -// fed2 ARABIC LETTER FEH FINAL FORM -// fed3 ARABIC LETTER FEH INITIAL FORM -// fed4 ARABIC LETTER FEH MEDIAL FORM -// fed5 ARABIC LETTER QAF ISOLATED FORM -// fed6 ARABIC LETTER QAF FINAL FORM -// fed7 ARABIC LETTER QAF INITIAL FORM -// fed8 ARABIC LETTER QAF MEDIAL FORM -// fed9 ARABIC LETTER KAF ISOLATED FORM -// feda ARABIC LETTER KAF FINAL FORM -// fedb ARABIC LETTER KAF INITIAL FORM -// fedc ARABIC LETTER KAF MEDIAL FORM -// fedd ARABIC LETTER LAM ISOLATED FORM -// fede ARABIC LETTER LAM FINAL FORM -// fedf ARABIC LETTER LAM INITIAL FORM -// fee0 ARABIC LETTER LAM MEDIAL FORM -// fee1 ARABIC LETTER MEEM ISOLATED FORM -// fee2 ARABIC LETTER MEEM FINAL FORM -// fee3 ARABIC LETTER MEEM INITIAL FORM -// fee4 ARABIC LETTER MEEM MEDIAL FORM -// fee5 ARABIC LETTER NOON ISOLATED FORM -// fee6 ARABIC LETTER NOON FINAL FORM -// fee7 ARABIC LETTER NOON INITIAL FORM -// fee8 ARABIC LETTER NOON MEDIAL FORM -// fee9 ARABIC LETTER HEH ISOLATED FORM -// feea ARABIC LETTER HEH FINAL FORM -// feeb ARABIC LETTER HEH INITIAL FORM -// feec ARABIC LETTER HEH MEDIAL FORM -// feed ARABIC LETTER WAW ISOLATED FORM -// feee ARABIC LETTER WAW FINAL FORM -// feef ARABIC LETTER ALEF MAKSURA ISOLATED FORM -// fef0 ARABIC LETTER ALEF MAKSURA FINAL FORM -// fef1 ARABIC LETTER YEH ISOLATED FORM -// fef2 ARABIC LETTER YEH FINAL FORM -// fef3 ARABIC LETTER YEH INITIAL FORM -// fef4 ARABIC LETTER YEH MEDIAL FORM -// fef5 ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM -// fef6 ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM -// fef7 ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM -// fef8 ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM -// fef9 ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM -// fefa ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM -// fefb ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM -// fefc ARABIC LIGATURE LAM WITH ALEF FINAL FORM - { 0xFE76, 0x87, 0x9, 0, 0 }, -// feff ZERO WIDTH NO-BREAK SPACE - { 0xFEFF, 0x1, 0x0, 0, 0 }, -// ff01 FULLWIDTH EXCLAMATION MARK -// ff02 FULLWIDTH QUOTATION MARK -// ff03 FULLWIDTH NUMBER SIGN - { 0xFF01, 0x3, 0x18, 0, 0 }, -// ff04 FULLWIDTH DOLLAR SIGN - { 0xFF04, 0x1, 0x8, 0, 0 }, -// ff05 FULLWIDTH PERCENT SIGN -// ff06 FULLWIDTH AMPERSAND -// ff07 FULLWIDTH APOSTROPHE -// ff08 FULLWIDTH LEFT PARENTHESIS -// ff09 FULLWIDTH RIGHT PARENTHESIS -// ff0a FULLWIDTH ASTERISK - { 0xFF05, 0x6, 0x18, 0, 0 }, -// ff0b FULLWIDTH PLUS SIGN - { 0xFF0B, 0x1, 0x8, 0, 0 }, -// ff0c FULLWIDTH COMMA -// ff0d FULLWIDTH HYPHEN-MINUS -// ff0e FULLWIDTH FULL STOP -// ff0f FULLWIDTH SOLIDUS - { 0xFF0C, 0x4, 0x18, 0, 0 }, -// ff10 FULLWIDTH DIGIT ZERO -// ff11 FULLWIDTH DIGIT ONE -// ff12 FULLWIDTH DIGIT TWO -// ff13 FULLWIDTH DIGIT THREE -// ff14 FULLWIDTH DIGIT FOUR -// ff15 FULLWIDTH DIGIT FIVE -// ff16 FULLWIDTH DIGIT SIX -// ff17 FULLWIDTH DIGIT SEVEN -// ff18 FULLWIDTH DIGIT EIGHT -// ff19 FULLWIDTH DIGIT NINE - { 0xFF10, 0xA, 0x108, 0, 0 }, -// ff1a FULLWIDTH COLON -// ff1b FULLWIDTH SEMICOLON - { 0xFF1A, 0x2, 0x18, 0, 0 }, -// ff1c FULLWIDTH LESS-THAN SIGN -// ff1d FULLWIDTH EQUALS SIGN -// ff1e FULLWIDTH GREATER-THAN SIGN - { 0xFF1C, 0x3, 0x8, 0, 0 }, -// ff1f FULLWIDTH QUESTION MARK -// ff20 FULLWIDTH COMMERCIAL AT - { 0xFF1F, 0x2, 0x18, 0, 0 }, -// ff21 FULLWIDTH LATIN CAPITAL LETTER A -// ff22 FULLWIDTH LATIN CAPITAL LETTER B -// ff23 FULLWIDTH LATIN CAPITAL LETTER C -// ff24 FULLWIDTH LATIN CAPITAL LETTER D -// ff25 FULLWIDTH LATIN CAPITAL LETTER E -// ff26 FULLWIDTH LATIN CAPITAL LETTER F -// ff27 FULLWIDTH LATIN CAPITAL LETTER G -// ff28 FULLWIDTH LATIN CAPITAL LETTER H -// ff29 FULLWIDTH LATIN CAPITAL LETTER I -// ff2a FULLWIDTH LATIN CAPITAL LETTER J -// ff2b FULLWIDTH LATIN CAPITAL LETTER K -// ff2c FULLWIDTH LATIN CAPITAL LETTER L -// ff2d FULLWIDTH LATIN CAPITAL LETTER M -// ff2e FULLWIDTH LATIN CAPITAL LETTER N -// ff2f FULLWIDTH LATIN CAPITAL LETTER O -// ff30 FULLWIDTH LATIN CAPITAL LETTER P -// ff31 FULLWIDTH LATIN CAPITAL LETTER Q -// ff32 FULLWIDTH LATIN CAPITAL LETTER R -// ff33 FULLWIDTH LATIN CAPITAL LETTER S -// ff34 FULLWIDTH LATIN CAPITAL LETTER T -// ff35 FULLWIDTH LATIN CAPITAL LETTER U -// ff36 FULLWIDTH LATIN CAPITAL LETTER V -// ff37 FULLWIDTH LATIN CAPITAL LETTER W -// ff38 FULLWIDTH LATIN CAPITAL LETTER X -// ff39 FULLWIDTH LATIN CAPITAL LETTER Y -// ff3a FULLWIDTH LATIN CAPITAL LETTER Z - { 0xFF21, 0x1A, 0x89, 32, 0 }, -// ff3b FULLWIDTH LEFT SQUARE BRACKET -// ff3c FULLWIDTH REVERSE SOLIDUS -// ff3d FULLWIDTH RIGHT SQUARE BRACKET - { 0xFF3B, 0x3, 0x18, 0, 0 }, -// ff3e FULLWIDTH CIRCUMFLEX ACCENT - { 0xFF3E, 0x1, 0x8, 0, 0 }, -// ff3f FULLWIDTH LOW LINE - { 0xFF3F, 0x1, 0x18, 0, 0 }, -// ff40 FULLWIDTH GRAVE ACCENT - { 0xFF40, 0x1, 0x8, 0, 0 }, -// ff41 FULLWIDTH LATIN SMALL LETTER A -// ff42 FULLWIDTH LATIN SMALL LETTER B -// ff43 FULLWIDTH LATIN SMALL LETTER C -// ff44 FULLWIDTH LATIN SMALL LETTER D -// ff45 FULLWIDTH LATIN SMALL LETTER E -// ff46 FULLWIDTH LATIN SMALL LETTER F -// ff47 FULLWIDTH LATIN SMALL LETTER G -// ff48 FULLWIDTH LATIN SMALL LETTER H -// ff49 FULLWIDTH LATIN SMALL LETTER I -// ff4a FULLWIDTH LATIN SMALL LETTER J -// ff4b FULLWIDTH LATIN SMALL LETTER K -// ff4c FULLWIDTH LATIN SMALL LETTER L -// ff4d FULLWIDTH LATIN SMALL LETTER M -// ff4e FULLWIDTH LATIN SMALL LETTER N -// ff4f FULLWIDTH LATIN SMALL LETTER O -// ff50 FULLWIDTH LATIN SMALL LETTER P -// ff51 FULLWIDTH LATIN SMALL LETTER Q -// ff52 FULLWIDTH LATIN SMALL LETTER R -// ff53 FULLWIDTH LATIN SMALL LETTER S -// ff54 FULLWIDTH LATIN SMALL LETTER T -// ff55 FULLWIDTH LATIN SMALL LETTER U -// ff56 FULLWIDTH LATIN SMALL LETTER V -// ff57 FULLWIDTH LATIN SMALL LETTER W -// ff58 FULLWIDTH LATIN SMALL LETTER X -// ff59 FULLWIDTH LATIN SMALL LETTER Y -// ff5a FULLWIDTH LATIN SMALL LETTER Z - { 0xFF41, 0x1A, 0x49, 0, -32 }, -// ff5b FULLWIDTH LEFT CURLY BRACKET - { 0xFF5B, 0x1, 0x18, 0, 0 }, -// ff5c FULLWIDTH VERTICAL LINE - { 0xFF5C, 0x1, 0x8, 0, 0 }, -// ff5d FULLWIDTH RIGHT CURLY BRACKET - { 0xFF5D, 0x1, 0x18, 0, 0 }, -// ff5e FULLWIDTH TILDE - { 0xFF5E, 0x1, 0x8, 0, 0 }, -// ff5f FULLWIDTH LEFT WHITE PARENTHESIS -// ff60 FULLWIDTH RIGHT WHITE PARENTHESIS -// ff61 HALFWIDTH IDEOGRAPHIC FULL STOP -// ff62 HALFWIDTH LEFT CORNER BRACKET -// ff63 HALFWIDTH RIGHT CORNER BRACKET -// ff64 HALFWIDTH IDEOGRAPHIC COMMA -// ff65 HALFWIDTH KATAKANA MIDDLE DOT - { 0xFF5F, 0x7, 0x18, 0, 0 }, -// ff66 HALFWIDTH KATAKANA LETTER WO -// ff67 HALFWIDTH KATAKANA LETTER SMALL A -// ff68 HALFWIDTH KATAKANA LETTER SMALL I -// ff69 HALFWIDTH KATAKANA LETTER SMALL U -// ff6a HALFWIDTH KATAKANA LETTER SMALL E -// ff6b HALFWIDTH KATAKANA LETTER SMALL O -// ff6c HALFWIDTH KATAKANA LETTER SMALL YA -// ff6d HALFWIDTH KATAKANA LETTER SMALL YU -// ff6e HALFWIDTH KATAKANA LETTER SMALL YO -// ff6f HALFWIDTH KATAKANA LETTER SMALL TU -// ff70 HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK -// ff71 HALFWIDTH KATAKANA LETTER A -// ff72 HALFWIDTH KATAKANA LETTER I -// ff73 HALFWIDTH KATAKANA LETTER U -// ff74 HALFWIDTH KATAKANA LETTER E -// ff75 HALFWIDTH KATAKANA LETTER O -// ff76 HALFWIDTH KATAKANA LETTER KA -// ff77 HALFWIDTH KATAKANA LETTER KI -// ff78 HALFWIDTH KATAKANA LETTER KU -// ff79 HALFWIDTH KATAKANA LETTER KE -// ff7a HALFWIDTH KATAKANA LETTER KO -// ff7b HALFWIDTH KATAKANA LETTER SA -// ff7c HALFWIDTH KATAKANA LETTER SI -// ff7d HALFWIDTH KATAKANA LETTER SU -// ff7e HALFWIDTH KATAKANA LETTER SE -// ff7f HALFWIDTH KATAKANA LETTER SO -// ff80 HALFWIDTH KATAKANA LETTER TA -// ff81 HALFWIDTH KATAKANA LETTER TI -// ff82 HALFWIDTH KATAKANA LETTER TU -// ff83 HALFWIDTH KATAKANA LETTER TE -// ff84 HALFWIDTH KATAKANA LETTER TO -// ff85 HALFWIDTH KATAKANA LETTER NA -// ff86 HALFWIDTH KATAKANA LETTER NI -// ff87 HALFWIDTH KATAKANA LETTER NU -// ff88 HALFWIDTH KATAKANA LETTER NE -// ff89 HALFWIDTH KATAKANA LETTER NO -// ff8a HALFWIDTH KATAKANA LETTER HA -// ff8b HALFWIDTH KATAKANA LETTER HI -// ff8c HALFWIDTH KATAKANA LETTER HU -// ff8d HALFWIDTH KATAKANA LETTER HE -// ff8e HALFWIDTH KATAKANA LETTER HO -// ff8f HALFWIDTH KATAKANA LETTER MA -// ff90 HALFWIDTH KATAKANA LETTER MI -// ff91 HALFWIDTH KATAKANA LETTER MU -// ff92 HALFWIDTH KATAKANA LETTER ME -// ff93 HALFWIDTH KATAKANA LETTER MO -// ff94 HALFWIDTH KATAKANA LETTER YA -// ff95 HALFWIDTH KATAKANA LETTER YU -// ff96 HALFWIDTH KATAKANA LETTER YO -// ff97 HALFWIDTH KATAKANA LETTER RA -// ff98 HALFWIDTH KATAKANA LETTER RI -// ff99 HALFWIDTH KATAKANA LETTER RU -// ff9a HALFWIDTH KATAKANA LETTER RE -// ff9b HALFWIDTH KATAKANA LETTER RO -// ff9c HALFWIDTH KATAKANA LETTER WA -// ff9d HALFWIDTH KATAKANA LETTER N -// ff9e HALFWIDTH KATAKANA VOICED SOUND MARK -// ff9f HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK -// ffa0 HALFWIDTH HANGUL FILLER -// ffa1 HALFWIDTH HANGUL LETTER KIYEOK -// ffa2 HALFWIDTH HANGUL LETTER SSANGKIYEOK -// ffa3 HALFWIDTH HANGUL LETTER KIYEOK-SIOS -// ffa4 HALFWIDTH HANGUL LETTER NIEUN -// ffa5 HALFWIDTH HANGUL LETTER NIEUN-CIEUC -// ffa6 HALFWIDTH HANGUL LETTER NIEUN-HIEUH -// ffa7 HALFWIDTH HANGUL LETTER TIKEUT -// ffa8 HALFWIDTH HANGUL LETTER SSANGTIKEUT -// ffa9 HALFWIDTH HANGUL LETTER RIEUL -// ffaa HALFWIDTH HANGUL LETTER RIEUL-KIYEOK -// ffab HALFWIDTH HANGUL LETTER RIEUL-MIEUM -// ffac HALFWIDTH HANGUL LETTER RIEUL-PIEUP -// ffad HALFWIDTH HANGUL LETTER RIEUL-SIOS -// ffae HALFWIDTH HANGUL LETTER RIEUL-THIEUTH -// ffaf HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH -// ffb0 HALFWIDTH HANGUL LETTER RIEUL-HIEUH -// ffb1 HALFWIDTH HANGUL LETTER MIEUM -// ffb2 HALFWIDTH HANGUL LETTER PIEUP -// ffb3 HALFWIDTH HANGUL LETTER SSANGPIEUP -// ffb4 HALFWIDTH HANGUL LETTER PIEUP-SIOS -// ffb5 HALFWIDTH HANGUL LETTER SIOS -// ffb6 HALFWIDTH HANGUL LETTER SSANGSIOS -// ffb7 HALFWIDTH HANGUL LETTER IEUNG -// ffb8 HALFWIDTH HANGUL LETTER CIEUC -// ffb9 HALFWIDTH HANGUL LETTER SSANGCIEUC -// ffba HALFWIDTH HANGUL LETTER CHIEUCH -// ffbb HALFWIDTH HANGUL LETTER KHIEUKH -// ffbc HALFWIDTH HANGUL LETTER THIEUTH -// ffbd HALFWIDTH HANGUL LETTER PHIEUPH -// ffbe HALFWIDTH HANGUL LETTER HIEUH - { 0xFF66, 0x59, 0x9, 0, 0 }, -// ffc2 HALFWIDTH HANGUL LETTER A -// ffc3 HALFWIDTH HANGUL LETTER AE -// ffc4 HALFWIDTH HANGUL LETTER YA -// ffc5 HALFWIDTH HANGUL LETTER YAE -// ffc6 HALFWIDTH HANGUL LETTER EO -// ffc7 HALFWIDTH HANGUL LETTER E - { 0xFFC2, 0x6, 0x9, 0, 0 }, -// ffca HALFWIDTH HANGUL LETTER YEO -// ffcb HALFWIDTH HANGUL LETTER YE -// ffcc HALFWIDTH HANGUL LETTER O -// ffcd HALFWIDTH HANGUL LETTER WA -// ffce HALFWIDTH HANGUL LETTER WAE -// ffcf HALFWIDTH HANGUL LETTER OE - { 0xFFCA, 0x6, 0x9, 0, 0 }, -// ffd2 HALFWIDTH HANGUL LETTER YO -// ffd3 HALFWIDTH HANGUL LETTER U -// ffd4 HALFWIDTH HANGUL LETTER WEO -// ffd5 HALFWIDTH HANGUL LETTER WE -// ffd6 HALFWIDTH HANGUL LETTER WI -// ffd7 HALFWIDTH HANGUL LETTER YU - { 0xFFD2, 0x6, 0x9, 0, 0 }, -// ffda HALFWIDTH HANGUL LETTER EU -// ffdb HALFWIDTH HANGUL LETTER YI -// ffdc HALFWIDTH HANGUL LETTER I - { 0xFFDA, 0x3, 0x9, 0, 0 }, -// ffe0 FULLWIDTH CENT SIGN -// ffe1 FULLWIDTH POUND SIGN -// ffe2 FULLWIDTH NOT SIGN -// ffe3 FULLWIDTH MACRON -// ffe4 FULLWIDTH BROKEN BAR -// ffe5 FULLWIDTH YEN SIGN -// ffe6 FULLWIDTH WON SIGN - { 0xFFE0, 0x7, 0x8, 0, 0 }, -// ffe8 HALFWIDTH FORMS LIGHT VERTICAL -// ffe9 HALFWIDTH LEFTWARDS ARROW -// ffea HALFWIDTH UPWARDS ARROW -// ffeb HALFWIDTH RIGHTWARDS ARROW -// ffec HALFWIDTH DOWNWARDS ARROW -// ffed HALFWIDTH BLACK SQUARE -// ffee HALFWIDTH WHITE CIRCLE - { 0xFFE8, 0x7, 0x8, 0, 0 }, -// fff9 INTERLINEAR ANNOTATION ANCHOR -// fffa INTERLINEAR ANNOTATION SEPARATOR -// fffb INTERLINEAR ANNOTATION TERMINATOR - { 0xFFF9, 0x3, 0x0, 0, 0 }, -// fffc OBJECT REPLACEMENT CHARACTER -// fffd REPLACEMENT CHARACTER - { 0xFFFC, 0x2, 0x8, 0, 0 }, -// 10000 LINEAR B SYLLABLE B008 A -// 10001 LINEAR B SYLLABLE B038 E -// 10002 LINEAR B SYLLABLE B028 I -// 10003 LINEAR B SYLLABLE B061 O -// 10004 LINEAR B SYLLABLE B010 U -// 10005 LINEAR B SYLLABLE B001 DA -// 10006 LINEAR B SYLLABLE B045 DE -// 10007 LINEAR B SYLLABLE B007 DI -// 10008 LINEAR B SYLLABLE B014 DO -// 10009 LINEAR B SYLLABLE B051 DU -// 1000a LINEAR B SYLLABLE B057 JA -// 1000b LINEAR B SYLLABLE B046 JE - { 0x10000, 0xC, 0x9, 0, 0 }, -// 1000d LINEAR B SYLLABLE B036 JO -// 1000e LINEAR B SYLLABLE B065 JU -// 1000f LINEAR B SYLLABLE B077 KA -// 10010 LINEAR B SYLLABLE B044 KE -// 10011 LINEAR B SYLLABLE B067 KI -// 10012 LINEAR B SYLLABLE B070 KO -// 10013 LINEAR B SYLLABLE B081 KU -// 10014 LINEAR B SYLLABLE B080 MA -// 10015 LINEAR B SYLLABLE B013 ME -// 10016 LINEAR B SYLLABLE B073 MI -// 10017 LINEAR B SYLLABLE B015 MO -// 10018 LINEAR B SYLLABLE B023 MU -// 10019 LINEAR B SYLLABLE B006 NA -// 1001a LINEAR B SYLLABLE B024 NE -// 1001b LINEAR B SYLLABLE B030 NI -// 1001c LINEAR B SYLLABLE B052 NO -// 1001d LINEAR B SYLLABLE B055 NU -// 1001e LINEAR B SYLLABLE B003 PA -// 1001f LINEAR B SYLLABLE B072 PE -// 10020 LINEAR B SYLLABLE B039 PI -// 10021 LINEAR B SYLLABLE B011 PO -// 10022 LINEAR B SYLLABLE B050 PU -// 10023 LINEAR B SYLLABLE B016 QA -// 10024 LINEAR B SYLLABLE B078 QE -// 10025 LINEAR B SYLLABLE B021 QI -// 10026 LINEAR B SYLLABLE B032 QO - { 0x1000D, 0x1A, 0x9, 0, 0 }, -// 10028 LINEAR B SYLLABLE B060 RA -// 10029 LINEAR B SYLLABLE B027 RE -// 1002a LINEAR B SYLLABLE B053 RI -// 1002b LINEAR B SYLLABLE B002 RO -// 1002c LINEAR B SYLLABLE B026 RU -// 1002d LINEAR B SYLLABLE B031 SA -// 1002e LINEAR B SYLLABLE B009 SE -// 1002f LINEAR B SYLLABLE B041 SI -// 10030 LINEAR B SYLLABLE B012 SO -// 10031 LINEAR B SYLLABLE B058 SU -// 10032 LINEAR B SYLLABLE B059 TA -// 10033 LINEAR B SYLLABLE B004 TE -// 10034 LINEAR B SYLLABLE B037 TI -// 10035 LINEAR B SYLLABLE B005 TO -// 10036 LINEAR B SYLLABLE B069 TU -// 10037 LINEAR B SYLLABLE B054 WA -// 10038 LINEAR B SYLLABLE B075 WE -// 10039 LINEAR B SYLLABLE B040 WI -// 1003a LINEAR B SYLLABLE B042 WO - { 0x10028, 0x13, 0x9, 0, 0 }, -// 1003c LINEAR B SYLLABLE B017 ZA -// 1003d LINEAR B SYLLABLE B074 ZE - { 0x1003C, 0x2, 0x9, 0, 0 }, -// 1003f LINEAR B SYLLABLE B020 ZO -// 10040 LINEAR B SYLLABLE B025 A2 -// 10041 LINEAR B SYLLABLE B043 A3 -// 10042 LINEAR B SYLLABLE B085 AU -// 10043 LINEAR B SYLLABLE B071 DWE -// 10044 LINEAR B SYLLABLE B090 DWO -// 10045 LINEAR B SYLLABLE B048 NWA -// 10046 LINEAR B SYLLABLE B029 PU2 -// 10047 LINEAR B SYLLABLE B062 PTE -// 10048 LINEAR B SYLLABLE B076 RA2 -// 10049 LINEAR B SYLLABLE B033 RA3 -// 1004a LINEAR B SYLLABLE B068 RO2 -// 1004b LINEAR B SYLLABLE B066 TA2 -// 1004c LINEAR B SYLLABLE B087 TWE -// 1004d LINEAR B SYLLABLE B091 TWO - { 0x1003F, 0xF, 0x9, 0, 0 }, -// 10050 LINEAR B SYMBOL B018 -// 10051 LINEAR B SYMBOL B019 -// 10052 LINEAR B SYMBOL B022 -// 10053 LINEAR B SYMBOL B034 -// 10054 LINEAR B SYMBOL B047 -// 10055 LINEAR B SYMBOL B049 -// 10056 LINEAR B SYMBOL B056 -// 10057 LINEAR B SYMBOL B063 -// 10058 LINEAR B SYMBOL B064 -// 10059 LINEAR B SYMBOL B079 -// 1005a LINEAR B SYMBOL B082 -// 1005b LINEAR B SYMBOL B083 -// 1005c LINEAR B SYMBOL B086 -// 1005d LINEAR B SYMBOL B089 - { 0x10050, 0xE, 0x9, 0, 0 }, -// 10080 LINEAR B IDEOGRAM B100 MAN -// 10081 LINEAR B IDEOGRAM B102 WOMAN -// 10082 LINEAR B IDEOGRAM B104 DEER -// 10083 LINEAR B IDEOGRAM B105 EQUID -// 10084 LINEAR B IDEOGRAM B105F MARE -// 10085 LINEAR B IDEOGRAM B105M STALLION -// 10086 LINEAR B IDEOGRAM B106F EWE -// 10087 LINEAR B IDEOGRAM B106M RAM -// 10088 LINEAR B IDEOGRAM B107F SHE-GOAT -// 10089 LINEAR B IDEOGRAM B107M HE-GOAT -// 1008a LINEAR B IDEOGRAM B108F SOW -// 1008b LINEAR B IDEOGRAM B108M BOAR -// 1008c LINEAR B IDEOGRAM B109F COW -// 1008d LINEAR B IDEOGRAM B109M BULL -// 1008e LINEAR B IDEOGRAM B120 WHEAT -// 1008f LINEAR B IDEOGRAM B121 BARLEY -// 10090 LINEAR B IDEOGRAM B122 OLIVE -// 10091 LINEAR B IDEOGRAM B123 SPICE -// 10092 LINEAR B IDEOGRAM B125 CYPERUS -// 10093 LINEAR B MONOGRAM B127 KAPO -// 10094 LINEAR B MONOGRAM B128 KANAKO -// 10095 LINEAR B IDEOGRAM B130 OIL -// 10096 LINEAR B IDEOGRAM B131 WINE -// 10097 LINEAR B IDEOGRAM B132 -// 10098 LINEAR B MONOGRAM B133 AREPA -// 10099 LINEAR B MONOGRAM B135 MERI -// 1009a LINEAR B IDEOGRAM B140 BRONZE -// 1009b LINEAR B IDEOGRAM B141 GOLD -// 1009c LINEAR B IDEOGRAM B142 -// 1009d LINEAR B IDEOGRAM B145 WOOL -// 1009e LINEAR B IDEOGRAM B146 -// 1009f LINEAR B IDEOGRAM B150 -// 100a0 LINEAR B IDEOGRAM B151 HORN -// 100a1 LINEAR B IDEOGRAM B152 -// 100a2 LINEAR B IDEOGRAM B153 -// 100a3 LINEAR B IDEOGRAM B154 -// 100a4 LINEAR B MONOGRAM B156 TURO2 -// 100a5 LINEAR B IDEOGRAM B157 -// 100a6 LINEAR B IDEOGRAM B158 -// 100a7 LINEAR B IDEOGRAM B159 CLOTH -// 100a8 LINEAR B IDEOGRAM B160 -// 100a9 LINEAR B IDEOGRAM B161 -// 100aa LINEAR B IDEOGRAM B162 GARMENT -// 100ab LINEAR B IDEOGRAM B163 ARMOUR -// 100ac LINEAR B IDEOGRAM B164 -// 100ad LINEAR B IDEOGRAM B165 -// 100ae LINEAR B IDEOGRAM B166 -// 100af LINEAR B IDEOGRAM B167 -// 100b0 LINEAR B IDEOGRAM B168 -// 100b1 LINEAR B IDEOGRAM B169 -// 100b2 LINEAR B IDEOGRAM B170 -// 100b3 LINEAR B IDEOGRAM B171 -// 100b4 LINEAR B IDEOGRAM B172 -// 100b5 LINEAR B IDEOGRAM B173 MONTH -// 100b6 LINEAR B IDEOGRAM B174 -// 100b7 LINEAR B IDEOGRAM B176 TREE -// 100b8 LINEAR B IDEOGRAM B177 -// 100b9 LINEAR B IDEOGRAM B178 -// 100ba LINEAR B IDEOGRAM B179 -// 100bb LINEAR B IDEOGRAM B180 -// 100bc LINEAR B IDEOGRAM B181 -// 100bd LINEAR B IDEOGRAM B182 -// 100be LINEAR B IDEOGRAM B183 -// 100bf LINEAR B IDEOGRAM B184 -// 100c0 LINEAR B IDEOGRAM B185 -// 100c1 LINEAR B IDEOGRAM B189 -// 100c2 LINEAR B IDEOGRAM B190 -// 100c3 LINEAR B IDEOGRAM B191 HELMET -// 100c4 LINEAR B IDEOGRAM B220 FOOTSTOOL -// 100c5 LINEAR B IDEOGRAM B225 BATHTUB -// 100c6 LINEAR B IDEOGRAM B230 SPEAR -// 100c7 LINEAR B IDEOGRAM B231 ARROW -// 100c8 LINEAR B IDEOGRAM B232 -// 100c9 LINEAR B IDEOGRAM B233 SWORD -// 100ca LINEAR B IDEOGRAM B234 -// 100cb LINEAR B IDEOGRAM B236 -// 100cc LINEAR B IDEOGRAM B240 WHEELED CHARIOT -// 100cd LINEAR B IDEOGRAM B241 CHARIOT -// 100ce LINEAR B IDEOGRAM B242 CHARIOT FRAME -// 100cf LINEAR B IDEOGRAM B243 WHEEL -// 100d0 LINEAR B IDEOGRAM B245 -// 100d1 LINEAR B IDEOGRAM B246 -// 100d2 LINEAR B MONOGRAM B247 DIPTE -// 100d3 LINEAR B IDEOGRAM B248 -// 100d4 LINEAR B IDEOGRAM B249 -// 100d5 LINEAR B IDEOGRAM B251 -// 100d6 LINEAR B IDEOGRAM B252 -// 100d7 LINEAR B IDEOGRAM B253 -// 100d8 LINEAR B IDEOGRAM B254 DART -// 100d9 LINEAR B IDEOGRAM B255 -// 100da LINEAR B IDEOGRAM B256 -// 100db LINEAR B IDEOGRAM B257 -// 100dc LINEAR B IDEOGRAM B258 -// 100dd LINEAR B IDEOGRAM B259 -// 100de LINEAR B IDEOGRAM VESSEL B155 -// 100df LINEAR B IDEOGRAM VESSEL B200 -// 100e0 LINEAR B IDEOGRAM VESSEL B201 -// 100e1 LINEAR B IDEOGRAM VESSEL B202 -// 100e2 LINEAR B IDEOGRAM VESSEL B203 -// 100e3 LINEAR B IDEOGRAM VESSEL B204 -// 100e4 LINEAR B IDEOGRAM VESSEL B205 -// 100e5 LINEAR B IDEOGRAM VESSEL B206 -// 100e6 LINEAR B IDEOGRAM VESSEL B207 -// 100e7 LINEAR B IDEOGRAM VESSEL B208 -// 100e8 LINEAR B IDEOGRAM VESSEL B209 -// 100e9 LINEAR B IDEOGRAM VESSEL B210 -// 100ea LINEAR B IDEOGRAM VESSEL B211 -// 100eb LINEAR B IDEOGRAM VESSEL B212 -// 100ec LINEAR B IDEOGRAM VESSEL B213 -// 100ed LINEAR B IDEOGRAM VESSEL B214 -// 100ee LINEAR B IDEOGRAM VESSEL B215 -// 100ef LINEAR B IDEOGRAM VESSEL B216 -// 100f0 LINEAR B IDEOGRAM VESSEL B217 -// 100f1 LINEAR B IDEOGRAM VESSEL B218 -// 100f2 LINEAR B IDEOGRAM VESSEL B219 -// 100f3 LINEAR B IDEOGRAM VESSEL B221 -// 100f4 LINEAR B IDEOGRAM VESSEL B222 -// 100f5 LINEAR B IDEOGRAM VESSEL B226 -// 100f6 LINEAR B IDEOGRAM VESSEL B227 -// 100f7 LINEAR B IDEOGRAM VESSEL B228 -// 100f8 LINEAR B IDEOGRAM VESSEL B229 -// 100f9 LINEAR B IDEOGRAM VESSEL B250 -// 100fa LINEAR B IDEOGRAM VESSEL B305 - { 0x10080, 0x7B, 0x9, 0, 0 }, -// 10100 AEGEAN WORD SEPARATOR LINE -// 10101 AEGEAN WORD SEPARATOR DOT -// 10102 AEGEAN CHECK MARK - { 0x10100, 0x3, 0x18, 0, 0 }, -// 10107 AEGEAN NUMBER ONE -// 10108 AEGEAN NUMBER TWO -// 10109 AEGEAN NUMBER THREE -// 1010a AEGEAN NUMBER FOUR -// 1010b AEGEAN NUMBER FIVE -// 1010c AEGEAN NUMBER SIX -// 1010d AEGEAN NUMBER SEVEN -// 1010e AEGEAN NUMBER EIGHT -// 1010f AEGEAN NUMBER NINE -// 10110 AEGEAN NUMBER TEN -// 10111 AEGEAN NUMBER TWENTY -// 10112 AEGEAN NUMBER THIRTY -// 10113 AEGEAN NUMBER FORTY -// 10114 AEGEAN NUMBER FIFTY -// 10115 AEGEAN NUMBER SIXTY -// 10116 AEGEAN NUMBER SEVENTY -// 10117 AEGEAN NUMBER EIGHTY -// 10118 AEGEAN NUMBER NINETY -// 10119 AEGEAN NUMBER ONE HUNDRED -// 1011a AEGEAN NUMBER TWO HUNDRED -// 1011b AEGEAN NUMBER THREE HUNDRED -// 1011c AEGEAN NUMBER FOUR HUNDRED -// 1011d AEGEAN NUMBER FIVE HUNDRED -// 1011e AEGEAN NUMBER SIX HUNDRED -// 1011f AEGEAN NUMBER SEVEN HUNDRED -// 10120 AEGEAN NUMBER EIGHT HUNDRED -// 10121 AEGEAN NUMBER NINE HUNDRED -// 10122 AEGEAN NUMBER ONE THOUSAND -// 10123 AEGEAN NUMBER TWO THOUSAND -// 10124 AEGEAN NUMBER THREE THOUSAND -// 10125 AEGEAN NUMBER FOUR THOUSAND -// 10126 AEGEAN NUMBER FIVE THOUSAND -// 10127 AEGEAN NUMBER SIX THOUSAND -// 10128 AEGEAN NUMBER SEVEN THOUSAND -// 10129 AEGEAN NUMBER EIGHT THOUSAND -// 1012a AEGEAN NUMBER NINE THOUSAND -// 1012b AEGEAN NUMBER TEN THOUSAND -// 1012c AEGEAN NUMBER TWENTY THOUSAND -// 1012d AEGEAN NUMBER THIRTY THOUSAND -// 1012e AEGEAN NUMBER FORTY THOUSAND -// 1012f AEGEAN NUMBER FIFTY THOUSAND -// 10130 AEGEAN NUMBER SIXTY THOUSAND -// 10131 AEGEAN NUMBER SEVENTY THOUSAND -// 10132 AEGEAN NUMBER EIGHTY THOUSAND -// 10133 AEGEAN NUMBER NINETY THOUSAND - { 0x10107, 0x2D, 0x8, 0, 0 }, -// 10137 AEGEAN WEIGHT BASE UNIT -// 10138 AEGEAN WEIGHT FIRST SUBUNIT -// 10139 AEGEAN WEIGHT SECOND SUBUNIT -// 1013a AEGEAN WEIGHT THIRD SUBUNIT -// 1013b AEGEAN WEIGHT FOURTH SUBUNIT -// 1013c AEGEAN DRY MEASURE FIRST SUBUNIT -// 1013d AEGEAN LIQUID MEASURE FIRST SUBUNIT -// 1013e AEGEAN MEASURE SECOND SUBUNIT -// 1013f AEGEAN MEASURE THIRD SUBUNIT -// 10140 GREEK ACROPHONIC ATTIC ONE QUARTER -// 10141 GREEK ACROPHONIC ATTIC ONE HALF -// 10142 GREEK ACROPHONIC ATTIC ONE DRACHMA -// 10143 GREEK ACROPHONIC ATTIC FIVE -// 10144 GREEK ACROPHONIC ATTIC FIFTY -// 10145 GREEK ACROPHONIC ATTIC FIVE HUNDRED -// 10146 GREEK ACROPHONIC ATTIC FIVE THOUSAND -// 10147 GREEK ACROPHONIC ATTIC FIFTY THOUSAND -// 10148 GREEK ACROPHONIC ATTIC FIVE TALENTS -// 10149 GREEK ACROPHONIC ATTIC TEN TALENTS -// 1014a GREEK ACROPHONIC ATTIC FIFTY TALENTS -// 1014b GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS -// 1014c GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS -// 1014d GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS -// 1014e GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS -// 1014f GREEK ACROPHONIC ATTIC FIVE STATERS -// 10150 GREEK ACROPHONIC ATTIC TEN STATERS -// 10151 GREEK ACROPHONIC ATTIC FIFTY STATERS -// 10152 GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS -// 10153 GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS -// 10154 GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS -// 10155 GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS -// 10156 GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS -// 10157 GREEK ACROPHONIC ATTIC TEN MNAS -// 10158 GREEK ACROPHONIC HERAEUM ONE PLETHRON -// 10159 GREEK ACROPHONIC THESPIAN ONE -// 1015a GREEK ACROPHONIC HERMIONIAN ONE -// 1015b GREEK ACROPHONIC EPIDAUREAN TWO -// 1015c GREEK ACROPHONIC THESPIAN TWO -// 1015d GREEK ACROPHONIC CYRENAIC TWO DRACHMAS -// 1015e GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS -// 1015f GREEK ACROPHONIC TROEZENIAN FIVE -// 10160 GREEK ACROPHONIC TROEZENIAN TEN -// 10161 GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM -// 10162 GREEK ACROPHONIC HERMIONIAN TEN -// 10163 GREEK ACROPHONIC MESSENIAN TEN -// 10164 GREEK ACROPHONIC THESPIAN TEN -// 10165 GREEK ACROPHONIC THESPIAN THIRTY -// 10166 GREEK ACROPHONIC TROEZENIAN FIFTY -// 10167 GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM -// 10168 GREEK ACROPHONIC HERMIONIAN FIFTY -// 10169 GREEK ACROPHONIC THESPIAN FIFTY -// 1016a GREEK ACROPHONIC THESPIAN ONE HUNDRED -// 1016b GREEK ACROPHONIC THESPIAN THREE HUNDRED -// 1016c GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED -// 1016d GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED -// 1016e GREEK ACROPHONIC THESPIAN FIVE HUNDRED -// 1016f GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED -// 10170 GREEK ACROPHONIC NAXIAN FIVE HUNDRED -// 10171 GREEK ACROPHONIC THESPIAN ONE THOUSAND -// 10172 GREEK ACROPHONIC THESPIAN FIVE THOUSAND -// 10173 GREEK ACROPHONIC DELPHIC FIVE MNAS -// 10174 GREEK ACROPHONIC STRATIAN FIFTY MNAS -// 10175 GREEK ONE HALF SIGN -// 10176 GREEK ONE HALF SIGN ALTERNATE FORM -// 10177 GREEK TWO THIRDS SIGN -// 10178 GREEK THREE QUARTERS SIGN -// 10179 GREEK YEAR SIGN -// 1017a GREEK TALENT SIGN -// 1017b GREEK DRACHMA SIGN -// 1017c GREEK OBOL SIGN -// 1017d GREEK TWO OBOLS SIGN -// 1017e GREEK THREE OBOLS SIGN -// 1017f GREEK FOUR OBOLS SIGN -// 10180 GREEK FIVE OBOLS SIGN -// 10181 GREEK METRETES SIGN -// 10182 GREEK KYATHOS BASE SIGN -// 10183 GREEK LITRA SIGN -// 10184 GREEK OUNKIA SIGN -// 10185 GREEK XESTES SIGN -// 10186 GREEK ARTABE SIGN -// 10187 GREEK AROURA SIGN -// 10188 GREEK GRAMMA SIGN -// 10189 GREEK TRYBLION BASE SIGN -// 1018a GREEK ZERO SIGN -// 1018b GREEK ONE QUARTER SIGN -// 1018c GREEK SINUSOID SIGN - { 0x10137, 0x56, 0x8, 0, 0 }, -// 10190 ROMAN SEXTANS SIGN -// 10191 ROMAN UNCIA SIGN -// 10192 ROMAN SEMUNCIA SIGN -// 10193 ROMAN SEXTULA SIGN -// 10194 ROMAN DIMIDIA SEXTULA SIGN -// 10195 ROMAN SILIQUA SIGN -// 10196 ROMAN DENARIUS SIGN -// 10197 ROMAN QUINARIUS SIGN -// 10198 ROMAN SESTERTIUS SIGN -// 10199 ROMAN DUPONDIUS SIGN -// 1019a ROMAN AS SIGN -// 1019b ROMAN CENTURIAL SIGN - { 0x10190, 0xC, 0x8, 0, 0 }, -// 101a0 GREEK SYMBOL TAU RHO - { 0x101A0, 0x1, 0x8, 0, 0 }, -// 101d0 PHAISTOS DISC SIGN PEDESTRIAN -// 101d1 PHAISTOS DISC SIGN PLUMED HEAD -// 101d2 PHAISTOS DISC SIGN TATTOOED HEAD -// 101d3 PHAISTOS DISC SIGN CAPTIVE -// 101d4 PHAISTOS DISC SIGN CHILD -// 101d5 PHAISTOS DISC SIGN WOMAN -// 101d6 PHAISTOS DISC SIGN HELMET -// 101d7 PHAISTOS DISC SIGN GAUNTLET -// 101d8 PHAISTOS DISC SIGN TIARA -// 101d9 PHAISTOS DISC SIGN ARROW -// 101da PHAISTOS DISC SIGN BOW -// 101db PHAISTOS DISC SIGN SHIELD -// 101dc PHAISTOS DISC SIGN CLUB -// 101dd PHAISTOS DISC SIGN MANACLES -// 101de PHAISTOS DISC SIGN MATTOCK -// 101df PHAISTOS DISC SIGN SAW -// 101e0 PHAISTOS DISC SIGN LID -// 101e1 PHAISTOS DISC SIGN BOOMERANG -// 101e2 PHAISTOS DISC SIGN CARPENTRY PLANE -// 101e3 PHAISTOS DISC SIGN DOLIUM -// 101e4 PHAISTOS DISC SIGN COMB -// 101e5 PHAISTOS DISC SIGN SLING -// 101e6 PHAISTOS DISC SIGN COLUMN -// 101e7 PHAISTOS DISC SIGN BEEHIVE -// 101e8 PHAISTOS DISC SIGN SHIP -// 101e9 PHAISTOS DISC SIGN HORN -// 101ea PHAISTOS DISC SIGN HIDE -// 101eb PHAISTOS DISC SIGN BULLS LEG -// 101ec PHAISTOS DISC SIGN CAT -// 101ed PHAISTOS DISC SIGN RAM -// 101ee PHAISTOS DISC SIGN EAGLE -// 101ef PHAISTOS DISC SIGN DOVE -// 101f0 PHAISTOS DISC SIGN TUNNY -// 101f1 PHAISTOS DISC SIGN BEE -// 101f2 PHAISTOS DISC SIGN PLANE TREE -// 101f3 PHAISTOS DISC SIGN VINE -// 101f4 PHAISTOS DISC SIGN PAPYRUS -// 101f5 PHAISTOS DISC SIGN ROSETTE -// 101f6 PHAISTOS DISC SIGN LILY -// 101f7 PHAISTOS DISC SIGN OX BACK -// 101f8 PHAISTOS DISC SIGN FLUTE -// 101f9 PHAISTOS DISC SIGN GRATER -// 101fa PHAISTOS DISC SIGN STRAINER -// 101fb PHAISTOS DISC SIGN SMALL AXE -// 101fc PHAISTOS DISC SIGN WAVY BAND - { 0x101D0, 0x2D, 0x8, 0, 0 }, -// 101fd PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE - { 0x101FD, 0x1, 0x0, 0, 0 }, -// 10280 LYCIAN LETTER A -// 10281 LYCIAN LETTER E -// 10282 LYCIAN LETTER B -// 10283 LYCIAN LETTER BH -// 10284 LYCIAN LETTER G -// 10285 LYCIAN LETTER D -// 10286 LYCIAN LETTER I -// 10287 LYCIAN LETTER W -// 10288 LYCIAN LETTER Z -// 10289 LYCIAN LETTER TH -// 1028a LYCIAN LETTER J -// 1028b LYCIAN LETTER K -// 1028c LYCIAN LETTER Q -// 1028d LYCIAN LETTER L -// 1028e LYCIAN LETTER M -// 1028f LYCIAN LETTER N -// 10290 LYCIAN LETTER MM -// 10291 LYCIAN LETTER NN -// 10292 LYCIAN LETTER U -// 10293 LYCIAN LETTER P -// 10294 LYCIAN LETTER KK -// 10295 LYCIAN LETTER R -// 10296 LYCIAN LETTER S -// 10297 LYCIAN LETTER T -// 10298 LYCIAN LETTER TT -// 10299 LYCIAN LETTER AN -// 1029a LYCIAN LETTER EN -// 1029b LYCIAN LETTER H -// 1029c LYCIAN LETTER X - { 0x10280, 0x1D, 0x9, 0, 0 }, -// 102a0 CARIAN LETTER A -// 102a1 CARIAN LETTER P2 -// 102a2 CARIAN LETTER D -// 102a3 CARIAN LETTER L -// 102a4 CARIAN LETTER UUU -// 102a5 CARIAN LETTER R -// 102a6 CARIAN LETTER LD -// 102a7 CARIAN LETTER A2 -// 102a8 CARIAN LETTER Q -// 102a9 CARIAN LETTER B -// 102aa CARIAN LETTER M -// 102ab CARIAN LETTER O -// 102ac CARIAN LETTER D2 -// 102ad CARIAN LETTER T -// 102ae CARIAN LETTER SH -// 102af CARIAN LETTER SH2 -// 102b0 CARIAN LETTER S -// 102b1 CARIAN LETTER C-18 -// 102b2 CARIAN LETTER U -// 102b3 CARIAN LETTER NN -// 102b4 CARIAN LETTER X -// 102b5 CARIAN LETTER N -// 102b6 CARIAN LETTER TT2 -// 102b7 CARIAN LETTER P -// 102b8 CARIAN LETTER SS -// 102b9 CARIAN LETTER I -// 102ba CARIAN LETTER E -// 102bb CARIAN LETTER UUUU -// 102bc CARIAN LETTER K -// 102bd CARIAN LETTER K2 -// 102be CARIAN LETTER ND -// 102bf CARIAN LETTER UU -// 102c0 CARIAN LETTER G -// 102c1 CARIAN LETTER G2 -// 102c2 CARIAN LETTER ST -// 102c3 CARIAN LETTER ST2 -// 102c4 CARIAN LETTER NG -// 102c5 CARIAN LETTER II -// 102c6 CARIAN LETTER C-39 -// 102c7 CARIAN LETTER TT -// 102c8 CARIAN LETTER UUU2 -// 102c9 CARIAN LETTER RR -// 102ca CARIAN LETTER MB -// 102cb CARIAN LETTER MB2 -// 102cc CARIAN LETTER MB3 -// 102cd CARIAN LETTER MB4 -// 102ce CARIAN LETTER LD2 -// 102cf CARIAN LETTER E2 -// 102d0 CARIAN LETTER UUU3 - { 0x102A0, 0x31, 0x9, 0, 0 }, -// 102e0 COPTIC EPACT THOUSANDS MARK - { 0x102E0, 0x1, 0x0, 0, 0 }, -// 102e1 COPTIC EPACT DIGIT ONE -// 102e2 COPTIC EPACT DIGIT TWO -// 102e3 COPTIC EPACT DIGIT THREE -// 102e4 COPTIC EPACT DIGIT FOUR -// 102e5 COPTIC EPACT DIGIT FIVE -// 102e6 COPTIC EPACT DIGIT SIX -// 102e7 COPTIC EPACT DIGIT SEVEN -// 102e8 COPTIC EPACT DIGIT EIGHT -// 102e9 COPTIC EPACT DIGIT NINE -// 102ea COPTIC EPACT NUMBER TEN -// 102eb COPTIC EPACT NUMBER TWENTY -// 102ec COPTIC EPACT NUMBER THIRTY -// 102ed COPTIC EPACT NUMBER FORTY -// 102ee COPTIC EPACT NUMBER FIFTY -// 102ef COPTIC EPACT NUMBER SIXTY -// 102f0 COPTIC EPACT NUMBER SEVENTY -// 102f1 COPTIC EPACT NUMBER EIGHTY -// 102f2 COPTIC EPACT NUMBER NINETY -// 102f3 COPTIC EPACT NUMBER ONE HUNDRED -// 102f4 COPTIC EPACT NUMBER TWO HUNDRED -// 102f5 COPTIC EPACT NUMBER THREE HUNDRED -// 102f6 COPTIC EPACT NUMBER FOUR HUNDRED -// 102f7 COPTIC EPACT NUMBER FIVE HUNDRED -// 102f8 COPTIC EPACT NUMBER SIX HUNDRED -// 102f9 COPTIC EPACT NUMBER SEVEN HUNDRED -// 102fa COPTIC EPACT NUMBER EIGHT HUNDRED -// 102fb COPTIC EPACT NUMBER NINE HUNDRED - { 0x102E1, 0x1B, 0x8, 0, 0 }, -// 10300 OLD ITALIC LETTER A -// 10301 OLD ITALIC LETTER BE -// 10302 OLD ITALIC LETTER KE -// 10303 OLD ITALIC LETTER DE -// 10304 OLD ITALIC LETTER E -// 10305 OLD ITALIC LETTER VE -// 10306 OLD ITALIC LETTER ZE -// 10307 OLD ITALIC LETTER HE -// 10308 OLD ITALIC LETTER THE -// 10309 OLD ITALIC LETTER I -// 1030a OLD ITALIC LETTER KA -// 1030b OLD ITALIC LETTER EL -// 1030c OLD ITALIC LETTER EM -// 1030d OLD ITALIC LETTER EN -// 1030e OLD ITALIC LETTER ESH -// 1030f OLD ITALIC LETTER O -// 10310 OLD ITALIC LETTER PE -// 10311 OLD ITALIC LETTER SHE -// 10312 OLD ITALIC LETTER KU -// 10313 OLD ITALIC LETTER ER -// 10314 OLD ITALIC LETTER ES -// 10315 OLD ITALIC LETTER TE -// 10316 OLD ITALIC LETTER U -// 10317 OLD ITALIC LETTER EKS -// 10318 OLD ITALIC LETTER PHE -// 10319 OLD ITALIC LETTER KHE -// 1031a OLD ITALIC LETTER EF -// 1031b OLD ITALIC LETTER ERS -// 1031c OLD ITALIC LETTER CHE -// 1031d OLD ITALIC LETTER II -// 1031e OLD ITALIC LETTER UU -// 1031f OLD ITALIC LETTER ESS - { 0x10300, 0x20, 0x9, 0, 0 }, -// 10320 OLD ITALIC NUMERAL ONE -// 10321 OLD ITALIC NUMERAL FIVE -// 10322 OLD ITALIC NUMERAL TEN -// 10323 OLD ITALIC NUMERAL FIFTY - { 0x10320, 0x4, 0x8, 0, 0 }, -// 10330 GOTHIC LETTER AHSA -// 10331 GOTHIC LETTER BAIRKAN -// 10332 GOTHIC LETTER GIBA -// 10333 GOTHIC LETTER DAGS -// 10334 GOTHIC LETTER AIHVUS -// 10335 GOTHIC LETTER QAIRTHRA -// 10336 GOTHIC LETTER IUJA -// 10337 GOTHIC LETTER HAGL -// 10338 GOTHIC LETTER THIUTH -// 10339 GOTHIC LETTER EIS -// 1033a GOTHIC LETTER KUSMA -// 1033b GOTHIC LETTER LAGUS -// 1033c GOTHIC LETTER MANNA -// 1033d GOTHIC LETTER NAUTHS -// 1033e GOTHIC LETTER JER -// 1033f GOTHIC LETTER URUS -// 10340 GOTHIC LETTER PAIRTHRA - { 0x10330, 0x11, 0x9, 0, 0 }, -// 10341 GOTHIC LETTER NINETY - { 0x10341, 0x1, 0x8, 0, 0 }, -// 10342 GOTHIC LETTER RAIDA -// 10343 GOTHIC LETTER SAUIL -// 10344 GOTHIC LETTER TEIWS -// 10345 GOTHIC LETTER WINJA -// 10346 GOTHIC LETTER FAIHU -// 10347 GOTHIC LETTER IGGWS -// 10348 GOTHIC LETTER HWAIR -// 10349 GOTHIC LETTER OTHAL - { 0x10342, 0x8, 0x9, 0, 0 }, -// 1034a GOTHIC LETTER NINE HUNDRED - { 0x1034A, 0x1, 0x8, 0, 0 }, -// 10350 OLD PERMIC LETTER AN -// 10351 OLD PERMIC LETTER BUR -// 10352 OLD PERMIC LETTER GAI -// 10353 OLD PERMIC LETTER DOI -// 10354 OLD PERMIC LETTER E -// 10355 OLD PERMIC LETTER ZHOI -// 10356 OLD PERMIC LETTER DZHOI -// 10357 OLD PERMIC LETTER ZATA -// 10358 OLD PERMIC LETTER DZITA -// 10359 OLD PERMIC LETTER I -// 1035a OLD PERMIC LETTER KOKE -// 1035b OLD PERMIC LETTER LEI -// 1035c OLD PERMIC LETTER MENOE -// 1035d OLD PERMIC LETTER NENOE -// 1035e OLD PERMIC LETTER VOOI -// 1035f OLD PERMIC LETTER PEEI -// 10360 OLD PERMIC LETTER REI -// 10361 OLD PERMIC LETTER SII -// 10362 OLD PERMIC LETTER TAI -// 10363 OLD PERMIC LETTER U -// 10364 OLD PERMIC LETTER CHERY -// 10365 OLD PERMIC LETTER SHOOI -// 10366 OLD PERMIC LETTER SHCHOOI -// 10367 OLD PERMIC LETTER YRY -// 10368 OLD PERMIC LETTER YERU -// 10369 OLD PERMIC LETTER O -// 1036a OLD PERMIC LETTER OO -// 1036b OLD PERMIC LETTER EF -// 1036c OLD PERMIC LETTER HA -// 1036d OLD PERMIC LETTER TSIU -// 1036e OLD PERMIC LETTER VER -// 1036f OLD PERMIC LETTER YER -// 10370 OLD PERMIC LETTER YERI -// 10371 OLD PERMIC LETTER YAT -// 10372 OLD PERMIC LETTER IE -// 10373 OLD PERMIC LETTER YU -// 10374 OLD PERMIC LETTER YA -// 10375 OLD PERMIC LETTER IA - { 0x10350, 0x26, 0x9, 0, 0 }, -// 10376 COMBINING OLD PERMIC LETTER AN -// 10377 COMBINING OLD PERMIC LETTER DOI -// 10378 COMBINING OLD PERMIC LETTER ZATA -// 10379 COMBINING OLD PERMIC LETTER NENOE -// 1037a COMBINING OLD PERMIC LETTER SII - { 0x10376, 0x5, 0x0, 0, 0 }, -// 10380 UGARITIC LETTER ALPA -// 10381 UGARITIC LETTER BETA -// 10382 UGARITIC LETTER GAMLA -// 10383 UGARITIC LETTER KHA -// 10384 UGARITIC LETTER DELTA -// 10385 UGARITIC LETTER HO -// 10386 UGARITIC LETTER WO -// 10387 UGARITIC LETTER ZETA -// 10388 UGARITIC LETTER HOTA -// 10389 UGARITIC LETTER TET -// 1038a UGARITIC LETTER YOD -// 1038b UGARITIC LETTER KAF -// 1038c UGARITIC LETTER SHIN -// 1038d UGARITIC LETTER LAMDA -// 1038e UGARITIC LETTER MEM -// 1038f UGARITIC LETTER DHAL -// 10390 UGARITIC LETTER NUN -// 10391 UGARITIC LETTER ZU -// 10392 UGARITIC LETTER SAMKA -// 10393 UGARITIC LETTER AIN -// 10394 UGARITIC LETTER PU -// 10395 UGARITIC LETTER SADE -// 10396 UGARITIC LETTER QOPA -// 10397 UGARITIC LETTER RASHA -// 10398 UGARITIC LETTER THANNA -// 10399 UGARITIC LETTER GHAIN -// 1039a UGARITIC LETTER TO -// 1039b UGARITIC LETTER I -// 1039c UGARITIC LETTER U -// 1039d UGARITIC LETTER SSU - { 0x10380, 0x1E, 0x9, 0, 0 }, -// 1039f UGARITIC WORD DIVIDER - { 0x1039F, 0x1, 0x18, 0, 0 }, -// 103a0 OLD PERSIAN SIGN A -// 103a1 OLD PERSIAN SIGN I -// 103a2 OLD PERSIAN SIGN U -// 103a3 OLD PERSIAN SIGN KA -// 103a4 OLD PERSIAN SIGN KU -// 103a5 OLD PERSIAN SIGN GA -// 103a6 OLD PERSIAN SIGN GU -// 103a7 OLD PERSIAN SIGN XA -// 103a8 OLD PERSIAN SIGN CA -// 103a9 OLD PERSIAN SIGN JA -// 103aa OLD PERSIAN SIGN JI -// 103ab OLD PERSIAN SIGN TA -// 103ac OLD PERSIAN SIGN TU -// 103ad OLD PERSIAN SIGN DA -// 103ae OLD PERSIAN SIGN DI -// 103af OLD PERSIAN SIGN DU -// 103b0 OLD PERSIAN SIGN THA -// 103b1 OLD PERSIAN SIGN PA -// 103b2 OLD PERSIAN SIGN BA -// 103b3 OLD PERSIAN SIGN FA -// 103b4 OLD PERSIAN SIGN NA -// 103b5 OLD PERSIAN SIGN NU -// 103b6 OLD PERSIAN SIGN MA -// 103b7 OLD PERSIAN SIGN MI -// 103b8 OLD PERSIAN SIGN MU -// 103b9 OLD PERSIAN SIGN YA -// 103ba OLD PERSIAN SIGN VA -// 103bb OLD PERSIAN SIGN VI -// 103bc OLD PERSIAN SIGN RA -// 103bd OLD PERSIAN SIGN RU -// 103be OLD PERSIAN SIGN LA -// 103bf OLD PERSIAN SIGN SA -// 103c0 OLD PERSIAN SIGN ZA -// 103c1 OLD PERSIAN SIGN SHA -// 103c2 OLD PERSIAN SIGN SSA -// 103c3 OLD PERSIAN SIGN HA - { 0x103A0, 0x24, 0x9, 0, 0 }, -// 103c8 OLD PERSIAN SIGN AURAMAZDAA -// 103c9 OLD PERSIAN SIGN AURAMAZDAA-2 -// 103ca OLD PERSIAN SIGN AURAMAZDAAHA -// 103cb OLD PERSIAN SIGN XSHAAYATHIYA -// 103cc OLD PERSIAN SIGN DAHYAAUSH -// 103cd OLD PERSIAN SIGN DAHYAAUSH-2 -// 103ce OLD PERSIAN SIGN BAGA -// 103cf OLD PERSIAN SIGN BUUMISH - { 0x103C8, 0x8, 0x9, 0, 0 }, -// 103d0 OLD PERSIAN WORD DIVIDER - { 0x103D0, 0x1, 0x18, 0, 0 }, -// 103d1 OLD PERSIAN NUMBER ONE -// 103d2 OLD PERSIAN NUMBER TWO -// 103d3 OLD PERSIAN NUMBER TEN -// 103d4 OLD PERSIAN NUMBER TWENTY -// 103d5 OLD PERSIAN NUMBER HUNDRED - { 0x103D1, 0x5, 0x8, 0, 0 }, -// 10400 DESERET CAPITAL LETTER LONG I -// 10401 DESERET CAPITAL LETTER LONG E -// 10402 DESERET CAPITAL LETTER LONG A -// 10403 DESERET CAPITAL LETTER LONG AH -// 10404 DESERET CAPITAL LETTER LONG O -// 10405 DESERET CAPITAL LETTER LONG OO -// 10406 DESERET CAPITAL LETTER SHORT I -// 10407 DESERET CAPITAL LETTER SHORT E -// 10408 DESERET CAPITAL LETTER SHORT A -// 10409 DESERET CAPITAL LETTER SHORT AH -// 1040a DESERET CAPITAL LETTER SHORT O -// 1040b DESERET CAPITAL LETTER SHORT OO -// 1040c DESERET CAPITAL LETTER AY -// 1040d DESERET CAPITAL LETTER OW -// 1040e DESERET CAPITAL LETTER WU -// 1040f DESERET CAPITAL LETTER YEE -// 10410 DESERET CAPITAL LETTER H -// 10411 DESERET CAPITAL LETTER PEE -// 10412 DESERET CAPITAL LETTER BEE -// 10413 DESERET CAPITAL LETTER TEE -// 10414 DESERET CAPITAL LETTER DEE -// 10415 DESERET CAPITAL LETTER CHEE -// 10416 DESERET CAPITAL LETTER JEE -// 10417 DESERET CAPITAL LETTER KAY -// 10418 DESERET CAPITAL LETTER GAY -// 10419 DESERET CAPITAL LETTER EF -// 1041a DESERET CAPITAL LETTER VEE -// 1041b DESERET CAPITAL LETTER ETH -// 1041c DESERET CAPITAL LETTER THEE -// 1041d DESERET CAPITAL LETTER ES -// 1041e DESERET CAPITAL LETTER ZEE -// 1041f DESERET CAPITAL LETTER ESH -// 10420 DESERET CAPITAL LETTER ZHEE -// 10421 DESERET CAPITAL LETTER ER -// 10422 DESERET CAPITAL LETTER EL -// 10423 DESERET CAPITAL LETTER EM -// 10424 DESERET CAPITAL LETTER EN -// 10425 DESERET CAPITAL LETTER ENG -// 10426 DESERET CAPITAL LETTER OI -// 10427 DESERET CAPITAL LETTER EW - { 0x10400, 0x28, 0x89, 40, 0 }, -// 10428 DESERET SMALL LETTER LONG I -// 10429 DESERET SMALL LETTER LONG E -// 1042a DESERET SMALL LETTER LONG A -// 1042b DESERET SMALL LETTER LONG AH -// 1042c DESERET SMALL LETTER LONG O -// 1042d DESERET SMALL LETTER LONG OO -// 1042e DESERET SMALL LETTER SHORT I -// 1042f DESERET SMALL LETTER SHORT E -// 10430 DESERET SMALL LETTER SHORT A -// 10431 DESERET SMALL LETTER SHORT AH -// 10432 DESERET SMALL LETTER SHORT O -// 10433 DESERET SMALL LETTER SHORT OO -// 10434 DESERET SMALL LETTER AY -// 10435 DESERET SMALL LETTER OW -// 10436 DESERET SMALL LETTER WU -// 10437 DESERET SMALL LETTER YEE -// 10438 DESERET SMALL LETTER H -// 10439 DESERET SMALL LETTER PEE -// 1043a DESERET SMALL LETTER BEE -// 1043b DESERET SMALL LETTER TEE -// 1043c DESERET SMALL LETTER DEE -// 1043d DESERET SMALL LETTER CHEE -// 1043e DESERET SMALL LETTER JEE -// 1043f DESERET SMALL LETTER KAY -// 10440 DESERET SMALL LETTER GAY -// 10441 DESERET SMALL LETTER EF -// 10442 DESERET SMALL LETTER VEE -// 10443 DESERET SMALL LETTER ETH -// 10444 DESERET SMALL LETTER THEE -// 10445 DESERET SMALL LETTER ES -// 10446 DESERET SMALL LETTER ZEE -// 10447 DESERET SMALL LETTER ESH -// 10448 DESERET SMALL LETTER ZHEE -// 10449 DESERET SMALL LETTER ER -// 1044a DESERET SMALL LETTER EL -// 1044b DESERET SMALL LETTER EM -// 1044c DESERET SMALL LETTER EN -// 1044d DESERET SMALL LETTER ENG -// 1044e DESERET SMALL LETTER OI -// 1044f DESERET SMALL LETTER EW - { 0x10428, 0x28, 0x49, 0, -40 }, -// 10450 SHAVIAN LETTER PEEP -// 10451 SHAVIAN LETTER TOT -// 10452 SHAVIAN LETTER KICK -// 10453 SHAVIAN LETTER FEE -// 10454 SHAVIAN LETTER THIGH -// 10455 SHAVIAN LETTER SO -// 10456 SHAVIAN LETTER SURE -// 10457 SHAVIAN LETTER CHURCH -// 10458 SHAVIAN LETTER YEA -// 10459 SHAVIAN LETTER HUNG -// 1045a SHAVIAN LETTER BIB -// 1045b SHAVIAN LETTER DEAD -// 1045c SHAVIAN LETTER GAG -// 1045d SHAVIAN LETTER VOW -// 1045e SHAVIAN LETTER THEY -// 1045f SHAVIAN LETTER ZOO -// 10460 SHAVIAN LETTER MEASURE -// 10461 SHAVIAN LETTER JUDGE -// 10462 SHAVIAN LETTER WOE -// 10463 SHAVIAN LETTER HA-HA -// 10464 SHAVIAN LETTER LOLL -// 10465 SHAVIAN LETTER MIME -// 10466 SHAVIAN LETTER IF -// 10467 SHAVIAN LETTER EGG -// 10468 SHAVIAN LETTER ASH -// 10469 SHAVIAN LETTER ADO -// 1046a SHAVIAN LETTER ON -// 1046b SHAVIAN LETTER WOOL -// 1046c SHAVIAN LETTER OUT -// 1046d SHAVIAN LETTER AH -// 1046e SHAVIAN LETTER ROAR -// 1046f SHAVIAN LETTER NUN -// 10470 SHAVIAN LETTER EAT -// 10471 SHAVIAN LETTER AGE -// 10472 SHAVIAN LETTER ICE -// 10473 SHAVIAN LETTER UP -// 10474 SHAVIAN LETTER OAK -// 10475 SHAVIAN LETTER OOZE -// 10476 SHAVIAN LETTER OIL -// 10477 SHAVIAN LETTER AWE -// 10478 SHAVIAN LETTER ARE -// 10479 SHAVIAN LETTER OR -// 1047a SHAVIAN LETTER AIR -// 1047b SHAVIAN LETTER ERR -// 1047c SHAVIAN LETTER ARRAY -// 1047d SHAVIAN LETTER EAR -// 1047e SHAVIAN LETTER IAN -// 1047f SHAVIAN LETTER YEW -// 10480 OSMANYA LETTER ALEF -// 10481 OSMANYA LETTER BA -// 10482 OSMANYA LETTER TA -// 10483 OSMANYA LETTER JA -// 10484 OSMANYA LETTER XA -// 10485 OSMANYA LETTER KHA -// 10486 OSMANYA LETTER DEEL -// 10487 OSMANYA LETTER RA -// 10488 OSMANYA LETTER SA -// 10489 OSMANYA LETTER SHIIN -// 1048a OSMANYA LETTER DHA -// 1048b OSMANYA LETTER CAYN -// 1048c OSMANYA LETTER GA -// 1048d OSMANYA LETTER FA -// 1048e OSMANYA LETTER QAAF -// 1048f OSMANYA LETTER KAAF -// 10490 OSMANYA LETTER LAAN -// 10491 OSMANYA LETTER MIIN -// 10492 OSMANYA LETTER NUUN -// 10493 OSMANYA LETTER WAW -// 10494 OSMANYA LETTER HA -// 10495 OSMANYA LETTER YA -// 10496 OSMANYA LETTER A -// 10497 OSMANYA LETTER E -// 10498 OSMANYA LETTER I -// 10499 OSMANYA LETTER O -// 1049a OSMANYA LETTER U -// 1049b OSMANYA LETTER AA -// 1049c OSMANYA LETTER EE -// 1049d OSMANYA LETTER OO - { 0x10450, 0x4E, 0x9, 0, 0 }, -// 104a0 OSMANYA DIGIT ZERO -// 104a1 OSMANYA DIGIT ONE -// 104a2 OSMANYA DIGIT TWO -// 104a3 OSMANYA DIGIT THREE -// 104a4 OSMANYA DIGIT FOUR -// 104a5 OSMANYA DIGIT FIVE -// 104a6 OSMANYA DIGIT SIX -// 104a7 OSMANYA DIGIT SEVEN -// 104a8 OSMANYA DIGIT EIGHT -// 104a9 OSMANYA DIGIT NINE - { 0x104A0, 0xA, 0x108, 0, 0 }, -// 10500 ELBASAN LETTER A -// 10501 ELBASAN LETTER BE -// 10502 ELBASAN LETTER CE -// 10503 ELBASAN LETTER CHE -// 10504 ELBASAN LETTER DE -// 10505 ELBASAN LETTER NDE -// 10506 ELBASAN LETTER DHE -// 10507 ELBASAN LETTER EI -// 10508 ELBASAN LETTER E -// 10509 ELBASAN LETTER FE -// 1050a ELBASAN LETTER GE -// 1050b ELBASAN LETTER GJE -// 1050c ELBASAN LETTER HE -// 1050d ELBASAN LETTER I -// 1050e ELBASAN LETTER JE -// 1050f ELBASAN LETTER KE -// 10510 ELBASAN LETTER LE -// 10511 ELBASAN LETTER LLE -// 10512 ELBASAN LETTER ME -// 10513 ELBASAN LETTER NE -// 10514 ELBASAN LETTER NA -// 10515 ELBASAN LETTER NJE -// 10516 ELBASAN LETTER O -// 10517 ELBASAN LETTER PE -// 10518 ELBASAN LETTER QE -// 10519 ELBASAN LETTER RE -// 1051a ELBASAN LETTER RRE -// 1051b ELBASAN LETTER SE -// 1051c ELBASAN LETTER SHE -// 1051d ELBASAN LETTER TE -// 1051e ELBASAN LETTER THE -// 1051f ELBASAN LETTER U -// 10520 ELBASAN LETTER VE -// 10521 ELBASAN LETTER XE -// 10522 ELBASAN LETTER Y -// 10523 ELBASAN LETTER ZE -// 10524 ELBASAN LETTER ZHE -// 10525 ELBASAN LETTER GHE -// 10526 ELBASAN LETTER GHAMMA -// 10527 ELBASAN LETTER KHE - { 0x10500, 0x28, 0x9, 0, 0 }, -// 10530 CAUCASIAN ALBANIAN LETTER ALT -// 10531 CAUCASIAN ALBANIAN LETTER BET -// 10532 CAUCASIAN ALBANIAN LETTER GIM -// 10533 CAUCASIAN ALBANIAN LETTER DAT -// 10534 CAUCASIAN ALBANIAN LETTER EB -// 10535 CAUCASIAN ALBANIAN LETTER ZARL -// 10536 CAUCASIAN ALBANIAN LETTER EYN -// 10537 CAUCASIAN ALBANIAN LETTER ZHIL -// 10538 CAUCASIAN ALBANIAN LETTER TAS -// 10539 CAUCASIAN ALBANIAN LETTER CHA -// 1053a CAUCASIAN ALBANIAN LETTER YOWD -// 1053b CAUCASIAN ALBANIAN LETTER ZHA -// 1053c CAUCASIAN ALBANIAN LETTER IRB -// 1053d CAUCASIAN ALBANIAN LETTER SHA -// 1053e CAUCASIAN ALBANIAN LETTER LAN -// 1053f CAUCASIAN ALBANIAN LETTER INYA -// 10540 CAUCASIAN ALBANIAN LETTER XEYN -// 10541 CAUCASIAN ALBANIAN LETTER DYAN -// 10542 CAUCASIAN ALBANIAN LETTER CAR -// 10543 CAUCASIAN ALBANIAN LETTER JHOX -// 10544 CAUCASIAN ALBANIAN LETTER KAR -// 10545 CAUCASIAN ALBANIAN LETTER LYIT -// 10546 CAUCASIAN ALBANIAN LETTER HEYT -// 10547 CAUCASIAN ALBANIAN LETTER QAY -// 10548 CAUCASIAN ALBANIAN LETTER AOR -// 10549 CAUCASIAN ALBANIAN LETTER CHOY -// 1054a CAUCASIAN ALBANIAN LETTER CHI -// 1054b CAUCASIAN ALBANIAN LETTER CYAY -// 1054c CAUCASIAN ALBANIAN LETTER MAQ -// 1054d CAUCASIAN ALBANIAN LETTER QAR -// 1054e CAUCASIAN ALBANIAN LETTER NOWC -// 1054f CAUCASIAN ALBANIAN LETTER DZYAY -// 10550 CAUCASIAN ALBANIAN LETTER SHAK -// 10551 CAUCASIAN ALBANIAN LETTER JAYN -// 10552 CAUCASIAN ALBANIAN LETTER ON -// 10553 CAUCASIAN ALBANIAN LETTER TYAY -// 10554 CAUCASIAN ALBANIAN LETTER FAM -// 10555 CAUCASIAN ALBANIAN LETTER DZAY -// 10556 CAUCASIAN ALBANIAN LETTER CHAT -// 10557 CAUCASIAN ALBANIAN LETTER PEN -// 10558 CAUCASIAN ALBANIAN LETTER GHEYS -// 10559 CAUCASIAN ALBANIAN LETTER RAT -// 1055a CAUCASIAN ALBANIAN LETTER SEYK -// 1055b CAUCASIAN ALBANIAN LETTER VEYZ -// 1055c CAUCASIAN ALBANIAN LETTER TIWR -// 1055d CAUCASIAN ALBANIAN LETTER SHOY -// 1055e CAUCASIAN ALBANIAN LETTER IWN -// 1055f CAUCASIAN ALBANIAN LETTER CYAW -// 10560 CAUCASIAN ALBANIAN LETTER CAYN -// 10561 CAUCASIAN ALBANIAN LETTER YAYD -// 10562 CAUCASIAN ALBANIAN LETTER PIWR -// 10563 CAUCASIAN ALBANIAN LETTER KIW - { 0x10530, 0x34, 0x9, 0, 0 }, -// 1056f CAUCASIAN ALBANIAN CITATION MARK - { 0x1056F, 0x1, 0x18, 0, 0 }, -// 10600 LINEAR A SIGN AB001 -// 10601 LINEAR A SIGN AB002 -// 10602 LINEAR A SIGN AB003 -// 10603 LINEAR A SIGN AB004 -// 10604 LINEAR A SIGN AB005 -// 10605 LINEAR A SIGN AB006 -// 10606 LINEAR A SIGN AB007 -// 10607 LINEAR A SIGN AB008 -// 10608 LINEAR A SIGN AB009 -// 10609 LINEAR A SIGN AB010 -// 1060a LINEAR A SIGN AB011 -// 1060b LINEAR A SIGN AB013 -// 1060c LINEAR A SIGN AB016 -// 1060d LINEAR A SIGN AB017 -// 1060e LINEAR A SIGN AB020 -// 1060f LINEAR A SIGN AB021 -// 10610 LINEAR A SIGN AB021F -// 10611 LINEAR A SIGN AB021M -// 10612 LINEAR A SIGN AB022 -// 10613 LINEAR A SIGN AB022F -// 10614 LINEAR A SIGN AB022M -// 10615 LINEAR A SIGN AB023 -// 10616 LINEAR A SIGN AB023M -// 10617 LINEAR A SIGN AB024 -// 10618 LINEAR A SIGN AB026 -// 10619 LINEAR A SIGN AB027 -// 1061a LINEAR A SIGN AB028 -// 1061b LINEAR A SIGN A028B -// 1061c LINEAR A SIGN AB029 -// 1061d LINEAR A SIGN AB030 -// 1061e LINEAR A SIGN AB031 -// 1061f LINEAR A SIGN AB034 -// 10620 LINEAR A SIGN AB037 -// 10621 LINEAR A SIGN AB038 -// 10622 LINEAR A SIGN AB039 -// 10623 LINEAR A SIGN AB040 -// 10624 LINEAR A SIGN AB041 -// 10625 LINEAR A SIGN AB044 -// 10626 LINEAR A SIGN AB045 -// 10627 LINEAR A SIGN AB046 -// 10628 LINEAR A SIGN AB047 -// 10629 LINEAR A SIGN AB048 -// 1062a LINEAR A SIGN AB049 -// 1062b LINEAR A SIGN AB050 -// 1062c LINEAR A SIGN AB051 -// 1062d LINEAR A SIGN AB053 -// 1062e LINEAR A SIGN AB054 -// 1062f LINEAR A SIGN AB055 -// 10630 LINEAR A SIGN AB056 -// 10631 LINEAR A SIGN AB057 -// 10632 LINEAR A SIGN AB058 -// 10633 LINEAR A SIGN AB059 -// 10634 LINEAR A SIGN AB060 -// 10635 LINEAR A SIGN AB061 -// 10636 LINEAR A SIGN AB065 -// 10637 LINEAR A SIGN AB066 -// 10638 LINEAR A SIGN AB067 -// 10639 LINEAR A SIGN AB069 -// 1063a LINEAR A SIGN AB070 -// 1063b LINEAR A SIGN AB073 -// 1063c LINEAR A SIGN AB074 -// 1063d LINEAR A SIGN AB076 -// 1063e LINEAR A SIGN AB077 -// 1063f LINEAR A SIGN AB078 -// 10640 LINEAR A SIGN AB079 -// 10641 LINEAR A SIGN AB080 -// 10642 LINEAR A SIGN AB081 -// 10643 LINEAR A SIGN AB082 -// 10644 LINEAR A SIGN AB085 -// 10645 LINEAR A SIGN AB086 -// 10646 LINEAR A SIGN AB087 -// 10647 LINEAR A SIGN A100-102 -// 10648 LINEAR A SIGN AB118 -// 10649 LINEAR A SIGN AB120 -// 1064a LINEAR A SIGN A120B -// 1064b LINEAR A SIGN AB122 -// 1064c LINEAR A SIGN AB123 -// 1064d LINEAR A SIGN AB131A -// 1064e LINEAR A SIGN AB131B -// 1064f LINEAR A SIGN A131C -// 10650 LINEAR A SIGN AB164 -// 10651 LINEAR A SIGN AB171 -// 10652 LINEAR A SIGN AB180 -// 10653 LINEAR A SIGN AB188 -// 10654 LINEAR A SIGN AB191 -// 10655 LINEAR A SIGN A301 -// 10656 LINEAR A SIGN A302 -// 10657 LINEAR A SIGN A303 -// 10658 LINEAR A SIGN A304 -// 10659 LINEAR A SIGN A305 -// 1065a LINEAR A SIGN A306 -// 1065b LINEAR A SIGN A307 -// 1065c LINEAR A SIGN A308 -// 1065d LINEAR A SIGN A309A -// 1065e LINEAR A SIGN A309B -// 1065f LINEAR A SIGN A309C -// 10660 LINEAR A SIGN A310 -// 10661 LINEAR A SIGN A311 -// 10662 LINEAR A SIGN A312 -// 10663 LINEAR A SIGN A313A -// 10664 LINEAR A SIGN A313B -// 10665 LINEAR A SIGN A313C -// 10666 LINEAR A SIGN A314 -// 10667 LINEAR A SIGN A315 -// 10668 LINEAR A SIGN A316 -// 10669 LINEAR A SIGN A317 -// 1066a LINEAR A SIGN A318 -// 1066b LINEAR A SIGN A319 -// 1066c LINEAR A SIGN A320 -// 1066d LINEAR A SIGN A321 -// 1066e LINEAR A SIGN A322 -// 1066f LINEAR A SIGN A323 -// 10670 LINEAR A SIGN A324 -// 10671 LINEAR A SIGN A325 -// 10672 LINEAR A SIGN A326 -// 10673 LINEAR A SIGN A327 -// 10674 LINEAR A SIGN A328 -// 10675 LINEAR A SIGN A329 -// 10676 LINEAR A SIGN A330 -// 10677 LINEAR A SIGN A331 -// 10678 LINEAR A SIGN A332 -// 10679 LINEAR A SIGN A333 -// 1067a LINEAR A SIGN A334 -// 1067b LINEAR A SIGN A335 -// 1067c LINEAR A SIGN A336 -// 1067d LINEAR A SIGN A337 -// 1067e LINEAR A SIGN A338 -// 1067f LINEAR A SIGN A339 -// 10680 LINEAR A SIGN A340 -// 10681 LINEAR A SIGN A341 -// 10682 LINEAR A SIGN A342 -// 10683 LINEAR A SIGN A343 -// 10684 LINEAR A SIGN A344 -// 10685 LINEAR A SIGN A345 -// 10686 LINEAR A SIGN A346 -// 10687 LINEAR A SIGN A347 -// 10688 LINEAR A SIGN A348 -// 10689 LINEAR A SIGN A349 -// 1068a LINEAR A SIGN A350 -// 1068b LINEAR A SIGN A351 -// 1068c LINEAR A SIGN A352 -// 1068d LINEAR A SIGN A353 -// 1068e LINEAR A SIGN A354 -// 1068f LINEAR A SIGN A355 -// 10690 LINEAR A SIGN A356 -// 10691 LINEAR A SIGN A357 -// 10692 LINEAR A SIGN A358 -// 10693 LINEAR A SIGN A359 -// 10694 LINEAR A SIGN A360 -// 10695 LINEAR A SIGN A361 -// 10696 LINEAR A SIGN A362 -// 10697 LINEAR A SIGN A363 -// 10698 LINEAR A SIGN A364 -// 10699 LINEAR A SIGN A365 -// 1069a LINEAR A SIGN A366 -// 1069b LINEAR A SIGN A367 -// 1069c LINEAR A SIGN A368 -// 1069d LINEAR A SIGN A369 -// 1069e LINEAR A SIGN A370 -// 1069f LINEAR A SIGN A371 -// 106a0 LINEAR A SIGN A400-VAS -// 106a1 LINEAR A SIGN A401-VAS -// 106a2 LINEAR A SIGN A402-VAS -// 106a3 LINEAR A SIGN A403-VAS -// 106a4 LINEAR A SIGN A404-VAS -// 106a5 LINEAR A SIGN A405-VAS -// 106a6 LINEAR A SIGN A406-VAS -// 106a7 LINEAR A SIGN A407-VAS -// 106a8 LINEAR A SIGN A408-VAS -// 106a9 LINEAR A SIGN A409-VAS -// 106aa LINEAR A SIGN A410-VAS -// 106ab LINEAR A SIGN A411-VAS -// 106ac LINEAR A SIGN A412-VAS -// 106ad LINEAR A SIGN A413-VAS -// 106ae LINEAR A SIGN A414-VAS -// 106af LINEAR A SIGN A415-VAS -// 106b0 LINEAR A SIGN A416-VAS -// 106b1 LINEAR A SIGN A417-VAS -// 106b2 LINEAR A SIGN A418-VAS -// 106b3 LINEAR A SIGN A501 -// 106b4 LINEAR A SIGN A502 -// 106b5 LINEAR A SIGN A503 -// 106b6 LINEAR A SIGN A504 -// 106b7 LINEAR A SIGN A505 -// 106b8 LINEAR A SIGN A506 -// 106b9 LINEAR A SIGN A508 -// 106ba LINEAR A SIGN A509 -// 106bb LINEAR A SIGN A510 -// 106bc LINEAR A SIGN A511 -// 106bd LINEAR A SIGN A512 -// 106be LINEAR A SIGN A513 -// 106bf LINEAR A SIGN A515 -// 106c0 LINEAR A SIGN A516 -// 106c1 LINEAR A SIGN A520 -// 106c2 LINEAR A SIGN A521 -// 106c3 LINEAR A SIGN A523 -// 106c4 LINEAR A SIGN A524 -// 106c5 LINEAR A SIGN A525 -// 106c6 LINEAR A SIGN A526 -// 106c7 LINEAR A SIGN A527 -// 106c8 LINEAR A SIGN A528 -// 106c9 LINEAR A SIGN A529 -// 106ca LINEAR A SIGN A530 -// 106cb LINEAR A SIGN A531 -// 106cc LINEAR A SIGN A532 -// 106cd LINEAR A SIGN A534 -// 106ce LINEAR A SIGN A535 -// 106cf LINEAR A SIGN A536 -// 106d0 LINEAR A SIGN A537 -// 106d1 LINEAR A SIGN A538 -// 106d2 LINEAR A SIGN A539 -// 106d3 LINEAR A SIGN A540 -// 106d4 LINEAR A SIGN A541 -// 106d5 LINEAR A SIGN A542 -// 106d6 LINEAR A SIGN A545 -// 106d7 LINEAR A SIGN A547 -// 106d8 LINEAR A SIGN A548 -// 106d9 LINEAR A SIGN A549 -// 106da LINEAR A SIGN A550 -// 106db LINEAR A SIGN A551 -// 106dc LINEAR A SIGN A552 -// 106dd LINEAR A SIGN A553 -// 106de LINEAR A SIGN A554 -// 106df LINEAR A SIGN A555 -// 106e0 LINEAR A SIGN A556 -// 106e1 LINEAR A SIGN A557 -// 106e2 LINEAR A SIGN A559 -// 106e3 LINEAR A SIGN A563 -// 106e4 LINEAR A SIGN A564 -// 106e5 LINEAR A SIGN A565 -// 106e6 LINEAR A SIGN A566 -// 106e7 LINEAR A SIGN A568 -// 106e8 LINEAR A SIGN A569 -// 106e9 LINEAR A SIGN A570 -// 106ea LINEAR A SIGN A571 -// 106eb LINEAR A SIGN A572 -// 106ec LINEAR A SIGN A573 -// 106ed LINEAR A SIGN A574 -// 106ee LINEAR A SIGN A575 -// 106ef LINEAR A SIGN A576 -// 106f0 LINEAR A SIGN A577 -// 106f1 LINEAR A SIGN A578 -// 106f2 LINEAR A SIGN A579 -// 106f3 LINEAR A SIGN A580 -// 106f4 LINEAR A SIGN A581 -// 106f5 LINEAR A SIGN A582 -// 106f6 LINEAR A SIGN A583 -// 106f7 LINEAR A SIGN A584 -// 106f8 LINEAR A SIGN A585 -// 106f9 LINEAR A SIGN A586 -// 106fa LINEAR A SIGN A587 -// 106fb LINEAR A SIGN A588 -// 106fc LINEAR A SIGN A589 -// 106fd LINEAR A SIGN A591 -// 106fe LINEAR A SIGN A592 -// 106ff LINEAR A SIGN A594 -// 10700 LINEAR A SIGN A595 -// 10701 LINEAR A SIGN A596 -// 10702 LINEAR A SIGN A598 -// 10703 LINEAR A SIGN A600 -// 10704 LINEAR A SIGN A601 -// 10705 LINEAR A SIGN A602 -// 10706 LINEAR A SIGN A603 -// 10707 LINEAR A SIGN A604 -// 10708 LINEAR A SIGN A606 -// 10709 LINEAR A SIGN A608 -// 1070a LINEAR A SIGN A609 -// 1070b LINEAR A SIGN A610 -// 1070c LINEAR A SIGN A611 -// 1070d LINEAR A SIGN A612 -// 1070e LINEAR A SIGN A613 -// 1070f LINEAR A SIGN A614 -// 10710 LINEAR A SIGN A615 -// 10711 LINEAR A SIGN A616 -// 10712 LINEAR A SIGN A617 -// 10713 LINEAR A SIGN A618 -// 10714 LINEAR A SIGN A619 -// 10715 LINEAR A SIGN A620 -// 10716 LINEAR A SIGN A621 -// 10717 LINEAR A SIGN A622 -// 10718 LINEAR A SIGN A623 -// 10719 LINEAR A SIGN A624 -// 1071a LINEAR A SIGN A626 -// 1071b LINEAR A SIGN A627 -// 1071c LINEAR A SIGN A628 -// 1071d LINEAR A SIGN A629 -// 1071e LINEAR A SIGN A634 -// 1071f LINEAR A SIGN A637 -// 10720 LINEAR A SIGN A638 -// 10721 LINEAR A SIGN A640 -// 10722 LINEAR A SIGN A642 -// 10723 LINEAR A SIGN A643 -// 10724 LINEAR A SIGN A644 -// 10725 LINEAR A SIGN A645 -// 10726 LINEAR A SIGN A646 -// 10727 LINEAR A SIGN A648 -// 10728 LINEAR A SIGN A649 -// 10729 LINEAR A SIGN A651 -// 1072a LINEAR A SIGN A652 -// 1072b LINEAR A SIGN A653 -// 1072c LINEAR A SIGN A654 -// 1072d LINEAR A SIGN A655 -// 1072e LINEAR A SIGN A656 -// 1072f LINEAR A SIGN A657 -// 10730 LINEAR A SIGN A658 -// 10731 LINEAR A SIGN A659 -// 10732 LINEAR A SIGN A660 -// 10733 LINEAR A SIGN A661 -// 10734 LINEAR A SIGN A662 -// 10735 LINEAR A SIGN A663 -// 10736 LINEAR A SIGN A664 - { 0x10600, 0x137, 0x9, 0, 0 }, -// 10740 LINEAR A SIGN A701 A -// 10741 LINEAR A SIGN A702 B -// 10742 LINEAR A SIGN A703 D -// 10743 LINEAR A SIGN A704 E -// 10744 LINEAR A SIGN A705 F -// 10745 LINEAR A SIGN A706 H -// 10746 LINEAR A SIGN A707 J -// 10747 LINEAR A SIGN A708 K -// 10748 LINEAR A SIGN A709 L -// 10749 LINEAR A SIGN A709-2 L2 -// 1074a LINEAR A SIGN A709-3 L3 -// 1074b LINEAR A SIGN A709-4 L4 -// 1074c LINEAR A SIGN A709-6 L6 -// 1074d LINEAR A SIGN A710 W -// 1074e LINEAR A SIGN A711 X -// 1074f LINEAR A SIGN A712 Y -// 10750 LINEAR A SIGN A713 OMEGA -// 10751 LINEAR A SIGN A714 ABB -// 10752 LINEAR A SIGN A715 BB -// 10753 LINEAR A SIGN A717 DD -// 10754 LINEAR A SIGN A726 EYYY -// 10755 LINEAR A SIGN A732 JE - { 0x10740, 0x16, 0x9, 0, 0 }, -// 10760 LINEAR A SIGN A800 -// 10761 LINEAR A SIGN A801 -// 10762 LINEAR A SIGN A802 -// 10763 LINEAR A SIGN A803 -// 10764 LINEAR A SIGN A804 -// 10765 LINEAR A SIGN A805 -// 10766 LINEAR A SIGN A806 -// 10767 LINEAR A SIGN A807 - { 0x10760, 0x8, 0x9, 0, 0 }, -// 10800 CYPRIOT SYLLABLE A -// 10801 CYPRIOT SYLLABLE E -// 10802 CYPRIOT SYLLABLE I -// 10803 CYPRIOT SYLLABLE O -// 10804 CYPRIOT SYLLABLE U -// 10805 CYPRIOT SYLLABLE JA - { 0x10800, 0x6, 0x9, 0, 0 }, -// 10808 CYPRIOT SYLLABLE JO - { 0x10808, 0x1, 0x9, 0, 0 }, -// 1080a CYPRIOT SYLLABLE KA -// 1080b CYPRIOT SYLLABLE KE -// 1080c CYPRIOT SYLLABLE KI -// 1080d CYPRIOT SYLLABLE KO -// 1080e CYPRIOT SYLLABLE KU -// 1080f CYPRIOT SYLLABLE LA -// 10810 CYPRIOT SYLLABLE LE -// 10811 CYPRIOT SYLLABLE LI -// 10812 CYPRIOT SYLLABLE LO -// 10813 CYPRIOT SYLLABLE LU -// 10814 CYPRIOT SYLLABLE MA -// 10815 CYPRIOT SYLLABLE ME -// 10816 CYPRIOT SYLLABLE MI -// 10817 CYPRIOT SYLLABLE MO -// 10818 CYPRIOT SYLLABLE MU -// 10819 CYPRIOT SYLLABLE NA -// 1081a CYPRIOT SYLLABLE NE -// 1081b CYPRIOT SYLLABLE NI -// 1081c CYPRIOT SYLLABLE NO -// 1081d CYPRIOT SYLLABLE NU -// 1081e CYPRIOT SYLLABLE PA -// 1081f CYPRIOT SYLLABLE PE -// 10820 CYPRIOT SYLLABLE PI -// 10821 CYPRIOT SYLLABLE PO -// 10822 CYPRIOT SYLLABLE PU -// 10823 CYPRIOT SYLLABLE RA -// 10824 CYPRIOT SYLLABLE RE -// 10825 CYPRIOT SYLLABLE RI -// 10826 CYPRIOT SYLLABLE RO -// 10827 CYPRIOT SYLLABLE RU -// 10828 CYPRIOT SYLLABLE SA -// 10829 CYPRIOT SYLLABLE SE -// 1082a CYPRIOT SYLLABLE SI -// 1082b CYPRIOT SYLLABLE SO -// 1082c CYPRIOT SYLLABLE SU -// 1082d CYPRIOT SYLLABLE TA -// 1082e CYPRIOT SYLLABLE TE -// 1082f CYPRIOT SYLLABLE TI -// 10830 CYPRIOT SYLLABLE TO -// 10831 CYPRIOT SYLLABLE TU -// 10832 CYPRIOT SYLLABLE WA -// 10833 CYPRIOT SYLLABLE WE -// 10834 CYPRIOT SYLLABLE WI -// 10835 CYPRIOT SYLLABLE WO - { 0x1080A, 0x2C, 0x9, 0, 0 }, -// 10837 CYPRIOT SYLLABLE XA -// 10838 CYPRIOT SYLLABLE XE - { 0x10837, 0x2, 0x9, 0, 0 }, -// 1083c CYPRIOT SYLLABLE ZA - { 0x1083C, 0x1, 0x9, 0, 0 }, -// 1083f CYPRIOT SYLLABLE ZO -// 10840 IMPERIAL ARAMAIC LETTER ALEPH -// 10841 IMPERIAL ARAMAIC LETTER BETH -// 10842 IMPERIAL ARAMAIC LETTER GIMEL -// 10843 IMPERIAL ARAMAIC LETTER DALETH -// 10844 IMPERIAL ARAMAIC LETTER HE -// 10845 IMPERIAL ARAMAIC LETTER WAW -// 10846 IMPERIAL ARAMAIC LETTER ZAYIN -// 10847 IMPERIAL ARAMAIC LETTER HETH -// 10848 IMPERIAL ARAMAIC LETTER TETH -// 10849 IMPERIAL ARAMAIC LETTER YODH -// 1084a IMPERIAL ARAMAIC LETTER KAPH -// 1084b IMPERIAL ARAMAIC LETTER LAMEDH -// 1084c IMPERIAL ARAMAIC LETTER MEM -// 1084d IMPERIAL ARAMAIC LETTER NUN -// 1084e IMPERIAL ARAMAIC LETTER SAMEKH -// 1084f IMPERIAL ARAMAIC LETTER AYIN -// 10850 IMPERIAL ARAMAIC LETTER PE -// 10851 IMPERIAL ARAMAIC LETTER SADHE -// 10852 IMPERIAL ARAMAIC LETTER QOPH -// 10853 IMPERIAL ARAMAIC LETTER RESH -// 10854 IMPERIAL ARAMAIC LETTER SHIN -// 10855 IMPERIAL ARAMAIC LETTER TAW - { 0x1083F, 0x17, 0x9, 0, 0 }, -// 10857 IMPERIAL ARAMAIC SECTION SIGN - { 0x10857, 0x1, 0x18, 0, 0 }, -// 10858 IMPERIAL ARAMAIC NUMBER ONE -// 10859 IMPERIAL ARAMAIC NUMBER TWO -// 1085a IMPERIAL ARAMAIC NUMBER THREE -// 1085b IMPERIAL ARAMAIC NUMBER TEN -// 1085c IMPERIAL ARAMAIC NUMBER TWENTY -// 1085d IMPERIAL ARAMAIC NUMBER ONE HUNDRED -// 1085e IMPERIAL ARAMAIC NUMBER ONE THOUSAND -// 1085f IMPERIAL ARAMAIC NUMBER TEN THOUSAND - { 0x10858, 0x8, 0x8, 0, 0 }, -// 10860 PALMYRENE LETTER ALEPH -// 10861 PALMYRENE LETTER BETH -// 10862 PALMYRENE LETTER GIMEL -// 10863 PALMYRENE LETTER DALETH -// 10864 PALMYRENE LETTER HE -// 10865 PALMYRENE LETTER WAW -// 10866 PALMYRENE LETTER ZAYIN -// 10867 PALMYRENE LETTER HETH -// 10868 PALMYRENE LETTER TETH -// 10869 PALMYRENE LETTER YODH -// 1086a PALMYRENE LETTER KAPH -// 1086b PALMYRENE LETTER LAMEDH -// 1086c PALMYRENE LETTER MEM -// 1086d PALMYRENE LETTER FINAL NUN -// 1086e PALMYRENE LETTER NUN -// 1086f PALMYRENE LETTER SAMEKH -// 10870 PALMYRENE LETTER AYIN -// 10871 PALMYRENE LETTER PE -// 10872 PALMYRENE LETTER SADHE -// 10873 PALMYRENE LETTER QOPH -// 10874 PALMYRENE LETTER RESH -// 10875 PALMYRENE LETTER SHIN -// 10876 PALMYRENE LETTER TAW - { 0x10860, 0x17, 0x9, 0, 0 }, -// 10877 PALMYRENE LEFT-POINTING FLEURON -// 10878 PALMYRENE RIGHT-POINTING FLEURON -// 10879 PALMYRENE NUMBER ONE -// 1087a PALMYRENE NUMBER TWO -// 1087b PALMYRENE NUMBER THREE -// 1087c PALMYRENE NUMBER FOUR -// 1087d PALMYRENE NUMBER FIVE -// 1087e PALMYRENE NUMBER TEN -// 1087f PALMYRENE NUMBER TWENTY - { 0x10877, 0x9, 0x8, 0, 0 }, -// 10880 NABATAEAN LETTER FINAL ALEPH -// 10881 NABATAEAN LETTER ALEPH -// 10882 NABATAEAN LETTER FINAL BETH -// 10883 NABATAEAN LETTER BETH -// 10884 NABATAEAN LETTER GIMEL -// 10885 NABATAEAN LETTER DALETH -// 10886 NABATAEAN LETTER FINAL HE -// 10887 NABATAEAN LETTER HE -// 10888 NABATAEAN LETTER WAW -// 10889 NABATAEAN LETTER ZAYIN -// 1088a NABATAEAN LETTER HETH -// 1088b NABATAEAN LETTER TETH -// 1088c NABATAEAN LETTER FINAL YODH -// 1088d NABATAEAN LETTER YODH -// 1088e NABATAEAN LETTER FINAL KAPH -// 1088f NABATAEAN LETTER KAPH -// 10890 NABATAEAN LETTER FINAL LAMEDH -// 10891 NABATAEAN LETTER LAMEDH -// 10892 NABATAEAN LETTER FINAL MEM -// 10893 NABATAEAN LETTER MEM -// 10894 NABATAEAN LETTER FINAL NUN -// 10895 NABATAEAN LETTER NUN -// 10896 NABATAEAN LETTER SAMEKH -// 10897 NABATAEAN LETTER AYIN -// 10898 NABATAEAN LETTER PE -// 10899 NABATAEAN LETTER SADHE -// 1089a NABATAEAN LETTER QOPH -// 1089b NABATAEAN LETTER RESH -// 1089c NABATAEAN LETTER FINAL SHIN -// 1089d NABATAEAN LETTER SHIN -// 1089e NABATAEAN LETTER TAW - { 0x10880, 0x1F, 0x9, 0, 0 }, -// 108a7 NABATAEAN NUMBER ONE -// 108a8 NABATAEAN NUMBER TWO -// 108a9 NABATAEAN NUMBER THREE -// 108aa NABATAEAN NUMBER FOUR -// 108ab NABATAEAN CRUCIFORM NUMBER FOUR -// 108ac NABATAEAN NUMBER FIVE -// 108ad NABATAEAN NUMBER TEN -// 108ae NABATAEAN NUMBER TWENTY -// 108af NABATAEAN NUMBER ONE HUNDRED - { 0x108A7, 0x9, 0x8, 0, 0 }, -// 10900 PHOENICIAN LETTER ALF -// 10901 PHOENICIAN LETTER BET -// 10902 PHOENICIAN LETTER GAML -// 10903 PHOENICIAN LETTER DELT -// 10904 PHOENICIAN LETTER HE -// 10905 PHOENICIAN LETTER WAU -// 10906 PHOENICIAN LETTER ZAI -// 10907 PHOENICIAN LETTER HET -// 10908 PHOENICIAN LETTER TET -// 10909 PHOENICIAN LETTER YOD -// 1090a PHOENICIAN LETTER KAF -// 1090b PHOENICIAN LETTER LAMD -// 1090c PHOENICIAN LETTER MEM -// 1090d PHOENICIAN LETTER NUN -// 1090e PHOENICIAN LETTER SEMK -// 1090f PHOENICIAN LETTER AIN -// 10910 PHOENICIAN LETTER PE -// 10911 PHOENICIAN LETTER SADE -// 10912 PHOENICIAN LETTER QOF -// 10913 PHOENICIAN LETTER ROSH -// 10914 PHOENICIAN LETTER SHIN -// 10915 PHOENICIAN LETTER TAU - { 0x10900, 0x16, 0x9, 0, 0 }, -// 10916 PHOENICIAN NUMBER ONE -// 10917 PHOENICIAN NUMBER TEN -// 10918 PHOENICIAN NUMBER TWENTY -// 10919 PHOENICIAN NUMBER ONE HUNDRED -// 1091a PHOENICIAN NUMBER TWO -// 1091b PHOENICIAN NUMBER THREE - { 0x10916, 0x6, 0x8, 0, 0 }, -// 1091f PHOENICIAN WORD SEPARATOR - { 0x1091F, 0x1, 0x18, 0, 0 }, -// 10920 LYDIAN LETTER A -// 10921 LYDIAN LETTER B -// 10922 LYDIAN LETTER G -// 10923 LYDIAN LETTER D -// 10924 LYDIAN LETTER E -// 10925 LYDIAN LETTER V -// 10926 LYDIAN LETTER I -// 10927 LYDIAN LETTER Y -// 10928 LYDIAN LETTER K -// 10929 LYDIAN LETTER L -// 1092a LYDIAN LETTER M -// 1092b LYDIAN LETTER N -// 1092c LYDIAN LETTER O -// 1092d LYDIAN LETTER R -// 1092e LYDIAN LETTER SS -// 1092f LYDIAN LETTER T -// 10930 LYDIAN LETTER U -// 10931 LYDIAN LETTER F -// 10932 LYDIAN LETTER Q -// 10933 LYDIAN LETTER S -// 10934 LYDIAN LETTER TT -// 10935 LYDIAN LETTER AN -// 10936 LYDIAN LETTER EN -// 10937 LYDIAN LETTER LY -// 10938 LYDIAN LETTER NN -// 10939 LYDIAN LETTER C - { 0x10920, 0x1A, 0x9, 0, 0 }, -// 1093f LYDIAN TRIANGULAR MARK - { 0x1093F, 0x1, 0x18, 0, 0 }, -// 10980 MEROITIC HIEROGLYPHIC LETTER A -// 10981 MEROITIC HIEROGLYPHIC LETTER E -// 10982 MEROITIC HIEROGLYPHIC LETTER I -// 10983 MEROITIC HIEROGLYPHIC LETTER O -// 10984 MEROITIC HIEROGLYPHIC LETTER YA -// 10985 MEROITIC HIEROGLYPHIC LETTER WA -// 10986 MEROITIC HIEROGLYPHIC LETTER BA -// 10987 MEROITIC HIEROGLYPHIC LETTER BA-2 -// 10988 MEROITIC HIEROGLYPHIC LETTER PA -// 10989 MEROITIC HIEROGLYPHIC LETTER MA -// 1098a MEROITIC HIEROGLYPHIC LETTER NA -// 1098b MEROITIC HIEROGLYPHIC LETTER NA-2 -// 1098c MEROITIC HIEROGLYPHIC LETTER NE -// 1098d MEROITIC HIEROGLYPHIC LETTER NE-2 -// 1098e MEROITIC HIEROGLYPHIC LETTER RA -// 1098f MEROITIC HIEROGLYPHIC LETTER RA-2 -// 10990 MEROITIC HIEROGLYPHIC LETTER LA -// 10991 MEROITIC HIEROGLYPHIC LETTER KHA -// 10992 MEROITIC HIEROGLYPHIC LETTER HHA -// 10993 MEROITIC HIEROGLYPHIC LETTER SA -// 10994 MEROITIC HIEROGLYPHIC LETTER SA-2 -// 10995 MEROITIC HIEROGLYPHIC LETTER SE -// 10996 MEROITIC HIEROGLYPHIC LETTER KA -// 10997 MEROITIC HIEROGLYPHIC LETTER QA -// 10998 MEROITIC HIEROGLYPHIC LETTER TA -// 10999 MEROITIC HIEROGLYPHIC LETTER TA-2 -// 1099a MEROITIC HIEROGLYPHIC LETTER TE -// 1099b MEROITIC HIEROGLYPHIC LETTER TE-2 -// 1099c MEROITIC HIEROGLYPHIC LETTER TO -// 1099d MEROITIC HIEROGLYPHIC LETTER DA -// 1099e MEROITIC HIEROGLYPHIC SYMBOL VIDJ -// 1099f MEROITIC HIEROGLYPHIC SYMBOL VIDJ-2 -// 109a0 MEROITIC CURSIVE LETTER A -// 109a1 MEROITIC CURSIVE LETTER E -// 109a2 MEROITIC CURSIVE LETTER I -// 109a3 MEROITIC CURSIVE LETTER O -// 109a4 MEROITIC CURSIVE LETTER YA -// 109a5 MEROITIC CURSIVE LETTER WA -// 109a6 MEROITIC CURSIVE LETTER BA -// 109a7 MEROITIC CURSIVE LETTER PA -// 109a8 MEROITIC CURSIVE LETTER MA -// 109a9 MEROITIC CURSIVE LETTER NA -// 109aa MEROITIC CURSIVE LETTER NE -// 109ab MEROITIC CURSIVE LETTER RA -// 109ac MEROITIC CURSIVE LETTER LA -// 109ad MEROITIC CURSIVE LETTER KHA -// 109ae MEROITIC CURSIVE LETTER HHA -// 109af MEROITIC CURSIVE LETTER SA -// 109b0 MEROITIC CURSIVE LETTER ARCHAIC SA -// 109b1 MEROITIC CURSIVE LETTER SE -// 109b2 MEROITIC CURSIVE LETTER KA -// 109b3 MEROITIC CURSIVE LETTER QA -// 109b4 MEROITIC CURSIVE LETTER TA -// 109b5 MEROITIC CURSIVE LETTER TE -// 109b6 MEROITIC CURSIVE LETTER TO -// 109b7 MEROITIC CURSIVE LETTER DA - { 0x10980, 0x38, 0x9, 0, 0 }, -// 109be MEROITIC CURSIVE LOGOGRAM RMT -// 109bf MEROITIC CURSIVE LOGOGRAM IMN - { 0x109BE, 0x2, 0x9, 0, 0 }, -// 10a00 KHAROSHTHI LETTER A - { 0x10A00, 0x1, 0x9, 0, 0 }, -// 10a01 KHAROSHTHI VOWEL SIGN I -// 10a02 KHAROSHTHI VOWEL SIGN U -// 10a03 KHAROSHTHI VOWEL SIGN VOCALIC R - { 0x10A01, 0x3, 0x0, 0, 0 }, -// 10a05 KHAROSHTHI VOWEL SIGN E -// 10a06 KHAROSHTHI VOWEL SIGN O - { 0x10A05, 0x2, 0x0, 0, 0 }, -// 10a0c KHAROSHTHI VOWEL LENGTH MARK -// 10a0d KHAROSHTHI SIGN DOUBLE RING BELOW -// 10a0e KHAROSHTHI SIGN ANUSVARA -// 10a0f KHAROSHTHI SIGN VISARGA - { 0x10A0C, 0x4, 0x0, 0, 0 }, -// 10a10 KHAROSHTHI LETTER KA -// 10a11 KHAROSHTHI LETTER KHA -// 10a12 KHAROSHTHI LETTER GA -// 10a13 KHAROSHTHI LETTER GHA - { 0x10A10, 0x4, 0x9, 0, 0 }, -// 10a15 KHAROSHTHI LETTER CA -// 10a16 KHAROSHTHI LETTER CHA -// 10a17 KHAROSHTHI LETTER JA - { 0x10A15, 0x3, 0x9, 0, 0 }, -// 10a19 KHAROSHTHI LETTER NYA -// 10a1a KHAROSHTHI LETTER TTA -// 10a1b KHAROSHTHI LETTER TTHA -// 10a1c KHAROSHTHI LETTER DDA -// 10a1d KHAROSHTHI LETTER DDHA -// 10a1e KHAROSHTHI LETTER NNA -// 10a1f KHAROSHTHI LETTER TA -// 10a20 KHAROSHTHI LETTER THA -// 10a21 KHAROSHTHI LETTER DA -// 10a22 KHAROSHTHI LETTER DHA -// 10a23 KHAROSHTHI LETTER NA -// 10a24 KHAROSHTHI LETTER PA -// 10a25 KHAROSHTHI LETTER PHA -// 10a26 KHAROSHTHI LETTER BA -// 10a27 KHAROSHTHI LETTER BHA -// 10a28 KHAROSHTHI LETTER MA -// 10a29 KHAROSHTHI LETTER YA -// 10a2a KHAROSHTHI LETTER RA -// 10a2b KHAROSHTHI LETTER LA -// 10a2c KHAROSHTHI LETTER VA -// 10a2d KHAROSHTHI LETTER SHA -// 10a2e KHAROSHTHI LETTER SSA -// 10a2f KHAROSHTHI LETTER SA -// 10a30 KHAROSHTHI LETTER ZA -// 10a31 KHAROSHTHI LETTER HA -// 10a32 KHAROSHTHI LETTER KKA -// 10a33 KHAROSHTHI LETTER TTTHA - { 0x10A19, 0x1B, 0x9, 0, 0 }, -// 10a38 KHAROSHTHI SIGN BAR ABOVE -// 10a39 KHAROSHTHI SIGN CAUDA -// 10a3a KHAROSHTHI SIGN DOT BELOW - { 0x10A38, 0x3, 0x0, 0, 0 }, -// 10a3f KHAROSHTHI VIRAMA - { 0x10A3F, 0x1, 0x0, 0, 0 }, -// 10a40 KHAROSHTHI DIGIT ONE -// 10a41 KHAROSHTHI DIGIT TWO -// 10a42 KHAROSHTHI DIGIT THREE -// 10a43 KHAROSHTHI DIGIT FOUR -// 10a44 KHAROSHTHI NUMBER TEN -// 10a45 KHAROSHTHI NUMBER TWENTY -// 10a46 KHAROSHTHI NUMBER ONE HUNDRED -// 10a47 KHAROSHTHI NUMBER ONE THOUSAND - { 0x10A40, 0x8, 0x8, 0, 0 }, -// 10a50 KHAROSHTHI PUNCTUATION DOT -// 10a51 KHAROSHTHI PUNCTUATION SMALL CIRCLE -// 10a52 KHAROSHTHI PUNCTUATION CIRCLE -// 10a53 KHAROSHTHI PUNCTUATION CRESCENT BAR -// 10a54 KHAROSHTHI PUNCTUATION MANGALAM -// 10a55 KHAROSHTHI PUNCTUATION LOTUS -// 10a56 KHAROSHTHI PUNCTUATION DANDA -// 10a57 KHAROSHTHI PUNCTUATION DOUBLE DANDA -// 10a58 KHAROSHTHI PUNCTUATION LINES - { 0x10A50, 0x9, 0x18, 0, 0 }, -// 10a60 OLD SOUTH ARABIAN LETTER HE -// 10a61 OLD SOUTH ARABIAN LETTER LAMEDH -// 10a62 OLD SOUTH ARABIAN LETTER HETH -// 10a63 OLD SOUTH ARABIAN LETTER MEM -// 10a64 OLD SOUTH ARABIAN LETTER QOPH -// 10a65 OLD SOUTH ARABIAN LETTER WAW -// 10a66 OLD SOUTH ARABIAN LETTER SHIN -// 10a67 OLD SOUTH ARABIAN LETTER RESH -// 10a68 OLD SOUTH ARABIAN LETTER BETH -// 10a69 OLD SOUTH ARABIAN LETTER TAW -// 10a6a OLD SOUTH ARABIAN LETTER SAT -// 10a6b OLD SOUTH ARABIAN LETTER KAPH -// 10a6c OLD SOUTH ARABIAN LETTER NUN -// 10a6d OLD SOUTH ARABIAN LETTER KHETH -// 10a6e OLD SOUTH ARABIAN LETTER SADHE -// 10a6f OLD SOUTH ARABIAN LETTER SAMEKH -// 10a70 OLD SOUTH ARABIAN LETTER FE -// 10a71 OLD SOUTH ARABIAN LETTER ALEF -// 10a72 OLD SOUTH ARABIAN LETTER AYN -// 10a73 OLD SOUTH ARABIAN LETTER DHADHE -// 10a74 OLD SOUTH ARABIAN LETTER GIMEL -// 10a75 OLD SOUTH ARABIAN LETTER DALETH -// 10a76 OLD SOUTH ARABIAN LETTER GHAYN -// 10a77 OLD SOUTH ARABIAN LETTER TETH -// 10a78 OLD SOUTH ARABIAN LETTER ZAYN -// 10a79 OLD SOUTH ARABIAN LETTER DHALETH -// 10a7a OLD SOUTH ARABIAN LETTER YODH -// 10a7b OLD SOUTH ARABIAN LETTER THAW -// 10a7c OLD SOUTH ARABIAN LETTER THETH - { 0x10A60, 0x1D, 0x9, 0, 0 }, -// 10a7d OLD SOUTH ARABIAN NUMBER ONE -// 10a7e OLD SOUTH ARABIAN NUMBER FIFTY - { 0x10A7D, 0x2, 0x8, 0, 0 }, -// 10a7f OLD SOUTH ARABIAN NUMERIC INDICATOR - { 0x10A7F, 0x1, 0x18, 0, 0 }, -// 10a80 OLD NORTH ARABIAN LETTER HEH -// 10a81 OLD NORTH ARABIAN LETTER LAM -// 10a82 OLD NORTH ARABIAN LETTER HAH -// 10a83 OLD NORTH ARABIAN LETTER MEEM -// 10a84 OLD NORTH ARABIAN LETTER QAF -// 10a85 OLD NORTH ARABIAN LETTER WAW -// 10a86 OLD NORTH ARABIAN LETTER ES-2 -// 10a87 OLD NORTH ARABIAN LETTER REH -// 10a88 OLD NORTH ARABIAN LETTER BEH -// 10a89 OLD NORTH ARABIAN LETTER TEH -// 10a8a OLD NORTH ARABIAN LETTER ES-1 -// 10a8b OLD NORTH ARABIAN LETTER KAF -// 10a8c OLD NORTH ARABIAN LETTER NOON -// 10a8d OLD NORTH ARABIAN LETTER KHAH -// 10a8e OLD NORTH ARABIAN LETTER SAD -// 10a8f OLD NORTH ARABIAN LETTER ES-3 -// 10a90 OLD NORTH ARABIAN LETTER FEH -// 10a91 OLD NORTH ARABIAN LETTER ALEF -// 10a92 OLD NORTH ARABIAN LETTER AIN -// 10a93 OLD NORTH ARABIAN LETTER DAD -// 10a94 OLD NORTH ARABIAN LETTER GEEM -// 10a95 OLD NORTH ARABIAN LETTER DAL -// 10a96 OLD NORTH ARABIAN LETTER GHAIN -// 10a97 OLD NORTH ARABIAN LETTER TAH -// 10a98 OLD NORTH ARABIAN LETTER ZAIN -// 10a99 OLD NORTH ARABIAN LETTER THAL -// 10a9a OLD NORTH ARABIAN LETTER YEH -// 10a9b OLD NORTH ARABIAN LETTER THEH -// 10a9c OLD NORTH ARABIAN LETTER ZAH - { 0x10A80, 0x1D, 0x9, 0, 0 }, -// 10a9d OLD NORTH ARABIAN NUMBER ONE -// 10a9e OLD NORTH ARABIAN NUMBER TEN -// 10a9f OLD NORTH ARABIAN NUMBER TWENTY - { 0x10A9D, 0x3, 0x8, 0, 0 }, -// 10ac0 MANICHAEAN LETTER ALEPH -// 10ac1 MANICHAEAN LETTER BETH -// 10ac2 MANICHAEAN LETTER BHETH -// 10ac3 MANICHAEAN LETTER GIMEL -// 10ac4 MANICHAEAN LETTER GHIMEL -// 10ac5 MANICHAEAN LETTER DALETH -// 10ac6 MANICHAEAN LETTER HE -// 10ac7 MANICHAEAN LETTER WAW - { 0x10AC0, 0x8, 0x9, 0, 0 }, -// 10ac8 MANICHAEAN SIGN UD - { 0x10AC8, 0x1, 0x8, 0, 0 }, -// 10ac9 MANICHAEAN LETTER ZAYIN -// 10aca MANICHAEAN LETTER ZHAYIN -// 10acb MANICHAEAN LETTER JAYIN -// 10acc MANICHAEAN LETTER JHAYIN -// 10acd MANICHAEAN LETTER HETH -// 10ace MANICHAEAN LETTER TETH -// 10acf MANICHAEAN LETTER YODH -// 10ad0 MANICHAEAN LETTER KAPH -// 10ad1 MANICHAEAN LETTER XAPH -// 10ad2 MANICHAEAN LETTER KHAPH -// 10ad3 MANICHAEAN LETTER LAMEDH -// 10ad4 MANICHAEAN LETTER DHAMEDH -// 10ad5 MANICHAEAN LETTER THAMEDH -// 10ad6 MANICHAEAN LETTER MEM -// 10ad7 MANICHAEAN LETTER NUN -// 10ad8 MANICHAEAN LETTER SAMEKH -// 10ad9 MANICHAEAN LETTER AYIN -// 10ada MANICHAEAN LETTER AAYIN -// 10adb MANICHAEAN LETTER PE -// 10adc MANICHAEAN LETTER FE -// 10add MANICHAEAN LETTER SADHE -// 10ade MANICHAEAN LETTER QOPH -// 10adf MANICHAEAN LETTER XOPH -// 10ae0 MANICHAEAN LETTER QHOPH -// 10ae1 MANICHAEAN LETTER RESH -// 10ae2 MANICHAEAN LETTER SHIN -// 10ae3 MANICHAEAN LETTER SSHIN -// 10ae4 MANICHAEAN LETTER TAW - { 0x10AC9, 0x1C, 0x9, 0, 0 }, -// 10ae5 MANICHAEAN ABBREVIATION MARK ABOVE -// 10ae6 MANICHAEAN ABBREVIATION MARK BELOW - { 0x10AE5, 0x2, 0x0, 0, 0 }, -// 10aeb MANICHAEAN NUMBER ONE -// 10aec MANICHAEAN NUMBER FIVE -// 10aed MANICHAEAN NUMBER TEN -// 10aee MANICHAEAN NUMBER TWENTY -// 10aef MANICHAEAN NUMBER ONE HUNDRED - { 0x10AEB, 0x5, 0x8, 0, 0 }, -// 10af0 MANICHAEAN PUNCTUATION STAR -// 10af1 MANICHAEAN PUNCTUATION FLEURON -// 10af2 MANICHAEAN PUNCTUATION DOUBLE DOT WITHIN DOT -// 10af3 MANICHAEAN PUNCTUATION DOT WITHIN DOT -// 10af4 MANICHAEAN PUNCTUATION DOT -// 10af5 MANICHAEAN PUNCTUATION TWO DOTS -// 10af6 MANICHAEAN PUNCTUATION LINE FILLER - { 0x10AF0, 0x7, 0x18, 0, 0 }, -// 10b00 AVESTAN LETTER A -// 10b01 AVESTAN LETTER AA -// 10b02 AVESTAN LETTER AO -// 10b03 AVESTAN LETTER AAO -// 10b04 AVESTAN LETTER AN -// 10b05 AVESTAN LETTER AAN -// 10b06 AVESTAN LETTER AE -// 10b07 AVESTAN LETTER AEE -// 10b08 AVESTAN LETTER E -// 10b09 AVESTAN LETTER EE -// 10b0a AVESTAN LETTER O -// 10b0b AVESTAN LETTER OO -// 10b0c AVESTAN LETTER I -// 10b0d AVESTAN LETTER II -// 10b0e AVESTAN LETTER U -// 10b0f AVESTAN LETTER UU -// 10b10 AVESTAN LETTER KE -// 10b11 AVESTAN LETTER XE -// 10b12 AVESTAN LETTER XYE -// 10b13 AVESTAN LETTER XVE -// 10b14 AVESTAN LETTER GE -// 10b15 AVESTAN LETTER GGE -// 10b16 AVESTAN LETTER GHE -// 10b17 AVESTAN LETTER CE -// 10b18 AVESTAN LETTER JE -// 10b19 AVESTAN LETTER TE -// 10b1a AVESTAN LETTER THE -// 10b1b AVESTAN LETTER DE -// 10b1c AVESTAN LETTER DHE -// 10b1d AVESTAN LETTER TTE -// 10b1e AVESTAN LETTER PE -// 10b1f AVESTAN LETTER FE -// 10b20 AVESTAN LETTER BE -// 10b21 AVESTAN LETTER BHE -// 10b22 AVESTAN LETTER NGE -// 10b23 AVESTAN LETTER NGYE -// 10b24 AVESTAN LETTER NGVE -// 10b25 AVESTAN LETTER NE -// 10b26 AVESTAN LETTER NYE -// 10b27 AVESTAN LETTER NNE -// 10b28 AVESTAN LETTER ME -// 10b29 AVESTAN LETTER HME -// 10b2a AVESTAN LETTER YYE -// 10b2b AVESTAN LETTER YE -// 10b2c AVESTAN LETTER VE -// 10b2d AVESTAN LETTER RE -// 10b2e AVESTAN LETTER LE -// 10b2f AVESTAN LETTER SE -// 10b30 AVESTAN LETTER ZE -// 10b31 AVESTAN LETTER SHE -// 10b32 AVESTAN LETTER ZHE -// 10b33 AVESTAN LETTER SHYE -// 10b34 AVESTAN LETTER SSHE -// 10b35 AVESTAN LETTER HE - { 0x10B00, 0x36, 0x9, 0, 0 }, -// 10b39 AVESTAN ABBREVIATION MARK -// 10b3a TINY TWO DOTS OVER ONE DOT PUNCTUATION -// 10b3b SMALL TWO DOTS OVER ONE DOT PUNCTUATION -// 10b3c LARGE TWO DOTS OVER ONE DOT PUNCTUATION -// 10b3d LARGE ONE DOT OVER TWO DOTS PUNCTUATION -// 10b3e LARGE TWO RINGS OVER ONE RING PUNCTUATION -// 10b3f LARGE ONE RING OVER TWO RINGS PUNCTUATION - { 0x10B39, 0x7, 0x18, 0, 0 }, -// 10b40 INSCRIPTIONAL PARTHIAN LETTER ALEPH -// 10b41 INSCRIPTIONAL PARTHIAN LETTER BETH -// 10b42 INSCRIPTIONAL PARTHIAN LETTER GIMEL -// 10b43 INSCRIPTIONAL PARTHIAN LETTER DALETH -// 10b44 INSCRIPTIONAL PARTHIAN LETTER HE -// 10b45 INSCRIPTIONAL PARTHIAN LETTER WAW -// 10b46 INSCRIPTIONAL PARTHIAN LETTER ZAYIN -// 10b47 INSCRIPTIONAL PARTHIAN LETTER HETH -// 10b48 INSCRIPTIONAL PARTHIAN LETTER TETH -// 10b49 INSCRIPTIONAL PARTHIAN LETTER YODH -// 10b4a INSCRIPTIONAL PARTHIAN LETTER KAPH -// 10b4b INSCRIPTIONAL PARTHIAN LETTER LAMEDH -// 10b4c INSCRIPTIONAL PARTHIAN LETTER MEM -// 10b4d INSCRIPTIONAL PARTHIAN LETTER NUN -// 10b4e INSCRIPTIONAL PARTHIAN LETTER SAMEKH -// 10b4f INSCRIPTIONAL PARTHIAN LETTER AYIN -// 10b50 INSCRIPTIONAL PARTHIAN LETTER PE -// 10b51 INSCRIPTIONAL PARTHIAN LETTER SADHE -// 10b52 INSCRIPTIONAL PARTHIAN LETTER QOPH -// 10b53 INSCRIPTIONAL PARTHIAN LETTER RESH -// 10b54 INSCRIPTIONAL PARTHIAN LETTER SHIN -// 10b55 INSCRIPTIONAL PARTHIAN LETTER TAW - { 0x10B40, 0x16, 0x9, 0, 0 }, -// 10b58 INSCRIPTIONAL PARTHIAN NUMBER ONE -// 10b59 INSCRIPTIONAL PARTHIAN NUMBER TWO -// 10b5a INSCRIPTIONAL PARTHIAN NUMBER THREE -// 10b5b INSCRIPTIONAL PARTHIAN NUMBER FOUR -// 10b5c INSCRIPTIONAL PARTHIAN NUMBER TEN -// 10b5d INSCRIPTIONAL PARTHIAN NUMBER TWENTY -// 10b5e INSCRIPTIONAL PARTHIAN NUMBER ONE HUNDRED -// 10b5f INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND - { 0x10B58, 0x8, 0x8, 0, 0 }, -// 10b60 INSCRIPTIONAL PAHLAVI LETTER ALEPH -// 10b61 INSCRIPTIONAL PAHLAVI LETTER BETH -// 10b62 INSCRIPTIONAL PAHLAVI LETTER GIMEL -// 10b63 INSCRIPTIONAL PAHLAVI LETTER DALETH -// 10b64 INSCRIPTIONAL PAHLAVI LETTER HE -// 10b65 INSCRIPTIONAL PAHLAVI LETTER WAW-AYIN-RESH -// 10b66 INSCRIPTIONAL PAHLAVI LETTER ZAYIN -// 10b67 INSCRIPTIONAL PAHLAVI LETTER HETH -// 10b68 INSCRIPTIONAL PAHLAVI LETTER TETH -// 10b69 INSCRIPTIONAL PAHLAVI LETTER YODH -// 10b6a INSCRIPTIONAL PAHLAVI LETTER KAPH -// 10b6b INSCRIPTIONAL PAHLAVI LETTER LAMEDH -// 10b6c INSCRIPTIONAL PAHLAVI LETTER MEM-QOPH -// 10b6d INSCRIPTIONAL PAHLAVI LETTER NUN -// 10b6e INSCRIPTIONAL PAHLAVI LETTER SAMEKH -// 10b6f INSCRIPTIONAL PAHLAVI LETTER PE -// 10b70 INSCRIPTIONAL PAHLAVI LETTER SADHE -// 10b71 INSCRIPTIONAL PAHLAVI LETTER SHIN -// 10b72 INSCRIPTIONAL PAHLAVI LETTER TAW - { 0x10B60, 0x13, 0x9, 0, 0 }, -// 10b78 INSCRIPTIONAL PAHLAVI NUMBER ONE -// 10b79 INSCRIPTIONAL PAHLAVI NUMBER TWO -// 10b7a INSCRIPTIONAL PAHLAVI NUMBER THREE -// 10b7b INSCRIPTIONAL PAHLAVI NUMBER FOUR -// 10b7c INSCRIPTIONAL PAHLAVI NUMBER TEN -// 10b7d INSCRIPTIONAL PAHLAVI NUMBER TWENTY -// 10b7e INSCRIPTIONAL PAHLAVI NUMBER ONE HUNDRED -// 10b7f INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND - { 0x10B78, 0x8, 0x8, 0, 0 }, -// 10b80 PSALTER PAHLAVI LETTER ALEPH -// 10b81 PSALTER PAHLAVI LETTER BETH -// 10b82 PSALTER PAHLAVI LETTER GIMEL -// 10b83 PSALTER PAHLAVI LETTER DALETH -// 10b84 PSALTER PAHLAVI LETTER HE -// 10b85 PSALTER PAHLAVI LETTER WAW-AYIN-RESH -// 10b86 PSALTER PAHLAVI LETTER ZAYIN -// 10b87 PSALTER PAHLAVI LETTER HETH -// 10b88 PSALTER PAHLAVI LETTER YODH -// 10b89 PSALTER PAHLAVI LETTER KAPH -// 10b8a PSALTER PAHLAVI LETTER LAMEDH -// 10b8b PSALTER PAHLAVI LETTER MEM-QOPH -// 10b8c PSALTER PAHLAVI LETTER NUN -// 10b8d PSALTER PAHLAVI LETTER SAMEKH -// 10b8e PSALTER PAHLAVI LETTER PE -// 10b8f PSALTER PAHLAVI LETTER SADHE -// 10b90 PSALTER PAHLAVI LETTER SHIN -// 10b91 PSALTER PAHLAVI LETTER TAW - { 0x10B80, 0x12, 0x9, 0, 0 }, -// 10b99 PSALTER PAHLAVI SECTION MARK -// 10b9a PSALTER PAHLAVI TURNED SECTION MARK -// 10b9b PSALTER PAHLAVI FOUR DOTS WITH CROSS -// 10b9c PSALTER PAHLAVI FOUR DOTS WITH DOT - { 0x10B99, 0x4, 0x18, 0, 0 }, -// 10ba9 PSALTER PAHLAVI NUMBER ONE -// 10baa PSALTER PAHLAVI NUMBER TWO -// 10bab PSALTER PAHLAVI NUMBER THREE -// 10bac PSALTER PAHLAVI NUMBER FOUR -// 10bad PSALTER PAHLAVI NUMBER TEN -// 10bae PSALTER PAHLAVI NUMBER TWENTY -// 10baf PSALTER PAHLAVI NUMBER ONE HUNDRED - { 0x10BA9, 0x7, 0x8, 0, 0 }, -// 10c00 OLD TURKIC LETTER ORKHON A -// 10c01 OLD TURKIC LETTER YENISEI A -// 10c02 OLD TURKIC LETTER YENISEI AE -// 10c03 OLD TURKIC LETTER ORKHON I -// 10c04 OLD TURKIC LETTER YENISEI I -// 10c05 OLD TURKIC LETTER YENISEI E -// 10c06 OLD TURKIC LETTER ORKHON O -// 10c07 OLD TURKIC LETTER ORKHON OE -// 10c08 OLD TURKIC LETTER YENISEI OE -// 10c09 OLD TURKIC LETTER ORKHON AB -// 10c0a OLD TURKIC LETTER YENISEI AB -// 10c0b OLD TURKIC LETTER ORKHON AEB -// 10c0c OLD TURKIC LETTER YENISEI AEB -// 10c0d OLD TURKIC LETTER ORKHON AG -// 10c0e OLD TURKIC LETTER YENISEI AG -// 10c0f OLD TURKIC LETTER ORKHON AEG -// 10c10 OLD TURKIC LETTER YENISEI AEG -// 10c11 OLD TURKIC LETTER ORKHON AD -// 10c12 OLD TURKIC LETTER YENISEI AD -// 10c13 OLD TURKIC LETTER ORKHON AED -// 10c14 OLD TURKIC LETTER ORKHON EZ -// 10c15 OLD TURKIC LETTER YENISEI EZ -// 10c16 OLD TURKIC LETTER ORKHON AY -// 10c17 OLD TURKIC LETTER YENISEI AY -// 10c18 OLD TURKIC LETTER ORKHON AEY -// 10c19 OLD TURKIC LETTER YENISEI AEY -// 10c1a OLD TURKIC LETTER ORKHON AEK -// 10c1b OLD TURKIC LETTER YENISEI AEK -// 10c1c OLD TURKIC LETTER ORKHON OEK -// 10c1d OLD TURKIC LETTER YENISEI OEK -// 10c1e OLD TURKIC LETTER ORKHON AL -// 10c1f OLD TURKIC LETTER YENISEI AL -// 10c20 OLD TURKIC LETTER ORKHON AEL -// 10c21 OLD TURKIC LETTER ORKHON ELT -// 10c22 OLD TURKIC LETTER ORKHON EM -// 10c23 OLD TURKIC LETTER ORKHON AN -// 10c24 OLD TURKIC LETTER ORKHON AEN -// 10c25 OLD TURKIC LETTER YENISEI AEN -// 10c26 OLD TURKIC LETTER ORKHON ENT -// 10c27 OLD TURKIC LETTER YENISEI ENT -// 10c28 OLD TURKIC LETTER ORKHON ENC -// 10c29 OLD TURKIC LETTER YENISEI ENC -// 10c2a OLD TURKIC LETTER ORKHON ENY -// 10c2b OLD TURKIC LETTER YENISEI ENY -// 10c2c OLD TURKIC LETTER YENISEI ANG -// 10c2d OLD TURKIC LETTER ORKHON ENG -// 10c2e OLD TURKIC LETTER YENISEI AENG -// 10c2f OLD TURKIC LETTER ORKHON EP -// 10c30 OLD TURKIC LETTER ORKHON OP -// 10c31 OLD TURKIC LETTER ORKHON IC -// 10c32 OLD TURKIC LETTER ORKHON EC -// 10c33 OLD TURKIC LETTER YENISEI EC -// 10c34 OLD TURKIC LETTER ORKHON AQ -// 10c35 OLD TURKIC LETTER YENISEI AQ -// 10c36 OLD TURKIC LETTER ORKHON IQ -// 10c37 OLD TURKIC LETTER YENISEI IQ -// 10c38 OLD TURKIC LETTER ORKHON OQ -// 10c39 OLD TURKIC LETTER YENISEI OQ -// 10c3a OLD TURKIC LETTER ORKHON AR -// 10c3b OLD TURKIC LETTER YENISEI AR -// 10c3c OLD TURKIC LETTER ORKHON AER -// 10c3d OLD TURKIC LETTER ORKHON AS -// 10c3e OLD TURKIC LETTER ORKHON AES -// 10c3f OLD TURKIC LETTER ORKHON ASH -// 10c40 OLD TURKIC LETTER YENISEI ASH -// 10c41 OLD TURKIC LETTER ORKHON ESH -// 10c42 OLD TURKIC LETTER YENISEI ESH -// 10c43 OLD TURKIC LETTER ORKHON AT -// 10c44 OLD TURKIC LETTER YENISEI AT -// 10c45 OLD TURKIC LETTER ORKHON AET -// 10c46 OLD TURKIC LETTER YENISEI AET -// 10c47 OLD TURKIC LETTER ORKHON OT -// 10c48 OLD TURKIC LETTER ORKHON BASH - { 0x10C00, 0x49, 0x9, 0, 0 }, -// 10e60 RUMI DIGIT ONE -// 10e61 RUMI DIGIT TWO -// 10e62 RUMI DIGIT THREE -// 10e63 RUMI DIGIT FOUR -// 10e64 RUMI DIGIT FIVE -// 10e65 RUMI DIGIT SIX -// 10e66 RUMI DIGIT SEVEN -// 10e67 RUMI DIGIT EIGHT -// 10e68 RUMI DIGIT NINE -// 10e69 RUMI NUMBER TEN -// 10e6a RUMI NUMBER TWENTY -// 10e6b RUMI NUMBER THIRTY -// 10e6c RUMI NUMBER FORTY -// 10e6d RUMI NUMBER FIFTY -// 10e6e RUMI NUMBER SIXTY -// 10e6f RUMI NUMBER SEVENTY -// 10e70 RUMI NUMBER EIGHTY -// 10e71 RUMI NUMBER NINETY -// 10e72 RUMI NUMBER ONE HUNDRED -// 10e73 RUMI NUMBER TWO HUNDRED -// 10e74 RUMI NUMBER THREE HUNDRED -// 10e75 RUMI NUMBER FOUR HUNDRED -// 10e76 RUMI NUMBER FIVE HUNDRED -// 10e77 RUMI NUMBER SIX HUNDRED -// 10e78 RUMI NUMBER SEVEN HUNDRED -// 10e79 RUMI NUMBER EIGHT HUNDRED -// 10e7a RUMI NUMBER NINE HUNDRED -// 10e7b RUMI FRACTION ONE HALF -// 10e7c RUMI FRACTION ONE QUARTER -// 10e7d RUMI FRACTION ONE THIRD -// 10e7e RUMI FRACTION TWO THIRDS - { 0x10E60, 0x1F, 0x8, 0, 0 }, -// 11000 BRAHMI SIGN CANDRABINDU -// 11001 BRAHMI SIGN ANUSVARA -// 11002 BRAHMI SIGN VISARGA - { 0x11000, 0x3, 0x0, 0, 0 }, -// 11003 BRAHMI SIGN JIHVAMULIYA -// 11004 BRAHMI SIGN UPADHMANIYA -// 11005 BRAHMI LETTER A -// 11006 BRAHMI LETTER AA -// 11007 BRAHMI LETTER I -// 11008 BRAHMI LETTER II -// 11009 BRAHMI LETTER U -// 1100a BRAHMI LETTER UU -// 1100b BRAHMI LETTER VOCALIC R -// 1100c BRAHMI LETTER VOCALIC RR -// 1100d BRAHMI LETTER VOCALIC L -// 1100e BRAHMI LETTER VOCALIC LL -// 1100f BRAHMI LETTER E -// 11010 BRAHMI LETTER AI -// 11011 BRAHMI LETTER O -// 11012 BRAHMI LETTER AU -// 11013 BRAHMI LETTER KA -// 11014 BRAHMI LETTER KHA -// 11015 BRAHMI LETTER GA -// 11016 BRAHMI LETTER GHA -// 11017 BRAHMI LETTER NGA -// 11018 BRAHMI LETTER CA -// 11019 BRAHMI LETTER CHA -// 1101a BRAHMI LETTER JA -// 1101b BRAHMI LETTER JHA -// 1101c BRAHMI LETTER NYA -// 1101d BRAHMI LETTER TTA -// 1101e BRAHMI LETTER TTHA -// 1101f BRAHMI LETTER DDA -// 11020 BRAHMI LETTER DDHA -// 11021 BRAHMI LETTER NNA -// 11022 BRAHMI LETTER TA -// 11023 BRAHMI LETTER THA -// 11024 BRAHMI LETTER DA -// 11025 BRAHMI LETTER DHA -// 11026 BRAHMI LETTER NA -// 11027 BRAHMI LETTER PA -// 11028 BRAHMI LETTER PHA -// 11029 BRAHMI LETTER BA -// 1102a BRAHMI LETTER BHA -// 1102b BRAHMI LETTER MA -// 1102c BRAHMI LETTER YA -// 1102d BRAHMI LETTER RA -// 1102e BRAHMI LETTER LA -// 1102f BRAHMI LETTER VA -// 11030 BRAHMI LETTER SHA -// 11031 BRAHMI LETTER SSA -// 11032 BRAHMI LETTER SA -// 11033 BRAHMI LETTER HA -// 11034 BRAHMI LETTER LLA -// 11035 BRAHMI LETTER OLD TAMIL LLLA -// 11036 BRAHMI LETTER OLD TAMIL RRA -// 11037 BRAHMI LETTER OLD TAMIL NNNA - { 0x11003, 0x35, 0x9, 0, 0 }, -// 11038 BRAHMI VOWEL SIGN AA -// 11039 BRAHMI VOWEL SIGN BHATTIPROLU AA -// 1103a BRAHMI VOWEL SIGN I -// 1103b BRAHMI VOWEL SIGN II -// 1103c BRAHMI VOWEL SIGN U -// 1103d BRAHMI VOWEL SIGN UU -// 1103e BRAHMI VOWEL SIGN VOCALIC R -// 1103f BRAHMI VOWEL SIGN VOCALIC RR -// 11040 BRAHMI VOWEL SIGN VOCALIC L -// 11041 BRAHMI VOWEL SIGN VOCALIC LL -// 11042 BRAHMI VOWEL SIGN E -// 11043 BRAHMI VOWEL SIGN AI -// 11044 BRAHMI VOWEL SIGN O -// 11045 BRAHMI VOWEL SIGN AU -// 11046 BRAHMI VIRAMA - { 0x11038, 0xF, 0x0, 0, 0 }, -// 11047 BRAHMI DANDA -// 11048 BRAHMI DOUBLE DANDA -// 11049 BRAHMI PUNCTUATION DOT -// 1104a BRAHMI PUNCTUATION DOUBLE DOT -// 1104b BRAHMI PUNCTUATION LINE -// 1104c BRAHMI PUNCTUATION CRESCENT BAR -// 1104d BRAHMI PUNCTUATION LOTUS - { 0x11047, 0x7, 0x18, 0, 0 }, -// 11052 BRAHMI NUMBER ONE -// 11053 BRAHMI NUMBER TWO -// 11054 BRAHMI NUMBER THREE -// 11055 BRAHMI NUMBER FOUR -// 11056 BRAHMI NUMBER FIVE -// 11057 BRAHMI NUMBER SIX -// 11058 BRAHMI NUMBER SEVEN -// 11059 BRAHMI NUMBER EIGHT -// 1105a BRAHMI NUMBER NINE -// 1105b BRAHMI NUMBER TEN -// 1105c BRAHMI NUMBER TWENTY -// 1105d BRAHMI NUMBER THIRTY -// 1105e BRAHMI NUMBER FORTY -// 1105f BRAHMI NUMBER FIFTY -// 11060 BRAHMI NUMBER SIXTY -// 11061 BRAHMI NUMBER SEVENTY -// 11062 BRAHMI NUMBER EIGHTY -// 11063 BRAHMI NUMBER NINETY -// 11064 BRAHMI NUMBER ONE HUNDRED -// 11065 BRAHMI NUMBER ONE THOUSAND - { 0x11052, 0x14, 0x8, 0, 0 }, -// 11066 BRAHMI DIGIT ZERO -// 11067 BRAHMI DIGIT ONE -// 11068 BRAHMI DIGIT TWO -// 11069 BRAHMI DIGIT THREE -// 1106a BRAHMI DIGIT FOUR -// 1106b BRAHMI DIGIT FIVE -// 1106c BRAHMI DIGIT SIX -// 1106d BRAHMI DIGIT SEVEN -// 1106e BRAHMI DIGIT EIGHT -// 1106f BRAHMI DIGIT NINE - { 0x11066, 0xA, 0x108, 0, 0 }, -// 1107f BRAHMI NUMBER JOINER -// 11080 KAITHI SIGN CANDRABINDU -// 11081 KAITHI SIGN ANUSVARA -// 11082 KAITHI SIGN VISARGA - { 0x1107F, 0x4, 0x0, 0, 0 }, -// 11083 KAITHI LETTER A -// 11084 KAITHI LETTER AA -// 11085 KAITHI LETTER I -// 11086 KAITHI LETTER II -// 11087 KAITHI LETTER U -// 11088 KAITHI LETTER UU -// 11089 KAITHI LETTER E -// 1108a KAITHI LETTER AI -// 1108b KAITHI LETTER O -// 1108c KAITHI LETTER AU -// 1108d KAITHI LETTER KA -// 1108e KAITHI LETTER KHA -// 1108f KAITHI LETTER GA -// 11090 KAITHI LETTER GHA -// 11091 KAITHI LETTER NGA -// 11092 KAITHI LETTER CA -// 11093 KAITHI LETTER CHA -// 11094 KAITHI LETTER JA -// 11095 KAITHI LETTER JHA -// 11096 KAITHI LETTER NYA -// 11097 KAITHI LETTER TTA -// 11098 KAITHI LETTER TTHA -// 11099 KAITHI LETTER DDA -// 1109a KAITHI LETTER DDDHA -// 1109b KAITHI LETTER DDHA -// 1109c KAITHI LETTER RHA -// 1109d KAITHI LETTER NNA -// 1109e KAITHI LETTER TA -// 1109f KAITHI LETTER THA -// 110a0 KAITHI LETTER DA -// 110a1 KAITHI LETTER DHA -// 110a2 KAITHI LETTER NA -// 110a3 KAITHI LETTER PA -// 110a4 KAITHI LETTER PHA -// 110a5 KAITHI LETTER BA -// 110a6 KAITHI LETTER BHA -// 110a7 KAITHI LETTER MA -// 110a8 KAITHI LETTER YA -// 110a9 KAITHI LETTER RA -// 110aa KAITHI LETTER LA -// 110ab KAITHI LETTER VA -// 110ac KAITHI LETTER SHA -// 110ad KAITHI LETTER SSA -// 110ae KAITHI LETTER SA -// 110af KAITHI LETTER HA - { 0x11083, 0x2D, 0x9, 0, 0 }, -// 110b0 KAITHI VOWEL SIGN AA -// 110b1 KAITHI VOWEL SIGN I -// 110b2 KAITHI VOWEL SIGN II -// 110b3 KAITHI VOWEL SIGN U -// 110b4 KAITHI VOWEL SIGN UU -// 110b5 KAITHI VOWEL SIGN E -// 110b6 KAITHI VOWEL SIGN AI -// 110b7 KAITHI VOWEL SIGN O -// 110b8 KAITHI VOWEL SIGN AU -// 110b9 KAITHI SIGN VIRAMA -// 110ba KAITHI SIGN NUKTA - { 0x110B0, 0xB, 0x0, 0, 0 }, -// 110bb KAITHI ABBREVIATION SIGN -// 110bc KAITHI ENUMERATION SIGN - { 0x110BB, 0x2, 0x18, 0, 0 }, -// 110bd KAITHI NUMBER SIGN - { 0x110BD, 0x1, 0x0, 0, 0 }, -// 110be KAITHI SECTION MARK -// 110bf KAITHI DOUBLE SECTION MARK -// 110c0 KAITHI DANDA -// 110c1 KAITHI DOUBLE DANDA - { 0x110BE, 0x4, 0x18, 0, 0 }, -// 110d0 SORA SOMPENG LETTER SAH -// 110d1 SORA SOMPENG LETTER TAH -// 110d2 SORA SOMPENG LETTER BAH -// 110d3 SORA SOMPENG LETTER CAH -// 110d4 SORA SOMPENG LETTER DAH -// 110d5 SORA SOMPENG LETTER GAH -// 110d6 SORA SOMPENG LETTER MAH -// 110d7 SORA SOMPENG LETTER NGAH -// 110d8 SORA SOMPENG LETTER LAH -// 110d9 SORA SOMPENG LETTER NAH -// 110da SORA SOMPENG LETTER VAH -// 110db SORA SOMPENG LETTER PAH -// 110dc SORA SOMPENG LETTER YAH -// 110dd SORA SOMPENG LETTER RAH -// 110de SORA SOMPENG LETTER HAH -// 110df SORA SOMPENG LETTER KAH -// 110e0 SORA SOMPENG LETTER JAH -// 110e1 SORA SOMPENG LETTER NYAH -// 110e2 SORA SOMPENG LETTER AH -// 110e3 SORA SOMPENG LETTER EEH -// 110e4 SORA SOMPENG LETTER IH -// 110e5 SORA SOMPENG LETTER UH -// 110e6 SORA SOMPENG LETTER OH -// 110e7 SORA SOMPENG LETTER EH -// 110e8 SORA SOMPENG LETTER MAE - { 0x110D0, 0x19, 0x9, 0, 0 }, -// 110f0 SORA SOMPENG DIGIT ZERO -// 110f1 SORA SOMPENG DIGIT ONE -// 110f2 SORA SOMPENG DIGIT TWO -// 110f3 SORA SOMPENG DIGIT THREE -// 110f4 SORA SOMPENG DIGIT FOUR -// 110f5 SORA SOMPENG DIGIT FIVE -// 110f6 SORA SOMPENG DIGIT SIX -// 110f7 SORA SOMPENG DIGIT SEVEN -// 110f8 SORA SOMPENG DIGIT EIGHT -// 110f9 SORA SOMPENG DIGIT NINE - { 0x110F0, 0xA, 0x108, 0, 0 }, -// 11100 CHAKMA SIGN CANDRABINDU -// 11101 CHAKMA SIGN ANUSVARA -// 11102 CHAKMA SIGN VISARGA - { 0x11100, 0x3, 0x0, 0, 0 }, -// 11103 CHAKMA LETTER AA -// 11104 CHAKMA LETTER I -// 11105 CHAKMA LETTER U -// 11106 CHAKMA LETTER E -// 11107 CHAKMA LETTER KAA -// 11108 CHAKMA LETTER KHAA -// 11109 CHAKMA LETTER GAA -// 1110a CHAKMA LETTER GHAA -// 1110b CHAKMA LETTER NGAA -// 1110c CHAKMA LETTER CAA -// 1110d CHAKMA LETTER CHAA -// 1110e CHAKMA LETTER JAA -// 1110f CHAKMA LETTER JHAA -// 11110 CHAKMA LETTER NYAA -// 11111 CHAKMA LETTER TTAA -// 11112 CHAKMA LETTER TTHAA -// 11113 CHAKMA LETTER DDAA -// 11114 CHAKMA LETTER DDHAA -// 11115 CHAKMA LETTER NNAA -// 11116 CHAKMA LETTER TAA -// 11117 CHAKMA LETTER THAA -// 11118 CHAKMA LETTER DAA -// 11119 CHAKMA LETTER DHAA -// 1111a CHAKMA LETTER NAA -// 1111b CHAKMA LETTER PAA -// 1111c CHAKMA LETTER PHAA -// 1111d CHAKMA LETTER BAA -// 1111e CHAKMA LETTER BHAA -// 1111f CHAKMA LETTER MAA -// 11120 CHAKMA LETTER YYAA -// 11121 CHAKMA LETTER YAA -// 11122 CHAKMA LETTER RAA -// 11123 CHAKMA LETTER LAA -// 11124 CHAKMA LETTER WAA -// 11125 CHAKMA LETTER SAA -// 11126 CHAKMA LETTER HAA - { 0x11103, 0x24, 0x9, 0, 0 }, -// 11127 CHAKMA VOWEL SIGN A -// 11128 CHAKMA VOWEL SIGN I -// 11129 CHAKMA VOWEL SIGN II -// 1112a CHAKMA VOWEL SIGN U -// 1112b CHAKMA VOWEL SIGN UU -// 1112c CHAKMA VOWEL SIGN E -// 1112d CHAKMA VOWEL SIGN AI -// 1112e CHAKMA VOWEL SIGN O -// 1112f CHAKMA VOWEL SIGN AU -// 11130 CHAKMA VOWEL SIGN OI -// 11131 CHAKMA O MARK -// 11132 CHAKMA AU MARK -// 11133 CHAKMA VIRAMA -// 11134 CHAKMA MAAYYAA - { 0x11127, 0xE, 0x0, 0, 0 }, -// 11136 CHAKMA DIGIT ZERO -// 11137 CHAKMA DIGIT ONE -// 11138 CHAKMA DIGIT TWO -// 11139 CHAKMA DIGIT THREE -// 1113a CHAKMA DIGIT FOUR -// 1113b CHAKMA DIGIT FIVE -// 1113c CHAKMA DIGIT SIX -// 1113d CHAKMA DIGIT SEVEN -// 1113e CHAKMA DIGIT EIGHT -// 1113f CHAKMA DIGIT NINE - { 0x11136, 0xA, 0x108, 0, 0 }, -// 11140 CHAKMA SECTION MARK -// 11141 CHAKMA DANDA -// 11142 CHAKMA DOUBLE DANDA -// 11143 CHAKMA QUESTION MARK - { 0x11140, 0x4, 0x18, 0, 0 }, -// 11150 MAHAJANI LETTER A -// 11151 MAHAJANI LETTER I -// 11152 MAHAJANI LETTER U -// 11153 MAHAJANI LETTER E -// 11154 MAHAJANI LETTER O -// 11155 MAHAJANI LETTER KA -// 11156 MAHAJANI LETTER KHA -// 11157 MAHAJANI LETTER GA -// 11158 MAHAJANI LETTER GHA -// 11159 MAHAJANI LETTER CA -// 1115a MAHAJANI LETTER CHA -// 1115b MAHAJANI LETTER JA -// 1115c MAHAJANI LETTER JHA -// 1115d MAHAJANI LETTER NYA -// 1115e MAHAJANI LETTER TTA -// 1115f MAHAJANI LETTER TTHA -// 11160 MAHAJANI LETTER DDA -// 11161 MAHAJANI LETTER DDHA -// 11162 MAHAJANI LETTER NNA -// 11163 MAHAJANI LETTER TA -// 11164 MAHAJANI LETTER THA -// 11165 MAHAJANI LETTER DA -// 11166 MAHAJANI LETTER DHA -// 11167 MAHAJANI LETTER NA -// 11168 MAHAJANI LETTER PA -// 11169 MAHAJANI LETTER PHA -// 1116a MAHAJANI LETTER BA -// 1116b MAHAJANI LETTER BHA -// 1116c MAHAJANI LETTER MA -// 1116d MAHAJANI LETTER RA -// 1116e MAHAJANI LETTER LA -// 1116f MAHAJANI LETTER VA -// 11170 MAHAJANI LETTER SA -// 11171 MAHAJANI LETTER HA -// 11172 MAHAJANI LETTER RRA - { 0x11150, 0x23, 0x9, 0, 0 }, -// 11173 MAHAJANI SIGN NUKTA - { 0x11173, 0x1, 0x0, 0, 0 }, -// 11174 MAHAJANI ABBREVIATION SIGN -// 11175 MAHAJANI SECTION MARK - { 0x11174, 0x2, 0x18, 0, 0 }, -// 11176 MAHAJANI LIGATURE SHRI - { 0x11176, 0x1, 0x9, 0, 0 }, -// 11180 SHARADA SIGN CANDRABINDU -// 11181 SHARADA SIGN ANUSVARA -// 11182 SHARADA SIGN VISARGA - { 0x11180, 0x3, 0x0, 0, 0 }, -// 11183 SHARADA LETTER A -// 11184 SHARADA LETTER AA -// 11185 SHARADA LETTER I -// 11186 SHARADA LETTER II -// 11187 SHARADA LETTER U -// 11188 SHARADA LETTER UU -// 11189 SHARADA LETTER VOCALIC R -// 1118a SHARADA LETTER VOCALIC RR -// 1118b SHARADA LETTER VOCALIC L -// 1118c SHARADA LETTER VOCALIC LL -// 1118d SHARADA LETTER E -// 1118e SHARADA LETTER AI -// 1118f SHARADA LETTER O -// 11190 SHARADA LETTER AU -// 11191 SHARADA LETTER KA -// 11192 SHARADA LETTER KHA -// 11193 SHARADA LETTER GA -// 11194 SHARADA LETTER GHA -// 11195 SHARADA LETTER NGA -// 11196 SHARADA LETTER CA -// 11197 SHARADA LETTER CHA -// 11198 SHARADA LETTER JA -// 11199 SHARADA LETTER JHA -// 1119a SHARADA LETTER NYA -// 1119b SHARADA LETTER TTA -// 1119c SHARADA LETTER TTHA -// 1119d SHARADA LETTER DDA -// 1119e SHARADA LETTER DDHA -// 1119f SHARADA LETTER NNA -// 111a0 SHARADA LETTER TA -// 111a1 SHARADA LETTER THA -// 111a2 SHARADA LETTER DA -// 111a3 SHARADA LETTER DHA -// 111a4 SHARADA LETTER NA -// 111a5 SHARADA LETTER PA -// 111a6 SHARADA LETTER PHA -// 111a7 SHARADA LETTER BA -// 111a8 SHARADA LETTER BHA -// 111a9 SHARADA LETTER MA -// 111aa SHARADA LETTER YA -// 111ab SHARADA LETTER RA -// 111ac SHARADA LETTER LA -// 111ad SHARADA LETTER LLA -// 111ae SHARADA LETTER VA -// 111af SHARADA LETTER SHA -// 111b0 SHARADA LETTER SSA -// 111b1 SHARADA LETTER SA -// 111b2 SHARADA LETTER HA - { 0x11183, 0x30, 0x9, 0, 0 }, -// 111b3 SHARADA VOWEL SIGN AA -// 111b4 SHARADA VOWEL SIGN I -// 111b5 SHARADA VOWEL SIGN II -// 111b6 SHARADA VOWEL SIGN U -// 111b7 SHARADA VOWEL SIGN UU -// 111b8 SHARADA VOWEL SIGN VOCALIC R -// 111b9 SHARADA VOWEL SIGN VOCALIC RR -// 111ba SHARADA VOWEL SIGN VOCALIC L -// 111bb SHARADA VOWEL SIGN VOCALIC LL -// 111bc SHARADA VOWEL SIGN E -// 111bd SHARADA VOWEL SIGN AI -// 111be SHARADA VOWEL SIGN O -// 111bf SHARADA VOWEL SIGN AU -// 111c0 SHARADA SIGN VIRAMA - { 0x111B3, 0xE, 0x0, 0, 0 }, -// 111c1 SHARADA SIGN AVAGRAHA -// 111c2 SHARADA SIGN JIHVAMULIYA -// 111c3 SHARADA SIGN UPADHMANIYA -// 111c4 SHARADA OM - { 0x111C1, 0x4, 0x9, 0, 0 }, -// 111c5 SHARADA DANDA -// 111c6 SHARADA DOUBLE DANDA -// 111c7 SHARADA ABBREVIATION SIGN -// 111c8 SHARADA SEPARATOR - { 0x111C5, 0x4, 0x18, 0, 0 }, -// 111cd SHARADA SUTRA MARK - { 0x111CD, 0x1, 0x18, 0, 0 }, -// 111d0 SHARADA DIGIT ZERO -// 111d1 SHARADA DIGIT ONE -// 111d2 SHARADA DIGIT TWO -// 111d3 SHARADA DIGIT THREE -// 111d4 SHARADA DIGIT FOUR -// 111d5 SHARADA DIGIT FIVE -// 111d6 SHARADA DIGIT SIX -// 111d7 SHARADA DIGIT SEVEN -// 111d8 SHARADA DIGIT EIGHT -// 111d9 SHARADA DIGIT NINE - { 0x111D0, 0xA, 0x108, 0, 0 }, -// 111da SHARADA EKAM - { 0x111DA, 0x1, 0x9, 0, 0 }, -// 111e1 SINHALA ARCHAIC DIGIT ONE -// 111e2 SINHALA ARCHAIC DIGIT TWO -// 111e3 SINHALA ARCHAIC DIGIT THREE -// 111e4 SINHALA ARCHAIC DIGIT FOUR -// 111e5 SINHALA ARCHAIC DIGIT FIVE -// 111e6 SINHALA ARCHAIC DIGIT SIX -// 111e7 SINHALA ARCHAIC DIGIT SEVEN -// 111e8 SINHALA ARCHAIC DIGIT EIGHT -// 111e9 SINHALA ARCHAIC DIGIT NINE -// 111ea SINHALA ARCHAIC NUMBER TEN -// 111eb SINHALA ARCHAIC NUMBER TWENTY -// 111ec SINHALA ARCHAIC NUMBER THIRTY -// 111ed SINHALA ARCHAIC NUMBER FORTY -// 111ee SINHALA ARCHAIC NUMBER FIFTY -// 111ef SINHALA ARCHAIC NUMBER SIXTY -// 111f0 SINHALA ARCHAIC NUMBER SEVENTY -// 111f1 SINHALA ARCHAIC NUMBER EIGHTY -// 111f2 SINHALA ARCHAIC NUMBER NINETY -// 111f3 SINHALA ARCHAIC NUMBER ONE HUNDRED -// 111f4 SINHALA ARCHAIC NUMBER ONE THOUSAND - { 0x111E1, 0x14, 0x8, 0, 0 }, -// 11200 KHOJKI LETTER A -// 11201 KHOJKI LETTER AA -// 11202 KHOJKI LETTER I -// 11203 KHOJKI LETTER U -// 11204 KHOJKI LETTER E -// 11205 KHOJKI LETTER AI -// 11206 KHOJKI LETTER O -// 11207 KHOJKI LETTER AU -// 11208 KHOJKI LETTER KA -// 11209 KHOJKI LETTER KHA -// 1120a KHOJKI LETTER GA -// 1120b KHOJKI LETTER GGA -// 1120c KHOJKI LETTER GHA -// 1120d KHOJKI LETTER NGA -// 1120e KHOJKI LETTER CA -// 1120f KHOJKI LETTER CHA -// 11210 KHOJKI LETTER JA -// 11211 KHOJKI LETTER JJA - { 0x11200, 0x12, 0x9, 0, 0 }, -// 11213 KHOJKI LETTER NYA -// 11214 KHOJKI LETTER TTA -// 11215 KHOJKI LETTER TTHA -// 11216 KHOJKI LETTER DDA -// 11217 KHOJKI LETTER DDHA -// 11218 KHOJKI LETTER NNA -// 11219 KHOJKI LETTER TA -// 1121a KHOJKI LETTER THA -// 1121b KHOJKI LETTER DA -// 1121c KHOJKI LETTER DDDA -// 1121d KHOJKI LETTER DHA -// 1121e KHOJKI LETTER NA -// 1121f KHOJKI LETTER PA -// 11220 KHOJKI LETTER PHA -// 11221 KHOJKI LETTER BA -// 11222 KHOJKI LETTER BBA -// 11223 KHOJKI LETTER BHA -// 11224 KHOJKI LETTER MA -// 11225 KHOJKI LETTER YA -// 11226 KHOJKI LETTER RA -// 11227 KHOJKI LETTER LA -// 11228 KHOJKI LETTER VA -// 11229 KHOJKI LETTER SA -// 1122a KHOJKI LETTER HA -// 1122b KHOJKI LETTER LLA - { 0x11213, 0x19, 0x9, 0, 0 }, -// 1122c KHOJKI VOWEL SIGN AA -// 1122d KHOJKI VOWEL SIGN I -// 1122e KHOJKI VOWEL SIGN II -// 1122f KHOJKI VOWEL SIGN U -// 11230 KHOJKI VOWEL SIGN E -// 11231 KHOJKI VOWEL SIGN AI -// 11232 KHOJKI VOWEL SIGN O -// 11233 KHOJKI VOWEL SIGN AU -// 11234 KHOJKI SIGN ANUSVARA -// 11235 KHOJKI SIGN VIRAMA -// 11236 KHOJKI SIGN NUKTA -// 11237 KHOJKI SIGN SHADDA - { 0x1122C, 0xC, 0x0, 0, 0 }, -// 11238 KHOJKI DANDA -// 11239 KHOJKI DOUBLE DANDA -// 1123a KHOJKI WORD SEPARATOR -// 1123b KHOJKI SECTION MARK -// 1123c KHOJKI DOUBLE SECTION MARK -// 1123d KHOJKI ABBREVIATION SIGN - { 0x11238, 0x6, 0x18, 0, 0 }, -// 112b0 KHUDAWADI LETTER A -// 112b1 KHUDAWADI LETTER AA -// 112b2 KHUDAWADI LETTER I -// 112b3 KHUDAWADI LETTER II -// 112b4 KHUDAWADI LETTER U -// 112b5 KHUDAWADI LETTER UU -// 112b6 KHUDAWADI LETTER E -// 112b7 KHUDAWADI LETTER AI -// 112b8 KHUDAWADI LETTER O -// 112b9 KHUDAWADI LETTER AU -// 112ba KHUDAWADI LETTER KA -// 112bb KHUDAWADI LETTER KHA -// 112bc KHUDAWADI LETTER GA -// 112bd KHUDAWADI LETTER GGA -// 112be KHUDAWADI LETTER GHA -// 112bf KHUDAWADI LETTER NGA -// 112c0 KHUDAWADI LETTER CA -// 112c1 KHUDAWADI LETTER CHA -// 112c2 KHUDAWADI LETTER JA -// 112c3 KHUDAWADI LETTER JJA -// 112c4 KHUDAWADI LETTER JHA -// 112c5 KHUDAWADI LETTER NYA -// 112c6 KHUDAWADI LETTER TTA -// 112c7 KHUDAWADI LETTER TTHA -// 112c8 KHUDAWADI LETTER DDA -// 112c9 KHUDAWADI LETTER DDDA -// 112ca KHUDAWADI LETTER RRA -// 112cb KHUDAWADI LETTER DDHA -// 112cc KHUDAWADI LETTER NNA -// 112cd KHUDAWADI LETTER TA -// 112ce KHUDAWADI LETTER THA -// 112cf KHUDAWADI LETTER DA -// 112d0 KHUDAWADI LETTER DHA -// 112d1 KHUDAWADI LETTER NA -// 112d2 KHUDAWADI LETTER PA -// 112d3 KHUDAWADI LETTER PHA -// 112d4 KHUDAWADI LETTER BA -// 112d5 KHUDAWADI LETTER BBA -// 112d6 KHUDAWADI LETTER BHA -// 112d7 KHUDAWADI LETTER MA -// 112d8 KHUDAWADI LETTER YA -// 112d9 KHUDAWADI LETTER RA -// 112da KHUDAWADI LETTER LA -// 112db KHUDAWADI LETTER VA -// 112dc KHUDAWADI LETTER SHA -// 112dd KHUDAWADI LETTER SA -// 112de KHUDAWADI LETTER HA - { 0x112B0, 0x2F, 0x9, 0, 0 }, -// 112df KHUDAWADI SIGN ANUSVARA -// 112e0 KHUDAWADI VOWEL SIGN AA -// 112e1 KHUDAWADI VOWEL SIGN I -// 112e2 KHUDAWADI VOWEL SIGN II -// 112e3 KHUDAWADI VOWEL SIGN U -// 112e4 KHUDAWADI VOWEL SIGN UU -// 112e5 KHUDAWADI VOWEL SIGN E -// 112e6 KHUDAWADI VOWEL SIGN AI -// 112e7 KHUDAWADI VOWEL SIGN O -// 112e8 KHUDAWADI VOWEL SIGN AU -// 112e9 KHUDAWADI SIGN NUKTA -// 112ea KHUDAWADI SIGN VIRAMA - { 0x112DF, 0xC, 0x0, 0, 0 }, -// 112f0 KHUDAWADI DIGIT ZERO -// 112f1 KHUDAWADI DIGIT ONE -// 112f2 KHUDAWADI DIGIT TWO -// 112f3 KHUDAWADI DIGIT THREE -// 112f4 KHUDAWADI DIGIT FOUR -// 112f5 KHUDAWADI DIGIT FIVE -// 112f6 KHUDAWADI DIGIT SIX -// 112f7 KHUDAWADI DIGIT SEVEN -// 112f8 KHUDAWADI DIGIT EIGHT -// 112f9 KHUDAWADI DIGIT NINE - { 0x112F0, 0xA, 0x108, 0, 0 }, -// 11301 GRANTHA SIGN CANDRABINDU -// 11302 GRANTHA SIGN ANUSVARA -// 11303 GRANTHA SIGN VISARGA - { 0x11301, 0x3, 0x0, 0, 0 }, -// 11305 GRANTHA LETTER A -// 11306 GRANTHA LETTER AA -// 11307 GRANTHA LETTER I -// 11308 GRANTHA LETTER II -// 11309 GRANTHA LETTER U -// 1130a GRANTHA LETTER UU -// 1130b GRANTHA LETTER VOCALIC R -// 1130c GRANTHA LETTER VOCALIC L - { 0x11305, 0x8, 0x9, 0, 0 }, -// 1130f GRANTHA LETTER EE -// 11310 GRANTHA LETTER AI - { 0x1130F, 0x2, 0x9, 0, 0 }, -// 11313 GRANTHA LETTER OO -// 11314 GRANTHA LETTER AU -// 11315 GRANTHA LETTER KA -// 11316 GRANTHA LETTER KHA -// 11317 GRANTHA LETTER GA -// 11318 GRANTHA LETTER GHA -// 11319 GRANTHA LETTER NGA -// 1131a GRANTHA LETTER CA -// 1131b GRANTHA LETTER CHA -// 1131c GRANTHA LETTER JA -// 1131d GRANTHA LETTER JHA -// 1131e GRANTHA LETTER NYA -// 1131f GRANTHA LETTER TTA -// 11320 GRANTHA LETTER TTHA -// 11321 GRANTHA LETTER DDA -// 11322 GRANTHA LETTER DDHA -// 11323 GRANTHA LETTER NNA -// 11324 GRANTHA LETTER TA -// 11325 GRANTHA LETTER THA -// 11326 GRANTHA LETTER DA -// 11327 GRANTHA LETTER DHA -// 11328 GRANTHA LETTER NA - { 0x11313, 0x16, 0x9, 0, 0 }, -// 1132a GRANTHA LETTER PA -// 1132b GRANTHA LETTER PHA -// 1132c GRANTHA LETTER BA -// 1132d GRANTHA LETTER BHA -// 1132e GRANTHA LETTER MA -// 1132f GRANTHA LETTER YA -// 11330 GRANTHA LETTER RA - { 0x1132A, 0x7, 0x9, 0, 0 }, -// 11332 GRANTHA LETTER LA -// 11333 GRANTHA LETTER LLA - { 0x11332, 0x2, 0x9, 0, 0 }, -// 11335 GRANTHA LETTER VA -// 11336 GRANTHA LETTER SHA -// 11337 GRANTHA LETTER SSA -// 11338 GRANTHA LETTER SA -// 11339 GRANTHA LETTER HA - { 0x11335, 0x5, 0x9, 0, 0 }, -// 1133c GRANTHA SIGN NUKTA - { 0x1133C, 0x1, 0x0, 0, 0 }, -// 1133d GRANTHA SIGN AVAGRAHA - { 0x1133D, 0x1, 0x9, 0, 0 }, -// 1133e GRANTHA VOWEL SIGN AA -// 1133f GRANTHA VOWEL SIGN I -// 11340 GRANTHA VOWEL SIGN II -// 11341 GRANTHA VOWEL SIGN U -// 11342 GRANTHA VOWEL SIGN UU -// 11343 GRANTHA VOWEL SIGN VOCALIC R -// 11344 GRANTHA VOWEL SIGN VOCALIC RR - { 0x1133E, 0x7, 0x0, 0, 0 }, -// 11347 GRANTHA VOWEL SIGN EE -// 11348 GRANTHA VOWEL SIGN AI - { 0x11347, 0x2, 0x0, 0, 0 }, -// 1134b GRANTHA VOWEL SIGN OO -// 1134c GRANTHA VOWEL SIGN AU -// 1134d GRANTHA SIGN VIRAMA - { 0x1134B, 0x3, 0x0, 0, 0 }, -// 11357 GRANTHA AU LENGTH MARK - { 0x11357, 0x1, 0x0, 0, 0 }, -// 1135d GRANTHA SIGN PLUTA -// 1135e GRANTHA LETTER VEDIC ANUSVARA -// 1135f GRANTHA LETTER VEDIC DOUBLE ANUSVARA -// 11360 GRANTHA LETTER VOCALIC RR -// 11361 GRANTHA LETTER VOCALIC LL - { 0x1135D, 0x5, 0x9, 0, 0 }, -// 11362 GRANTHA VOWEL SIGN VOCALIC L -// 11363 GRANTHA VOWEL SIGN VOCALIC LL - { 0x11362, 0x2, 0x0, 0, 0 }, -// 11366 COMBINING GRANTHA DIGIT ZERO -// 11367 COMBINING GRANTHA DIGIT ONE -// 11368 COMBINING GRANTHA DIGIT TWO -// 11369 COMBINING GRANTHA DIGIT THREE -// 1136a COMBINING GRANTHA DIGIT FOUR -// 1136b COMBINING GRANTHA DIGIT FIVE -// 1136c COMBINING GRANTHA DIGIT SIX - { 0x11366, 0x7, 0x0, 0, 0 }, -// 11370 COMBINING GRANTHA LETTER A -// 11371 COMBINING GRANTHA LETTER KA -// 11372 COMBINING GRANTHA LETTER NA -// 11373 COMBINING GRANTHA LETTER VI -// 11374 COMBINING GRANTHA LETTER PA - { 0x11370, 0x5, 0x0, 0, 0 }, -// 11480 TIRHUTA ANJI -// 11481 TIRHUTA LETTER A -// 11482 TIRHUTA LETTER AA -// 11483 TIRHUTA LETTER I -// 11484 TIRHUTA LETTER II -// 11485 TIRHUTA LETTER U -// 11486 TIRHUTA LETTER UU -// 11487 TIRHUTA LETTER VOCALIC R -// 11488 TIRHUTA LETTER VOCALIC RR -// 11489 TIRHUTA LETTER VOCALIC L -// 1148a TIRHUTA LETTER VOCALIC LL -// 1148b TIRHUTA LETTER E -// 1148c TIRHUTA LETTER AI -// 1148d TIRHUTA LETTER O -// 1148e TIRHUTA LETTER AU -// 1148f TIRHUTA LETTER KA -// 11490 TIRHUTA LETTER KHA -// 11491 TIRHUTA LETTER GA -// 11492 TIRHUTA LETTER GHA -// 11493 TIRHUTA LETTER NGA -// 11494 TIRHUTA LETTER CA -// 11495 TIRHUTA LETTER CHA -// 11496 TIRHUTA LETTER JA -// 11497 TIRHUTA LETTER JHA -// 11498 TIRHUTA LETTER NYA -// 11499 TIRHUTA LETTER TTA -// 1149a TIRHUTA LETTER TTHA -// 1149b TIRHUTA LETTER DDA -// 1149c TIRHUTA LETTER DDHA -// 1149d TIRHUTA LETTER NNA -// 1149e TIRHUTA LETTER TA -// 1149f TIRHUTA LETTER THA -// 114a0 TIRHUTA LETTER DA -// 114a1 TIRHUTA LETTER DHA -// 114a2 TIRHUTA LETTER NA -// 114a3 TIRHUTA LETTER PA -// 114a4 TIRHUTA LETTER PHA -// 114a5 TIRHUTA LETTER BA -// 114a6 TIRHUTA LETTER BHA -// 114a7 TIRHUTA LETTER MA -// 114a8 TIRHUTA LETTER YA -// 114a9 TIRHUTA LETTER RA -// 114aa TIRHUTA LETTER LA -// 114ab TIRHUTA LETTER VA -// 114ac TIRHUTA LETTER SHA -// 114ad TIRHUTA LETTER SSA -// 114ae TIRHUTA LETTER SA -// 114af TIRHUTA LETTER HA - { 0x11480, 0x30, 0x9, 0, 0 }, -// 114b0 TIRHUTA VOWEL SIGN AA -// 114b1 TIRHUTA VOWEL SIGN I -// 114b2 TIRHUTA VOWEL SIGN II -// 114b3 TIRHUTA VOWEL SIGN U -// 114b4 TIRHUTA VOWEL SIGN UU -// 114b5 TIRHUTA VOWEL SIGN VOCALIC R -// 114b6 TIRHUTA VOWEL SIGN VOCALIC RR -// 114b7 TIRHUTA VOWEL SIGN VOCALIC L -// 114b8 TIRHUTA VOWEL SIGN VOCALIC LL -// 114b9 TIRHUTA VOWEL SIGN E -// 114ba TIRHUTA VOWEL SIGN SHORT E -// 114bb TIRHUTA VOWEL SIGN AI -// 114bc TIRHUTA VOWEL SIGN O -// 114bd TIRHUTA VOWEL SIGN SHORT O -// 114be TIRHUTA VOWEL SIGN AU -// 114bf TIRHUTA SIGN CANDRABINDU -// 114c0 TIRHUTA SIGN ANUSVARA -// 114c1 TIRHUTA SIGN VISARGA -// 114c2 TIRHUTA SIGN VIRAMA -// 114c3 TIRHUTA SIGN NUKTA - { 0x114B0, 0x14, 0x0, 0, 0 }, -// 114c4 TIRHUTA SIGN AVAGRAHA -// 114c5 TIRHUTA GVANG - { 0x114C4, 0x2, 0x9, 0, 0 }, -// 114c6 TIRHUTA ABBREVIATION SIGN - { 0x114C6, 0x1, 0x18, 0, 0 }, -// 114c7 TIRHUTA OM - { 0x114C7, 0x1, 0x9, 0, 0 }, -// 114d0 TIRHUTA DIGIT ZERO -// 114d1 TIRHUTA DIGIT ONE -// 114d2 TIRHUTA DIGIT TWO -// 114d3 TIRHUTA DIGIT THREE -// 114d4 TIRHUTA DIGIT FOUR -// 114d5 TIRHUTA DIGIT FIVE -// 114d6 TIRHUTA DIGIT SIX -// 114d7 TIRHUTA DIGIT SEVEN -// 114d8 TIRHUTA DIGIT EIGHT -// 114d9 TIRHUTA DIGIT NINE - { 0x114D0, 0xA, 0x108, 0, 0 }, -// 11580 SIDDHAM LETTER A -// 11581 SIDDHAM LETTER AA -// 11582 SIDDHAM LETTER I -// 11583 SIDDHAM LETTER II -// 11584 SIDDHAM LETTER U -// 11585 SIDDHAM LETTER UU -// 11586 SIDDHAM LETTER VOCALIC R -// 11587 SIDDHAM LETTER VOCALIC RR -// 11588 SIDDHAM LETTER VOCALIC L -// 11589 SIDDHAM LETTER VOCALIC LL -// 1158a SIDDHAM LETTER E -// 1158b SIDDHAM LETTER AI -// 1158c SIDDHAM LETTER O -// 1158d SIDDHAM LETTER AU -// 1158e SIDDHAM LETTER KA -// 1158f SIDDHAM LETTER KHA -// 11590 SIDDHAM LETTER GA -// 11591 SIDDHAM LETTER GHA -// 11592 SIDDHAM LETTER NGA -// 11593 SIDDHAM LETTER CA -// 11594 SIDDHAM LETTER CHA -// 11595 SIDDHAM LETTER JA -// 11596 SIDDHAM LETTER JHA -// 11597 SIDDHAM LETTER NYA -// 11598 SIDDHAM LETTER TTA -// 11599 SIDDHAM LETTER TTHA -// 1159a SIDDHAM LETTER DDA -// 1159b SIDDHAM LETTER DDHA -// 1159c SIDDHAM LETTER NNA -// 1159d SIDDHAM LETTER TA -// 1159e SIDDHAM LETTER THA -// 1159f SIDDHAM LETTER DA -// 115a0 SIDDHAM LETTER DHA -// 115a1 SIDDHAM LETTER NA -// 115a2 SIDDHAM LETTER PA -// 115a3 SIDDHAM LETTER PHA -// 115a4 SIDDHAM LETTER BA -// 115a5 SIDDHAM LETTER BHA -// 115a6 SIDDHAM LETTER MA -// 115a7 SIDDHAM LETTER YA -// 115a8 SIDDHAM LETTER RA -// 115a9 SIDDHAM LETTER LA -// 115aa SIDDHAM LETTER VA -// 115ab SIDDHAM LETTER SHA -// 115ac SIDDHAM LETTER SSA -// 115ad SIDDHAM LETTER SA -// 115ae SIDDHAM LETTER HA - { 0x11580, 0x2F, 0x9, 0, 0 }, -// 115af SIDDHAM VOWEL SIGN AA -// 115b0 SIDDHAM VOWEL SIGN I -// 115b1 SIDDHAM VOWEL SIGN II -// 115b2 SIDDHAM VOWEL SIGN U -// 115b3 SIDDHAM VOWEL SIGN UU -// 115b4 SIDDHAM VOWEL SIGN VOCALIC R -// 115b5 SIDDHAM VOWEL SIGN VOCALIC RR - { 0x115AF, 0x7, 0x0, 0, 0 }, -// 115b8 SIDDHAM VOWEL SIGN E -// 115b9 SIDDHAM VOWEL SIGN AI -// 115ba SIDDHAM VOWEL SIGN O -// 115bb SIDDHAM VOWEL SIGN AU -// 115bc SIDDHAM SIGN CANDRABINDU -// 115bd SIDDHAM SIGN ANUSVARA -// 115be SIDDHAM SIGN VISARGA -// 115bf SIDDHAM SIGN VIRAMA -// 115c0 SIDDHAM SIGN NUKTA - { 0x115B8, 0x9, 0x0, 0, 0 }, -// 115c1 SIDDHAM SIGN SIDDHAM -// 115c2 SIDDHAM DANDA -// 115c3 SIDDHAM DOUBLE DANDA -// 115c4 SIDDHAM SEPARATOR DOT -// 115c5 SIDDHAM SEPARATOR BAR -// 115c6 SIDDHAM REPETITION MARK-1 -// 115c7 SIDDHAM REPETITION MARK-2 -// 115c8 SIDDHAM REPETITION MARK-3 -// 115c9 SIDDHAM END OF TEXT MARK - { 0x115C1, 0x9, 0x18, 0, 0 }, -// 11600 MODI LETTER A -// 11601 MODI LETTER AA -// 11602 MODI LETTER I -// 11603 MODI LETTER II -// 11604 MODI LETTER U -// 11605 MODI LETTER UU -// 11606 MODI LETTER VOCALIC R -// 11607 MODI LETTER VOCALIC RR -// 11608 MODI LETTER VOCALIC L -// 11609 MODI LETTER VOCALIC LL -// 1160a MODI LETTER E -// 1160b MODI LETTER AI -// 1160c MODI LETTER O -// 1160d MODI LETTER AU -// 1160e MODI LETTER KA -// 1160f MODI LETTER KHA -// 11610 MODI LETTER GA -// 11611 MODI LETTER GHA -// 11612 MODI LETTER NGA -// 11613 MODI LETTER CA -// 11614 MODI LETTER CHA -// 11615 MODI LETTER JA -// 11616 MODI LETTER JHA -// 11617 MODI LETTER NYA -// 11618 MODI LETTER TTA -// 11619 MODI LETTER TTHA -// 1161a MODI LETTER DDA -// 1161b MODI LETTER DDHA -// 1161c MODI LETTER NNA -// 1161d MODI LETTER TA -// 1161e MODI LETTER THA -// 1161f MODI LETTER DA -// 11620 MODI LETTER DHA -// 11621 MODI LETTER NA -// 11622 MODI LETTER PA -// 11623 MODI LETTER PHA -// 11624 MODI LETTER BA -// 11625 MODI LETTER BHA -// 11626 MODI LETTER MA -// 11627 MODI LETTER YA -// 11628 MODI LETTER RA -// 11629 MODI LETTER LA -// 1162a MODI LETTER VA -// 1162b MODI LETTER SHA -// 1162c MODI LETTER SSA -// 1162d MODI LETTER SA -// 1162e MODI LETTER HA -// 1162f MODI LETTER LLA - { 0x11600, 0x30, 0x9, 0, 0 }, -// 11630 MODI VOWEL SIGN AA -// 11631 MODI VOWEL SIGN I -// 11632 MODI VOWEL SIGN II -// 11633 MODI VOWEL SIGN U -// 11634 MODI VOWEL SIGN UU -// 11635 MODI VOWEL SIGN VOCALIC R -// 11636 MODI VOWEL SIGN VOCALIC RR -// 11637 MODI VOWEL SIGN VOCALIC L -// 11638 MODI VOWEL SIGN VOCALIC LL -// 11639 MODI VOWEL SIGN E -// 1163a MODI VOWEL SIGN AI -// 1163b MODI VOWEL SIGN O -// 1163c MODI VOWEL SIGN AU -// 1163d MODI SIGN ANUSVARA -// 1163e MODI SIGN VISARGA -// 1163f MODI SIGN VIRAMA -// 11640 MODI SIGN ARDHACANDRA - { 0x11630, 0x11, 0x0, 0, 0 }, -// 11641 MODI DANDA -// 11642 MODI DOUBLE DANDA -// 11643 MODI ABBREVIATION SIGN - { 0x11641, 0x3, 0x18, 0, 0 }, -// 11644 MODI SIGN HUVA - { 0x11644, 0x1, 0x9, 0, 0 }, -// 11650 MODI DIGIT ZERO -// 11651 MODI DIGIT ONE -// 11652 MODI DIGIT TWO -// 11653 MODI DIGIT THREE -// 11654 MODI DIGIT FOUR -// 11655 MODI DIGIT FIVE -// 11656 MODI DIGIT SIX -// 11657 MODI DIGIT SEVEN -// 11658 MODI DIGIT EIGHT -// 11659 MODI DIGIT NINE - { 0x11650, 0xA, 0x108, 0, 0 }, -// 11680 TAKRI LETTER A -// 11681 TAKRI LETTER AA -// 11682 TAKRI LETTER I -// 11683 TAKRI LETTER II -// 11684 TAKRI LETTER U -// 11685 TAKRI LETTER UU -// 11686 TAKRI LETTER E -// 11687 TAKRI LETTER AI -// 11688 TAKRI LETTER O -// 11689 TAKRI LETTER AU -// 1168a TAKRI LETTER KA -// 1168b TAKRI LETTER KHA -// 1168c TAKRI LETTER GA -// 1168d TAKRI LETTER GHA -// 1168e TAKRI LETTER NGA -// 1168f TAKRI LETTER CA -// 11690 TAKRI LETTER CHA -// 11691 TAKRI LETTER JA -// 11692 TAKRI LETTER JHA -// 11693 TAKRI LETTER NYA -// 11694 TAKRI LETTER TTA -// 11695 TAKRI LETTER TTHA -// 11696 TAKRI LETTER DDA -// 11697 TAKRI LETTER DDHA -// 11698 TAKRI LETTER NNA -// 11699 TAKRI LETTER TA -// 1169a TAKRI LETTER THA -// 1169b TAKRI LETTER DA -// 1169c TAKRI LETTER DHA -// 1169d TAKRI LETTER NA -// 1169e TAKRI LETTER PA -// 1169f TAKRI LETTER PHA -// 116a0 TAKRI LETTER BA -// 116a1 TAKRI LETTER BHA -// 116a2 TAKRI LETTER MA -// 116a3 TAKRI LETTER YA -// 116a4 TAKRI LETTER RA -// 116a5 TAKRI LETTER LA -// 116a6 TAKRI LETTER VA -// 116a7 TAKRI LETTER SHA -// 116a8 TAKRI LETTER SA -// 116a9 TAKRI LETTER HA -// 116aa TAKRI LETTER RRA - { 0x11680, 0x2B, 0x9, 0, 0 }, -// 116ab TAKRI SIGN ANUSVARA -// 116ac TAKRI SIGN VISARGA -// 116ad TAKRI VOWEL SIGN AA -// 116ae TAKRI VOWEL SIGN I -// 116af TAKRI VOWEL SIGN II -// 116b0 TAKRI VOWEL SIGN U -// 116b1 TAKRI VOWEL SIGN UU -// 116b2 TAKRI VOWEL SIGN E -// 116b3 TAKRI VOWEL SIGN AI -// 116b4 TAKRI VOWEL SIGN O -// 116b5 TAKRI VOWEL SIGN AU -// 116b6 TAKRI SIGN VIRAMA -// 116b7 TAKRI SIGN NUKTA - { 0x116AB, 0xD, 0x0, 0, 0 }, -// 116c0 TAKRI DIGIT ZERO -// 116c1 TAKRI DIGIT ONE -// 116c2 TAKRI DIGIT TWO -// 116c3 TAKRI DIGIT THREE -// 116c4 TAKRI DIGIT FOUR -// 116c5 TAKRI DIGIT FIVE -// 116c6 TAKRI DIGIT SIX -// 116c7 TAKRI DIGIT SEVEN -// 116c8 TAKRI DIGIT EIGHT -// 116c9 TAKRI DIGIT NINE - { 0x116C0, 0xA, 0x108, 0, 0 }, -// 118a0 WARANG CITI CAPITAL LETTER NGAA -// 118a1 WARANG CITI CAPITAL LETTER A -// 118a2 WARANG CITI CAPITAL LETTER WI -// 118a3 WARANG CITI CAPITAL LETTER YU -// 118a4 WARANG CITI CAPITAL LETTER YA -// 118a5 WARANG CITI CAPITAL LETTER YO -// 118a6 WARANG CITI CAPITAL LETTER II -// 118a7 WARANG CITI CAPITAL LETTER UU -// 118a8 WARANG CITI CAPITAL LETTER E -// 118a9 WARANG CITI CAPITAL LETTER O -// 118aa WARANG CITI CAPITAL LETTER ANG -// 118ab WARANG CITI CAPITAL LETTER GA -// 118ac WARANG CITI CAPITAL LETTER KO -// 118ad WARANG CITI CAPITAL LETTER ENY -// 118ae WARANG CITI CAPITAL LETTER YUJ -// 118af WARANG CITI CAPITAL LETTER UC -// 118b0 WARANG CITI CAPITAL LETTER ENN -// 118b1 WARANG CITI CAPITAL LETTER ODD -// 118b2 WARANG CITI CAPITAL LETTER TTE -// 118b3 WARANG CITI CAPITAL LETTER NUNG -// 118b4 WARANG CITI CAPITAL LETTER DA -// 118b5 WARANG CITI CAPITAL LETTER AT -// 118b6 WARANG CITI CAPITAL LETTER AM -// 118b7 WARANG CITI CAPITAL LETTER BU -// 118b8 WARANG CITI CAPITAL LETTER PU -// 118b9 WARANG CITI CAPITAL LETTER HIYO -// 118ba WARANG CITI CAPITAL LETTER HOLO -// 118bb WARANG CITI CAPITAL LETTER HORR -// 118bc WARANG CITI CAPITAL LETTER HAR -// 118bd WARANG CITI CAPITAL LETTER SSUU -// 118be WARANG CITI CAPITAL LETTER SII -// 118bf WARANG CITI CAPITAL LETTER VIYO - { 0x118A0, 0x20, 0x89, 32, 0 }, -// 118c0 WARANG CITI SMALL LETTER NGAA -// 118c1 WARANG CITI SMALL LETTER A -// 118c2 WARANG CITI SMALL LETTER WI -// 118c3 WARANG CITI SMALL LETTER YU -// 118c4 WARANG CITI SMALL LETTER YA -// 118c5 WARANG CITI SMALL LETTER YO -// 118c6 WARANG CITI SMALL LETTER II -// 118c7 WARANG CITI SMALL LETTER UU -// 118c8 WARANG CITI SMALL LETTER E -// 118c9 WARANG CITI SMALL LETTER O -// 118ca WARANG CITI SMALL LETTER ANG -// 118cb WARANG CITI SMALL LETTER GA -// 118cc WARANG CITI SMALL LETTER KO -// 118cd WARANG CITI SMALL LETTER ENY -// 118ce WARANG CITI SMALL LETTER YUJ -// 118cf WARANG CITI SMALL LETTER UC -// 118d0 WARANG CITI SMALL LETTER ENN -// 118d1 WARANG CITI SMALL LETTER ODD -// 118d2 WARANG CITI SMALL LETTER TTE -// 118d3 WARANG CITI SMALL LETTER NUNG -// 118d4 WARANG CITI SMALL LETTER DA -// 118d5 WARANG CITI SMALL LETTER AT -// 118d6 WARANG CITI SMALL LETTER AM -// 118d7 WARANG CITI SMALL LETTER BU -// 118d8 WARANG CITI SMALL LETTER PU -// 118d9 WARANG CITI SMALL LETTER HIYO -// 118da WARANG CITI SMALL LETTER HOLO -// 118db WARANG CITI SMALL LETTER HORR -// 118dc WARANG CITI SMALL LETTER HAR -// 118dd WARANG CITI SMALL LETTER SSUU -// 118de WARANG CITI SMALL LETTER SII -// 118df WARANG CITI SMALL LETTER VIYO - { 0x118C0, 0x20, 0x49, 0, -32 }, -// 118e0 WARANG CITI DIGIT ZERO -// 118e1 WARANG CITI DIGIT ONE -// 118e2 WARANG CITI DIGIT TWO -// 118e3 WARANG CITI DIGIT THREE -// 118e4 WARANG CITI DIGIT FOUR -// 118e5 WARANG CITI DIGIT FIVE -// 118e6 WARANG CITI DIGIT SIX -// 118e7 WARANG CITI DIGIT SEVEN -// 118e8 WARANG CITI DIGIT EIGHT -// 118e9 WARANG CITI DIGIT NINE - { 0x118E0, 0xA, 0x108, 0, 0 }, -// 118ea WARANG CITI NUMBER TEN -// 118eb WARANG CITI NUMBER TWENTY -// 118ec WARANG CITI NUMBER THIRTY -// 118ed WARANG CITI NUMBER FORTY -// 118ee WARANG CITI NUMBER FIFTY -// 118ef WARANG CITI NUMBER SIXTY -// 118f0 WARANG CITI NUMBER SEVENTY -// 118f1 WARANG CITI NUMBER EIGHTY -// 118f2 WARANG CITI NUMBER NINETY - { 0x118EA, 0x9, 0x8, 0, 0 }, -// 118ff WARANG CITI OM - { 0x118FF, 0x1, 0x9, 0, 0 }, -// 11ac0 PAU CIN HAU LETTER PA -// 11ac1 PAU CIN HAU LETTER KA -// 11ac2 PAU CIN HAU LETTER LA -// 11ac3 PAU CIN HAU LETTER MA -// 11ac4 PAU CIN HAU LETTER DA -// 11ac5 PAU CIN HAU LETTER ZA -// 11ac6 PAU CIN HAU LETTER VA -// 11ac7 PAU CIN HAU LETTER NGA -// 11ac8 PAU CIN HAU LETTER HA -// 11ac9 PAU CIN HAU LETTER GA -// 11aca PAU CIN HAU LETTER KHA -// 11acb PAU CIN HAU LETTER SA -// 11acc PAU CIN HAU LETTER BA -// 11acd PAU CIN HAU LETTER CA -// 11ace PAU CIN HAU LETTER TA -// 11acf PAU CIN HAU LETTER THA -// 11ad0 PAU CIN HAU LETTER NA -// 11ad1 PAU CIN HAU LETTER PHA -// 11ad2 PAU CIN HAU LETTER RA -// 11ad3 PAU CIN HAU LETTER FA -// 11ad4 PAU CIN HAU LETTER CHA -// 11ad5 PAU CIN HAU LETTER A -// 11ad6 PAU CIN HAU LETTER E -// 11ad7 PAU CIN HAU LETTER I -// 11ad8 PAU CIN HAU LETTER O -// 11ad9 PAU CIN HAU LETTER U -// 11ada PAU CIN HAU LETTER UA -// 11adb PAU CIN HAU LETTER IA -// 11adc PAU CIN HAU LETTER FINAL P -// 11add PAU CIN HAU LETTER FINAL K -// 11ade PAU CIN HAU LETTER FINAL T -// 11adf PAU CIN HAU LETTER FINAL M -// 11ae0 PAU CIN HAU LETTER FINAL N -// 11ae1 PAU CIN HAU LETTER FINAL L -// 11ae2 PAU CIN HAU LETTER FINAL W -// 11ae3 PAU CIN HAU LETTER FINAL NG -// 11ae4 PAU CIN HAU LETTER FINAL Y -// 11ae5 PAU CIN HAU RISING TONE LONG -// 11ae6 PAU CIN HAU RISING TONE -// 11ae7 PAU CIN HAU SANDHI GLOTTAL STOP -// 11ae8 PAU CIN HAU RISING TONE LONG FINAL -// 11ae9 PAU CIN HAU RISING TONE FINAL -// 11aea PAU CIN HAU SANDHI GLOTTAL STOP FINAL -// 11aeb PAU CIN HAU SANDHI TONE LONG -// 11aec PAU CIN HAU SANDHI TONE -// 11aed PAU CIN HAU SANDHI TONE LONG FINAL -// 11aee PAU CIN HAU SANDHI TONE FINAL -// 11aef PAU CIN HAU MID-LEVEL TONE -// 11af0 PAU CIN HAU GLOTTAL STOP VARIANT -// 11af1 PAU CIN HAU MID-LEVEL TONE LONG FINAL -// 11af2 PAU CIN HAU MID-LEVEL TONE FINAL -// 11af3 PAU CIN HAU LOW-FALLING TONE LONG -// 11af4 PAU CIN HAU LOW-FALLING TONE -// 11af5 PAU CIN HAU GLOTTAL STOP -// 11af6 PAU CIN HAU LOW-FALLING TONE LONG FINAL -// 11af7 PAU CIN HAU LOW-FALLING TONE FINAL -// 11af8 PAU CIN HAU GLOTTAL STOP FINAL - { 0x11AC0, 0x39, 0x9, 0, 0 }, -// 12000 CUNEIFORM SIGN A -// 12001 CUNEIFORM SIGN A TIMES A -// 12002 CUNEIFORM SIGN A TIMES BAD -// 12003 CUNEIFORM SIGN A TIMES GAN2 TENU -// 12004 CUNEIFORM SIGN A TIMES HA -// 12005 CUNEIFORM SIGN A TIMES IGI -// 12006 CUNEIFORM SIGN A TIMES LAGAR GUNU -// 12007 CUNEIFORM SIGN A TIMES MUSH -// 12008 CUNEIFORM SIGN A TIMES SAG -// 12009 CUNEIFORM SIGN A2 -// 1200a CUNEIFORM SIGN AB -// 1200b CUNEIFORM SIGN AB TIMES ASH2 -// 1200c CUNEIFORM SIGN AB TIMES DUN3 GUNU -// 1200d CUNEIFORM SIGN AB TIMES GAL -// 1200e CUNEIFORM SIGN AB TIMES GAN2 TENU -// 1200f CUNEIFORM SIGN AB TIMES HA -// 12010 CUNEIFORM SIGN AB TIMES IGI GUNU -// 12011 CUNEIFORM SIGN AB TIMES IMIN -// 12012 CUNEIFORM SIGN AB TIMES LAGAB -// 12013 CUNEIFORM SIGN AB TIMES SHESH -// 12014 CUNEIFORM SIGN AB TIMES U PLUS U PLUS U -// 12015 CUNEIFORM SIGN AB GUNU -// 12016 CUNEIFORM SIGN AB2 -// 12017 CUNEIFORM SIGN AB2 TIMES BALAG -// 12018 CUNEIFORM SIGN AB2 TIMES GAN2 TENU -// 12019 CUNEIFORM SIGN AB2 TIMES ME PLUS EN -// 1201a CUNEIFORM SIGN AB2 TIMES SHA3 -// 1201b CUNEIFORM SIGN AB2 TIMES TAK4 -// 1201c CUNEIFORM SIGN AD -// 1201d CUNEIFORM SIGN AK -// 1201e CUNEIFORM SIGN AK TIMES ERIN2 -// 1201f CUNEIFORM SIGN AK TIMES SHITA PLUS GISH -// 12020 CUNEIFORM SIGN AL -// 12021 CUNEIFORM SIGN AL TIMES AL -// 12022 CUNEIFORM SIGN AL TIMES DIM2 -// 12023 CUNEIFORM SIGN AL TIMES GISH -// 12024 CUNEIFORM SIGN AL TIMES HA -// 12025 CUNEIFORM SIGN AL TIMES KAD3 -// 12026 CUNEIFORM SIGN AL TIMES KI -// 12027 CUNEIFORM SIGN AL TIMES SHE -// 12028 CUNEIFORM SIGN AL TIMES USH -// 12029 CUNEIFORM SIGN ALAN -// 1202a CUNEIFORM SIGN ALEPH -// 1202b CUNEIFORM SIGN AMAR -// 1202c CUNEIFORM SIGN AMAR TIMES SHE -// 1202d CUNEIFORM SIGN AN -// 1202e CUNEIFORM SIGN AN OVER AN -// 1202f CUNEIFORM SIGN AN THREE TIMES -// 12030 CUNEIFORM SIGN AN PLUS NAGA OPPOSING AN PLUS NAGA -// 12031 CUNEIFORM SIGN AN PLUS NAGA SQUARED -// 12032 CUNEIFORM SIGN ANSHE -// 12033 CUNEIFORM SIGN APIN -// 12034 CUNEIFORM SIGN ARAD -// 12035 CUNEIFORM SIGN ARAD TIMES KUR -// 12036 CUNEIFORM SIGN ARKAB -// 12037 CUNEIFORM SIGN ASAL2 -// 12038 CUNEIFORM SIGN ASH -// 12039 CUNEIFORM SIGN ASH ZIDA TENU -// 1203a CUNEIFORM SIGN ASH KABA TENU -// 1203b CUNEIFORM SIGN ASH OVER ASH TUG2 OVER TUG2 TUG2 OVER TUG2 PAP -// 1203c CUNEIFORM SIGN ASH OVER ASH OVER ASH -// 1203d CUNEIFORM SIGN ASH OVER ASH OVER ASH CROSSING ASH OVER ASH OVER ASH -// 1203e CUNEIFORM SIGN ASH2 -// 1203f CUNEIFORM SIGN ASHGAB -// 12040 CUNEIFORM SIGN BA -// 12041 CUNEIFORM SIGN BAD -// 12042 CUNEIFORM SIGN BAG3 -// 12043 CUNEIFORM SIGN BAHAR2 -// 12044 CUNEIFORM SIGN BAL -// 12045 CUNEIFORM SIGN BAL OVER BAL -// 12046 CUNEIFORM SIGN BALAG -// 12047 CUNEIFORM SIGN BAR -// 12048 CUNEIFORM SIGN BARA2 -// 12049 CUNEIFORM SIGN BI -// 1204a CUNEIFORM SIGN BI TIMES A -// 1204b CUNEIFORM SIGN BI TIMES GAR -// 1204c CUNEIFORM SIGN BI TIMES IGI GUNU -// 1204d CUNEIFORM SIGN BU -// 1204e CUNEIFORM SIGN BU OVER BU AB -// 1204f CUNEIFORM SIGN BU OVER BU UN -// 12050 CUNEIFORM SIGN BU CROSSING BU -// 12051 CUNEIFORM SIGN BULUG -// 12052 CUNEIFORM SIGN BULUG OVER BULUG -// 12053 CUNEIFORM SIGN BUR -// 12054 CUNEIFORM SIGN BUR2 -// 12055 CUNEIFORM SIGN DA -// 12056 CUNEIFORM SIGN DAG -// 12057 CUNEIFORM SIGN DAG KISIM5 TIMES A PLUS MASH -// 12058 CUNEIFORM SIGN DAG KISIM5 TIMES AMAR -// 12059 CUNEIFORM SIGN DAG KISIM5 TIMES BALAG -// 1205a CUNEIFORM SIGN DAG KISIM5 TIMES BI -// 1205b CUNEIFORM SIGN DAG KISIM5 TIMES GA -// 1205c CUNEIFORM SIGN DAG KISIM5 TIMES GA PLUS MASH -// 1205d CUNEIFORM SIGN DAG KISIM5 TIMES GI -// 1205e CUNEIFORM SIGN DAG KISIM5 TIMES GIR2 -// 1205f CUNEIFORM SIGN DAG KISIM5 TIMES GUD -// 12060 CUNEIFORM SIGN DAG KISIM5 TIMES HA -// 12061 CUNEIFORM SIGN DAG KISIM5 TIMES IR -// 12062 CUNEIFORM SIGN DAG KISIM5 TIMES IR PLUS LU -// 12063 CUNEIFORM SIGN DAG KISIM5 TIMES KAK -// 12064 CUNEIFORM SIGN DAG KISIM5 TIMES LA -// 12065 CUNEIFORM SIGN DAG KISIM5 TIMES LU -// 12066 CUNEIFORM SIGN DAG KISIM5 TIMES LU PLUS MASH2 -// 12067 CUNEIFORM SIGN DAG KISIM5 TIMES LUM -// 12068 CUNEIFORM SIGN DAG KISIM5 TIMES NE -// 12069 CUNEIFORM SIGN DAG KISIM5 TIMES PAP PLUS PAP -// 1206a CUNEIFORM SIGN DAG KISIM5 TIMES SI -// 1206b CUNEIFORM SIGN DAG KISIM5 TIMES TAK4 -// 1206c CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS GIR2 -// 1206d CUNEIFORM SIGN DAG KISIM5 TIMES USH -// 1206e CUNEIFORM SIGN DAM -// 1206f CUNEIFORM SIGN DAR -// 12070 CUNEIFORM SIGN DARA3 -// 12071 CUNEIFORM SIGN DARA4 -// 12072 CUNEIFORM SIGN DI -// 12073 CUNEIFORM SIGN DIB -// 12074 CUNEIFORM SIGN DIM -// 12075 CUNEIFORM SIGN DIM TIMES SHE -// 12076 CUNEIFORM SIGN DIM2 -// 12077 CUNEIFORM SIGN DIN -// 12078 CUNEIFORM SIGN DIN KASKAL U GUNU DISH -// 12079 CUNEIFORM SIGN DISH -// 1207a CUNEIFORM SIGN DU -// 1207b CUNEIFORM SIGN DU OVER DU -// 1207c CUNEIFORM SIGN DU GUNU -// 1207d CUNEIFORM SIGN DU SHESHIG -// 1207e CUNEIFORM SIGN DUB -// 1207f CUNEIFORM SIGN DUB TIMES ESH2 -// 12080 CUNEIFORM SIGN DUB2 -// 12081 CUNEIFORM SIGN DUG -// 12082 CUNEIFORM SIGN DUGUD -// 12083 CUNEIFORM SIGN DUH -// 12084 CUNEIFORM SIGN DUN -// 12085 CUNEIFORM SIGN DUN3 -// 12086 CUNEIFORM SIGN DUN3 GUNU -// 12087 CUNEIFORM SIGN DUN3 GUNU GUNU -// 12088 CUNEIFORM SIGN DUN4 -// 12089 CUNEIFORM SIGN DUR2 -// 1208a CUNEIFORM SIGN E -// 1208b CUNEIFORM SIGN E TIMES PAP -// 1208c CUNEIFORM SIGN E OVER E NUN OVER NUN -// 1208d CUNEIFORM SIGN E2 -// 1208e CUNEIFORM SIGN E2 TIMES A PLUS HA PLUS DA -// 1208f CUNEIFORM SIGN E2 TIMES GAR -// 12090 CUNEIFORM SIGN E2 TIMES MI -// 12091 CUNEIFORM SIGN E2 TIMES SAL -// 12092 CUNEIFORM SIGN E2 TIMES SHE -// 12093 CUNEIFORM SIGN E2 TIMES U -// 12094 CUNEIFORM SIGN EDIN -// 12095 CUNEIFORM SIGN EGIR -// 12096 CUNEIFORM SIGN EL -// 12097 CUNEIFORM SIGN EN -// 12098 CUNEIFORM SIGN EN TIMES GAN2 -// 12099 CUNEIFORM SIGN EN TIMES GAN2 TENU -// 1209a CUNEIFORM SIGN EN TIMES ME -// 1209b CUNEIFORM SIGN EN CROSSING EN -// 1209c CUNEIFORM SIGN EN OPPOSING EN -// 1209d CUNEIFORM SIGN EN SQUARED -// 1209e CUNEIFORM SIGN EREN -// 1209f CUNEIFORM SIGN ERIN2 -// 120a0 CUNEIFORM SIGN ESH2 -// 120a1 CUNEIFORM SIGN EZEN -// 120a2 CUNEIFORM SIGN EZEN TIMES A -// 120a3 CUNEIFORM SIGN EZEN TIMES A PLUS LAL -// 120a4 CUNEIFORM SIGN EZEN TIMES A PLUS LAL TIMES LAL -// 120a5 CUNEIFORM SIGN EZEN TIMES AN -// 120a6 CUNEIFORM SIGN EZEN TIMES BAD -// 120a7 CUNEIFORM SIGN EZEN TIMES DUN3 GUNU -// 120a8 CUNEIFORM SIGN EZEN TIMES DUN3 GUNU GUNU -// 120a9 CUNEIFORM SIGN EZEN TIMES HA -// 120aa CUNEIFORM SIGN EZEN TIMES HA GUNU -// 120ab CUNEIFORM SIGN EZEN TIMES IGI GUNU -// 120ac CUNEIFORM SIGN EZEN TIMES KASKAL -// 120ad CUNEIFORM SIGN EZEN TIMES KASKAL SQUARED -// 120ae CUNEIFORM SIGN EZEN TIMES KU3 -// 120af CUNEIFORM SIGN EZEN TIMES LA -// 120b0 CUNEIFORM SIGN EZEN TIMES LAL TIMES LAL -// 120b1 CUNEIFORM SIGN EZEN TIMES LI -// 120b2 CUNEIFORM SIGN EZEN TIMES LU -// 120b3 CUNEIFORM SIGN EZEN TIMES U2 -// 120b4 CUNEIFORM SIGN EZEN TIMES UD -// 120b5 CUNEIFORM SIGN GA -// 120b6 CUNEIFORM SIGN GA GUNU -// 120b7 CUNEIFORM SIGN GA2 -// 120b8 CUNEIFORM SIGN GA2 TIMES A PLUS DA PLUS HA -// 120b9 CUNEIFORM SIGN GA2 TIMES A PLUS HA -// 120ba CUNEIFORM SIGN GA2 TIMES A PLUS IGI -// 120bb CUNEIFORM SIGN GA2 TIMES AB2 TENU PLUS TAB -// 120bc CUNEIFORM SIGN GA2 TIMES AN -// 120bd CUNEIFORM SIGN GA2 TIMES ASH -// 120be CUNEIFORM SIGN GA2 TIMES ASH2 PLUS GAL -// 120bf CUNEIFORM SIGN GA2 TIMES BAD -// 120c0 CUNEIFORM SIGN GA2 TIMES BAR PLUS RA -// 120c1 CUNEIFORM SIGN GA2 TIMES BUR -// 120c2 CUNEIFORM SIGN GA2 TIMES BUR PLUS RA -// 120c3 CUNEIFORM SIGN GA2 TIMES DA -// 120c4 CUNEIFORM SIGN GA2 TIMES DI -// 120c5 CUNEIFORM SIGN GA2 TIMES DIM TIMES SHE -// 120c6 CUNEIFORM SIGN GA2 TIMES DUB -// 120c7 CUNEIFORM SIGN GA2 TIMES EL -// 120c8 CUNEIFORM SIGN GA2 TIMES EL PLUS LA -// 120c9 CUNEIFORM SIGN GA2 TIMES EN -// 120ca CUNEIFORM SIGN GA2 TIMES EN TIMES GAN2 TENU -// 120cb CUNEIFORM SIGN GA2 TIMES GAN2 TENU -// 120cc CUNEIFORM SIGN GA2 TIMES GAR -// 120cd CUNEIFORM SIGN GA2 TIMES GI -// 120ce CUNEIFORM SIGN GA2 TIMES GI4 -// 120cf CUNEIFORM SIGN GA2 TIMES GI4 PLUS A -// 120d0 CUNEIFORM SIGN GA2 TIMES GIR2 PLUS SU -// 120d1 CUNEIFORM SIGN GA2 TIMES HA PLUS LU PLUS ESH2 -// 120d2 CUNEIFORM SIGN GA2 TIMES HAL -// 120d3 CUNEIFORM SIGN GA2 TIMES HAL PLUS LA -// 120d4 CUNEIFORM SIGN GA2 TIMES HI PLUS LI -// 120d5 CUNEIFORM SIGN GA2 TIMES HUB2 -// 120d6 CUNEIFORM SIGN GA2 TIMES IGI GUNU -// 120d7 CUNEIFORM SIGN GA2 TIMES ISH PLUS HU PLUS ASH -// 120d8 CUNEIFORM SIGN GA2 TIMES KAK -// 120d9 CUNEIFORM SIGN GA2 TIMES KASKAL -// 120da CUNEIFORM SIGN GA2 TIMES KID -// 120db CUNEIFORM SIGN GA2 TIMES KID PLUS LAL -// 120dc CUNEIFORM SIGN GA2 TIMES KU3 PLUS AN -// 120dd CUNEIFORM SIGN GA2 TIMES LA -// 120de CUNEIFORM SIGN GA2 TIMES ME PLUS EN -// 120df CUNEIFORM SIGN GA2 TIMES MI -// 120e0 CUNEIFORM SIGN GA2 TIMES NUN -// 120e1 CUNEIFORM SIGN GA2 TIMES NUN OVER NUN -// 120e2 CUNEIFORM SIGN GA2 TIMES PA -// 120e3 CUNEIFORM SIGN GA2 TIMES SAL -// 120e4 CUNEIFORM SIGN GA2 TIMES SAR -// 120e5 CUNEIFORM SIGN GA2 TIMES SHE -// 120e6 CUNEIFORM SIGN GA2 TIMES SHE PLUS TUR -// 120e7 CUNEIFORM SIGN GA2 TIMES SHID -// 120e8 CUNEIFORM SIGN GA2 TIMES SUM -// 120e9 CUNEIFORM SIGN GA2 TIMES TAK4 -// 120ea CUNEIFORM SIGN GA2 TIMES U -// 120eb CUNEIFORM SIGN GA2 TIMES UD -// 120ec CUNEIFORM SIGN GA2 TIMES UD PLUS DU -// 120ed CUNEIFORM SIGN GA2 OVER GA2 -// 120ee CUNEIFORM SIGN GABA -// 120ef CUNEIFORM SIGN GABA CROSSING GABA -// 120f0 CUNEIFORM SIGN GAD -// 120f1 CUNEIFORM SIGN GAD OVER GAD GAR OVER GAR -// 120f2 CUNEIFORM SIGN GAL -// 120f3 CUNEIFORM SIGN GAL GAD OVER GAD GAR OVER GAR -// 120f4 CUNEIFORM SIGN GALAM -// 120f5 CUNEIFORM SIGN GAM -// 120f6 CUNEIFORM SIGN GAN -// 120f7 CUNEIFORM SIGN GAN2 -// 120f8 CUNEIFORM SIGN GAN2 TENU -// 120f9 CUNEIFORM SIGN GAN2 OVER GAN2 -// 120fa CUNEIFORM SIGN GAN2 CROSSING GAN2 -// 120fb CUNEIFORM SIGN GAR -// 120fc CUNEIFORM SIGN GAR3 -// 120fd CUNEIFORM SIGN GASHAN -// 120fe CUNEIFORM SIGN GESHTIN -// 120ff CUNEIFORM SIGN GESHTIN TIMES KUR -// 12100 CUNEIFORM SIGN GI -// 12101 CUNEIFORM SIGN GI TIMES E -// 12102 CUNEIFORM SIGN GI TIMES U -// 12103 CUNEIFORM SIGN GI CROSSING GI -// 12104 CUNEIFORM SIGN GI4 -// 12105 CUNEIFORM SIGN GI4 OVER GI4 -// 12106 CUNEIFORM SIGN GI4 CROSSING GI4 -// 12107 CUNEIFORM SIGN GIDIM -// 12108 CUNEIFORM SIGN GIR2 -// 12109 CUNEIFORM SIGN GIR2 GUNU -// 1210a CUNEIFORM SIGN GIR3 -// 1210b CUNEIFORM SIGN GIR3 TIMES A PLUS IGI -// 1210c CUNEIFORM SIGN GIR3 TIMES GAN2 TENU -// 1210d CUNEIFORM SIGN GIR3 TIMES IGI -// 1210e CUNEIFORM SIGN GIR3 TIMES LU PLUS IGI -// 1210f CUNEIFORM SIGN GIR3 TIMES PA -// 12110 CUNEIFORM SIGN GISAL -// 12111 CUNEIFORM SIGN GISH -// 12112 CUNEIFORM SIGN GISH CROSSING GISH -// 12113 CUNEIFORM SIGN GISH TIMES BAD -// 12114 CUNEIFORM SIGN GISH TIMES TAK4 -// 12115 CUNEIFORM SIGN GISH TENU -// 12116 CUNEIFORM SIGN GU -// 12117 CUNEIFORM SIGN GU CROSSING GU -// 12118 CUNEIFORM SIGN GU2 -// 12119 CUNEIFORM SIGN GU2 TIMES KAK -// 1211a CUNEIFORM SIGN GU2 TIMES KAK TIMES IGI GUNU -// 1211b CUNEIFORM SIGN GU2 TIMES NUN -// 1211c CUNEIFORM SIGN GU2 TIMES SAL PLUS TUG2 -// 1211d CUNEIFORM SIGN GU2 GUNU -// 1211e CUNEIFORM SIGN GUD -// 1211f CUNEIFORM SIGN GUD TIMES A PLUS KUR -// 12120 CUNEIFORM SIGN GUD TIMES KUR -// 12121 CUNEIFORM SIGN GUD OVER GUD LUGAL -// 12122 CUNEIFORM SIGN GUL -// 12123 CUNEIFORM SIGN GUM -// 12124 CUNEIFORM SIGN GUM TIMES SHE -// 12125 CUNEIFORM SIGN GUR -// 12126 CUNEIFORM SIGN GUR7 -// 12127 CUNEIFORM SIGN GURUN -// 12128 CUNEIFORM SIGN GURUSH -// 12129 CUNEIFORM SIGN HA -// 1212a CUNEIFORM SIGN HA TENU -// 1212b CUNEIFORM SIGN HA GUNU -// 1212c CUNEIFORM SIGN HAL -// 1212d CUNEIFORM SIGN HI -// 1212e CUNEIFORM SIGN HI TIMES ASH -// 1212f CUNEIFORM SIGN HI TIMES ASH2 -// 12130 CUNEIFORM SIGN HI TIMES BAD -// 12131 CUNEIFORM SIGN HI TIMES DISH -// 12132 CUNEIFORM SIGN HI TIMES GAD -// 12133 CUNEIFORM SIGN HI TIMES KIN -// 12134 CUNEIFORM SIGN HI TIMES NUN -// 12135 CUNEIFORM SIGN HI TIMES SHE -// 12136 CUNEIFORM SIGN HI TIMES U -// 12137 CUNEIFORM SIGN HU -// 12138 CUNEIFORM SIGN HUB2 -// 12139 CUNEIFORM SIGN HUB2 TIMES AN -// 1213a CUNEIFORM SIGN HUB2 TIMES HAL -// 1213b CUNEIFORM SIGN HUB2 TIMES KASKAL -// 1213c CUNEIFORM SIGN HUB2 TIMES LISH -// 1213d CUNEIFORM SIGN HUB2 TIMES UD -// 1213e CUNEIFORM SIGN HUL2 -// 1213f CUNEIFORM SIGN I -// 12140 CUNEIFORM SIGN I A -// 12141 CUNEIFORM SIGN IB -// 12142 CUNEIFORM SIGN IDIM -// 12143 CUNEIFORM SIGN IDIM OVER IDIM BUR -// 12144 CUNEIFORM SIGN IDIM OVER IDIM SQUARED -// 12145 CUNEIFORM SIGN IG -// 12146 CUNEIFORM SIGN IGI -// 12147 CUNEIFORM SIGN IGI DIB -// 12148 CUNEIFORM SIGN IGI RI -// 12149 CUNEIFORM SIGN IGI OVER IGI SHIR OVER SHIR UD OVER UD -// 1214a CUNEIFORM SIGN IGI GUNU -// 1214b CUNEIFORM SIGN IL -// 1214c CUNEIFORM SIGN IL TIMES GAN2 TENU -// 1214d CUNEIFORM SIGN IL2 -// 1214e CUNEIFORM SIGN IM -// 1214f CUNEIFORM SIGN IM TIMES TAK4 -// 12150 CUNEIFORM SIGN IM CROSSING IM -// 12151 CUNEIFORM SIGN IM OPPOSING IM -// 12152 CUNEIFORM SIGN IM SQUARED -// 12153 CUNEIFORM SIGN IMIN -// 12154 CUNEIFORM SIGN IN -// 12155 CUNEIFORM SIGN IR -// 12156 CUNEIFORM SIGN ISH -// 12157 CUNEIFORM SIGN KA -// 12158 CUNEIFORM SIGN KA TIMES A -// 12159 CUNEIFORM SIGN KA TIMES AD -// 1215a CUNEIFORM SIGN KA TIMES AD PLUS KU3 -// 1215b CUNEIFORM SIGN KA TIMES ASH2 -// 1215c CUNEIFORM SIGN KA TIMES BAD -// 1215d CUNEIFORM SIGN KA TIMES BALAG -// 1215e CUNEIFORM SIGN KA TIMES BAR -// 1215f CUNEIFORM SIGN KA TIMES BI -// 12160 CUNEIFORM SIGN KA TIMES ERIN2 -// 12161 CUNEIFORM SIGN KA TIMES ESH2 -// 12162 CUNEIFORM SIGN KA TIMES GA -// 12163 CUNEIFORM SIGN KA TIMES GAL -// 12164 CUNEIFORM SIGN KA TIMES GAN2 TENU -// 12165 CUNEIFORM SIGN KA TIMES GAR -// 12166 CUNEIFORM SIGN KA TIMES GAR PLUS SHA3 PLUS A -// 12167 CUNEIFORM SIGN KA TIMES GI -// 12168 CUNEIFORM SIGN KA TIMES GIR2 -// 12169 CUNEIFORM SIGN KA TIMES GISH PLUS SAR -// 1216a CUNEIFORM SIGN KA TIMES GISH CROSSING GISH -// 1216b CUNEIFORM SIGN KA TIMES GU -// 1216c CUNEIFORM SIGN KA TIMES GUR7 -// 1216d CUNEIFORM SIGN KA TIMES IGI -// 1216e CUNEIFORM SIGN KA TIMES IM -// 1216f CUNEIFORM SIGN KA TIMES KAK -// 12170 CUNEIFORM SIGN KA TIMES KI -// 12171 CUNEIFORM SIGN KA TIMES KID -// 12172 CUNEIFORM SIGN KA TIMES LI -// 12173 CUNEIFORM SIGN KA TIMES LU -// 12174 CUNEIFORM SIGN KA TIMES ME -// 12175 CUNEIFORM SIGN KA TIMES ME PLUS DU -// 12176 CUNEIFORM SIGN KA TIMES ME PLUS GI -// 12177 CUNEIFORM SIGN KA TIMES ME PLUS TE -// 12178 CUNEIFORM SIGN KA TIMES MI -// 12179 CUNEIFORM SIGN KA TIMES MI PLUS NUNUZ -// 1217a CUNEIFORM SIGN KA TIMES NE -// 1217b CUNEIFORM SIGN KA TIMES NUN -// 1217c CUNEIFORM SIGN KA TIMES PI -// 1217d CUNEIFORM SIGN KA TIMES RU -// 1217e CUNEIFORM SIGN KA TIMES SA -// 1217f CUNEIFORM SIGN KA TIMES SAR -// 12180 CUNEIFORM SIGN KA TIMES SHA -// 12181 CUNEIFORM SIGN KA TIMES SHE -// 12182 CUNEIFORM SIGN KA TIMES SHID -// 12183 CUNEIFORM SIGN KA TIMES SHU -// 12184 CUNEIFORM SIGN KA TIMES SIG -// 12185 CUNEIFORM SIGN KA TIMES SUHUR -// 12186 CUNEIFORM SIGN KA TIMES TAR -// 12187 CUNEIFORM SIGN KA TIMES U -// 12188 CUNEIFORM SIGN KA TIMES U2 -// 12189 CUNEIFORM SIGN KA TIMES UD -// 1218a CUNEIFORM SIGN KA TIMES UMUM TIMES PA -// 1218b CUNEIFORM SIGN KA TIMES USH -// 1218c CUNEIFORM SIGN KA TIMES ZI -// 1218d CUNEIFORM SIGN KA2 -// 1218e CUNEIFORM SIGN KA2 CROSSING KA2 -// 1218f CUNEIFORM SIGN KAB -// 12190 CUNEIFORM SIGN KAD2 -// 12191 CUNEIFORM SIGN KAD3 -// 12192 CUNEIFORM SIGN KAD4 -// 12193 CUNEIFORM SIGN KAD5 -// 12194 CUNEIFORM SIGN KAD5 OVER KAD5 -// 12195 CUNEIFORM SIGN KAK -// 12196 CUNEIFORM SIGN KAK TIMES IGI GUNU -// 12197 CUNEIFORM SIGN KAL -// 12198 CUNEIFORM SIGN KAL TIMES BAD -// 12199 CUNEIFORM SIGN KAL CROSSING KAL -// 1219a CUNEIFORM SIGN KAM2 -// 1219b CUNEIFORM SIGN KAM4 -// 1219c CUNEIFORM SIGN KASKAL -// 1219d CUNEIFORM SIGN KASKAL LAGAB TIMES U OVER LAGAB TIMES U -// 1219e CUNEIFORM SIGN KASKAL OVER KASKAL LAGAB TIMES U OVER LAGAB TIMES U -// 1219f CUNEIFORM SIGN KESH2 -// 121a0 CUNEIFORM SIGN KI -// 121a1 CUNEIFORM SIGN KI TIMES BAD -// 121a2 CUNEIFORM SIGN KI TIMES U -// 121a3 CUNEIFORM SIGN KI TIMES UD -// 121a4 CUNEIFORM SIGN KID -// 121a5 CUNEIFORM SIGN KIN -// 121a6 CUNEIFORM SIGN KISAL -// 121a7 CUNEIFORM SIGN KISH -// 121a8 CUNEIFORM SIGN KISIM5 -// 121a9 CUNEIFORM SIGN KISIM5 OVER KISIM5 -// 121aa CUNEIFORM SIGN KU -// 121ab CUNEIFORM SIGN KU OVER HI TIMES ASH2 KU OVER HI TIMES ASH2 -// 121ac CUNEIFORM SIGN KU3 -// 121ad CUNEIFORM SIGN KU4 -// 121ae CUNEIFORM SIGN KU4 VARIANT FORM -// 121af CUNEIFORM SIGN KU7 -// 121b0 CUNEIFORM SIGN KUL -// 121b1 CUNEIFORM SIGN KUL GUNU -// 121b2 CUNEIFORM SIGN KUN -// 121b3 CUNEIFORM SIGN KUR -// 121b4 CUNEIFORM SIGN KUR OPPOSING KUR -// 121b5 CUNEIFORM SIGN KUSHU2 -// 121b6 CUNEIFORM SIGN KWU318 -// 121b7 CUNEIFORM SIGN LA -// 121b8 CUNEIFORM SIGN LAGAB -// 121b9 CUNEIFORM SIGN LAGAB TIMES A -// 121ba CUNEIFORM SIGN LAGAB TIMES A PLUS DA PLUS HA -// 121bb CUNEIFORM SIGN LAGAB TIMES A PLUS GAR -// 121bc CUNEIFORM SIGN LAGAB TIMES A PLUS LAL -// 121bd CUNEIFORM SIGN LAGAB TIMES AL -// 121be CUNEIFORM SIGN LAGAB TIMES AN -// 121bf CUNEIFORM SIGN LAGAB TIMES ASH ZIDA TENU -// 121c0 CUNEIFORM SIGN LAGAB TIMES BAD -// 121c1 CUNEIFORM SIGN LAGAB TIMES BI -// 121c2 CUNEIFORM SIGN LAGAB TIMES DAR -// 121c3 CUNEIFORM SIGN LAGAB TIMES EN -// 121c4 CUNEIFORM SIGN LAGAB TIMES GA -// 121c5 CUNEIFORM SIGN LAGAB TIMES GAR -// 121c6 CUNEIFORM SIGN LAGAB TIMES GUD -// 121c7 CUNEIFORM SIGN LAGAB TIMES GUD PLUS GUD -// 121c8 CUNEIFORM SIGN LAGAB TIMES HA -// 121c9 CUNEIFORM SIGN LAGAB TIMES HAL -// 121ca CUNEIFORM SIGN LAGAB TIMES HI TIMES NUN -// 121cb CUNEIFORM SIGN LAGAB TIMES IGI GUNU -// 121cc CUNEIFORM SIGN LAGAB TIMES IM -// 121cd CUNEIFORM SIGN LAGAB TIMES IM PLUS HA -// 121ce CUNEIFORM SIGN LAGAB TIMES IM PLUS LU -// 121cf CUNEIFORM SIGN LAGAB TIMES KI -// 121d0 CUNEIFORM SIGN LAGAB TIMES KIN -// 121d1 CUNEIFORM SIGN LAGAB TIMES KU3 -// 121d2 CUNEIFORM SIGN LAGAB TIMES KUL -// 121d3 CUNEIFORM SIGN LAGAB TIMES KUL PLUS HI PLUS A -// 121d4 CUNEIFORM SIGN LAGAB TIMES LAGAB -// 121d5 CUNEIFORM SIGN LAGAB TIMES LISH -// 121d6 CUNEIFORM SIGN LAGAB TIMES LU -// 121d7 CUNEIFORM SIGN LAGAB TIMES LUL -// 121d8 CUNEIFORM SIGN LAGAB TIMES ME -// 121d9 CUNEIFORM SIGN LAGAB TIMES ME PLUS EN -// 121da CUNEIFORM SIGN LAGAB TIMES MUSH -// 121db CUNEIFORM SIGN LAGAB TIMES NE -// 121dc CUNEIFORM SIGN LAGAB TIMES SHE PLUS SUM -// 121dd CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH PLUS ERIN2 -// 121de CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH TENU -// 121df CUNEIFORM SIGN LAGAB TIMES SHU2 -// 121e0 CUNEIFORM SIGN LAGAB TIMES SHU2 PLUS SHU2 -// 121e1 CUNEIFORM SIGN LAGAB TIMES SUM -// 121e2 CUNEIFORM SIGN LAGAB TIMES TAG -// 121e3 CUNEIFORM SIGN LAGAB TIMES TAK4 -// 121e4 CUNEIFORM SIGN LAGAB TIMES TE PLUS A PLUS SU PLUS NA -// 121e5 CUNEIFORM SIGN LAGAB TIMES U -// 121e6 CUNEIFORM SIGN LAGAB TIMES U PLUS A -// 121e7 CUNEIFORM SIGN LAGAB TIMES U PLUS U PLUS U -// 121e8 CUNEIFORM SIGN LAGAB TIMES U2 PLUS ASH -// 121e9 CUNEIFORM SIGN LAGAB TIMES UD -// 121ea CUNEIFORM SIGN LAGAB TIMES USH -// 121eb CUNEIFORM SIGN LAGAB SQUARED -// 121ec CUNEIFORM SIGN LAGAR -// 121ed CUNEIFORM SIGN LAGAR TIMES SHE -// 121ee CUNEIFORM SIGN LAGAR TIMES SHE PLUS SUM -// 121ef CUNEIFORM SIGN LAGAR GUNU -// 121f0 CUNEIFORM SIGN LAGAR GUNU OVER LAGAR GUNU SHE -// 121f1 CUNEIFORM SIGN LAHSHU -// 121f2 CUNEIFORM SIGN LAL -// 121f3 CUNEIFORM SIGN LAL TIMES LAL -// 121f4 CUNEIFORM SIGN LAM -// 121f5 CUNEIFORM SIGN LAM TIMES KUR -// 121f6 CUNEIFORM SIGN LAM TIMES KUR PLUS RU -// 121f7 CUNEIFORM SIGN LI -// 121f8 CUNEIFORM SIGN LIL -// 121f9 CUNEIFORM SIGN LIMMU2 -// 121fa CUNEIFORM SIGN LISH -// 121fb CUNEIFORM SIGN LU -// 121fc CUNEIFORM SIGN LU TIMES BAD -// 121fd CUNEIFORM SIGN LU2 -// 121fe CUNEIFORM SIGN LU2 TIMES AL -// 121ff CUNEIFORM SIGN LU2 TIMES BAD -// 12200 CUNEIFORM SIGN LU2 TIMES ESH2 -// 12201 CUNEIFORM SIGN LU2 TIMES ESH2 TENU -// 12202 CUNEIFORM SIGN LU2 TIMES GAN2 TENU -// 12203 CUNEIFORM SIGN LU2 TIMES HI TIMES BAD -// 12204 CUNEIFORM SIGN LU2 TIMES IM -// 12205 CUNEIFORM SIGN LU2 TIMES KAD2 -// 12206 CUNEIFORM SIGN LU2 TIMES KAD3 -// 12207 CUNEIFORM SIGN LU2 TIMES KAD3 PLUS ASH -// 12208 CUNEIFORM SIGN LU2 TIMES KI -// 12209 CUNEIFORM SIGN LU2 TIMES LA PLUS ASH -// 1220a CUNEIFORM SIGN LU2 TIMES LAGAB -// 1220b CUNEIFORM SIGN LU2 TIMES ME PLUS EN -// 1220c CUNEIFORM SIGN LU2 TIMES NE -// 1220d CUNEIFORM SIGN LU2 TIMES NU -// 1220e CUNEIFORM SIGN LU2 TIMES SI PLUS ASH -// 1220f CUNEIFORM SIGN LU2 TIMES SIK2 PLUS BU -// 12210 CUNEIFORM SIGN LU2 TIMES TUG2 -// 12211 CUNEIFORM SIGN LU2 TENU -// 12212 CUNEIFORM SIGN LU2 CROSSING LU2 -// 12213 CUNEIFORM SIGN LU2 OPPOSING LU2 -// 12214 CUNEIFORM SIGN LU2 SQUARED -// 12215 CUNEIFORM SIGN LU2 SHESHIG -// 12216 CUNEIFORM SIGN LU3 -// 12217 CUNEIFORM SIGN LUGAL -// 12218 CUNEIFORM SIGN LUGAL OVER LUGAL -// 12219 CUNEIFORM SIGN LUGAL OPPOSING LUGAL -// 1221a CUNEIFORM SIGN LUGAL SHESHIG -// 1221b CUNEIFORM SIGN LUH -// 1221c CUNEIFORM SIGN LUL -// 1221d CUNEIFORM SIGN LUM -// 1221e CUNEIFORM SIGN LUM OVER LUM -// 1221f CUNEIFORM SIGN LUM OVER LUM GAR OVER GAR -// 12220 CUNEIFORM SIGN MA -// 12221 CUNEIFORM SIGN MA TIMES TAK4 -// 12222 CUNEIFORM SIGN MA GUNU -// 12223 CUNEIFORM SIGN MA2 -// 12224 CUNEIFORM SIGN MAH -// 12225 CUNEIFORM SIGN MAR -// 12226 CUNEIFORM SIGN MASH -// 12227 CUNEIFORM SIGN MASH2 -// 12228 CUNEIFORM SIGN ME -// 12229 CUNEIFORM SIGN MES -// 1222a CUNEIFORM SIGN MI -// 1222b CUNEIFORM SIGN MIN -// 1222c CUNEIFORM SIGN MU -// 1222d CUNEIFORM SIGN MU OVER MU -// 1222e CUNEIFORM SIGN MUG -// 1222f CUNEIFORM SIGN MUG GUNU -// 12230 CUNEIFORM SIGN MUNSUB -// 12231 CUNEIFORM SIGN MURGU2 -// 12232 CUNEIFORM SIGN MUSH -// 12233 CUNEIFORM SIGN MUSH TIMES A -// 12234 CUNEIFORM SIGN MUSH TIMES KUR -// 12235 CUNEIFORM SIGN MUSH TIMES ZA -// 12236 CUNEIFORM SIGN MUSH OVER MUSH -// 12237 CUNEIFORM SIGN MUSH OVER MUSH TIMES A PLUS NA -// 12238 CUNEIFORM SIGN MUSH CROSSING MUSH -// 12239 CUNEIFORM SIGN MUSH3 -// 1223a CUNEIFORM SIGN MUSH3 TIMES A -// 1223b CUNEIFORM SIGN MUSH3 TIMES A PLUS DI -// 1223c CUNEIFORM SIGN MUSH3 TIMES DI -// 1223d CUNEIFORM SIGN MUSH3 GUNU -// 1223e CUNEIFORM SIGN NA -// 1223f CUNEIFORM SIGN NA2 -// 12240 CUNEIFORM SIGN NAGA -// 12241 CUNEIFORM SIGN NAGA INVERTED -// 12242 CUNEIFORM SIGN NAGA TIMES SHU TENU -// 12243 CUNEIFORM SIGN NAGA OPPOSING NAGA -// 12244 CUNEIFORM SIGN NAGAR -// 12245 CUNEIFORM SIGN NAM NUTILLU -// 12246 CUNEIFORM SIGN NAM -// 12247 CUNEIFORM SIGN NAM2 -// 12248 CUNEIFORM SIGN NE -// 12249 CUNEIFORM SIGN NE TIMES A -// 1224a CUNEIFORM SIGN NE TIMES UD -// 1224b CUNEIFORM SIGN NE SHESHIG -// 1224c CUNEIFORM SIGN NI -// 1224d CUNEIFORM SIGN NI TIMES E -// 1224e CUNEIFORM SIGN NI2 -// 1224f CUNEIFORM SIGN NIM -// 12250 CUNEIFORM SIGN NIM TIMES GAN2 TENU -// 12251 CUNEIFORM SIGN NIM TIMES GAR PLUS GAN2 TENU -// 12252 CUNEIFORM SIGN NINDA2 -// 12253 CUNEIFORM SIGN NINDA2 TIMES AN -// 12254 CUNEIFORM SIGN NINDA2 TIMES ASH -// 12255 CUNEIFORM SIGN NINDA2 TIMES ASH PLUS ASH -// 12256 CUNEIFORM SIGN NINDA2 TIMES GUD -// 12257 CUNEIFORM SIGN NINDA2 TIMES ME PLUS GAN2 TENU -// 12258 CUNEIFORM SIGN NINDA2 TIMES NE -// 12259 CUNEIFORM SIGN NINDA2 TIMES NUN -// 1225a CUNEIFORM SIGN NINDA2 TIMES SHE -// 1225b CUNEIFORM SIGN NINDA2 TIMES SHE PLUS A AN -// 1225c CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH -// 1225d CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH PLUS ASH -// 1225e CUNEIFORM SIGN NINDA2 TIMES U2 PLUS ASH -// 1225f CUNEIFORM SIGN NINDA2 TIMES USH -// 12260 CUNEIFORM SIGN NISAG -// 12261 CUNEIFORM SIGN NU -// 12262 CUNEIFORM SIGN NU11 -// 12263 CUNEIFORM SIGN NUN -// 12264 CUNEIFORM SIGN NUN LAGAR TIMES GAR -// 12265 CUNEIFORM SIGN NUN LAGAR TIMES MASH -// 12266 CUNEIFORM SIGN NUN LAGAR TIMES SAL -// 12267 CUNEIFORM SIGN NUN LAGAR TIMES SAL OVER NUN LAGAR TIMES SAL -// 12268 CUNEIFORM SIGN NUN LAGAR TIMES USH -// 12269 CUNEIFORM SIGN NUN TENU -// 1226a CUNEIFORM SIGN NUN OVER NUN -// 1226b CUNEIFORM SIGN NUN CROSSING NUN -// 1226c CUNEIFORM SIGN NUN CROSSING NUN LAGAR OVER LAGAR -// 1226d CUNEIFORM SIGN NUNUZ -// 1226e CUNEIFORM SIGN NUNUZ AB2 TIMES ASHGAB -// 1226f CUNEIFORM SIGN NUNUZ AB2 TIMES BI -// 12270 CUNEIFORM SIGN NUNUZ AB2 TIMES DUG -// 12271 CUNEIFORM SIGN NUNUZ AB2 TIMES GUD -// 12272 CUNEIFORM SIGN NUNUZ AB2 TIMES IGI GUNU -// 12273 CUNEIFORM SIGN NUNUZ AB2 TIMES KAD3 -// 12274 CUNEIFORM SIGN NUNUZ AB2 TIMES LA -// 12275 CUNEIFORM SIGN NUNUZ AB2 TIMES NE -// 12276 CUNEIFORM SIGN NUNUZ AB2 TIMES SILA3 -// 12277 CUNEIFORM SIGN NUNUZ AB2 TIMES U2 -// 12278 CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI -// 12279 CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI U -// 1227a CUNEIFORM SIGN PA -// 1227b CUNEIFORM SIGN PAD -// 1227c CUNEIFORM SIGN PAN -// 1227d CUNEIFORM SIGN PAP -// 1227e CUNEIFORM SIGN PESH2 -// 1227f CUNEIFORM SIGN PI -// 12280 CUNEIFORM SIGN PI TIMES A -// 12281 CUNEIFORM SIGN PI TIMES AB -// 12282 CUNEIFORM SIGN PI TIMES BI -// 12283 CUNEIFORM SIGN PI TIMES BU -// 12284 CUNEIFORM SIGN PI TIMES E -// 12285 CUNEIFORM SIGN PI TIMES I -// 12286 CUNEIFORM SIGN PI TIMES IB -// 12287 CUNEIFORM SIGN PI TIMES U -// 12288 CUNEIFORM SIGN PI TIMES U2 -// 12289 CUNEIFORM SIGN PI CROSSING PI -// 1228a CUNEIFORM SIGN PIRIG -// 1228b CUNEIFORM SIGN PIRIG TIMES KAL -// 1228c CUNEIFORM SIGN PIRIG TIMES UD -// 1228d CUNEIFORM SIGN PIRIG TIMES ZA -// 1228e CUNEIFORM SIGN PIRIG OPPOSING PIRIG -// 1228f CUNEIFORM SIGN RA -// 12290 CUNEIFORM SIGN RAB -// 12291 CUNEIFORM SIGN RI -// 12292 CUNEIFORM SIGN RU -// 12293 CUNEIFORM SIGN SA -// 12294 CUNEIFORM SIGN SAG NUTILLU -// 12295 CUNEIFORM SIGN SAG -// 12296 CUNEIFORM SIGN SAG TIMES A -// 12297 CUNEIFORM SIGN SAG TIMES DU -// 12298 CUNEIFORM SIGN SAG TIMES DUB -// 12299 CUNEIFORM SIGN SAG TIMES HA -// 1229a CUNEIFORM SIGN SAG TIMES KAK -// 1229b CUNEIFORM SIGN SAG TIMES KUR -// 1229c CUNEIFORM SIGN SAG TIMES LUM -// 1229d CUNEIFORM SIGN SAG TIMES MI -// 1229e CUNEIFORM SIGN SAG TIMES NUN -// 1229f CUNEIFORM SIGN SAG TIMES SAL -// 122a0 CUNEIFORM SIGN SAG TIMES SHID -// 122a1 CUNEIFORM SIGN SAG TIMES TAB -// 122a2 CUNEIFORM SIGN SAG TIMES U2 -// 122a3 CUNEIFORM SIGN SAG TIMES UB -// 122a4 CUNEIFORM SIGN SAG TIMES UM -// 122a5 CUNEIFORM SIGN SAG TIMES UR -// 122a6 CUNEIFORM SIGN SAG TIMES USH -// 122a7 CUNEIFORM SIGN SAG OVER SAG -// 122a8 CUNEIFORM SIGN SAG GUNU -// 122a9 CUNEIFORM SIGN SAL -// 122aa CUNEIFORM SIGN SAL LAGAB TIMES ASH2 -// 122ab CUNEIFORM SIGN SANGA2 -// 122ac CUNEIFORM SIGN SAR -// 122ad CUNEIFORM SIGN SHA -// 122ae CUNEIFORM SIGN SHA3 -// 122af CUNEIFORM SIGN SHA3 TIMES A -// 122b0 CUNEIFORM SIGN SHA3 TIMES BAD -// 122b1 CUNEIFORM SIGN SHA3 TIMES GISH -// 122b2 CUNEIFORM SIGN SHA3 TIMES NE -// 122b3 CUNEIFORM SIGN SHA3 TIMES SHU2 -// 122b4 CUNEIFORM SIGN SHA3 TIMES TUR -// 122b5 CUNEIFORM SIGN SHA3 TIMES U -// 122b6 CUNEIFORM SIGN SHA3 TIMES U PLUS A -// 122b7 CUNEIFORM SIGN SHA6 -// 122b8 CUNEIFORM SIGN SHAB6 -// 122b9 CUNEIFORM SIGN SHAR2 -// 122ba CUNEIFORM SIGN SHE -// 122bb CUNEIFORM SIGN SHE HU -// 122bc CUNEIFORM SIGN SHE OVER SHE GAD OVER GAD GAR OVER GAR -// 122bd CUNEIFORM SIGN SHE OVER SHE TAB OVER TAB GAR OVER GAR -// 122be CUNEIFORM SIGN SHEG9 -// 122bf CUNEIFORM SIGN SHEN -// 122c0 CUNEIFORM SIGN SHESH -// 122c1 CUNEIFORM SIGN SHESH2 -// 122c2 CUNEIFORM SIGN SHESHLAM -// 122c3 CUNEIFORM SIGN SHID -// 122c4 CUNEIFORM SIGN SHID TIMES A -// 122c5 CUNEIFORM SIGN SHID TIMES IM -// 122c6 CUNEIFORM SIGN SHIM -// 122c7 CUNEIFORM SIGN SHIM TIMES A -// 122c8 CUNEIFORM SIGN SHIM TIMES BAL -// 122c9 CUNEIFORM SIGN SHIM TIMES BULUG -// 122ca CUNEIFORM SIGN SHIM TIMES DIN -// 122cb CUNEIFORM SIGN SHIM TIMES GAR -// 122cc CUNEIFORM SIGN SHIM TIMES IGI -// 122cd CUNEIFORM SIGN SHIM TIMES IGI GUNU -// 122ce CUNEIFORM SIGN SHIM TIMES KUSHU2 -// 122cf CUNEIFORM SIGN SHIM TIMES LUL -// 122d0 CUNEIFORM SIGN SHIM TIMES MUG -// 122d1 CUNEIFORM SIGN SHIM TIMES SAL -// 122d2 CUNEIFORM SIGN SHINIG -// 122d3 CUNEIFORM SIGN SHIR -// 122d4 CUNEIFORM SIGN SHIR TENU -// 122d5 CUNEIFORM SIGN SHIR OVER SHIR BUR OVER BUR -// 122d6 CUNEIFORM SIGN SHITA -// 122d7 CUNEIFORM SIGN SHU -// 122d8 CUNEIFORM SIGN SHU OVER INVERTED SHU -// 122d9 CUNEIFORM SIGN SHU2 -// 122da CUNEIFORM SIGN SHUBUR -// 122db CUNEIFORM SIGN SI -// 122dc CUNEIFORM SIGN SI GUNU -// 122dd CUNEIFORM SIGN SIG -// 122de CUNEIFORM SIGN SIG4 -// 122df CUNEIFORM SIGN SIG4 OVER SIG4 SHU2 -// 122e0 CUNEIFORM SIGN SIK2 -// 122e1 CUNEIFORM SIGN SILA3 -// 122e2 CUNEIFORM SIGN SU -// 122e3 CUNEIFORM SIGN SU OVER SU -// 122e4 CUNEIFORM SIGN SUD -// 122e5 CUNEIFORM SIGN SUD2 -// 122e6 CUNEIFORM SIGN SUHUR -// 122e7 CUNEIFORM SIGN SUM -// 122e8 CUNEIFORM SIGN SUMASH -// 122e9 CUNEIFORM SIGN SUR -// 122ea CUNEIFORM SIGN SUR9 -// 122eb CUNEIFORM SIGN TA -// 122ec CUNEIFORM SIGN TA ASTERISK -// 122ed CUNEIFORM SIGN TA TIMES HI -// 122ee CUNEIFORM SIGN TA TIMES MI -// 122ef CUNEIFORM SIGN TA GUNU -// 122f0 CUNEIFORM SIGN TAB -// 122f1 CUNEIFORM SIGN TAB OVER TAB NI OVER NI DISH OVER DISH -// 122f2 CUNEIFORM SIGN TAB SQUARED -// 122f3 CUNEIFORM SIGN TAG -// 122f4 CUNEIFORM SIGN TAG TIMES BI -// 122f5 CUNEIFORM SIGN TAG TIMES GUD -// 122f6 CUNEIFORM SIGN TAG TIMES SHE -// 122f7 CUNEIFORM SIGN TAG TIMES SHU -// 122f8 CUNEIFORM SIGN TAG TIMES TUG2 -// 122f9 CUNEIFORM SIGN TAG TIMES UD -// 122fa CUNEIFORM SIGN TAK4 -// 122fb CUNEIFORM SIGN TAR -// 122fc CUNEIFORM SIGN TE -// 122fd CUNEIFORM SIGN TE GUNU -// 122fe CUNEIFORM SIGN TI -// 122ff CUNEIFORM SIGN TI TENU -// 12300 CUNEIFORM SIGN TIL -// 12301 CUNEIFORM SIGN TIR -// 12302 CUNEIFORM SIGN TIR TIMES TAK4 -// 12303 CUNEIFORM SIGN TIR OVER TIR -// 12304 CUNEIFORM SIGN TIR OVER TIR GAD OVER GAD GAR OVER GAR -// 12305 CUNEIFORM SIGN TU -// 12306 CUNEIFORM SIGN TUG2 -// 12307 CUNEIFORM SIGN TUK -// 12308 CUNEIFORM SIGN TUM -// 12309 CUNEIFORM SIGN TUR -// 1230a CUNEIFORM SIGN TUR OVER TUR ZA OVER ZA -// 1230b CUNEIFORM SIGN U -// 1230c CUNEIFORM SIGN U GUD -// 1230d CUNEIFORM SIGN U U U -// 1230e CUNEIFORM SIGN U OVER U PA OVER PA GAR OVER GAR -// 1230f CUNEIFORM SIGN U OVER U SUR OVER SUR -// 12310 CUNEIFORM SIGN U OVER U U REVERSED OVER U REVERSED -// 12311 CUNEIFORM SIGN U2 -// 12312 CUNEIFORM SIGN UB -// 12313 CUNEIFORM SIGN UD -// 12314 CUNEIFORM SIGN UD KUSHU2 -// 12315 CUNEIFORM SIGN UD TIMES BAD -// 12316 CUNEIFORM SIGN UD TIMES MI -// 12317 CUNEIFORM SIGN UD TIMES U PLUS U PLUS U -// 12318 CUNEIFORM SIGN UD TIMES U PLUS U PLUS U GUNU -// 12319 CUNEIFORM SIGN UD GUNU -// 1231a CUNEIFORM SIGN UD SHESHIG -// 1231b CUNEIFORM SIGN UD SHESHIG TIMES BAD -// 1231c CUNEIFORM SIGN UDUG -// 1231d CUNEIFORM SIGN UM -// 1231e CUNEIFORM SIGN UM TIMES LAGAB -// 1231f CUNEIFORM SIGN UM TIMES ME PLUS DA -// 12320 CUNEIFORM SIGN UM TIMES SHA3 -// 12321 CUNEIFORM SIGN UM TIMES U -// 12322 CUNEIFORM SIGN UMBIN -// 12323 CUNEIFORM SIGN UMUM -// 12324 CUNEIFORM SIGN UMUM TIMES KASKAL -// 12325 CUNEIFORM SIGN UMUM TIMES PA -// 12326 CUNEIFORM SIGN UN -// 12327 CUNEIFORM SIGN UN GUNU -// 12328 CUNEIFORM SIGN UR -// 12329 CUNEIFORM SIGN UR CROSSING UR -// 1232a CUNEIFORM SIGN UR SHESHIG -// 1232b CUNEIFORM SIGN UR2 -// 1232c CUNEIFORM SIGN UR2 TIMES A PLUS HA -// 1232d CUNEIFORM SIGN UR2 TIMES A PLUS NA -// 1232e CUNEIFORM SIGN UR2 TIMES AL -// 1232f CUNEIFORM SIGN UR2 TIMES HA -// 12330 CUNEIFORM SIGN UR2 TIMES NUN -// 12331 CUNEIFORM SIGN UR2 TIMES U2 -// 12332 CUNEIFORM SIGN UR2 TIMES U2 PLUS ASH -// 12333 CUNEIFORM SIGN UR2 TIMES U2 PLUS BI -// 12334 CUNEIFORM SIGN UR4 -// 12335 CUNEIFORM SIGN URI -// 12336 CUNEIFORM SIGN URI3 -// 12337 CUNEIFORM SIGN URU -// 12338 CUNEIFORM SIGN URU TIMES A -// 12339 CUNEIFORM SIGN URU TIMES ASHGAB -// 1233a CUNEIFORM SIGN URU TIMES BAR -// 1233b CUNEIFORM SIGN URU TIMES DUN -// 1233c CUNEIFORM SIGN URU TIMES GA -// 1233d CUNEIFORM SIGN URU TIMES GAL -// 1233e CUNEIFORM SIGN URU TIMES GAN2 TENU -// 1233f CUNEIFORM SIGN URU TIMES GAR -// 12340 CUNEIFORM SIGN URU TIMES GU -// 12341 CUNEIFORM SIGN URU TIMES HA -// 12342 CUNEIFORM SIGN URU TIMES IGI -// 12343 CUNEIFORM SIGN URU TIMES IM -// 12344 CUNEIFORM SIGN URU TIMES ISH -// 12345 CUNEIFORM SIGN URU TIMES KI -// 12346 CUNEIFORM SIGN URU TIMES LUM -// 12347 CUNEIFORM SIGN URU TIMES MIN -// 12348 CUNEIFORM SIGN URU TIMES PA -// 12349 CUNEIFORM SIGN URU TIMES SHE -// 1234a CUNEIFORM SIGN URU TIMES SIG4 -// 1234b CUNEIFORM SIGN URU TIMES TU -// 1234c CUNEIFORM SIGN URU TIMES U PLUS GUD -// 1234d CUNEIFORM SIGN URU TIMES UD -// 1234e CUNEIFORM SIGN URU TIMES URUDA -// 1234f CUNEIFORM SIGN URUDA -// 12350 CUNEIFORM SIGN URUDA TIMES U -// 12351 CUNEIFORM SIGN USH -// 12352 CUNEIFORM SIGN USH TIMES A -// 12353 CUNEIFORM SIGN USH TIMES KU -// 12354 CUNEIFORM SIGN USH TIMES KUR -// 12355 CUNEIFORM SIGN USH TIMES TAK4 -// 12356 CUNEIFORM SIGN USHX -// 12357 CUNEIFORM SIGN USH2 -// 12358 CUNEIFORM SIGN USHUMX -// 12359 CUNEIFORM SIGN UTUKI -// 1235a CUNEIFORM SIGN UZ3 -// 1235b CUNEIFORM SIGN UZ3 TIMES KASKAL -// 1235c CUNEIFORM SIGN UZU -// 1235d CUNEIFORM SIGN ZA -// 1235e CUNEIFORM SIGN ZA TENU -// 1235f CUNEIFORM SIGN ZA SQUARED TIMES KUR -// 12360 CUNEIFORM SIGN ZAG -// 12361 CUNEIFORM SIGN ZAMX -// 12362 CUNEIFORM SIGN ZE2 -// 12363 CUNEIFORM SIGN ZI -// 12364 CUNEIFORM SIGN ZI OVER ZI -// 12365 CUNEIFORM SIGN ZI3 -// 12366 CUNEIFORM SIGN ZIB -// 12367 CUNEIFORM SIGN ZIB KABA TENU -// 12368 CUNEIFORM SIGN ZIG -// 12369 CUNEIFORM SIGN ZIZ2 -// 1236a CUNEIFORM SIGN ZU -// 1236b CUNEIFORM SIGN ZU5 -// 1236c CUNEIFORM SIGN ZU5 TIMES A -// 1236d CUNEIFORM SIGN ZUBUR -// 1236e CUNEIFORM SIGN ZUM -// 1236f CUNEIFORM SIGN KAP ELAMITE -// 12370 CUNEIFORM SIGN AB TIMES NUN -// 12371 CUNEIFORM SIGN AB2 TIMES A -// 12372 CUNEIFORM SIGN AMAR TIMES KUG -// 12373 CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS MASH -// 12374 CUNEIFORM SIGN DAG3 -// 12375 CUNEIFORM SIGN DISH PLUS SHU -// 12376 CUNEIFORM SIGN DUB TIMES SHE -// 12377 CUNEIFORM SIGN EZEN TIMES GUD -// 12378 CUNEIFORM SIGN EZEN TIMES SHE -// 12379 CUNEIFORM SIGN GA2 TIMES AN PLUS KAK PLUS A -// 1237a CUNEIFORM SIGN GA2 TIMES ASH2 -// 1237b CUNEIFORM SIGN GE22 -// 1237c CUNEIFORM SIGN GIG -// 1237d CUNEIFORM SIGN HUSH -// 1237e CUNEIFORM SIGN KA TIMES ANSHE -// 1237f CUNEIFORM SIGN KA TIMES ASH3 -// 12380 CUNEIFORM SIGN KA TIMES GISH -// 12381 CUNEIFORM SIGN KA TIMES GUD -// 12382 CUNEIFORM SIGN KA TIMES HI TIMES ASH2 -// 12383 CUNEIFORM SIGN KA TIMES LUM -// 12384 CUNEIFORM SIGN KA TIMES PA -// 12385 CUNEIFORM SIGN KA TIMES SHUL -// 12386 CUNEIFORM SIGN KA TIMES TU -// 12387 CUNEIFORM SIGN KA TIMES UR2 -// 12388 CUNEIFORM SIGN LAGAB TIMES GI -// 12389 CUNEIFORM SIGN LU2 SHESHIG TIMES BAD -// 1238a CUNEIFORM SIGN LU2 TIMES ESH2 PLUS LAL -// 1238b CUNEIFORM SIGN LU2 TIMES SHU -// 1238c CUNEIFORM SIGN MESH -// 1238d CUNEIFORM SIGN MUSH3 TIMES ZA -// 1238e CUNEIFORM SIGN NA4 -// 1238f CUNEIFORM SIGN NIN -// 12390 CUNEIFORM SIGN NIN9 -// 12391 CUNEIFORM SIGN NINDA2 TIMES BAL -// 12392 CUNEIFORM SIGN NINDA2 TIMES GI -// 12393 CUNEIFORM SIGN NU11 ROTATED NINETY DEGREES -// 12394 CUNEIFORM SIGN PESH2 ASTERISK -// 12395 CUNEIFORM SIGN PIR2 -// 12396 CUNEIFORM SIGN SAG TIMES IGI GUNU -// 12397 CUNEIFORM SIGN TI2 -// 12398 CUNEIFORM SIGN UM TIMES ME - { 0x12000, 0x399, 0x9, 0, 0 }, -// 12400 CUNEIFORM NUMERIC SIGN TWO ASH -// 12401 CUNEIFORM NUMERIC SIGN THREE ASH -// 12402 CUNEIFORM NUMERIC SIGN FOUR ASH -// 12403 CUNEIFORM NUMERIC SIGN FIVE ASH -// 12404 CUNEIFORM NUMERIC SIGN SIX ASH -// 12405 CUNEIFORM NUMERIC SIGN SEVEN ASH -// 12406 CUNEIFORM NUMERIC SIGN EIGHT ASH -// 12407 CUNEIFORM NUMERIC SIGN NINE ASH -// 12408 CUNEIFORM NUMERIC SIGN THREE DISH -// 12409 CUNEIFORM NUMERIC SIGN FOUR DISH -// 1240a CUNEIFORM NUMERIC SIGN FIVE DISH -// 1240b CUNEIFORM NUMERIC SIGN SIX DISH -// 1240c CUNEIFORM NUMERIC SIGN SEVEN DISH -// 1240d CUNEIFORM NUMERIC SIGN EIGHT DISH -// 1240e CUNEIFORM NUMERIC SIGN NINE DISH -// 1240f CUNEIFORM NUMERIC SIGN FOUR U -// 12410 CUNEIFORM NUMERIC SIGN FIVE U -// 12411 CUNEIFORM NUMERIC SIGN SIX U -// 12412 CUNEIFORM NUMERIC SIGN SEVEN U -// 12413 CUNEIFORM NUMERIC SIGN EIGHT U -// 12414 CUNEIFORM NUMERIC SIGN NINE U -// 12415 CUNEIFORM NUMERIC SIGN ONE GESH2 -// 12416 CUNEIFORM NUMERIC SIGN TWO GESH2 -// 12417 CUNEIFORM NUMERIC SIGN THREE GESH2 -// 12418 CUNEIFORM NUMERIC SIGN FOUR GESH2 -// 12419 CUNEIFORM NUMERIC SIGN FIVE GESH2 -// 1241a CUNEIFORM NUMERIC SIGN SIX GESH2 -// 1241b CUNEIFORM NUMERIC SIGN SEVEN GESH2 -// 1241c CUNEIFORM NUMERIC SIGN EIGHT GESH2 -// 1241d CUNEIFORM NUMERIC SIGN NINE GESH2 -// 1241e CUNEIFORM NUMERIC SIGN ONE GESHU -// 1241f CUNEIFORM NUMERIC SIGN TWO GESHU -// 12420 CUNEIFORM NUMERIC SIGN THREE GESHU -// 12421 CUNEIFORM NUMERIC SIGN FOUR GESHU -// 12422 CUNEIFORM NUMERIC SIGN FIVE GESHU -// 12423 CUNEIFORM NUMERIC SIGN TWO SHAR2 -// 12424 CUNEIFORM NUMERIC SIGN THREE SHAR2 -// 12425 CUNEIFORM NUMERIC SIGN THREE SHAR2 VARIANT FORM -// 12426 CUNEIFORM NUMERIC SIGN FOUR SHAR2 -// 12427 CUNEIFORM NUMERIC SIGN FIVE SHAR2 -// 12428 CUNEIFORM NUMERIC SIGN SIX SHAR2 -// 12429 CUNEIFORM NUMERIC SIGN SEVEN SHAR2 -// 1242a CUNEIFORM NUMERIC SIGN EIGHT SHAR2 -// 1242b CUNEIFORM NUMERIC SIGN NINE SHAR2 -// 1242c CUNEIFORM NUMERIC SIGN ONE SHARU -// 1242d CUNEIFORM NUMERIC SIGN TWO SHARU -// 1242e CUNEIFORM NUMERIC SIGN THREE SHARU -// 1242f CUNEIFORM NUMERIC SIGN THREE SHARU VARIANT FORM -// 12430 CUNEIFORM NUMERIC SIGN FOUR SHARU -// 12431 CUNEIFORM NUMERIC SIGN FIVE SHARU -// 12432 CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS DISH -// 12433 CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS MIN -// 12434 CUNEIFORM NUMERIC SIGN ONE BURU -// 12435 CUNEIFORM NUMERIC SIGN TWO BURU -// 12436 CUNEIFORM NUMERIC SIGN THREE BURU -// 12437 CUNEIFORM NUMERIC SIGN THREE BURU VARIANT FORM -// 12438 CUNEIFORM NUMERIC SIGN FOUR BURU -// 12439 CUNEIFORM NUMERIC SIGN FIVE BURU -// 1243a CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH16 -// 1243b CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH21 -// 1243c CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU -// 1243d CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU4 -// 1243e CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU A -// 1243f CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU B -// 12440 CUNEIFORM NUMERIC SIGN SIX VARIANT FORM ASH9 -// 12441 CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN3 -// 12442 CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN A -// 12443 CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN B -// 12444 CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU -// 12445 CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU3 -// 12446 CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU -// 12447 CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU3 -// 12448 CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU4 -// 12449 CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU A -// 1244a CUNEIFORM NUMERIC SIGN TWO ASH TENU -// 1244b CUNEIFORM NUMERIC SIGN THREE ASH TENU -// 1244c CUNEIFORM NUMERIC SIGN FOUR ASH TENU -// 1244d CUNEIFORM NUMERIC SIGN FIVE ASH TENU -// 1244e CUNEIFORM NUMERIC SIGN SIX ASH TENU -// 1244f CUNEIFORM NUMERIC SIGN ONE BAN2 -// 12450 CUNEIFORM NUMERIC SIGN TWO BAN2 -// 12451 CUNEIFORM NUMERIC SIGN THREE BAN2 -// 12452 CUNEIFORM NUMERIC SIGN FOUR BAN2 -// 12453 CUNEIFORM NUMERIC SIGN FOUR BAN2 VARIANT FORM -// 12454 CUNEIFORM NUMERIC SIGN FIVE BAN2 -// 12455 CUNEIFORM NUMERIC SIGN FIVE BAN2 VARIANT FORM -// 12456 CUNEIFORM NUMERIC SIGN NIGIDAMIN -// 12457 CUNEIFORM NUMERIC SIGN NIGIDAESH -// 12458 CUNEIFORM NUMERIC SIGN ONE ESHE3 -// 12459 CUNEIFORM NUMERIC SIGN TWO ESHE3 -// 1245a CUNEIFORM NUMERIC SIGN ONE THIRD DISH -// 1245b CUNEIFORM NUMERIC SIGN TWO THIRDS DISH -// 1245c CUNEIFORM NUMERIC SIGN FIVE SIXTHS DISH -// 1245d CUNEIFORM NUMERIC SIGN ONE THIRD VARIANT FORM A -// 1245e CUNEIFORM NUMERIC SIGN TWO THIRDS VARIANT FORM A -// 1245f CUNEIFORM NUMERIC SIGN ONE EIGHTH ASH -// 12460 CUNEIFORM NUMERIC SIGN ONE QUARTER ASH -// 12461 CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE SIXTH -// 12462 CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER -// 12463 CUNEIFORM NUMERIC SIGN ONE QUARTER GUR -// 12464 CUNEIFORM NUMERIC SIGN ONE HALF GUR -// 12465 CUNEIFORM NUMERIC SIGN ELAMITE ONE THIRD -// 12466 CUNEIFORM NUMERIC SIGN ELAMITE TWO THIRDS -// 12467 CUNEIFORM NUMERIC SIGN ELAMITE FORTY -// 12468 CUNEIFORM NUMERIC SIGN ELAMITE FIFTY -// 12469 CUNEIFORM NUMERIC SIGN FOUR U VARIANT FORM -// 1246a CUNEIFORM NUMERIC SIGN FIVE U VARIANT FORM -// 1246b CUNEIFORM NUMERIC SIGN SIX U VARIANT FORM -// 1246c CUNEIFORM NUMERIC SIGN SEVEN U VARIANT FORM -// 1246d CUNEIFORM NUMERIC SIGN EIGHT U VARIANT FORM -// 1246e CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM - { 0x12400, 0x6F, 0x8, 0, 0 }, -// 12470 CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER -// 12471 CUNEIFORM PUNCTUATION SIGN VERTICAL COLON -// 12472 CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON -// 12473 CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON -// 12474 CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON - { 0x12470, 0x5, 0x18, 0, 0 }, -// 13000 EGYPTIAN HIEROGLYPH A001 -// 13001 EGYPTIAN HIEROGLYPH A002 -// 13002 EGYPTIAN HIEROGLYPH A003 -// 13003 EGYPTIAN HIEROGLYPH A004 -// 13004 EGYPTIAN HIEROGLYPH A005 -// 13005 EGYPTIAN HIEROGLYPH A005A -// 13006 EGYPTIAN HIEROGLYPH A006 -// 13007 EGYPTIAN HIEROGLYPH A006A -// 13008 EGYPTIAN HIEROGLYPH A006B -// 13009 EGYPTIAN HIEROGLYPH A007 -// 1300a EGYPTIAN HIEROGLYPH A008 -// 1300b EGYPTIAN HIEROGLYPH A009 -// 1300c EGYPTIAN HIEROGLYPH A010 -// 1300d EGYPTIAN HIEROGLYPH A011 -// 1300e EGYPTIAN HIEROGLYPH A012 -// 1300f EGYPTIAN HIEROGLYPH A013 -// 13010 EGYPTIAN HIEROGLYPH A014 -// 13011 EGYPTIAN HIEROGLYPH A014A -// 13012 EGYPTIAN HIEROGLYPH A015 -// 13013 EGYPTIAN HIEROGLYPH A016 -// 13014 EGYPTIAN HIEROGLYPH A017 -// 13015 EGYPTIAN HIEROGLYPH A017A -// 13016 EGYPTIAN HIEROGLYPH A018 -// 13017 EGYPTIAN HIEROGLYPH A019 -// 13018 EGYPTIAN HIEROGLYPH A020 -// 13019 EGYPTIAN HIEROGLYPH A021 -// 1301a EGYPTIAN HIEROGLYPH A022 -// 1301b EGYPTIAN HIEROGLYPH A023 -// 1301c EGYPTIAN HIEROGLYPH A024 -// 1301d EGYPTIAN HIEROGLYPH A025 -// 1301e EGYPTIAN HIEROGLYPH A026 -// 1301f EGYPTIAN HIEROGLYPH A027 -// 13020 EGYPTIAN HIEROGLYPH A028 -// 13021 EGYPTIAN HIEROGLYPH A029 -// 13022 EGYPTIAN HIEROGLYPH A030 -// 13023 EGYPTIAN HIEROGLYPH A031 -// 13024 EGYPTIAN HIEROGLYPH A032 -// 13025 EGYPTIAN HIEROGLYPH A032A -// 13026 EGYPTIAN HIEROGLYPH A033 -// 13027 EGYPTIAN HIEROGLYPH A034 -// 13028 EGYPTIAN HIEROGLYPH A035 -// 13029 EGYPTIAN HIEROGLYPH A036 -// 1302a EGYPTIAN HIEROGLYPH A037 -// 1302b EGYPTIAN HIEROGLYPH A038 -// 1302c EGYPTIAN HIEROGLYPH A039 -// 1302d EGYPTIAN HIEROGLYPH A040 -// 1302e EGYPTIAN HIEROGLYPH A040A -// 1302f EGYPTIAN HIEROGLYPH A041 -// 13030 EGYPTIAN HIEROGLYPH A042 -// 13031 EGYPTIAN HIEROGLYPH A042A -// 13032 EGYPTIAN HIEROGLYPH A043 -// 13033 EGYPTIAN HIEROGLYPH A043A -// 13034 EGYPTIAN HIEROGLYPH A044 -// 13035 EGYPTIAN HIEROGLYPH A045 -// 13036 EGYPTIAN HIEROGLYPH A045A -// 13037 EGYPTIAN HIEROGLYPH A046 -// 13038 EGYPTIAN HIEROGLYPH A047 -// 13039 EGYPTIAN HIEROGLYPH A048 -// 1303a EGYPTIAN HIEROGLYPH A049 -// 1303b EGYPTIAN HIEROGLYPH A050 -// 1303c EGYPTIAN HIEROGLYPH A051 -// 1303d EGYPTIAN HIEROGLYPH A052 -// 1303e EGYPTIAN HIEROGLYPH A053 -// 1303f EGYPTIAN HIEROGLYPH A054 -// 13040 EGYPTIAN HIEROGLYPH A055 -// 13041 EGYPTIAN HIEROGLYPH A056 -// 13042 EGYPTIAN HIEROGLYPH A057 -// 13043 EGYPTIAN HIEROGLYPH A058 -// 13044 EGYPTIAN HIEROGLYPH A059 -// 13045 EGYPTIAN HIEROGLYPH A060 -// 13046 EGYPTIAN HIEROGLYPH A061 -// 13047 EGYPTIAN HIEROGLYPH A062 -// 13048 EGYPTIAN HIEROGLYPH A063 -// 13049 EGYPTIAN HIEROGLYPH A064 -// 1304a EGYPTIAN HIEROGLYPH A065 -// 1304b EGYPTIAN HIEROGLYPH A066 -// 1304c EGYPTIAN HIEROGLYPH A067 -// 1304d EGYPTIAN HIEROGLYPH A068 -// 1304e EGYPTIAN HIEROGLYPH A069 -// 1304f EGYPTIAN HIEROGLYPH A070 -// 13050 EGYPTIAN HIEROGLYPH B001 -// 13051 EGYPTIAN HIEROGLYPH B002 -// 13052 EGYPTIAN HIEROGLYPH B003 -// 13053 EGYPTIAN HIEROGLYPH B004 -// 13054 EGYPTIAN HIEROGLYPH B005 -// 13055 EGYPTIAN HIEROGLYPH B005A -// 13056 EGYPTIAN HIEROGLYPH B006 -// 13057 EGYPTIAN HIEROGLYPH B007 -// 13058 EGYPTIAN HIEROGLYPH B008 -// 13059 EGYPTIAN HIEROGLYPH B009 -// 1305a EGYPTIAN HIEROGLYPH C001 -// 1305b EGYPTIAN HIEROGLYPH C002 -// 1305c EGYPTIAN HIEROGLYPH C002A -// 1305d EGYPTIAN HIEROGLYPH C002B -// 1305e EGYPTIAN HIEROGLYPH C002C -// 1305f EGYPTIAN HIEROGLYPH C003 -// 13060 EGYPTIAN HIEROGLYPH C004 -// 13061 EGYPTIAN HIEROGLYPH C005 -// 13062 EGYPTIAN HIEROGLYPH C006 -// 13063 EGYPTIAN HIEROGLYPH C007 -// 13064 EGYPTIAN HIEROGLYPH C008 -// 13065 EGYPTIAN HIEROGLYPH C009 -// 13066 EGYPTIAN HIEROGLYPH C010 -// 13067 EGYPTIAN HIEROGLYPH C010A -// 13068 EGYPTIAN HIEROGLYPH C011 -// 13069 EGYPTIAN HIEROGLYPH C012 -// 1306a EGYPTIAN HIEROGLYPH C013 -// 1306b EGYPTIAN HIEROGLYPH C014 -// 1306c EGYPTIAN HIEROGLYPH C015 -// 1306d EGYPTIAN HIEROGLYPH C016 -// 1306e EGYPTIAN HIEROGLYPH C017 -// 1306f EGYPTIAN HIEROGLYPH C018 -// 13070 EGYPTIAN HIEROGLYPH C019 -// 13071 EGYPTIAN HIEROGLYPH C020 -// 13072 EGYPTIAN HIEROGLYPH C021 -// 13073 EGYPTIAN HIEROGLYPH C022 -// 13074 EGYPTIAN HIEROGLYPH C023 -// 13075 EGYPTIAN HIEROGLYPH C024 -// 13076 EGYPTIAN HIEROGLYPH D001 -// 13077 EGYPTIAN HIEROGLYPH D002 -// 13078 EGYPTIAN HIEROGLYPH D003 -// 13079 EGYPTIAN HIEROGLYPH D004 -// 1307a EGYPTIAN HIEROGLYPH D005 -// 1307b EGYPTIAN HIEROGLYPH D006 -// 1307c EGYPTIAN HIEROGLYPH D007 -// 1307d EGYPTIAN HIEROGLYPH D008 -// 1307e EGYPTIAN HIEROGLYPH D008A -// 1307f EGYPTIAN HIEROGLYPH D009 -// 13080 EGYPTIAN HIEROGLYPH D010 -// 13081 EGYPTIAN HIEROGLYPH D011 -// 13082 EGYPTIAN HIEROGLYPH D012 -// 13083 EGYPTIAN HIEROGLYPH D013 -// 13084 EGYPTIAN HIEROGLYPH D014 -// 13085 EGYPTIAN HIEROGLYPH D015 -// 13086 EGYPTIAN HIEROGLYPH D016 -// 13087 EGYPTIAN HIEROGLYPH D017 -// 13088 EGYPTIAN HIEROGLYPH D018 -// 13089 EGYPTIAN HIEROGLYPH D019 -// 1308a EGYPTIAN HIEROGLYPH D020 -// 1308b EGYPTIAN HIEROGLYPH D021 -// 1308c EGYPTIAN HIEROGLYPH D022 -// 1308d EGYPTIAN HIEROGLYPH D023 -// 1308e EGYPTIAN HIEROGLYPH D024 -// 1308f EGYPTIAN HIEROGLYPH D025 -// 13090 EGYPTIAN HIEROGLYPH D026 -// 13091 EGYPTIAN HIEROGLYPH D027 -// 13092 EGYPTIAN HIEROGLYPH D027A -// 13093 EGYPTIAN HIEROGLYPH D028 -// 13094 EGYPTIAN HIEROGLYPH D029 -// 13095 EGYPTIAN HIEROGLYPH D030 -// 13096 EGYPTIAN HIEROGLYPH D031 -// 13097 EGYPTIAN HIEROGLYPH D031A -// 13098 EGYPTIAN HIEROGLYPH D032 -// 13099 EGYPTIAN HIEROGLYPH D033 -// 1309a EGYPTIAN HIEROGLYPH D034 -// 1309b EGYPTIAN HIEROGLYPH D034A -// 1309c EGYPTIAN HIEROGLYPH D035 -// 1309d EGYPTIAN HIEROGLYPH D036 -// 1309e EGYPTIAN HIEROGLYPH D037 -// 1309f EGYPTIAN HIEROGLYPH D038 -// 130a0 EGYPTIAN HIEROGLYPH D039 -// 130a1 EGYPTIAN HIEROGLYPH D040 -// 130a2 EGYPTIAN HIEROGLYPH D041 -// 130a3 EGYPTIAN HIEROGLYPH D042 -// 130a4 EGYPTIAN HIEROGLYPH D043 -// 130a5 EGYPTIAN HIEROGLYPH D044 -// 130a6 EGYPTIAN HIEROGLYPH D045 -// 130a7 EGYPTIAN HIEROGLYPH D046 -// 130a8 EGYPTIAN HIEROGLYPH D046A -// 130a9 EGYPTIAN HIEROGLYPH D047 -// 130aa EGYPTIAN HIEROGLYPH D048 -// 130ab EGYPTIAN HIEROGLYPH D048A -// 130ac EGYPTIAN HIEROGLYPH D049 -// 130ad EGYPTIAN HIEROGLYPH D050 -// 130ae EGYPTIAN HIEROGLYPH D050A -// 130af EGYPTIAN HIEROGLYPH D050B -// 130b0 EGYPTIAN HIEROGLYPH D050C -// 130b1 EGYPTIAN HIEROGLYPH D050D -// 130b2 EGYPTIAN HIEROGLYPH D050E -// 130b3 EGYPTIAN HIEROGLYPH D050F -// 130b4 EGYPTIAN HIEROGLYPH D050G -// 130b5 EGYPTIAN HIEROGLYPH D050H -// 130b6 EGYPTIAN HIEROGLYPH D050I -// 130b7 EGYPTIAN HIEROGLYPH D051 -// 130b8 EGYPTIAN HIEROGLYPH D052 -// 130b9 EGYPTIAN HIEROGLYPH D052A -// 130ba EGYPTIAN HIEROGLYPH D053 -// 130bb EGYPTIAN HIEROGLYPH D054 -// 130bc EGYPTIAN HIEROGLYPH D054A -// 130bd EGYPTIAN HIEROGLYPH D055 -// 130be EGYPTIAN HIEROGLYPH D056 -// 130bf EGYPTIAN HIEROGLYPH D057 -// 130c0 EGYPTIAN HIEROGLYPH D058 -// 130c1 EGYPTIAN HIEROGLYPH D059 -// 130c2 EGYPTIAN HIEROGLYPH D060 -// 130c3 EGYPTIAN HIEROGLYPH D061 -// 130c4 EGYPTIAN HIEROGLYPH D062 -// 130c5 EGYPTIAN HIEROGLYPH D063 -// 130c6 EGYPTIAN HIEROGLYPH D064 -// 130c7 EGYPTIAN HIEROGLYPH D065 -// 130c8 EGYPTIAN HIEROGLYPH D066 -// 130c9 EGYPTIAN HIEROGLYPH D067 -// 130ca EGYPTIAN HIEROGLYPH D067A -// 130cb EGYPTIAN HIEROGLYPH D067B -// 130cc EGYPTIAN HIEROGLYPH D067C -// 130cd EGYPTIAN HIEROGLYPH D067D -// 130ce EGYPTIAN HIEROGLYPH D067E -// 130cf EGYPTIAN HIEROGLYPH D067F -// 130d0 EGYPTIAN HIEROGLYPH D067G -// 130d1 EGYPTIAN HIEROGLYPH D067H -// 130d2 EGYPTIAN HIEROGLYPH E001 -// 130d3 EGYPTIAN HIEROGLYPH E002 -// 130d4 EGYPTIAN HIEROGLYPH E003 -// 130d5 EGYPTIAN HIEROGLYPH E004 -// 130d6 EGYPTIAN HIEROGLYPH E005 -// 130d7 EGYPTIAN HIEROGLYPH E006 -// 130d8 EGYPTIAN HIEROGLYPH E007 -// 130d9 EGYPTIAN HIEROGLYPH E008 -// 130da EGYPTIAN HIEROGLYPH E008A -// 130db EGYPTIAN HIEROGLYPH E009 -// 130dc EGYPTIAN HIEROGLYPH E009A -// 130dd EGYPTIAN HIEROGLYPH E010 -// 130de EGYPTIAN HIEROGLYPH E011 -// 130df EGYPTIAN HIEROGLYPH E012 -// 130e0 EGYPTIAN HIEROGLYPH E013 -// 130e1 EGYPTIAN HIEROGLYPH E014 -// 130e2 EGYPTIAN HIEROGLYPH E015 -// 130e3 EGYPTIAN HIEROGLYPH E016 -// 130e4 EGYPTIAN HIEROGLYPH E016A -// 130e5 EGYPTIAN HIEROGLYPH E017 -// 130e6 EGYPTIAN HIEROGLYPH E017A -// 130e7 EGYPTIAN HIEROGLYPH E018 -// 130e8 EGYPTIAN HIEROGLYPH E019 -// 130e9 EGYPTIAN HIEROGLYPH E020 -// 130ea EGYPTIAN HIEROGLYPH E020A -// 130eb EGYPTIAN HIEROGLYPH E021 -// 130ec EGYPTIAN HIEROGLYPH E022 -// 130ed EGYPTIAN HIEROGLYPH E023 -// 130ee EGYPTIAN HIEROGLYPH E024 -// 130ef EGYPTIAN HIEROGLYPH E025 -// 130f0 EGYPTIAN HIEROGLYPH E026 -// 130f1 EGYPTIAN HIEROGLYPH E027 -// 130f2 EGYPTIAN HIEROGLYPH E028 -// 130f3 EGYPTIAN HIEROGLYPH E028A -// 130f4 EGYPTIAN HIEROGLYPH E029 -// 130f5 EGYPTIAN HIEROGLYPH E030 -// 130f6 EGYPTIAN HIEROGLYPH E031 -// 130f7 EGYPTIAN HIEROGLYPH E032 -// 130f8 EGYPTIAN HIEROGLYPH E033 -// 130f9 EGYPTIAN HIEROGLYPH E034 -// 130fa EGYPTIAN HIEROGLYPH E034A -// 130fb EGYPTIAN HIEROGLYPH E036 -// 130fc EGYPTIAN HIEROGLYPH E037 -// 130fd EGYPTIAN HIEROGLYPH E038 -// 130fe EGYPTIAN HIEROGLYPH F001 -// 130ff EGYPTIAN HIEROGLYPH F001A -// 13100 EGYPTIAN HIEROGLYPH F002 -// 13101 EGYPTIAN HIEROGLYPH F003 -// 13102 EGYPTIAN HIEROGLYPH F004 -// 13103 EGYPTIAN HIEROGLYPH F005 -// 13104 EGYPTIAN HIEROGLYPH F006 -// 13105 EGYPTIAN HIEROGLYPH F007 -// 13106 EGYPTIAN HIEROGLYPH F008 -// 13107 EGYPTIAN HIEROGLYPH F009 -// 13108 EGYPTIAN HIEROGLYPH F010 -// 13109 EGYPTIAN HIEROGLYPH F011 -// 1310a EGYPTIAN HIEROGLYPH F012 -// 1310b EGYPTIAN HIEROGLYPH F013 -// 1310c EGYPTIAN HIEROGLYPH F013A -// 1310d EGYPTIAN HIEROGLYPH F014 -// 1310e EGYPTIAN HIEROGLYPH F015 -// 1310f EGYPTIAN HIEROGLYPH F016 -// 13110 EGYPTIAN HIEROGLYPH F017 -// 13111 EGYPTIAN HIEROGLYPH F018 -// 13112 EGYPTIAN HIEROGLYPH F019 -// 13113 EGYPTIAN HIEROGLYPH F020 -// 13114 EGYPTIAN HIEROGLYPH F021 -// 13115 EGYPTIAN HIEROGLYPH F021A -// 13116 EGYPTIAN HIEROGLYPH F022 -// 13117 EGYPTIAN HIEROGLYPH F023 -// 13118 EGYPTIAN HIEROGLYPH F024 -// 13119 EGYPTIAN HIEROGLYPH F025 -// 1311a EGYPTIAN HIEROGLYPH F026 -// 1311b EGYPTIAN HIEROGLYPH F027 -// 1311c EGYPTIAN HIEROGLYPH F028 -// 1311d EGYPTIAN HIEROGLYPH F029 -// 1311e EGYPTIAN HIEROGLYPH F030 -// 1311f EGYPTIAN HIEROGLYPH F031 -// 13120 EGYPTIAN HIEROGLYPH F031A -// 13121 EGYPTIAN HIEROGLYPH F032 -// 13122 EGYPTIAN HIEROGLYPH F033 -// 13123 EGYPTIAN HIEROGLYPH F034 -// 13124 EGYPTIAN HIEROGLYPH F035 -// 13125 EGYPTIAN HIEROGLYPH F036 -// 13126 EGYPTIAN HIEROGLYPH F037 -// 13127 EGYPTIAN HIEROGLYPH F037A -// 13128 EGYPTIAN HIEROGLYPH F038 -// 13129 EGYPTIAN HIEROGLYPH F038A -// 1312a EGYPTIAN HIEROGLYPH F039 -// 1312b EGYPTIAN HIEROGLYPH F040 -// 1312c EGYPTIAN HIEROGLYPH F041 -// 1312d EGYPTIAN HIEROGLYPH F042 -// 1312e EGYPTIAN HIEROGLYPH F043 -// 1312f EGYPTIAN HIEROGLYPH F044 -// 13130 EGYPTIAN HIEROGLYPH F045 -// 13131 EGYPTIAN HIEROGLYPH F045A -// 13132 EGYPTIAN HIEROGLYPH F046 -// 13133 EGYPTIAN HIEROGLYPH F046A -// 13134 EGYPTIAN HIEROGLYPH F047 -// 13135 EGYPTIAN HIEROGLYPH F047A -// 13136 EGYPTIAN HIEROGLYPH F048 -// 13137 EGYPTIAN HIEROGLYPH F049 -// 13138 EGYPTIAN HIEROGLYPH F050 -// 13139 EGYPTIAN HIEROGLYPH F051 -// 1313a EGYPTIAN HIEROGLYPH F051A -// 1313b EGYPTIAN HIEROGLYPH F051B -// 1313c EGYPTIAN HIEROGLYPH F051C -// 1313d EGYPTIAN HIEROGLYPH F052 -// 1313e EGYPTIAN HIEROGLYPH F053 -// 1313f EGYPTIAN HIEROGLYPH G001 -// 13140 EGYPTIAN HIEROGLYPH G002 -// 13141 EGYPTIAN HIEROGLYPH G003 -// 13142 EGYPTIAN HIEROGLYPH G004 -// 13143 EGYPTIAN HIEROGLYPH G005 -// 13144 EGYPTIAN HIEROGLYPH G006 -// 13145 EGYPTIAN HIEROGLYPH G006A -// 13146 EGYPTIAN HIEROGLYPH G007 -// 13147 EGYPTIAN HIEROGLYPH G007A -// 13148 EGYPTIAN HIEROGLYPH G007B -// 13149 EGYPTIAN HIEROGLYPH G008 -// 1314a EGYPTIAN HIEROGLYPH G009 -// 1314b EGYPTIAN HIEROGLYPH G010 -// 1314c EGYPTIAN HIEROGLYPH G011 -// 1314d EGYPTIAN HIEROGLYPH G011A -// 1314e EGYPTIAN HIEROGLYPH G012 -// 1314f EGYPTIAN HIEROGLYPH G013 -// 13150 EGYPTIAN HIEROGLYPH G014 -// 13151 EGYPTIAN HIEROGLYPH G015 -// 13152 EGYPTIAN HIEROGLYPH G016 -// 13153 EGYPTIAN HIEROGLYPH G017 -// 13154 EGYPTIAN HIEROGLYPH G018 -// 13155 EGYPTIAN HIEROGLYPH G019 -// 13156 EGYPTIAN HIEROGLYPH G020 -// 13157 EGYPTIAN HIEROGLYPH G020A -// 13158 EGYPTIAN HIEROGLYPH G021 -// 13159 EGYPTIAN HIEROGLYPH G022 -// 1315a EGYPTIAN HIEROGLYPH G023 -// 1315b EGYPTIAN HIEROGLYPH G024 -// 1315c EGYPTIAN HIEROGLYPH G025 -// 1315d EGYPTIAN HIEROGLYPH G026 -// 1315e EGYPTIAN HIEROGLYPH G026A -// 1315f EGYPTIAN HIEROGLYPH G027 -// 13160 EGYPTIAN HIEROGLYPH G028 -// 13161 EGYPTIAN HIEROGLYPH G029 -// 13162 EGYPTIAN HIEROGLYPH G030 -// 13163 EGYPTIAN HIEROGLYPH G031 -// 13164 EGYPTIAN HIEROGLYPH G032 -// 13165 EGYPTIAN HIEROGLYPH G033 -// 13166 EGYPTIAN HIEROGLYPH G034 -// 13167 EGYPTIAN HIEROGLYPH G035 -// 13168 EGYPTIAN HIEROGLYPH G036 -// 13169 EGYPTIAN HIEROGLYPH G036A -// 1316a EGYPTIAN HIEROGLYPH G037 -// 1316b EGYPTIAN HIEROGLYPH G037A -// 1316c EGYPTIAN HIEROGLYPH G038 -// 1316d EGYPTIAN HIEROGLYPH G039 -// 1316e EGYPTIAN HIEROGLYPH G040 -// 1316f EGYPTIAN HIEROGLYPH G041 -// 13170 EGYPTIAN HIEROGLYPH G042 -// 13171 EGYPTIAN HIEROGLYPH G043 -// 13172 EGYPTIAN HIEROGLYPH G043A -// 13173 EGYPTIAN HIEROGLYPH G044 -// 13174 EGYPTIAN HIEROGLYPH G045 -// 13175 EGYPTIAN HIEROGLYPH G045A -// 13176 EGYPTIAN HIEROGLYPH G046 -// 13177 EGYPTIAN HIEROGLYPH G047 -// 13178 EGYPTIAN HIEROGLYPH G048 -// 13179 EGYPTIAN HIEROGLYPH G049 -// 1317a EGYPTIAN HIEROGLYPH G050 -// 1317b EGYPTIAN HIEROGLYPH G051 -// 1317c EGYPTIAN HIEROGLYPH G052 -// 1317d EGYPTIAN HIEROGLYPH G053 -// 1317e EGYPTIAN HIEROGLYPH G054 -// 1317f EGYPTIAN HIEROGLYPH H001 -// 13180 EGYPTIAN HIEROGLYPH H002 -// 13181 EGYPTIAN HIEROGLYPH H003 -// 13182 EGYPTIAN HIEROGLYPH H004 -// 13183 EGYPTIAN HIEROGLYPH H005 -// 13184 EGYPTIAN HIEROGLYPH H006 -// 13185 EGYPTIAN HIEROGLYPH H006A -// 13186 EGYPTIAN HIEROGLYPH H007 -// 13187 EGYPTIAN HIEROGLYPH H008 -// 13188 EGYPTIAN HIEROGLYPH I001 -// 13189 EGYPTIAN HIEROGLYPH I002 -// 1318a EGYPTIAN HIEROGLYPH I003 -// 1318b EGYPTIAN HIEROGLYPH I004 -// 1318c EGYPTIAN HIEROGLYPH I005 -// 1318d EGYPTIAN HIEROGLYPH I005A -// 1318e EGYPTIAN HIEROGLYPH I006 -// 1318f EGYPTIAN HIEROGLYPH I007 -// 13190 EGYPTIAN HIEROGLYPH I008 -// 13191 EGYPTIAN HIEROGLYPH I009 -// 13192 EGYPTIAN HIEROGLYPH I009A -// 13193 EGYPTIAN HIEROGLYPH I010 -// 13194 EGYPTIAN HIEROGLYPH I010A -// 13195 EGYPTIAN HIEROGLYPH I011 -// 13196 EGYPTIAN HIEROGLYPH I011A -// 13197 EGYPTIAN HIEROGLYPH I012 -// 13198 EGYPTIAN HIEROGLYPH I013 -// 13199 EGYPTIAN HIEROGLYPH I014 -// 1319a EGYPTIAN HIEROGLYPH I015 -// 1319b EGYPTIAN HIEROGLYPH K001 -// 1319c EGYPTIAN HIEROGLYPH K002 -// 1319d EGYPTIAN HIEROGLYPH K003 -// 1319e EGYPTIAN HIEROGLYPH K004 -// 1319f EGYPTIAN HIEROGLYPH K005 -// 131a0 EGYPTIAN HIEROGLYPH K006 -// 131a1 EGYPTIAN HIEROGLYPH K007 -// 131a2 EGYPTIAN HIEROGLYPH K008 -// 131a3 EGYPTIAN HIEROGLYPH L001 -// 131a4 EGYPTIAN HIEROGLYPH L002 -// 131a5 EGYPTIAN HIEROGLYPH L002A -// 131a6 EGYPTIAN HIEROGLYPH L003 -// 131a7 EGYPTIAN HIEROGLYPH L004 -// 131a8 EGYPTIAN HIEROGLYPH L005 -// 131a9 EGYPTIAN HIEROGLYPH L006 -// 131aa EGYPTIAN HIEROGLYPH L006A -// 131ab EGYPTIAN HIEROGLYPH L007 -// 131ac EGYPTIAN HIEROGLYPH L008 -// 131ad EGYPTIAN HIEROGLYPH M001 -// 131ae EGYPTIAN HIEROGLYPH M001A -// 131af EGYPTIAN HIEROGLYPH M001B -// 131b0 EGYPTIAN HIEROGLYPH M002 -// 131b1 EGYPTIAN HIEROGLYPH M003 -// 131b2 EGYPTIAN HIEROGLYPH M003A -// 131b3 EGYPTIAN HIEROGLYPH M004 -// 131b4 EGYPTIAN HIEROGLYPH M005 -// 131b5 EGYPTIAN HIEROGLYPH M006 -// 131b6 EGYPTIAN HIEROGLYPH M007 -// 131b7 EGYPTIAN HIEROGLYPH M008 -// 131b8 EGYPTIAN HIEROGLYPH M009 -// 131b9 EGYPTIAN HIEROGLYPH M010 -// 131ba EGYPTIAN HIEROGLYPH M010A -// 131bb EGYPTIAN HIEROGLYPH M011 -// 131bc EGYPTIAN HIEROGLYPH M012 -// 131bd EGYPTIAN HIEROGLYPH M012A -// 131be EGYPTIAN HIEROGLYPH M012B -// 131bf EGYPTIAN HIEROGLYPH M012C -// 131c0 EGYPTIAN HIEROGLYPH M012D -// 131c1 EGYPTIAN HIEROGLYPH M012E -// 131c2 EGYPTIAN HIEROGLYPH M012F -// 131c3 EGYPTIAN HIEROGLYPH M012G -// 131c4 EGYPTIAN HIEROGLYPH M012H -// 131c5 EGYPTIAN HIEROGLYPH M013 -// 131c6 EGYPTIAN HIEROGLYPH M014 -// 131c7 EGYPTIAN HIEROGLYPH M015 -// 131c8 EGYPTIAN HIEROGLYPH M015A -// 131c9 EGYPTIAN HIEROGLYPH M016 -// 131ca EGYPTIAN HIEROGLYPH M016A -// 131cb EGYPTIAN HIEROGLYPH M017 -// 131cc EGYPTIAN HIEROGLYPH M017A -// 131cd EGYPTIAN HIEROGLYPH M018 -// 131ce EGYPTIAN HIEROGLYPH M019 -// 131cf EGYPTIAN HIEROGLYPH M020 -// 131d0 EGYPTIAN HIEROGLYPH M021 -// 131d1 EGYPTIAN HIEROGLYPH M022 -// 131d2 EGYPTIAN HIEROGLYPH M022A -// 131d3 EGYPTIAN HIEROGLYPH M023 -// 131d4 EGYPTIAN HIEROGLYPH M024 -// 131d5 EGYPTIAN HIEROGLYPH M024A -// 131d6 EGYPTIAN HIEROGLYPH M025 -// 131d7 EGYPTIAN HIEROGLYPH M026 -// 131d8 EGYPTIAN HIEROGLYPH M027 -// 131d9 EGYPTIAN HIEROGLYPH M028 -// 131da EGYPTIAN HIEROGLYPH M028A -// 131db EGYPTIAN HIEROGLYPH M029 -// 131dc EGYPTIAN HIEROGLYPH M030 -// 131dd EGYPTIAN HIEROGLYPH M031 -// 131de EGYPTIAN HIEROGLYPH M031A -// 131df EGYPTIAN HIEROGLYPH M032 -// 131e0 EGYPTIAN HIEROGLYPH M033 -// 131e1 EGYPTIAN HIEROGLYPH M033A -// 131e2 EGYPTIAN HIEROGLYPH M033B -// 131e3 EGYPTIAN HIEROGLYPH M034 -// 131e4 EGYPTIAN HIEROGLYPH M035 -// 131e5 EGYPTIAN HIEROGLYPH M036 -// 131e6 EGYPTIAN HIEROGLYPH M037 -// 131e7 EGYPTIAN HIEROGLYPH M038 -// 131e8 EGYPTIAN HIEROGLYPH M039 -// 131e9 EGYPTIAN HIEROGLYPH M040 -// 131ea EGYPTIAN HIEROGLYPH M040A -// 131eb EGYPTIAN HIEROGLYPH M041 -// 131ec EGYPTIAN HIEROGLYPH M042 -// 131ed EGYPTIAN HIEROGLYPH M043 -// 131ee EGYPTIAN HIEROGLYPH M044 -// 131ef EGYPTIAN HIEROGLYPH N001 -// 131f0 EGYPTIAN HIEROGLYPH N002 -// 131f1 EGYPTIAN HIEROGLYPH N003 -// 131f2 EGYPTIAN HIEROGLYPH N004 -// 131f3 EGYPTIAN HIEROGLYPH N005 -// 131f4 EGYPTIAN HIEROGLYPH N006 -// 131f5 EGYPTIAN HIEROGLYPH N007 -// 131f6 EGYPTIAN HIEROGLYPH N008 -// 131f7 EGYPTIAN HIEROGLYPH N009 -// 131f8 EGYPTIAN HIEROGLYPH N010 -// 131f9 EGYPTIAN HIEROGLYPH N011 -// 131fa EGYPTIAN HIEROGLYPH N012 -// 131fb EGYPTIAN HIEROGLYPH N013 -// 131fc EGYPTIAN HIEROGLYPH N014 -// 131fd EGYPTIAN HIEROGLYPH N015 -// 131fe EGYPTIAN HIEROGLYPH N016 -// 131ff EGYPTIAN HIEROGLYPH N017 -// 13200 EGYPTIAN HIEROGLYPH N018 -// 13201 EGYPTIAN HIEROGLYPH N018A -// 13202 EGYPTIAN HIEROGLYPH N018B -// 13203 EGYPTIAN HIEROGLYPH N019 -// 13204 EGYPTIAN HIEROGLYPH N020 -// 13205 EGYPTIAN HIEROGLYPH N021 -// 13206 EGYPTIAN HIEROGLYPH N022 -// 13207 EGYPTIAN HIEROGLYPH N023 -// 13208 EGYPTIAN HIEROGLYPH N024 -// 13209 EGYPTIAN HIEROGLYPH N025 -// 1320a EGYPTIAN HIEROGLYPH N025A -// 1320b EGYPTIAN HIEROGLYPH N026 -// 1320c EGYPTIAN HIEROGLYPH N027 -// 1320d EGYPTIAN HIEROGLYPH N028 -// 1320e EGYPTIAN HIEROGLYPH N029 -// 1320f EGYPTIAN HIEROGLYPH N030 -// 13210 EGYPTIAN HIEROGLYPH N031 -// 13211 EGYPTIAN HIEROGLYPH N032 -// 13212 EGYPTIAN HIEROGLYPH N033 -// 13213 EGYPTIAN HIEROGLYPH N033A -// 13214 EGYPTIAN HIEROGLYPH N034 -// 13215 EGYPTIAN HIEROGLYPH N034A -// 13216 EGYPTIAN HIEROGLYPH N035 -// 13217 EGYPTIAN HIEROGLYPH N035A -// 13218 EGYPTIAN HIEROGLYPH N036 -// 13219 EGYPTIAN HIEROGLYPH N037 -// 1321a EGYPTIAN HIEROGLYPH N037A -// 1321b EGYPTIAN HIEROGLYPH N038 -// 1321c EGYPTIAN HIEROGLYPH N039 -// 1321d EGYPTIAN HIEROGLYPH N040 -// 1321e EGYPTIAN HIEROGLYPH N041 -// 1321f EGYPTIAN HIEROGLYPH N042 -// 13220 EGYPTIAN HIEROGLYPH NL001 -// 13221 EGYPTIAN HIEROGLYPH NL002 -// 13222 EGYPTIAN HIEROGLYPH NL003 -// 13223 EGYPTIAN HIEROGLYPH NL004 -// 13224 EGYPTIAN HIEROGLYPH NL005 -// 13225 EGYPTIAN HIEROGLYPH NL005A -// 13226 EGYPTIAN HIEROGLYPH NL006 -// 13227 EGYPTIAN HIEROGLYPH NL007 -// 13228 EGYPTIAN HIEROGLYPH NL008 -// 13229 EGYPTIAN HIEROGLYPH NL009 -// 1322a EGYPTIAN HIEROGLYPH NL010 -// 1322b EGYPTIAN HIEROGLYPH NL011 -// 1322c EGYPTIAN HIEROGLYPH NL012 -// 1322d EGYPTIAN HIEROGLYPH NL013 -// 1322e EGYPTIAN HIEROGLYPH NL014 -// 1322f EGYPTIAN HIEROGLYPH NL015 -// 13230 EGYPTIAN HIEROGLYPH NL016 -// 13231 EGYPTIAN HIEROGLYPH NL017 -// 13232 EGYPTIAN HIEROGLYPH NL017A -// 13233 EGYPTIAN HIEROGLYPH NL018 -// 13234 EGYPTIAN HIEROGLYPH NL019 -// 13235 EGYPTIAN HIEROGLYPH NL020 -// 13236 EGYPTIAN HIEROGLYPH NU001 -// 13237 EGYPTIAN HIEROGLYPH NU002 -// 13238 EGYPTIAN HIEROGLYPH NU003 -// 13239 EGYPTIAN HIEROGLYPH NU004 -// 1323a EGYPTIAN HIEROGLYPH NU005 -// 1323b EGYPTIAN HIEROGLYPH NU006 -// 1323c EGYPTIAN HIEROGLYPH NU007 -// 1323d EGYPTIAN HIEROGLYPH NU008 -// 1323e EGYPTIAN HIEROGLYPH NU009 -// 1323f EGYPTIAN HIEROGLYPH NU010 -// 13240 EGYPTIAN HIEROGLYPH NU010A -// 13241 EGYPTIAN HIEROGLYPH NU011 -// 13242 EGYPTIAN HIEROGLYPH NU011A -// 13243 EGYPTIAN HIEROGLYPH NU012 -// 13244 EGYPTIAN HIEROGLYPH NU013 -// 13245 EGYPTIAN HIEROGLYPH NU014 -// 13246 EGYPTIAN HIEROGLYPH NU015 -// 13247 EGYPTIAN HIEROGLYPH NU016 -// 13248 EGYPTIAN HIEROGLYPH NU017 -// 13249 EGYPTIAN HIEROGLYPH NU018 -// 1324a EGYPTIAN HIEROGLYPH NU018A -// 1324b EGYPTIAN HIEROGLYPH NU019 -// 1324c EGYPTIAN HIEROGLYPH NU020 -// 1324d EGYPTIAN HIEROGLYPH NU021 -// 1324e EGYPTIAN HIEROGLYPH NU022 -// 1324f EGYPTIAN HIEROGLYPH NU022A -// 13250 EGYPTIAN HIEROGLYPH O001 -// 13251 EGYPTIAN HIEROGLYPH O001A -// 13252 EGYPTIAN HIEROGLYPH O002 -// 13253 EGYPTIAN HIEROGLYPH O003 -// 13254 EGYPTIAN HIEROGLYPH O004 -// 13255 EGYPTIAN HIEROGLYPH O005 -// 13256 EGYPTIAN HIEROGLYPH O005A -// 13257 EGYPTIAN HIEROGLYPH O006 -// 13258 EGYPTIAN HIEROGLYPH O006A -// 13259 EGYPTIAN HIEROGLYPH O006B -// 1325a EGYPTIAN HIEROGLYPH O006C -// 1325b EGYPTIAN HIEROGLYPH O006D -// 1325c EGYPTIAN HIEROGLYPH O006E -// 1325d EGYPTIAN HIEROGLYPH O006F -// 1325e EGYPTIAN HIEROGLYPH O007 -// 1325f EGYPTIAN HIEROGLYPH O008 -// 13260 EGYPTIAN HIEROGLYPH O009 -// 13261 EGYPTIAN HIEROGLYPH O010 -// 13262 EGYPTIAN HIEROGLYPH O010A -// 13263 EGYPTIAN HIEROGLYPH O010B -// 13264 EGYPTIAN HIEROGLYPH O010C -// 13265 EGYPTIAN HIEROGLYPH O011 -// 13266 EGYPTIAN HIEROGLYPH O012 -// 13267 EGYPTIAN HIEROGLYPH O013 -// 13268 EGYPTIAN HIEROGLYPH O014 -// 13269 EGYPTIAN HIEROGLYPH O015 -// 1326a EGYPTIAN HIEROGLYPH O016 -// 1326b EGYPTIAN HIEROGLYPH O017 -// 1326c EGYPTIAN HIEROGLYPH O018 -// 1326d EGYPTIAN HIEROGLYPH O019 -// 1326e EGYPTIAN HIEROGLYPH O019A -// 1326f EGYPTIAN HIEROGLYPH O020 -// 13270 EGYPTIAN HIEROGLYPH O020A -// 13271 EGYPTIAN HIEROGLYPH O021 -// 13272 EGYPTIAN HIEROGLYPH O022 -// 13273 EGYPTIAN HIEROGLYPH O023 -// 13274 EGYPTIAN HIEROGLYPH O024 -// 13275 EGYPTIAN HIEROGLYPH O024A -// 13276 EGYPTIAN HIEROGLYPH O025 -// 13277 EGYPTIAN HIEROGLYPH O025A -// 13278 EGYPTIAN HIEROGLYPH O026 -// 13279 EGYPTIAN HIEROGLYPH O027 -// 1327a EGYPTIAN HIEROGLYPH O028 -// 1327b EGYPTIAN HIEROGLYPH O029 -// 1327c EGYPTIAN HIEROGLYPH O029A -// 1327d EGYPTIAN HIEROGLYPH O030 -// 1327e EGYPTIAN HIEROGLYPH O030A -// 1327f EGYPTIAN HIEROGLYPH O031 -// 13280 EGYPTIAN HIEROGLYPH O032 -// 13281 EGYPTIAN HIEROGLYPH O033 -// 13282 EGYPTIAN HIEROGLYPH O033A -// 13283 EGYPTIAN HIEROGLYPH O034 -// 13284 EGYPTIAN HIEROGLYPH O035 -// 13285 EGYPTIAN HIEROGLYPH O036 -// 13286 EGYPTIAN HIEROGLYPH O036A -// 13287 EGYPTIAN HIEROGLYPH O036B -// 13288 EGYPTIAN HIEROGLYPH O036C -// 13289 EGYPTIAN HIEROGLYPH O036D -// 1328a EGYPTIAN HIEROGLYPH O037 -// 1328b EGYPTIAN HIEROGLYPH O038 -// 1328c EGYPTIAN HIEROGLYPH O039 -// 1328d EGYPTIAN HIEROGLYPH O040 -// 1328e EGYPTIAN HIEROGLYPH O041 -// 1328f EGYPTIAN HIEROGLYPH O042 -// 13290 EGYPTIAN HIEROGLYPH O043 -// 13291 EGYPTIAN HIEROGLYPH O044 -// 13292 EGYPTIAN HIEROGLYPH O045 -// 13293 EGYPTIAN HIEROGLYPH O046 -// 13294 EGYPTIAN HIEROGLYPH O047 -// 13295 EGYPTIAN HIEROGLYPH O048 -// 13296 EGYPTIAN HIEROGLYPH O049 -// 13297 EGYPTIAN HIEROGLYPH O050 -// 13298 EGYPTIAN HIEROGLYPH O050A -// 13299 EGYPTIAN HIEROGLYPH O050B -// 1329a EGYPTIAN HIEROGLYPH O051 -// 1329b EGYPTIAN HIEROGLYPH P001 -// 1329c EGYPTIAN HIEROGLYPH P001A -// 1329d EGYPTIAN HIEROGLYPH P002 -// 1329e EGYPTIAN HIEROGLYPH P003 -// 1329f EGYPTIAN HIEROGLYPH P003A -// 132a0 EGYPTIAN HIEROGLYPH P004 -// 132a1 EGYPTIAN HIEROGLYPH P005 -// 132a2 EGYPTIAN HIEROGLYPH P006 -// 132a3 EGYPTIAN HIEROGLYPH P007 -// 132a4 EGYPTIAN HIEROGLYPH P008 -// 132a5 EGYPTIAN HIEROGLYPH P009 -// 132a6 EGYPTIAN HIEROGLYPH P010 -// 132a7 EGYPTIAN HIEROGLYPH P011 -// 132a8 EGYPTIAN HIEROGLYPH Q001 -// 132a9 EGYPTIAN HIEROGLYPH Q002 -// 132aa EGYPTIAN HIEROGLYPH Q003 -// 132ab EGYPTIAN HIEROGLYPH Q004 -// 132ac EGYPTIAN HIEROGLYPH Q005 -// 132ad EGYPTIAN HIEROGLYPH Q006 -// 132ae EGYPTIAN HIEROGLYPH Q007 -// 132af EGYPTIAN HIEROGLYPH R001 -// 132b0 EGYPTIAN HIEROGLYPH R002 -// 132b1 EGYPTIAN HIEROGLYPH R002A -// 132b2 EGYPTIAN HIEROGLYPH R003 -// 132b3 EGYPTIAN HIEROGLYPH R003A -// 132b4 EGYPTIAN HIEROGLYPH R003B -// 132b5 EGYPTIAN HIEROGLYPH R004 -// 132b6 EGYPTIAN HIEROGLYPH R005 -// 132b7 EGYPTIAN HIEROGLYPH R006 -// 132b8 EGYPTIAN HIEROGLYPH R007 -// 132b9 EGYPTIAN HIEROGLYPH R008 -// 132ba EGYPTIAN HIEROGLYPH R009 -// 132bb EGYPTIAN HIEROGLYPH R010 -// 132bc EGYPTIAN HIEROGLYPH R010A -// 132bd EGYPTIAN HIEROGLYPH R011 -// 132be EGYPTIAN HIEROGLYPH R012 -// 132bf EGYPTIAN HIEROGLYPH R013 -// 132c0 EGYPTIAN HIEROGLYPH R014 -// 132c1 EGYPTIAN HIEROGLYPH R015 -// 132c2 EGYPTIAN HIEROGLYPH R016 -// 132c3 EGYPTIAN HIEROGLYPH R016A -// 132c4 EGYPTIAN HIEROGLYPH R017 -// 132c5 EGYPTIAN HIEROGLYPH R018 -// 132c6 EGYPTIAN HIEROGLYPH R019 -// 132c7 EGYPTIAN HIEROGLYPH R020 -// 132c8 EGYPTIAN HIEROGLYPH R021 -// 132c9 EGYPTIAN HIEROGLYPH R022 -// 132ca EGYPTIAN HIEROGLYPH R023 -// 132cb EGYPTIAN HIEROGLYPH R024 -// 132cc EGYPTIAN HIEROGLYPH R025 -// 132cd EGYPTIAN HIEROGLYPH R026 -// 132ce EGYPTIAN HIEROGLYPH R027 -// 132cf EGYPTIAN HIEROGLYPH R028 -// 132d0 EGYPTIAN HIEROGLYPH R029 -// 132d1 EGYPTIAN HIEROGLYPH S001 -// 132d2 EGYPTIAN HIEROGLYPH S002 -// 132d3 EGYPTIAN HIEROGLYPH S002A -// 132d4 EGYPTIAN HIEROGLYPH S003 -// 132d5 EGYPTIAN HIEROGLYPH S004 -// 132d6 EGYPTIAN HIEROGLYPH S005 -// 132d7 EGYPTIAN HIEROGLYPH S006 -// 132d8 EGYPTIAN HIEROGLYPH S006A -// 132d9 EGYPTIAN HIEROGLYPH S007 -// 132da EGYPTIAN HIEROGLYPH S008 -// 132db EGYPTIAN HIEROGLYPH S009 -// 132dc EGYPTIAN HIEROGLYPH S010 -// 132dd EGYPTIAN HIEROGLYPH S011 -// 132de EGYPTIAN HIEROGLYPH S012 -// 132df EGYPTIAN HIEROGLYPH S013 -// 132e0 EGYPTIAN HIEROGLYPH S014 -// 132e1 EGYPTIAN HIEROGLYPH S014A -// 132e2 EGYPTIAN HIEROGLYPH S014B -// 132e3 EGYPTIAN HIEROGLYPH S015 -// 132e4 EGYPTIAN HIEROGLYPH S016 -// 132e5 EGYPTIAN HIEROGLYPH S017 -// 132e6 EGYPTIAN HIEROGLYPH S017A -// 132e7 EGYPTIAN HIEROGLYPH S018 -// 132e8 EGYPTIAN HIEROGLYPH S019 -// 132e9 EGYPTIAN HIEROGLYPH S020 -// 132ea EGYPTIAN HIEROGLYPH S021 -// 132eb EGYPTIAN HIEROGLYPH S022 -// 132ec EGYPTIAN HIEROGLYPH S023 -// 132ed EGYPTIAN HIEROGLYPH S024 -// 132ee EGYPTIAN HIEROGLYPH S025 -// 132ef EGYPTIAN HIEROGLYPH S026 -// 132f0 EGYPTIAN HIEROGLYPH S026A -// 132f1 EGYPTIAN HIEROGLYPH S026B -// 132f2 EGYPTIAN HIEROGLYPH S027 -// 132f3 EGYPTIAN HIEROGLYPH S028 -// 132f4 EGYPTIAN HIEROGLYPH S029 -// 132f5 EGYPTIAN HIEROGLYPH S030 -// 132f6 EGYPTIAN HIEROGLYPH S031 -// 132f7 EGYPTIAN HIEROGLYPH S032 -// 132f8 EGYPTIAN HIEROGLYPH S033 -// 132f9 EGYPTIAN HIEROGLYPH S034 -// 132fa EGYPTIAN HIEROGLYPH S035 -// 132fb EGYPTIAN HIEROGLYPH S035A -// 132fc EGYPTIAN HIEROGLYPH S036 -// 132fd EGYPTIAN HIEROGLYPH S037 -// 132fe EGYPTIAN HIEROGLYPH S038 -// 132ff EGYPTIAN HIEROGLYPH S039 -// 13300 EGYPTIAN HIEROGLYPH S040 -// 13301 EGYPTIAN HIEROGLYPH S041 -// 13302 EGYPTIAN HIEROGLYPH S042 -// 13303 EGYPTIAN HIEROGLYPH S043 -// 13304 EGYPTIAN HIEROGLYPH S044 -// 13305 EGYPTIAN HIEROGLYPH S045 -// 13306 EGYPTIAN HIEROGLYPH S046 -// 13307 EGYPTIAN HIEROGLYPH T001 -// 13308 EGYPTIAN HIEROGLYPH T002 -// 13309 EGYPTIAN HIEROGLYPH T003 -// 1330a EGYPTIAN HIEROGLYPH T003A -// 1330b EGYPTIAN HIEROGLYPH T004 -// 1330c EGYPTIAN HIEROGLYPH T005 -// 1330d EGYPTIAN HIEROGLYPH T006 -// 1330e EGYPTIAN HIEROGLYPH T007 -// 1330f EGYPTIAN HIEROGLYPH T007A -// 13310 EGYPTIAN HIEROGLYPH T008 -// 13311 EGYPTIAN HIEROGLYPH T008A -// 13312 EGYPTIAN HIEROGLYPH T009 -// 13313 EGYPTIAN HIEROGLYPH T009A -// 13314 EGYPTIAN HIEROGLYPH T010 -// 13315 EGYPTIAN HIEROGLYPH T011 -// 13316 EGYPTIAN HIEROGLYPH T011A -// 13317 EGYPTIAN HIEROGLYPH T012 -// 13318 EGYPTIAN HIEROGLYPH T013 -// 13319 EGYPTIAN HIEROGLYPH T014 -// 1331a EGYPTIAN HIEROGLYPH T015 -// 1331b EGYPTIAN HIEROGLYPH T016 -// 1331c EGYPTIAN HIEROGLYPH T016A -// 1331d EGYPTIAN HIEROGLYPH T017 -// 1331e EGYPTIAN HIEROGLYPH T018 -// 1331f EGYPTIAN HIEROGLYPH T019 -// 13320 EGYPTIAN HIEROGLYPH T020 -// 13321 EGYPTIAN HIEROGLYPH T021 -// 13322 EGYPTIAN HIEROGLYPH T022 -// 13323 EGYPTIAN HIEROGLYPH T023 -// 13324 EGYPTIAN HIEROGLYPH T024 -// 13325 EGYPTIAN HIEROGLYPH T025 -// 13326 EGYPTIAN HIEROGLYPH T026 -// 13327 EGYPTIAN HIEROGLYPH T027 -// 13328 EGYPTIAN HIEROGLYPH T028 -// 13329 EGYPTIAN HIEROGLYPH T029 -// 1332a EGYPTIAN HIEROGLYPH T030 -// 1332b EGYPTIAN HIEROGLYPH T031 -// 1332c EGYPTIAN HIEROGLYPH T032 -// 1332d EGYPTIAN HIEROGLYPH T032A -// 1332e EGYPTIAN HIEROGLYPH T033 -// 1332f EGYPTIAN HIEROGLYPH T033A -// 13330 EGYPTIAN HIEROGLYPH T034 -// 13331 EGYPTIAN HIEROGLYPH T035 -// 13332 EGYPTIAN HIEROGLYPH T036 -// 13333 EGYPTIAN HIEROGLYPH U001 -// 13334 EGYPTIAN HIEROGLYPH U002 -// 13335 EGYPTIAN HIEROGLYPH U003 -// 13336 EGYPTIAN HIEROGLYPH U004 -// 13337 EGYPTIAN HIEROGLYPH U005 -// 13338 EGYPTIAN HIEROGLYPH U006 -// 13339 EGYPTIAN HIEROGLYPH U006A -// 1333a EGYPTIAN HIEROGLYPH U006B -// 1333b EGYPTIAN HIEROGLYPH U007 -// 1333c EGYPTIAN HIEROGLYPH U008 -// 1333d EGYPTIAN HIEROGLYPH U009 -// 1333e EGYPTIAN HIEROGLYPH U010 -// 1333f EGYPTIAN HIEROGLYPH U011 -// 13340 EGYPTIAN HIEROGLYPH U012 -// 13341 EGYPTIAN HIEROGLYPH U013 -// 13342 EGYPTIAN HIEROGLYPH U014 -// 13343 EGYPTIAN HIEROGLYPH U015 -// 13344 EGYPTIAN HIEROGLYPH U016 -// 13345 EGYPTIAN HIEROGLYPH U017 -// 13346 EGYPTIAN HIEROGLYPH U018 -// 13347 EGYPTIAN HIEROGLYPH U019 -// 13348 EGYPTIAN HIEROGLYPH U020 -// 13349 EGYPTIAN HIEROGLYPH U021 -// 1334a EGYPTIAN HIEROGLYPH U022 -// 1334b EGYPTIAN HIEROGLYPH U023 -// 1334c EGYPTIAN HIEROGLYPH U023A -// 1334d EGYPTIAN HIEROGLYPH U024 -// 1334e EGYPTIAN HIEROGLYPH U025 -// 1334f EGYPTIAN HIEROGLYPH U026 -// 13350 EGYPTIAN HIEROGLYPH U027 -// 13351 EGYPTIAN HIEROGLYPH U028 -// 13352 EGYPTIAN HIEROGLYPH U029 -// 13353 EGYPTIAN HIEROGLYPH U029A -// 13354 EGYPTIAN HIEROGLYPH U030 -// 13355 EGYPTIAN HIEROGLYPH U031 -// 13356 EGYPTIAN HIEROGLYPH U032 -// 13357 EGYPTIAN HIEROGLYPH U032A -// 13358 EGYPTIAN HIEROGLYPH U033 -// 13359 EGYPTIAN HIEROGLYPH U034 -// 1335a EGYPTIAN HIEROGLYPH U035 -// 1335b EGYPTIAN HIEROGLYPH U036 -// 1335c EGYPTIAN HIEROGLYPH U037 -// 1335d EGYPTIAN HIEROGLYPH U038 -// 1335e EGYPTIAN HIEROGLYPH U039 -// 1335f EGYPTIAN HIEROGLYPH U040 -// 13360 EGYPTIAN HIEROGLYPH U041 -// 13361 EGYPTIAN HIEROGLYPH U042 -// 13362 EGYPTIAN HIEROGLYPH V001 -// 13363 EGYPTIAN HIEROGLYPH V001A -// 13364 EGYPTIAN HIEROGLYPH V001B -// 13365 EGYPTIAN HIEROGLYPH V001C -// 13366 EGYPTIAN HIEROGLYPH V001D -// 13367 EGYPTIAN HIEROGLYPH V001E -// 13368 EGYPTIAN HIEROGLYPH V001F -// 13369 EGYPTIAN HIEROGLYPH V001G -// 1336a EGYPTIAN HIEROGLYPH V001H -// 1336b EGYPTIAN HIEROGLYPH V001I -// 1336c EGYPTIAN HIEROGLYPH V002 -// 1336d EGYPTIAN HIEROGLYPH V002A -// 1336e EGYPTIAN HIEROGLYPH V003 -// 1336f EGYPTIAN HIEROGLYPH V004 -// 13370 EGYPTIAN HIEROGLYPH V005 -// 13371 EGYPTIAN HIEROGLYPH V006 -// 13372 EGYPTIAN HIEROGLYPH V007 -// 13373 EGYPTIAN HIEROGLYPH V007A -// 13374 EGYPTIAN HIEROGLYPH V007B -// 13375 EGYPTIAN HIEROGLYPH V008 -// 13376 EGYPTIAN HIEROGLYPH V009 -// 13377 EGYPTIAN HIEROGLYPH V010 -// 13378 EGYPTIAN HIEROGLYPH V011 -// 13379 EGYPTIAN HIEROGLYPH V011A -// 1337a EGYPTIAN HIEROGLYPH V011B -// 1337b EGYPTIAN HIEROGLYPH V011C -// 1337c EGYPTIAN HIEROGLYPH V012 -// 1337d EGYPTIAN HIEROGLYPH V012A -// 1337e EGYPTIAN HIEROGLYPH V012B -// 1337f EGYPTIAN HIEROGLYPH V013 -// 13380 EGYPTIAN HIEROGLYPH V014 -// 13381 EGYPTIAN HIEROGLYPH V015 -// 13382 EGYPTIAN HIEROGLYPH V016 -// 13383 EGYPTIAN HIEROGLYPH V017 -// 13384 EGYPTIAN HIEROGLYPH V018 -// 13385 EGYPTIAN HIEROGLYPH V019 -// 13386 EGYPTIAN HIEROGLYPH V020 -// 13387 EGYPTIAN HIEROGLYPH V020A -// 13388 EGYPTIAN HIEROGLYPH V020B -// 13389 EGYPTIAN HIEROGLYPH V020C -// 1338a EGYPTIAN HIEROGLYPH V020D -// 1338b EGYPTIAN HIEROGLYPH V020E -// 1338c EGYPTIAN HIEROGLYPH V020F -// 1338d EGYPTIAN HIEROGLYPH V020G -// 1338e EGYPTIAN HIEROGLYPH V020H -// 1338f EGYPTIAN HIEROGLYPH V020I -// 13390 EGYPTIAN HIEROGLYPH V020J -// 13391 EGYPTIAN HIEROGLYPH V020K -// 13392 EGYPTIAN HIEROGLYPH V020L -// 13393 EGYPTIAN HIEROGLYPH V021 -// 13394 EGYPTIAN HIEROGLYPH V022 -// 13395 EGYPTIAN HIEROGLYPH V023 -// 13396 EGYPTIAN HIEROGLYPH V023A -// 13397 EGYPTIAN HIEROGLYPH V024 -// 13398 EGYPTIAN HIEROGLYPH V025 -// 13399 EGYPTIAN HIEROGLYPH V026 -// 1339a EGYPTIAN HIEROGLYPH V027 -// 1339b EGYPTIAN HIEROGLYPH V028 -// 1339c EGYPTIAN HIEROGLYPH V028A -// 1339d EGYPTIAN HIEROGLYPH V029 -// 1339e EGYPTIAN HIEROGLYPH V029A -// 1339f EGYPTIAN HIEROGLYPH V030 -// 133a0 EGYPTIAN HIEROGLYPH V030A -// 133a1 EGYPTIAN HIEROGLYPH V031 -// 133a2 EGYPTIAN HIEROGLYPH V031A -// 133a3 EGYPTIAN HIEROGLYPH V032 -// 133a4 EGYPTIAN HIEROGLYPH V033 -// 133a5 EGYPTIAN HIEROGLYPH V033A -// 133a6 EGYPTIAN HIEROGLYPH V034 -// 133a7 EGYPTIAN HIEROGLYPH V035 -// 133a8 EGYPTIAN HIEROGLYPH V036 -// 133a9 EGYPTIAN HIEROGLYPH V037 -// 133aa EGYPTIAN HIEROGLYPH V037A -// 133ab EGYPTIAN HIEROGLYPH V038 -// 133ac EGYPTIAN HIEROGLYPH V039 -// 133ad EGYPTIAN HIEROGLYPH V040 -// 133ae EGYPTIAN HIEROGLYPH V040A -// 133af EGYPTIAN HIEROGLYPH W001 -// 133b0 EGYPTIAN HIEROGLYPH W002 -// 133b1 EGYPTIAN HIEROGLYPH W003 -// 133b2 EGYPTIAN HIEROGLYPH W003A -// 133b3 EGYPTIAN HIEROGLYPH W004 -// 133b4 EGYPTIAN HIEROGLYPH W005 -// 133b5 EGYPTIAN HIEROGLYPH W006 -// 133b6 EGYPTIAN HIEROGLYPH W007 -// 133b7 EGYPTIAN HIEROGLYPH W008 -// 133b8 EGYPTIAN HIEROGLYPH W009 -// 133b9 EGYPTIAN HIEROGLYPH W009A -// 133ba EGYPTIAN HIEROGLYPH W010 -// 133bb EGYPTIAN HIEROGLYPH W010A -// 133bc EGYPTIAN HIEROGLYPH W011 -// 133bd EGYPTIAN HIEROGLYPH W012 -// 133be EGYPTIAN HIEROGLYPH W013 -// 133bf EGYPTIAN HIEROGLYPH W014 -// 133c0 EGYPTIAN HIEROGLYPH W014A -// 133c1 EGYPTIAN HIEROGLYPH W015 -// 133c2 EGYPTIAN HIEROGLYPH W016 -// 133c3 EGYPTIAN HIEROGLYPH W017 -// 133c4 EGYPTIAN HIEROGLYPH W017A -// 133c5 EGYPTIAN HIEROGLYPH W018 -// 133c6 EGYPTIAN HIEROGLYPH W018A -// 133c7 EGYPTIAN HIEROGLYPH W019 -// 133c8 EGYPTIAN HIEROGLYPH W020 -// 133c9 EGYPTIAN HIEROGLYPH W021 -// 133ca EGYPTIAN HIEROGLYPH W022 -// 133cb EGYPTIAN HIEROGLYPH W023 -// 133cc EGYPTIAN HIEROGLYPH W024 -// 133cd EGYPTIAN HIEROGLYPH W024A -// 133ce EGYPTIAN HIEROGLYPH W025 -// 133cf EGYPTIAN HIEROGLYPH X001 -// 133d0 EGYPTIAN HIEROGLYPH X002 -// 133d1 EGYPTIAN HIEROGLYPH X003 -// 133d2 EGYPTIAN HIEROGLYPH X004 -// 133d3 EGYPTIAN HIEROGLYPH X004A -// 133d4 EGYPTIAN HIEROGLYPH X004B -// 133d5 EGYPTIAN HIEROGLYPH X005 -// 133d6 EGYPTIAN HIEROGLYPH X006 -// 133d7 EGYPTIAN HIEROGLYPH X006A -// 133d8 EGYPTIAN HIEROGLYPH X007 -// 133d9 EGYPTIAN HIEROGLYPH X008 -// 133da EGYPTIAN HIEROGLYPH X008A -// 133db EGYPTIAN HIEROGLYPH Y001 -// 133dc EGYPTIAN HIEROGLYPH Y001A -// 133dd EGYPTIAN HIEROGLYPH Y002 -// 133de EGYPTIAN HIEROGLYPH Y003 -// 133df EGYPTIAN HIEROGLYPH Y004 -// 133e0 EGYPTIAN HIEROGLYPH Y005 -// 133e1 EGYPTIAN HIEROGLYPH Y006 -// 133e2 EGYPTIAN HIEROGLYPH Y007 -// 133e3 EGYPTIAN HIEROGLYPH Y008 -// 133e4 EGYPTIAN HIEROGLYPH Z001 -// 133e5 EGYPTIAN HIEROGLYPH Z002 -// 133e6 EGYPTIAN HIEROGLYPH Z002A -// 133e7 EGYPTIAN HIEROGLYPH Z002B -// 133e8 EGYPTIAN HIEROGLYPH Z002C -// 133e9 EGYPTIAN HIEROGLYPH Z002D -// 133ea EGYPTIAN HIEROGLYPH Z003 -// 133eb EGYPTIAN HIEROGLYPH Z003A -// 133ec EGYPTIAN HIEROGLYPH Z003B -// 133ed EGYPTIAN HIEROGLYPH Z004 -// 133ee EGYPTIAN HIEROGLYPH Z004A -// 133ef EGYPTIAN HIEROGLYPH Z005 -// 133f0 EGYPTIAN HIEROGLYPH Z005A -// 133f1 EGYPTIAN HIEROGLYPH Z006 -// 133f2 EGYPTIAN HIEROGLYPH Z007 -// 133f3 EGYPTIAN HIEROGLYPH Z008 -// 133f4 EGYPTIAN HIEROGLYPH Z009 -// 133f5 EGYPTIAN HIEROGLYPH Z010 -// 133f6 EGYPTIAN HIEROGLYPH Z011 -// 133f7 EGYPTIAN HIEROGLYPH Z012 -// 133f8 EGYPTIAN HIEROGLYPH Z013 -// 133f9 EGYPTIAN HIEROGLYPH Z014 -// 133fa EGYPTIAN HIEROGLYPH Z015 -// 133fb EGYPTIAN HIEROGLYPH Z015A -// 133fc EGYPTIAN HIEROGLYPH Z015B -// 133fd EGYPTIAN HIEROGLYPH Z015C -// 133fe EGYPTIAN HIEROGLYPH Z015D -// 133ff EGYPTIAN HIEROGLYPH Z015E -// 13400 EGYPTIAN HIEROGLYPH Z015F -// 13401 EGYPTIAN HIEROGLYPH Z015G -// 13402 EGYPTIAN HIEROGLYPH Z015H -// 13403 EGYPTIAN HIEROGLYPH Z015I -// 13404 EGYPTIAN HIEROGLYPH Z016 -// 13405 EGYPTIAN HIEROGLYPH Z016A -// 13406 EGYPTIAN HIEROGLYPH Z016B -// 13407 EGYPTIAN HIEROGLYPH Z016C -// 13408 EGYPTIAN HIEROGLYPH Z016D -// 13409 EGYPTIAN HIEROGLYPH Z016E -// 1340a EGYPTIAN HIEROGLYPH Z016F -// 1340b EGYPTIAN HIEROGLYPH Z016G -// 1340c EGYPTIAN HIEROGLYPH Z016H -// 1340d EGYPTIAN HIEROGLYPH AA001 -// 1340e EGYPTIAN HIEROGLYPH AA002 -// 1340f EGYPTIAN HIEROGLYPH AA003 -// 13410 EGYPTIAN HIEROGLYPH AA004 -// 13411 EGYPTIAN HIEROGLYPH AA005 -// 13412 EGYPTIAN HIEROGLYPH AA006 -// 13413 EGYPTIAN HIEROGLYPH AA007 -// 13414 EGYPTIAN HIEROGLYPH AA007A -// 13415 EGYPTIAN HIEROGLYPH AA007B -// 13416 EGYPTIAN HIEROGLYPH AA008 -// 13417 EGYPTIAN HIEROGLYPH AA009 -// 13418 EGYPTIAN HIEROGLYPH AA010 -// 13419 EGYPTIAN HIEROGLYPH AA011 -// 1341a EGYPTIAN HIEROGLYPH AA012 -// 1341b EGYPTIAN HIEROGLYPH AA013 -// 1341c EGYPTIAN HIEROGLYPH AA014 -// 1341d EGYPTIAN HIEROGLYPH AA015 -// 1341e EGYPTIAN HIEROGLYPH AA016 -// 1341f EGYPTIAN HIEROGLYPH AA017 -// 13420 EGYPTIAN HIEROGLYPH AA018 -// 13421 EGYPTIAN HIEROGLYPH AA019 -// 13422 EGYPTIAN HIEROGLYPH AA020 -// 13423 EGYPTIAN HIEROGLYPH AA021 -// 13424 EGYPTIAN HIEROGLYPH AA022 -// 13425 EGYPTIAN HIEROGLYPH AA023 -// 13426 EGYPTIAN HIEROGLYPH AA024 -// 13427 EGYPTIAN HIEROGLYPH AA025 -// 13428 EGYPTIAN HIEROGLYPH AA026 -// 13429 EGYPTIAN HIEROGLYPH AA027 -// 1342a EGYPTIAN HIEROGLYPH AA028 -// 1342b EGYPTIAN HIEROGLYPH AA029 -// 1342c EGYPTIAN HIEROGLYPH AA030 -// 1342d EGYPTIAN HIEROGLYPH AA031 -// 1342e EGYPTIAN HIEROGLYPH AA032 - { 0x13000, 0x42F, 0x9, 0, 0 }, -// 16800 BAMUM LETTER PHASE-A NGKUE MFON -// 16801 BAMUM LETTER PHASE-A GBIEE FON -// 16802 BAMUM LETTER PHASE-A PON MFON PIPAEMGBIEE -// 16803 BAMUM LETTER PHASE-A PON MFON PIPAEMBA -// 16804 BAMUM LETTER PHASE-A NAA MFON -// 16805 BAMUM LETTER PHASE-A SHUENSHUET -// 16806 BAMUM LETTER PHASE-A TITA MFON -// 16807 BAMUM LETTER PHASE-A NZA MFON -// 16808 BAMUM LETTER PHASE-A SHINDA PA NJI -// 16809 BAMUM LETTER PHASE-A PON PA NJI PIPAEMGBIEE -// 1680a BAMUM LETTER PHASE-A PON PA NJI PIPAEMBA -// 1680b BAMUM LETTER PHASE-A MAEMBGBIEE -// 1680c BAMUM LETTER PHASE-A TU MAEMBA -// 1680d BAMUM LETTER PHASE-A NGANGU -// 1680e BAMUM LETTER PHASE-A MAEMVEUX -// 1680f BAMUM LETTER PHASE-A MANSUAE -// 16810 BAMUM LETTER PHASE-A MVEUAENGAM -// 16811 BAMUM LETTER PHASE-A SEUNYAM -// 16812 BAMUM LETTER PHASE-A NTOQPEN -// 16813 BAMUM LETTER PHASE-A KEUKEUTNDA -// 16814 BAMUM LETTER PHASE-A NKINDI -// 16815 BAMUM LETTER PHASE-A SUU -// 16816 BAMUM LETTER PHASE-A NGKUENZEUM -// 16817 BAMUM LETTER PHASE-A LAPAQ -// 16818 BAMUM LETTER PHASE-A LET KUT -// 16819 BAMUM LETTER PHASE-A NTAP MFAA -// 1681a BAMUM LETTER PHASE-A MAEKEUP -// 1681b BAMUM LETTER PHASE-A PASHAE -// 1681c BAMUM LETTER PHASE-A GHEUAERAE -// 1681d BAMUM LETTER PHASE-A PAMSHAE -// 1681e BAMUM LETTER PHASE-A MON NGGEUAET -// 1681f BAMUM LETTER PHASE-A NZUN MEUT -// 16820 BAMUM LETTER PHASE-A U YUQ NAE -// 16821 BAMUM LETTER PHASE-A GHEUAEGHEUAE -// 16822 BAMUM LETTER PHASE-A NTAP NTAA -// 16823 BAMUM LETTER PHASE-A SISA -// 16824 BAMUM LETTER PHASE-A MGBASA -// 16825 BAMUM LETTER PHASE-A MEUNJOMNDEUQ -// 16826 BAMUM LETTER PHASE-A MOOMPUQ -// 16827 BAMUM LETTER PHASE-A KAFA -// 16828 BAMUM LETTER PHASE-A PA LEERAEWA -// 16829 BAMUM LETTER PHASE-A NDA LEERAEWA -// 1682a BAMUM LETTER PHASE-A PET -// 1682b BAMUM LETTER PHASE-A MAEMKPEN -// 1682c BAMUM LETTER PHASE-A NIKA -// 1682d BAMUM LETTER PHASE-A PUP -// 1682e BAMUM LETTER PHASE-A TUAEP -// 1682f BAMUM LETTER PHASE-A LUAEP -// 16830 BAMUM LETTER PHASE-A SONJAM -// 16831 BAMUM LETTER PHASE-A TEUTEUWEN -// 16832 BAMUM LETTER PHASE-A MAENYI -// 16833 BAMUM LETTER PHASE-A KET -// 16834 BAMUM LETTER PHASE-A NDAANGGEUAET -// 16835 BAMUM LETTER PHASE-A KUOQ -// 16836 BAMUM LETTER PHASE-A MOOMEUT -// 16837 BAMUM LETTER PHASE-A SHUM -// 16838 BAMUM LETTER PHASE-A LOMMAE -// 16839 BAMUM LETTER PHASE-A FIRI -// 1683a BAMUM LETTER PHASE-A ROM -// 1683b BAMUM LETTER PHASE-A KPOQ -// 1683c BAMUM LETTER PHASE-A SOQ -// 1683d BAMUM LETTER PHASE-A MAP PIEET -// 1683e BAMUM LETTER PHASE-A SHIRAE -// 1683f BAMUM LETTER PHASE-A NTAP -// 16840 BAMUM LETTER PHASE-A SHOQ NSHUT YUM -// 16841 BAMUM LETTER PHASE-A NYIT MONGKEUAEQ -// 16842 BAMUM LETTER PHASE-A PAARAE -// 16843 BAMUM LETTER PHASE-A NKAARAE -// 16844 BAMUM LETTER PHASE-A UNKNOWN -// 16845 BAMUM LETTER PHASE-A NGGEN -// 16846 BAMUM LETTER PHASE-A MAESI -// 16847 BAMUM LETTER PHASE-A NJAM -// 16848 BAMUM LETTER PHASE-A MBANYI -// 16849 BAMUM LETTER PHASE-A NYET -// 1684a BAMUM LETTER PHASE-A TEUAEN -// 1684b BAMUM LETTER PHASE-A SOT -// 1684c BAMUM LETTER PHASE-A PAAM -// 1684d BAMUM LETTER PHASE-A NSHIEE -// 1684e BAMUM LETTER PHASE-A MAEM -// 1684f BAMUM LETTER PHASE-A NYI -// 16850 BAMUM LETTER PHASE-A KAQ -// 16851 BAMUM LETTER PHASE-A NSHA -// 16852 BAMUM LETTER PHASE-A VEE -// 16853 BAMUM LETTER PHASE-A LU -// 16854 BAMUM LETTER PHASE-A NEN -// 16855 BAMUM LETTER PHASE-A NAQ -// 16856 BAMUM LETTER PHASE-A MBAQ -// 16857 BAMUM LETTER PHASE-B NSHUET -// 16858 BAMUM LETTER PHASE-B TU MAEMGBIEE -// 16859 BAMUM LETTER PHASE-B SIEE -// 1685a BAMUM LETTER PHASE-B SET TU -// 1685b BAMUM LETTER PHASE-B LOM NTEUM -// 1685c BAMUM LETTER PHASE-B MBA MAELEE -// 1685d BAMUM LETTER PHASE-B KIEEM -// 1685e BAMUM LETTER PHASE-B YEURAE -// 1685f BAMUM LETTER PHASE-B MBAARAE -// 16860 BAMUM LETTER PHASE-B KAM -// 16861 BAMUM LETTER PHASE-B PEESHI -// 16862 BAMUM LETTER PHASE-B YAFU LEERAEWA -// 16863 BAMUM LETTER PHASE-B LAM NSHUT NYAM -// 16864 BAMUM LETTER PHASE-B NTIEE SHEUOQ -// 16865 BAMUM LETTER PHASE-B NDU NJAA -// 16866 BAMUM LETTER PHASE-B GHEUGHEUAEM -// 16867 BAMUM LETTER PHASE-B PIT -// 16868 BAMUM LETTER PHASE-B TU NSIEE -// 16869 BAMUM LETTER PHASE-B SHET NJAQ -// 1686a BAMUM LETTER PHASE-B SHEUAEQTU -// 1686b BAMUM LETTER PHASE-B MFON TEUAEQ -// 1686c BAMUM LETTER PHASE-B MBIT MBAAKET -// 1686d BAMUM LETTER PHASE-B NYI NTEUM -// 1686e BAMUM LETTER PHASE-B KEUPUQ -// 1686f BAMUM LETTER PHASE-B GHEUGHEN -// 16870 BAMUM LETTER PHASE-B KEUYEUX -// 16871 BAMUM LETTER PHASE-B LAANAE -// 16872 BAMUM LETTER PHASE-B PARUM -// 16873 BAMUM LETTER PHASE-B VEUM -// 16874 BAMUM LETTER PHASE-B NGKINDI MVOP -// 16875 BAMUM LETTER PHASE-B NGGEU MBU -// 16876 BAMUM LETTER PHASE-B WUAET -// 16877 BAMUM LETTER PHASE-B SAKEUAE -// 16878 BAMUM LETTER PHASE-B TAAM -// 16879 BAMUM LETTER PHASE-B MEUQ -// 1687a BAMUM LETTER PHASE-B NGGUOQ -// 1687b BAMUM LETTER PHASE-B NGGUOQ LARGE -// 1687c BAMUM LETTER PHASE-B MFIYAQ -// 1687d BAMUM LETTER PHASE-B SUE -// 1687e BAMUM LETTER PHASE-B MBEURI -// 1687f BAMUM LETTER PHASE-B MONTIEEN -// 16880 BAMUM LETTER PHASE-B NYAEMAE -// 16881 BAMUM LETTER PHASE-B PUNGAAM -// 16882 BAMUM LETTER PHASE-B MEUT NGGEET -// 16883 BAMUM LETTER PHASE-B FEUX -// 16884 BAMUM LETTER PHASE-B MBUOQ -// 16885 BAMUM LETTER PHASE-B FEE -// 16886 BAMUM LETTER PHASE-B KEUAEM -// 16887 BAMUM LETTER PHASE-B MA NJEUAENA -// 16888 BAMUM LETTER PHASE-B MA NJUQA -// 16889 BAMUM LETTER PHASE-B LET -// 1688a BAMUM LETTER PHASE-B NGGAAM -// 1688b BAMUM LETTER PHASE-B NSEN -// 1688c BAMUM LETTER PHASE-B MA -// 1688d BAMUM LETTER PHASE-B KIQ -// 1688e BAMUM LETTER PHASE-B NGOM -// 1688f BAMUM LETTER PHASE-C NGKUE MAEMBA -// 16890 BAMUM LETTER PHASE-C NZA -// 16891 BAMUM LETTER PHASE-C YUM -// 16892 BAMUM LETTER PHASE-C WANGKUOQ -// 16893 BAMUM LETTER PHASE-C NGGEN -// 16894 BAMUM LETTER PHASE-C NDEUAEREE -// 16895 BAMUM LETTER PHASE-C NGKAQ -// 16896 BAMUM LETTER PHASE-C GHARAE -// 16897 BAMUM LETTER PHASE-C MBEEKEET -// 16898 BAMUM LETTER PHASE-C GBAYI -// 16899 BAMUM LETTER PHASE-C NYIR MKPARAQ MEUN -// 1689a BAMUM LETTER PHASE-C NTU MBIT -// 1689b BAMUM LETTER PHASE-C MBEUM -// 1689c BAMUM LETTER PHASE-C PIRIEEN -// 1689d BAMUM LETTER PHASE-C NDOMBU -// 1689e BAMUM LETTER PHASE-C MBAA CABBAGE-TREE -// 1689f BAMUM LETTER PHASE-C KEUSHEUAEP -// 168a0 BAMUM LETTER PHASE-C GHAP -// 168a1 BAMUM LETTER PHASE-C KEUKAQ -// 168a2 BAMUM LETTER PHASE-C YU MUOMAE -// 168a3 BAMUM LETTER PHASE-C NZEUM -// 168a4 BAMUM LETTER PHASE-C MBUE -// 168a5 BAMUM LETTER PHASE-C NSEUAEN -// 168a6 BAMUM LETTER PHASE-C MBIT -// 168a7 BAMUM LETTER PHASE-C YEUQ -// 168a8 BAMUM LETTER PHASE-C KPARAQ -// 168a9 BAMUM LETTER PHASE-C KAA -// 168aa BAMUM LETTER PHASE-C SEUX -// 168ab BAMUM LETTER PHASE-C NDIDA -// 168ac BAMUM LETTER PHASE-C TAASHAE -// 168ad BAMUM LETTER PHASE-C NJUEQ -// 168ae BAMUM LETTER PHASE-C TITA YUE -// 168af BAMUM LETTER PHASE-C SUAET -// 168b0 BAMUM LETTER PHASE-C NGGUAEN NYAM -// 168b1 BAMUM LETTER PHASE-C VEUX -// 168b2 BAMUM LETTER PHASE-C NANSANAQ -// 168b3 BAMUM LETTER PHASE-C MA KEUAERI -// 168b4 BAMUM LETTER PHASE-C NTAA -// 168b5 BAMUM LETTER PHASE-C NGGUON -// 168b6 BAMUM LETTER PHASE-C LAP -// 168b7 BAMUM LETTER PHASE-C MBIRIEEN -// 168b8 BAMUM LETTER PHASE-C MGBASAQ -// 168b9 BAMUM LETTER PHASE-C NTEUNGBA -// 168ba BAMUM LETTER PHASE-C TEUTEUX -// 168bb BAMUM LETTER PHASE-C NGGUM -// 168bc BAMUM LETTER PHASE-C FUE -// 168bd BAMUM LETTER PHASE-C NDEUT -// 168be BAMUM LETTER PHASE-C NSA -// 168bf BAMUM LETTER PHASE-C NSHAQ -// 168c0 BAMUM LETTER PHASE-C BUNG -// 168c1 BAMUM LETTER PHASE-C VEUAEPEN -// 168c2 BAMUM LETTER PHASE-C MBERAE -// 168c3 BAMUM LETTER PHASE-C RU -// 168c4 BAMUM LETTER PHASE-C NJAEM -// 168c5 BAMUM LETTER PHASE-C LAM -// 168c6 BAMUM LETTER PHASE-C TITUAEP -// 168c7 BAMUM LETTER PHASE-C NSUOT NGOM -// 168c8 BAMUM LETTER PHASE-C NJEEEE -// 168c9 BAMUM LETTER PHASE-C KET -// 168ca BAMUM LETTER PHASE-C NGGU -// 168cb BAMUM LETTER PHASE-C MAESI -// 168cc BAMUM LETTER PHASE-C MBUAEM -// 168cd BAMUM LETTER PHASE-C LU -// 168ce BAMUM LETTER PHASE-C KUT -// 168cf BAMUM LETTER PHASE-C NJAM -// 168d0 BAMUM LETTER PHASE-C NGOM -// 168d1 BAMUM LETTER PHASE-C WUP -// 168d2 BAMUM LETTER PHASE-C NGGUEET -// 168d3 BAMUM LETTER PHASE-C NSOM -// 168d4 BAMUM LETTER PHASE-C NTEN -// 168d5 BAMUM LETTER PHASE-C KUOP NKAARAE -// 168d6 BAMUM LETTER PHASE-C NSUN -// 168d7 BAMUM LETTER PHASE-C NDAM -// 168d8 BAMUM LETTER PHASE-C MA NSIEE -// 168d9 BAMUM LETTER PHASE-C YAA -// 168da BAMUM LETTER PHASE-C NDAP -// 168db BAMUM LETTER PHASE-C SHUEQ -// 168dc BAMUM LETTER PHASE-C SETFON -// 168dd BAMUM LETTER PHASE-C MBI -// 168de BAMUM LETTER PHASE-C MAEMBA -// 168df BAMUM LETTER PHASE-C MBANYI -// 168e0 BAMUM LETTER PHASE-C KEUSEUX -// 168e1 BAMUM LETTER PHASE-C MBEUX -// 168e2 BAMUM LETTER PHASE-C KEUM -// 168e3 BAMUM LETTER PHASE-C MBAA PICKET -// 168e4 BAMUM LETTER PHASE-C YUWOQ -// 168e5 BAMUM LETTER PHASE-C NJEUX -// 168e6 BAMUM LETTER PHASE-C MIEE -// 168e7 BAMUM LETTER PHASE-C MUAE -// 168e8 BAMUM LETTER PHASE-C SHIQ -// 168e9 BAMUM LETTER PHASE-C KEN LAW -// 168ea BAMUM LETTER PHASE-C KEN FATIGUE -// 168eb BAMUM LETTER PHASE-C NGAQ -// 168ec BAMUM LETTER PHASE-C NAQ -// 168ed BAMUM LETTER PHASE-C LIQ -// 168ee BAMUM LETTER PHASE-C PIN -// 168ef BAMUM LETTER PHASE-C PEN -// 168f0 BAMUM LETTER PHASE-C TET -// 168f1 BAMUM LETTER PHASE-D MBUO -// 168f2 BAMUM LETTER PHASE-D WAP -// 168f3 BAMUM LETTER PHASE-D NJI -// 168f4 BAMUM LETTER PHASE-D MFON -// 168f5 BAMUM LETTER PHASE-D NJIEE -// 168f6 BAMUM LETTER PHASE-D LIEE -// 168f7 BAMUM LETTER PHASE-D NJEUT -// 168f8 BAMUM LETTER PHASE-D NSHEE -// 168f9 BAMUM LETTER PHASE-D NGGAAMAE -// 168fa BAMUM LETTER PHASE-D NYAM -// 168fb BAMUM LETTER PHASE-D WUAEN -// 168fc BAMUM LETTER PHASE-D NGKUN -// 168fd BAMUM LETTER PHASE-D SHEE -// 168fe BAMUM LETTER PHASE-D NGKAP -// 168ff BAMUM LETTER PHASE-D KEUAETMEUN -// 16900 BAMUM LETTER PHASE-D TEUT -// 16901 BAMUM LETTER PHASE-D SHEUAE -// 16902 BAMUM LETTER PHASE-D NJAP -// 16903 BAMUM LETTER PHASE-D SUE -// 16904 BAMUM LETTER PHASE-D KET -// 16905 BAMUM LETTER PHASE-D YAEMMAE -// 16906 BAMUM LETTER PHASE-D KUOM -// 16907 BAMUM LETTER PHASE-D SAP -// 16908 BAMUM LETTER PHASE-D MFEUT -// 16909 BAMUM LETTER PHASE-D NDEUX -// 1690a BAMUM LETTER PHASE-D MALEERI -// 1690b BAMUM LETTER PHASE-D MEUT -// 1690c BAMUM LETTER PHASE-D SEUAEQ -// 1690d BAMUM LETTER PHASE-D YEN -// 1690e BAMUM LETTER PHASE-D NJEUAEM -// 1690f BAMUM LETTER PHASE-D KEUOT MBUAE -// 16910 BAMUM LETTER PHASE-D NGKEURI -// 16911 BAMUM LETTER PHASE-D TU -// 16912 BAMUM LETTER PHASE-D GHAA -// 16913 BAMUM LETTER PHASE-D NGKYEE -// 16914 BAMUM LETTER PHASE-D FEUFEUAET -// 16915 BAMUM LETTER PHASE-D NDEE -// 16916 BAMUM LETTER PHASE-D MGBOFUM -// 16917 BAMUM LETTER PHASE-D LEUAEP -// 16918 BAMUM LETTER PHASE-D NDON -// 16919 BAMUM LETTER PHASE-D MONI -// 1691a BAMUM LETTER PHASE-D MGBEUN -// 1691b BAMUM LETTER PHASE-D PUUT -// 1691c BAMUM LETTER PHASE-D MGBIEE -// 1691d BAMUM LETTER PHASE-D MFO -// 1691e BAMUM LETTER PHASE-D LUM -// 1691f BAMUM LETTER PHASE-D NSIEEP -// 16920 BAMUM LETTER PHASE-D MBAA -// 16921 BAMUM LETTER PHASE-D KWAET -// 16922 BAMUM LETTER PHASE-D NYET -// 16923 BAMUM LETTER PHASE-D TEUAEN -// 16924 BAMUM LETTER PHASE-D SOT -// 16925 BAMUM LETTER PHASE-D YUWOQ -// 16926 BAMUM LETTER PHASE-D KEUM -// 16927 BAMUM LETTER PHASE-D RAEM -// 16928 BAMUM LETTER PHASE-D TEEEE -// 16929 BAMUM LETTER PHASE-D NGKEUAEQ -// 1692a BAMUM LETTER PHASE-D MFEUAE -// 1692b BAMUM LETTER PHASE-D NSIEET -// 1692c BAMUM LETTER PHASE-D KEUP -// 1692d BAMUM LETTER PHASE-D PIP -// 1692e BAMUM LETTER PHASE-D PEUTAE -// 1692f BAMUM LETTER PHASE-D NYUE -// 16930 BAMUM LETTER PHASE-D LET -// 16931 BAMUM LETTER PHASE-D NGGAAM -// 16932 BAMUM LETTER PHASE-D MFIEE -// 16933 BAMUM LETTER PHASE-D NGGWAEN -// 16934 BAMUM LETTER PHASE-D YUOM -// 16935 BAMUM LETTER PHASE-D PAP -// 16936 BAMUM LETTER PHASE-D YUOP -// 16937 BAMUM LETTER PHASE-D NDAM -// 16938 BAMUM LETTER PHASE-D NTEUM -// 16939 BAMUM LETTER PHASE-D SUAE -// 1693a BAMUM LETTER PHASE-D KUN -// 1693b BAMUM LETTER PHASE-D NGGEUX -// 1693c BAMUM LETTER PHASE-D NGKIEE -// 1693d BAMUM LETTER PHASE-D TUOT -// 1693e BAMUM LETTER PHASE-D MEUN -// 1693f BAMUM LETTER PHASE-D KUQ -// 16940 BAMUM LETTER PHASE-D NSUM -// 16941 BAMUM LETTER PHASE-D TEUN -// 16942 BAMUM LETTER PHASE-D MAENJET -// 16943 BAMUM LETTER PHASE-D NGGAP -// 16944 BAMUM LETTER PHASE-D LEUM -// 16945 BAMUM LETTER PHASE-D NGGUOM -// 16946 BAMUM LETTER PHASE-D NSHUT -// 16947 BAMUM LETTER PHASE-D NJUEQ -// 16948 BAMUM LETTER PHASE-D GHEUAE -// 16949 BAMUM LETTER PHASE-D KU -// 1694a BAMUM LETTER PHASE-D REN OLD -// 1694b BAMUM LETTER PHASE-D TAE -// 1694c BAMUM LETTER PHASE-D TOQ -// 1694d BAMUM LETTER PHASE-D NYI -// 1694e BAMUM LETTER PHASE-D RII -// 1694f BAMUM LETTER PHASE-D LEEEE -// 16950 BAMUM LETTER PHASE-D MEEEE -// 16951 BAMUM LETTER PHASE-D M -// 16952 BAMUM LETTER PHASE-D SUU -// 16953 BAMUM LETTER PHASE-D MU -// 16954 BAMUM LETTER PHASE-D SHII -// 16955 BAMUM LETTER PHASE-D SHEUX -// 16956 BAMUM LETTER PHASE-D KYEE -// 16957 BAMUM LETTER PHASE-D NU -// 16958 BAMUM LETTER PHASE-D SHU -// 16959 BAMUM LETTER PHASE-D NTEE -// 1695a BAMUM LETTER PHASE-D PEE -// 1695b BAMUM LETTER PHASE-D NI -// 1695c BAMUM LETTER PHASE-D SHOQ -// 1695d BAMUM LETTER PHASE-D PUQ -// 1695e BAMUM LETTER PHASE-D MVOP -// 1695f BAMUM LETTER PHASE-D LOQ -// 16960 BAMUM LETTER PHASE-D REN MUCH -// 16961 BAMUM LETTER PHASE-D TI -// 16962 BAMUM LETTER PHASE-D NTUU -// 16963 BAMUM LETTER PHASE-D MBAA SEVEN -// 16964 BAMUM LETTER PHASE-D SAQ -// 16965 BAMUM LETTER PHASE-D FAA -// 16966 BAMUM LETTER PHASE-E NDAP -// 16967 BAMUM LETTER PHASE-E TOON -// 16968 BAMUM LETTER PHASE-E MBEUM -// 16969 BAMUM LETTER PHASE-E LAP -// 1696a BAMUM LETTER PHASE-E VOM -// 1696b BAMUM LETTER PHASE-E LOON -// 1696c BAMUM LETTER PHASE-E PAA -// 1696d BAMUM LETTER PHASE-E SOM -// 1696e BAMUM LETTER PHASE-E RAQ -// 1696f BAMUM LETTER PHASE-E NSHUOP -// 16970 BAMUM LETTER PHASE-E NDUN -// 16971 BAMUM LETTER PHASE-E PUAE -// 16972 BAMUM LETTER PHASE-E TAM -// 16973 BAMUM LETTER PHASE-E NGKA -// 16974 BAMUM LETTER PHASE-E KPEUX -// 16975 BAMUM LETTER PHASE-E WUO -// 16976 BAMUM LETTER PHASE-E SEE -// 16977 BAMUM LETTER PHASE-E NGGEUAET -// 16978 BAMUM LETTER PHASE-E PAAM -// 16979 BAMUM LETTER PHASE-E TOO -// 1697a BAMUM LETTER PHASE-E KUOP -// 1697b BAMUM LETTER PHASE-E LOM -// 1697c BAMUM LETTER PHASE-E NSHIEE -// 1697d BAMUM LETTER PHASE-E NGOP -// 1697e BAMUM LETTER PHASE-E MAEM -// 1697f BAMUM LETTER PHASE-E NGKEUX -// 16980 BAMUM LETTER PHASE-E NGOQ -// 16981 BAMUM LETTER PHASE-E NSHUE -// 16982 BAMUM LETTER PHASE-E RIMGBA -// 16983 BAMUM LETTER PHASE-E NJEUX -// 16984 BAMUM LETTER PHASE-E PEEM -// 16985 BAMUM LETTER PHASE-E SAA -// 16986 BAMUM LETTER PHASE-E NGGURAE -// 16987 BAMUM LETTER PHASE-E MGBA -// 16988 BAMUM LETTER PHASE-E GHEUX -// 16989 BAMUM LETTER PHASE-E NGKEUAEM -// 1698a BAMUM LETTER PHASE-E NJAEMLI -// 1698b BAMUM LETTER PHASE-E MAP -// 1698c BAMUM LETTER PHASE-E LOOT -// 1698d BAMUM LETTER PHASE-E NGGEEEE -// 1698e BAMUM LETTER PHASE-E NDIQ -// 1698f BAMUM LETTER PHASE-E TAEN NTEUM -// 16990 BAMUM LETTER PHASE-E SET -// 16991 BAMUM LETTER PHASE-E PUM -// 16992 BAMUM LETTER PHASE-E NDAA SOFTNESS -// 16993 BAMUM LETTER PHASE-E NGGUAESHAE NYAM -// 16994 BAMUM LETTER PHASE-E YIEE -// 16995 BAMUM LETTER PHASE-E GHEUN -// 16996 BAMUM LETTER PHASE-E TUAE -// 16997 BAMUM LETTER PHASE-E YEUAE -// 16998 BAMUM LETTER PHASE-E PO -// 16999 BAMUM LETTER PHASE-E TUMAE -// 1699a BAMUM LETTER PHASE-E KEUAE -// 1699b BAMUM LETTER PHASE-E SUAEN -// 1699c BAMUM LETTER PHASE-E TEUAEQ -// 1699d BAMUM LETTER PHASE-E VEUAE -// 1699e BAMUM LETTER PHASE-E WEUX -// 1699f BAMUM LETTER PHASE-E LAAM -// 169a0 BAMUM LETTER PHASE-E PU -// 169a1 BAMUM LETTER PHASE-E TAAQ -// 169a2 BAMUM LETTER PHASE-E GHAAMAE -// 169a3 BAMUM LETTER PHASE-E NGEUREUT -// 169a4 BAMUM LETTER PHASE-E SHEUAEQ -// 169a5 BAMUM LETTER PHASE-E MGBEN -// 169a6 BAMUM LETTER PHASE-E MBEE -// 169a7 BAMUM LETTER PHASE-E NZAQ -// 169a8 BAMUM LETTER PHASE-E NKOM -// 169a9 BAMUM LETTER PHASE-E GBET -// 169aa BAMUM LETTER PHASE-E TUM -// 169ab BAMUM LETTER PHASE-E KUET -// 169ac BAMUM LETTER PHASE-E YAP -// 169ad BAMUM LETTER PHASE-E NYI CLEAVER -// 169ae BAMUM LETTER PHASE-E YIT -// 169af BAMUM LETTER PHASE-E MFEUQ -// 169b0 BAMUM LETTER PHASE-E NDIAQ -// 169b1 BAMUM LETTER PHASE-E PIEEQ -// 169b2 BAMUM LETTER PHASE-E YUEQ -// 169b3 BAMUM LETTER PHASE-E LEUAEM -// 169b4 BAMUM LETTER PHASE-E FUE -// 169b5 BAMUM LETTER PHASE-E GBEUX -// 169b6 BAMUM LETTER PHASE-E NGKUP -// 169b7 BAMUM LETTER PHASE-E KET -// 169b8 BAMUM LETTER PHASE-E MAE -// 169b9 BAMUM LETTER PHASE-E NGKAAMI -// 169ba BAMUM LETTER PHASE-E GHET -// 169bb BAMUM LETTER PHASE-E FA -// 169bc BAMUM LETTER PHASE-E NTUM -// 169bd BAMUM LETTER PHASE-E PEUT -// 169be BAMUM LETTER PHASE-E YEUM -// 169bf BAMUM LETTER PHASE-E NGGEUAE -// 169c0 BAMUM LETTER PHASE-E NYI BETWEEN -// 169c1 BAMUM LETTER PHASE-E NZUQ -// 169c2 BAMUM LETTER PHASE-E POON -// 169c3 BAMUM LETTER PHASE-E MIEE -// 169c4 BAMUM LETTER PHASE-E FUET -// 169c5 BAMUM LETTER PHASE-E NAE -// 169c6 BAMUM LETTER PHASE-E MUAE -// 169c7 BAMUM LETTER PHASE-E GHEUAE -// 169c8 BAMUM LETTER PHASE-E FU I -// 169c9 BAMUM LETTER PHASE-E MVI -// 169ca BAMUM LETTER PHASE-E PUAQ -// 169cb BAMUM LETTER PHASE-E NGKUM -// 169cc BAMUM LETTER PHASE-E KUT -// 169cd BAMUM LETTER PHASE-E PIET -// 169ce BAMUM LETTER PHASE-E NTAP -// 169cf BAMUM LETTER PHASE-E YEUAET -// 169d0 BAMUM LETTER PHASE-E NGGUP -// 169d1 BAMUM LETTER PHASE-E PA PEOPLE -// 169d2 BAMUM LETTER PHASE-E FU CALL -// 169d3 BAMUM LETTER PHASE-E FOM -// 169d4 BAMUM LETTER PHASE-E NJEE -// 169d5 BAMUM LETTER PHASE-E A -// 169d6 BAMUM LETTER PHASE-E TOQ -// 169d7 BAMUM LETTER PHASE-E O -// 169d8 BAMUM LETTER PHASE-E I -// 169d9 BAMUM LETTER PHASE-E LAQ -// 169da BAMUM LETTER PHASE-E PA PLURAL -// 169db BAMUM LETTER PHASE-E TAA -// 169dc BAMUM LETTER PHASE-E TAQ -// 169dd BAMUM LETTER PHASE-E NDAA MY HOUSE -// 169de BAMUM LETTER PHASE-E SHIQ -// 169df BAMUM LETTER PHASE-E YEUX -// 169e0 BAMUM LETTER PHASE-E NGUAE -// 169e1 BAMUM LETTER PHASE-E YUAEN -// 169e2 BAMUM LETTER PHASE-E YOQ SWIMMING -// 169e3 BAMUM LETTER PHASE-E YOQ COVER -// 169e4 BAMUM LETTER PHASE-E YUQ -// 169e5 BAMUM LETTER PHASE-E YUN -// 169e6 BAMUM LETTER PHASE-E KEUX -// 169e7 BAMUM LETTER PHASE-E PEUX -// 169e8 BAMUM LETTER PHASE-E NJEE EPOCH -// 169e9 BAMUM LETTER PHASE-E PUE -// 169ea BAMUM LETTER PHASE-E WUE -// 169eb BAMUM LETTER PHASE-E FEE -// 169ec BAMUM LETTER PHASE-E VEE -// 169ed BAMUM LETTER PHASE-E LU -// 169ee BAMUM LETTER PHASE-E MI -// 169ef BAMUM LETTER PHASE-E REUX -// 169f0 BAMUM LETTER PHASE-E RAE -// 169f1 BAMUM LETTER PHASE-E NGUAET -// 169f2 BAMUM LETTER PHASE-E NGA -// 169f3 BAMUM LETTER PHASE-E SHO -// 169f4 BAMUM LETTER PHASE-E SHOQ -// 169f5 BAMUM LETTER PHASE-E FU REMEDY -// 169f6 BAMUM LETTER PHASE-E NA -// 169f7 BAMUM LETTER PHASE-E PI -// 169f8 BAMUM LETTER PHASE-E LOQ -// 169f9 BAMUM LETTER PHASE-E KO -// 169fa BAMUM LETTER PHASE-E MEN -// 169fb BAMUM LETTER PHASE-E MA -// 169fc BAMUM LETTER PHASE-E MAQ -// 169fd BAMUM LETTER PHASE-E TEU -// 169fe BAMUM LETTER PHASE-E KI -// 169ff BAMUM LETTER PHASE-E MON -// 16a00 BAMUM LETTER PHASE-E TEN -// 16a01 BAMUM LETTER PHASE-E FAQ -// 16a02 BAMUM LETTER PHASE-E GHOM -// 16a03 BAMUM LETTER PHASE-F KA -// 16a04 BAMUM LETTER PHASE-F U -// 16a05 BAMUM LETTER PHASE-F KU -// 16a06 BAMUM LETTER PHASE-F EE -// 16a07 BAMUM LETTER PHASE-F REE -// 16a08 BAMUM LETTER PHASE-F TAE -// 16a09 BAMUM LETTER PHASE-F NYI -// 16a0a BAMUM LETTER PHASE-F LA -// 16a0b BAMUM LETTER PHASE-F RII -// 16a0c BAMUM LETTER PHASE-F RIEE -// 16a0d BAMUM LETTER PHASE-F MEEEE -// 16a0e BAMUM LETTER PHASE-F TAA -// 16a0f BAMUM LETTER PHASE-F NDAA -// 16a10 BAMUM LETTER PHASE-F NJAEM -// 16a11 BAMUM LETTER PHASE-F M -// 16a12 BAMUM LETTER PHASE-F SUU -// 16a13 BAMUM LETTER PHASE-F SHII -// 16a14 BAMUM LETTER PHASE-F SI -// 16a15 BAMUM LETTER PHASE-F SEUX -// 16a16 BAMUM LETTER PHASE-F KYEE -// 16a17 BAMUM LETTER PHASE-F KET -// 16a18 BAMUM LETTER PHASE-F NUAE -// 16a19 BAMUM LETTER PHASE-F NU -// 16a1a BAMUM LETTER PHASE-F NJUAE -// 16a1b BAMUM LETTER PHASE-F YOQ -// 16a1c BAMUM LETTER PHASE-F SHU -// 16a1d BAMUM LETTER PHASE-F YA -// 16a1e BAMUM LETTER PHASE-F NSHA -// 16a1f BAMUM LETTER PHASE-F PEUX -// 16a20 BAMUM LETTER PHASE-F NTEE -// 16a21 BAMUM LETTER PHASE-F WUE -// 16a22 BAMUM LETTER PHASE-F PEE -// 16a23 BAMUM LETTER PHASE-F RU -// 16a24 BAMUM LETTER PHASE-F NI -// 16a25 BAMUM LETTER PHASE-F REUX -// 16a26 BAMUM LETTER PHASE-F KEN -// 16a27 BAMUM LETTER PHASE-F NGKWAEN -// 16a28 BAMUM LETTER PHASE-F NGGA -// 16a29 BAMUM LETTER PHASE-F SHO -// 16a2a BAMUM LETTER PHASE-F PUAE -// 16a2b BAMUM LETTER PHASE-F FOM -// 16a2c BAMUM LETTER PHASE-F WA -// 16a2d BAMUM LETTER PHASE-F LI -// 16a2e BAMUM LETTER PHASE-F LOQ -// 16a2f BAMUM LETTER PHASE-F KO -// 16a30 BAMUM LETTER PHASE-F MBEN -// 16a31 BAMUM LETTER PHASE-F REN -// 16a32 BAMUM LETTER PHASE-F MA -// 16a33 BAMUM LETTER PHASE-F MO -// 16a34 BAMUM LETTER PHASE-F MBAA -// 16a35 BAMUM LETTER PHASE-F TET -// 16a36 BAMUM LETTER PHASE-F KPA -// 16a37 BAMUM LETTER PHASE-F SAMBA -// 16a38 BAMUM LETTER PHASE-F VUEQ - { 0x16800, 0x239, 0x9, 0, 0 }, -// 16a40 MRO LETTER TA -// 16a41 MRO LETTER NGI -// 16a42 MRO LETTER YO -// 16a43 MRO LETTER MIM -// 16a44 MRO LETTER BA -// 16a45 MRO LETTER DA -// 16a46 MRO LETTER A -// 16a47 MRO LETTER PHI -// 16a48 MRO LETTER KHAI -// 16a49 MRO LETTER HAO -// 16a4a MRO LETTER DAI -// 16a4b MRO LETTER CHU -// 16a4c MRO LETTER KEAAE -// 16a4d MRO LETTER OL -// 16a4e MRO LETTER MAEM -// 16a4f MRO LETTER NIN -// 16a50 MRO LETTER PA -// 16a51 MRO LETTER OO -// 16a52 MRO LETTER O -// 16a53 MRO LETTER RO -// 16a54 MRO LETTER SHI -// 16a55 MRO LETTER THEA -// 16a56 MRO LETTER EA -// 16a57 MRO LETTER WA -// 16a58 MRO LETTER E -// 16a59 MRO LETTER KO -// 16a5a MRO LETTER LAN -// 16a5b MRO LETTER LA -// 16a5c MRO LETTER HAI -// 16a5d MRO LETTER RI -// 16a5e MRO LETTER TEK - { 0x16A40, 0x1F, 0x9, 0, 0 }, -// 16a60 MRO DIGIT ZERO -// 16a61 MRO DIGIT ONE -// 16a62 MRO DIGIT TWO -// 16a63 MRO DIGIT THREE -// 16a64 MRO DIGIT FOUR -// 16a65 MRO DIGIT FIVE -// 16a66 MRO DIGIT SIX -// 16a67 MRO DIGIT SEVEN -// 16a68 MRO DIGIT EIGHT -// 16a69 MRO DIGIT NINE - { 0x16A60, 0xA, 0x108, 0, 0 }, -// 16a6e MRO DANDA -// 16a6f MRO DOUBLE DANDA - { 0x16A6E, 0x2, 0x18, 0, 0 }, -// 16ad0 BASSA VAH LETTER ENNI -// 16ad1 BASSA VAH LETTER KA -// 16ad2 BASSA VAH LETTER SE -// 16ad3 BASSA VAH LETTER FA -// 16ad4 BASSA VAH LETTER MBE -// 16ad5 BASSA VAH LETTER YIE -// 16ad6 BASSA VAH LETTER GAH -// 16ad7 BASSA VAH LETTER DHII -// 16ad8 BASSA VAH LETTER KPAH -// 16ad9 BASSA VAH LETTER JO -// 16ada BASSA VAH LETTER HWAH -// 16adb BASSA VAH LETTER WA -// 16adc BASSA VAH LETTER ZO -// 16add BASSA VAH LETTER GBU -// 16ade BASSA VAH LETTER DO -// 16adf BASSA VAH LETTER CE -// 16ae0 BASSA VAH LETTER UWU -// 16ae1 BASSA VAH LETTER TO -// 16ae2 BASSA VAH LETTER BA -// 16ae3 BASSA VAH LETTER VU -// 16ae4 BASSA VAH LETTER YEIN -// 16ae5 BASSA VAH LETTER PA -// 16ae6 BASSA VAH LETTER WADDA -// 16ae7 BASSA VAH LETTER A -// 16ae8 BASSA VAH LETTER O -// 16ae9 BASSA VAH LETTER OO -// 16aea BASSA VAH LETTER U -// 16aeb BASSA VAH LETTER EE -// 16aec BASSA VAH LETTER E -// 16aed BASSA VAH LETTER I - { 0x16AD0, 0x1E, 0x9, 0, 0 }, -// 16af0 BASSA VAH COMBINING HIGH TONE -// 16af1 BASSA VAH COMBINING LOW TONE -// 16af2 BASSA VAH COMBINING MID TONE -// 16af3 BASSA VAH COMBINING LOW-MID TONE -// 16af4 BASSA VAH COMBINING HIGH-LOW TONE - { 0x16AF0, 0x5, 0x0, 0, 0 }, -// 16af5 BASSA VAH FULL STOP - { 0x16AF5, 0x1, 0x18, 0, 0 }, -// 16b00 PAHAWH HMONG VOWEL KEEB -// 16b01 PAHAWH HMONG VOWEL KEEV -// 16b02 PAHAWH HMONG VOWEL KIB -// 16b03 PAHAWH HMONG VOWEL KIV -// 16b04 PAHAWH HMONG VOWEL KAUB -// 16b05 PAHAWH HMONG VOWEL KAUV -// 16b06 PAHAWH HMONG VOWEL KUB -// 16b07 PAHAWH HMONG VOWEL KUV -// 16b08 PAHAWH HMONG VOWEL KEB -// 16b09 PAHAWH HMONG VOWEL KEV -// 16b0a PAHAWH HMONG VOWEL KAIB -// 16b0b PAHAWH HMONG VOWEL KAIV -// 16b0c PAHAWH HMONG VOWEL KOOB -// 16b0d PAHAWH HMONG VOWEL KOOV -// 16b0e PAHAWH HMONG VOWEL KAWB -// 16b0f PAHAWH HMONG VOWEL KAWV -// 16b10 PAHAWH HMONG VOWEL KUAB -// 16b11 PAHAWH HMONG VOWEL KUAV -// 16b12 PAHAWH HMONG VOWEL KOB -// 16b13 PAHAWH HMONG VOWEL KOV -// 16b14 PAHAWH HMONG VOWEL KIAB -// 16b15 PAHAWH HMONG VOWEL KIAV -// 16b16 PAHAWH HMONG VOWEL KAB -// 16b17 PAHAWH HMONG VOWEL KAV -// 16b18 PAHAWH HMONG VOWEL KWB -// 16b19 PAHAWH HMONG VOWEL KWV -// 16b1a PAHAWH HMONG VOWEL KAAB -// 16b1b PAHAWH HMONG VOWEL KAAV -// 16b1c PAHAWH HMONG CONSONANT VAU -// 16b1d PAHAWH HMONG CONSONANT NTSAU -// 16b1e PAHAWH HMONG CONSONANT LAU -// 16b1f PAHAWH HMONG CONSONANT HAU -// 16b20 PAHAWH HMONG CONSONANT NLAU -// 16b21 PAHAWH HMONG CONSONANT RAU -// 16b22 PAHAWH HMONG CONSONANT NKAU -// 16b23 PAHAWH HMONG CONSONANT QHAU -// 16b24 PAHAWH HMONG CONSONANT YAU -// 16b25 PAHAWH HMONG CONSONANT HLAU -// 16b26 PAHAWH HMONG CONSONANT MAU -// 16b27 PAHAWH HMONG CONSONANT CHAU -// 16b28 PAHAWH HMONG CONSONANT NCHAU -// 16b29 PAHAWH HMONG CONSONANT HNAU -// 16b2a PAHAWH HMONG CONSONANT PLHAU -// 16b2b PAHAWH HMONG CONSONANT NTHAU -// 16b2c PAHAWH HMONG CONSONANT NAU -// 16b2d PAHAWH HMONG CONSONANT AU -// 16b2e PAHAWH HMONG CONSONANT XAU -// 16b2f PAHAWH HMONG CONSONANT CAU - { 0x16B00, 0x30, 0x9, 0, 0 }, -// 16b30 PAHAWH HMONG MARK CIM TUB -// 16b31 PAHAWH HMONG MARK CIM SO -// 16b32 PAHAWH HMONG MARK CIM KES -// 16b33 PAHAWH HMONG MARK CIM KHAV -// 16b34 PAHAWH HMONG MARK CIM SUAM -// 16b35 PAHAWH HMONG MARK CIM HOM -// 16b36 PAHAWH HMONG MARK CIM TAUM - { 0x16B30, 0x7, 0x0, 0, 0 }, -// 16b37 PAHAWH HMONG SIGN VOS THOM -// 16b38 PAHAWH HMONG SIGN VOS TSHAB CEEB -// 16b39 PAHAWH HMONG SIGN CIM CHEEM -// 16b3a PAHAWH HMONG SIGN VOS THIAB -// 16b3b PAHAWH HMONG SIGN VOS FEEM - { 0x16B37, 0x5, 0x18, 0, 0 }, -// 16b3c PAHAWH HMONG SIGN XYEEM NTXIV -// 16b3d PAHAWH HMONG SIGN XYEEM RHO -// 16b3e PAHAWH HMONG SIGN XYEEM TOV -// 16b3f PAHAWH HMONG SIGN XYEEM FAIB - { 0x16B3C, 0x4, 0x8, 0, 0 }, -// 16b40 PAHAWH HMONG SIGN VOS SEEV -// 16b41 PAHAWH HMONG SIGN MEEJ SUAB -// 16b42 PAHAWH HMONG SIGN VOS NRUA -// 16b43 PAHAWH HMONG SIGN IB YAM - { 0x16B40, 0x4, 0x9, 0, 0 }, -// 16b44 PAHAWH HMONG SIGN XAUS - { 0x16B44, 0x1, 0x18, 0, 0 }, -// 16b45 PAHAWH HMONG SIGN CIM TSOV ROG - { 0x16B45, 0x1, 0x8, 0, 0 }, -// 16b50 PAHAWH HMONG DIGIT ZERO -// 16b51 PAHAWH HMONG DIGIT ONE -// 16b52 PAHAWH HMONG DIGIT TWO -// 16b53 PAHAWH HMONG DIGIT THREE -// 16b54 PAHAWH HMONG DIGIT FOUR -// 16b55 PAHAWH HMONG DIGIT FIVE -// 16b56 PAHAWH HMONG DIGIT SIX -// 16b57 PAHAWH HMONG DIGIT SEVEN -// 16b58 PAHAWH HMONG DIGIT EIGHT -// 16b59 PAHAWH HMONG DIGIT NINE - { 0x16B50, 0xA, 0x108, 0, 0 }, -// 16b5b PAHAWH HMONG NUMBER TENS -// 16b5c PAHAWH HMONG NUMBER HUNDREDS -// 16b5d PAHAWH HMONG NUMBER TEN THOUSANDS -// 16b5e PAHAWH HMONG NUMBER MILLIONS -// 16b5f PAHAWH HMONG NUMBER HUNDRED MILLIONS -// 16b60 PAHAWH HMONG NUMBER TEN BILLIONS -// 16b61 PAHAWH HMONG NUMBER TRILLIONS - { 0x16B5B, 0x7, 0x8, 0, 0 }, -// 16b63 PAHAWH HMONG SIGN VOS LUB -// 16b64 PAHAWH HMONG SIGN XYOO -// 16b65 PAHAWH HMONG SIGN HLI -// 16b66 PAHAWH HMONG SIGN THIRD-STAGE HLI -// 16b67 PAHAWH HMONG SIGN ZWJ THAJ -// 16b68 PAHAWH HMONG SIGN HNUB -// 16b69 PAHAWH HMONG SIGN NQIG -// 16b6a PAHAWH HMONG SIGN XIAB -// 16b6b PAHAWH HMONG SIGN NTUJ -// 16b6c PAHAWH HMONG SIGN AV -// 16b6d PAHAWH HMONG SIGN TXHEEJ CEEV -// 16b6e PAHAWH HMONG SIGN MEEJ TSEEB -// 16b6f PAHAWH HMONG SIGN TAU -// 16b70 PAHAWH HMONG SIGN LOS -// 16b71 PAHAWH HMONG SIGN MUS -// 16b72 PAHAWH HMONG SIGN CIM HAIS LUS NTOG NTOG -// 16b73 PAHAWH HMONG SIGN CIM CUAM TSHOOJ -// 16b74 PAHAWH HMONG SIGN CIM TXWV -// 16b75 PAHAWH HMONG SIGN CIM TXWV CHWV -// 16b76 PAHAWH HMONG SIGN CIM PUB DAWB -// 16b77 PAHAWH HMONG SIGN CIM NRES TOS - { 0x16B63, 0x15, 0x9, 0, 0 }, -// 16b7d PAHAWH HMONG CLAN SIGN TSHEEJ -// 16b7e PAHAWH HMONG CLAN SIGN YEEG -// 16b7f PAHAWH HMONG CLAN SIGN LIS -// 16b80 PAHAWH HMONG CLAN SIGN LAUJ -// 16b81 PAHAWH HMONG CLAN SIGN XYOOJ -// 16b82 PAHAWH HMONG CLAN SIGN KOO -// 16b83 PAHAWH HMONG CLAN SIGN HAWJ -// 16b84 PAHAWH HMONG CLAN SIGN MUAS -// 16b85 PAHAWH HMONG CLAN SIGN THOJ -// 16b86 PAHAWH HMONG CLAN SIGN TSAB -// 16b87 PAHAWH HMONG CLAN SIGN PHAB -// 16b88 PAHAWH HMONG CLAN SIGN KHAB -// 16b89 PAHAWH HMONG CLAN SIGN HAM -// 16b8a PAHAWH HMONG CLAN SIGN VAJ -// 16b8b PAHAWH HMONG CLAN SIGN FAJ -// 16b8c PAHAWH HMONG CLAN SIGN YAJ -// 16b8d PAHAWH HMONG CLAN SIGN TSWB -// 16b8e PAHAWH HMONG CLAN SIGN KWM -// 16b8f PAHAWH HMONG CLAN SIGN VWJ - { 0x16B7D, 0x13, 0x9, 0, 0 }, -// 16f00 MIAO LETTER PA -// 16f01 MIAO LETTER BA -// 16f02 MIAO LETTER YI PA -// 16f03 MIAO LETTER PLA -// 16f04 MIAO LETTER MA -// 16f05 MIAO LETTER MHA -// 16f06 MIAO LETTER ARCHAIC MA -// 16f07 MIAO LETTER FA -// 16f08 MIAO LETTER VA -// 16f09 MIAO LETTER VFA -// 16f0a MIAO LETTER TA -// 16f0b MIAO LETTER DA -// 16f0c MIAO LETTER YI TTA -// 16f0d MIAO LETTER YI TA -// 16f0e MIAO LETTER TTA -// 16f0f MIAO LETTER DDA -// 16f10 MIAO LETTER NA -// 16f11 MIAO LETTER NHA -// 16f12 MIAO LETTER YI NNA -// 16f13 MIAO LETTER ARCHAIC NA -// 16f14 MIAO LETTER NNA -// 16f15 MIAO LETTER NNHA -// 16f16 MIAO LETTER LA -// 16f17 MIAO LETTER LYA -// 16f18 MIAO LETTER LHA -// 16f19 MIAO LETTER LHYA -// 16f1a MIAO LETTER TLHA -// 16f1b MIAO LETTER DLHA -// 16f1c MIAO LETTER TLHYA -// 16f1d MIAO LETTER DLHYA -// 16f1e MIAO LETTER KA -// 16f1f MIAO LETTER GA -// 16f20 MIAO LETTER YI KA -// 16f21 MIAO LETTER QA -// 16f22 MIAO LETTER QGA -// 16f23 MIAO LETTER NGA -// 16f24 MIAO LETTER NGHA -// 16f25 MIAO LETTER ARCHAIC NGA -// 16f26 MIAO LETTER HA -// 16f27 MIAO LETTER XA -// 16f28 MIAO LETTER GHA -// 16f29 MIAO LETTER GHHA -// 16f2a MIAO LETTER TSSA -// 16f2b MIAO LETTER DZZA -// 16f2c MIAO LETTER NYA -// 16f2d MIAO LETTER NYHA -// 16f2e MIAO LETTER TSHA -// 16f2f MIAO LETTER DZHA -// 16f30 MIAO LETTER YI TSHA -// 16f31 MIAO LETTER YI DZHA -// 16f32 MIAO LETTER REFORMED TSHA -// 16f33 MIAO LETTER SHA -// 16f34 MIAO LETTER SSA -// 16f35 MIAO LETTER ZHA -// 16f36 MIAO LETTER ZSHA -// 16f37 MIAO LETTER TSA -// 16f38 MIAO LETTER DZA -// 16f39 MIAO LETTER YI TSA -// 16f3a MIAO LETTER SA -// 16f3b MIAO LETTER ZA -// 16f3c MIAO LETTER ZSA -// 16f3d MIAO LETTER ZZA -// 16f3e MIAO LETTER ZZSA -// 16f3f MIAO LETTER ARCHAIC ZZA -// 16f40 MIAO LETTER ZZYA -// 16f41 MIAO LETTER ZZSYA -// 16f42 MIAO LETTER WA -// 16f43 MIAO LETTER AH -// 16f44 MIAO LETTER HHA - { 0x16F00, 0x45, 0x9, 0, 0 }, -// 16f50 MIAO LETTER NASALIZATION - { 0x16F50, 0x1, 0x9, 0, 0 }, -// 16f51 MIAO SIGN ASPIRATION -// 16f52 MIAO SIGN REFORMED VOICING -// 16f53 MIAO SIGN REFORMED ASPIRATION -// 16f54 MIAO VOWEL SIGN A -// 16f55 MIAO VOWEL SIGN AA -// 16f56 MIAO VOWEL SIGN AHH -// 16f57 MIAO VOWEL SIGN AN -// 16f58 MIAO VOWEL SIGN ANG -// 16f59 MIAO VOWEL SIGN O -// 16f5a MIAO VOWEL SIGN OO -// 16f5b MIAO VOWEL SIGN WO -// 16f5c MIAO VOWEL SIGN W -// 16f5d MIAO VOWEL SIGN E -// 16f5e MIAO VOWEL SIGN EN -// 16f5f MIAO VOWEL SIGN ENG -// 16f60 MIAO VOWEL SIGN OEY -// 16f61 MIAO VOWEL SIGN I -// 16f62 MIAO VOWEL SIGN IA -// 16f63 MIAO VOWEL SIGN IAN -// 16f64 MIAO VOWEL SIGN IANG -// 16f65 MIAO VOWEL SIGN IO -// 16f66 MIAO VOWEL SIGN IE -// 16f67 MIAO VOWEL SIGN II -// 16f68 MIAO VOWEL SIGN IU -// 16f69 MIAO VOWEL SIGN ING -// 16f6a MIAO VOWEL SIGN U -// 16f6b MIAO VOWEL SIGN UA -// 16f6c MIAO VOWEL SIGN UAN -// 16f6d MIAO VOWEL SIGN UANG -// 16f6e MIAO VOWEL SIGN UU -// 16f6f MIAO VOWEL SIGN UEI -// 16f70 MIAO VOWEL SIGN UNG -// 16f71 MIAO VOWEL SIGN Y -// 16f72 MIAO VOWEL SIGN YI -// 16f73 MIAO VOWEL SIGN AE -// 16f74 MIAO VOWEL SIGN AEE -// 16f75 MIAO VOWEL SIGN ERR -// 16f76 MIAO VOWEL SIGN ROUNDED ERR -// 16f77 MIAO VOWEL SIGN ER -// 16f78 MIAO VOWEL SIGN ROUNDED ER -// 16f79 MIAO VOWEL SIGN AI -// 16f7a MIAO VOWEL SIGN EI -// 16f7b MIAO VOWEL SIGN AU -// 16f7c MIAO VOWEL SIGN OU -// 16f7d MIAO VOWEL SIGN N -// 16f7e MIAO VOWEL SIGN NG - { 0x16F51, 0x2E, 0x0, 0, 0 }, -// 16f8f MIAO TONE RIGHT -// 16f90 MIAO TONE TOP RIGHT -// 16f91 MIAO TONE ABOVE -// 16f92 MIAO TONE BELOW - { 0x16F8F, 0x4, 0x0, 0, 0 }, -// 16f93 MIAO LETTER TONE-2 -// 16f94 MIAO LETTER TONE-3 -// 16f95 MIAO LETTER TONE-4 -// 16f96 MIAO LETTER TONE-5 -// 16f97 MIAO LETTER TONE-6 -// 16f98 MIAO LETTER TONE-7 -// 16f99 MIAO LETTER TONE-8 -// 16f9a MIAO LETTER REFORMED TONE-1 -// 16f9b MIAO LETTER REFORMED TONE-2 -// 16f9c MIAO LETTER REFORMED TONE-4 -// 16f9d MIAO LETTER REFORMED TONE-5 -// 16f9e MIAO LETTER REFORMED TONE-6 -// 16f9f MIAO LETTER REFORMED TONE-8 - { 0x16F93, 0xD, 0x9, 0, 0 }, -// 1b000 KATAKANA LETTER ARCHAIC E -// 1b001 HIRAGANA LETTER ARCHAIC YE - { 0x1B000, 0x2, 0x9, 0, 0 }, -// 1bc00 DUPLOYAN LETTER H -// 1bc01 DUPLOYAN LETTER X -// 1bc02 DUPLOYAN LETTER P -// 1bc03 DUPLOYAN LETTER T -// 1bc04 DUPLOYAN LETTER F -// 1bc05 DUPLOYAN LETTER K -// 1bc06 DUPLOYAN LETTER L -// 1bc07 DUPLOYAN LETTER B -// 1bc08 DUPLOYAN LETTER D -// 1bc09 DUPLOYAN LETTER V -// 1bc0a DUPLOYAN LETTER G -// 1bc0b DUPLOYAN LETTER R -// 1bc0c DUPLOYAN LETTER P N -// 1bc0d DUPLOYAN LETTER D S -// 1bc0e DUPLOYAN LETTER F N -// 1bc0f DUPLOYAN LETTER K M -// 1bc10 DUPLOYAN LETTER R S -// 1bc11 DUPLOYAN LETTER TH -// 1bc12 DUPLOYAN LETTER SLOAN DH -// 1bc13 DUPLOYAN LETTER DH -// 1bc14 DUPLOYAN LETTER KK -// 1bc15 DUPLOYAN LETTER SLOAN J -// 1bc16 DUPLOYAN LETTER HL -// 1bc17 DUPLOYAN LETTER LH -// 1bc18 DUPLOYAN LETTER RH -// 1bc19 DUPLOYAN LETTER M -// 1bc1a DUPLOYAN LETTER N -// 1bc1b DUPLOYAN LETTER J -// 1bc1c DUPLOYAN LETTER S -// 1bc1d DUPLOYAN LETTER M N -// 1bc1e DUPLOYAN LETTER N M -// 1bc1f DUPLOYAN LETTER J M -// 1bc20 DUPLOYAN LETTER S J -// 1bc21 DUPLOYAN LETTER M WITH DOT -// 1bc22 DUPLOYAN LETTER N WITH DOT -// 1bc23 DUPLOYAN LETTER J WITH DOT -// 1bc24 DUPLOYAN LETTER J WITH DOTS INSIDE AND ABOVE -// 1bc25 DUPLOYAN LETTER S WITH DOT -// 1bc26 DUPLOYAN LETTER S WITH DOT BELOW -// 1bc27 DUPLOYAN LETTER M S -// 1bc28 DUPLOYAN LETTER N S -// 1bc29 DUPLOYAN LETTER J S -// 1bc2a DUPLOYAN LETTER S S -// 1bc2b DUPLOYAN LETTER M N S -// 1bc2c DUPLOYAN LETTER N M S -// 1bc2d DUPLOYAN LETTER J M S -// 1bc2e DUPLOYAN LETTER S J S -// 1bc2f DUPLOYAN LETTER J S WITH DOT -// 1bc30 DUPLOYAN LETTER J N -// 1bc31 DUPLOYAN LETTER J N S -// 1bc32 DUPLOYAN LETTER S T -// 1bc33 DUPLOYAN LETTER S T R -// 1bc34 DUPLOYAN LETTER S P -// 1bc35 DUPLOYAN LETTER S P R -// 1bc36 DUPLOYAN LETTER T S -// 1bc37 DUPLOYAN LETTER T R S -// 1bc38 DUPLOYAN LETTER W -// 1bc39 DUPLOYAN LETTER WH -// 1bc3a DUPLOYAN LETTER W R -// 1bc3b DUPLOYAN LETTER S N -// 1bc3c DUPLOYAN LETTER S M -// 1bc3d DUPLOYAN LETTER K R S -// 1bc3e DUPLOYAN LETTER G R S -// 1bc3f DUPLOYAN LETTER S K -// 1bc40 DUPLOYAN LETTER S K R -// 1bc41 DUPLOYAN LETTER A -// 1bc42 DUPLOYAN LETTER SLOAN OW -// 1bc43 DUPLOYAN LETTER OA -// 1bc44 DUPLOYAN LETTER O -// 1bc45 DUPLOYAN LETTER AOU -// 1bc46 DUPLOYAN LETTER I -// 1bc47 DUPLOYAN LETTER E -// 1bc48 DUPLOYAN LETTER IE -// 1bc49 DUPLOYAN LETTER SHORT I -// 1bc4a DUPLOYAN LETTER UI -// 1bc4b DUPLOYAN LETTER EE -// 1bc4c DUPLOYAN LETTER SLOAN EH -// 1bc4d DUPLOYAN LETTER ROMANIAN I -// 1bc4e DUPLOYAN LETTER SLOAN EE -// 1bc4f DUPLOYAN LETTER LONG I -// 1bc50 DUPLOYAN LETTER YE -// 1bc51 DUPLOYAN LETTER U -// 1bc52 DUPLOYAN LETTER EU -// 1bc53 DUPLOYAN LETTER XW -// 1bc54 DUPLOYAN LETTER U N -// 1bc55 DUPLOYAN LETTER LONG U -// 1bc56 DUPLOYAN LETTER ROMANIAN U -// 1bc57 DUPLOYAN LETTER UH -// 1bc58 DUPLOYAN LETTER SLOAN U -// 1bc59 DUPLOYAN LETTER OOH -// 1bc5a DUPLOYAN LETTER OW -// 1bc5b DUPLOYAN LETTER OU -// 1bc5c DUPLOYAN LETTER WA -// 1bc5d DUPLOYAN LETTER WO -// 1bc5e DUPLOYAN LETTER WI -// 1bc5f DUPLOYAN LETTER WEI -// 1bc60 DUPLOYAN LETTER WOW -// 1bc61 DUPLOYAN LETTER NASAL U -// 1bc62 DUPLOYAN LETTER NASAL O -// 1bc63 DUPLOYAN LETTER NASAL I -// 1bc64 DUPLOYAN LETTER NASAL A -// 1bc65 DUPLOYAN LETTER PERNIN AN -// 1bc66 DUPLOYAN LETTER PERNIN AM -// 1bc67 DUPLOYAN LETTER SLOAN EN -// 1bc68 DUPLOYAN LETTER SLOAN AN -// 1bc69 DUPLOYAN LETTER SLOAN ON -// 1bc6a DUPLOYAN LETTER VOCALIC M - { 0x1BC00, 0x6B, 0x9, 0, 0 }, -// 1bc70 DUPLOYAN AFFIX LEFT HORIZONTAL SECANT -// 1bc71 DUPLOYAN AFFIX MID HORIZONTAL SECANT -// 1bc72 DUPLOYAN AFFIX RIGHT HORIZONTAL SECANT -// 1bc73 DUPLOYAN AFFIX LOW VERTICAL SECANT -// 1bc74 DUPLOYAN AFFIX MID VERTICAL SECANT -// 1bc75 DUPLOYAN AFFIX HIGH VERTICAL SECANT -// 1bc76 DUPLOYAN AFFIX ATTACHED SECANT -// 1bc77 DUPLOYAN AFFIX ATTACHED LEFT-TO-RIGHT SECANT -// 1bc78 DUPLOYAN AFFIX ATTACHED TANGENT -// 1bc79 DUPLOYAN AFFIX ATTACHED TAIL -// 1bc7a DUPLOYAN AFFIX ATTACHED E HOOK -// 1bc7b DUPLOYAN AFFIX ATTACHED I HOOK -// 1bc7c DUPLOYAN AFFIX ATTACHED TANGENT HOOK - { 0x1BC70, 0xD, 0x9, 0, 0 }, -// 1bc80 DUPLOYAN AFFIX HIGH ACUTE -// 1bc81 DUPLOYAN AFFIX HIGH TIGHT ACUTE -// 1bc82 DUPLOYAN AFFIX HIGH GRAVE -// 1bc83 DUPLOYAN AFFIX HIGH LONG GRAVE -// 1bc84 DUPLOYAN AFFIX HIGH DOT -// 1bc85 DUPLOYAN AFFIX HIGH CIRCLE -// 1bc86 DUPLOYAN AFFIX HIGH LINE -// 1bc87 DUPLOYAN AFFIX HIGH WAVE -// 1bc88 DUPLOYAN AFFIX HIGH VERTICAL - { 0x1BC80, 0x9, 0x9, 0, 0 }, -// 1bc90 DUPLOYAN AFFIX LOW ACUTE -// 1bc91 DUPLOYAN AFFIX LOW TIGHT ACUTE -// 1bc92 DUPLOYAN AFFIX LOW GRAVE -// 1bc93 DUPLOYAN AFFIX LOW LONG GRAVE -// 1bc94 DUPLOYAN AFFIX LOW DOT -// 1bc95 DUPLOYAN AFFIX LOW CIRCLE -// 1bc96 DUPLOYAN AFFIX LOW LINE -// 1bc97 DUPLOYAN AFFIX LOW WAVE -// 1bc98 DUPLOYAN AFFIX LOW VERTICAL -// 1bc99 DUPLOYAN AFFIX LOW ARROW - { 0x1BC90, 0xA, 0x9, 0, 0 }, -// 1bc9c DUPLOYAN SIGN O WITH CROSS - { 0x1BC9C, 0x1, 0x8, 0, 0 }, -// 1bc9d DUPLOYAN THICK LETTER SELECTOR -// 1bc9e DUPLOYAN DOUBLE MARK - { 0x1BC9D, 0x2, 0x0, 0, 0 }, -// 1bc9f DUPLOYAN PUNCTUATION CHINOOK FULL STOP - { 0x1BC9F, 0x1, 0x18, 0, 0 }, -// 1bca0 SHORTHAND FORMAT LETTER OVERLAP -// 1bca1 SHORTHAND FORMAT CONTINUING OVERLAP -// 1bca2 SHORTHAND FORMAT DOWN STEP -// 1bca3 SHORTHAND FORMAT UP STEP - { 0x1BCA0, 0x4, 0x0, 0, 0 }, -// 1d000 BYZANTINE MUSICAL SYMBOL PSILI -// 1d001 BYZANTINE MUSICAL SYMBOL DASEIA -// 1d002 BYZANTINE MUSICAL SYMBOL PERISPOMENI -// 1d003 BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON -// 1d004 BYZANTINE MUSICAL SYMBOL OXEIA DIPLI -// 1d005 BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON -// 1d006 BYZANTINE MUSICAL SYMBOL VAREIA DIPLI -// 1d007 BYZANTINE MUSICAL SYMBOL KATHISTI -// 1d008 BYZANTINE MUSICAL SYMBOL SYRMATIKI -// 1d009 BYZANTINE MUSICAL SYMBOL PARAKLITIKI -// 1d00a BYZANTINE MUSICAL SYMBOL YPOKRISIS -// 1d00b BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI -// 1d00c BYZANTINE MUSICAL SYMBOL KREMASTI -// 1d00d BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON -// 1d00e BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON -// 1d00f BYZANTINE MUSICAL SYMBOL TELEIA -// 1d010 BYZANTINE MUSICAL SYMBOL KENTIMATA -// 1d011 BYZANTINE MUSICAL SYMBOL APOSTROFOS -// 1d012 BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI -// 1d013 BYZANTINE MUSICAL SYMBOL SYNEVMA -// 1d014 BYZANTINE MUSICAL SYMBOL THITA -// 1d015 BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION -// 1d016 BYZANTINE MUSICAL SYMBOL GORGON ARCHAION -// 1d017 BYZANTINE MUSICAL SYMBOL PSILON -// 1d018 BYZANTINE MUSICAL SYMBOL CHAMILON -// 1d019 BYZANTINE MUSICAL SYMBOL VATHY -// 1d01a BYZANTINE MUSICAL SYMBOL ISON ARCHAION -// 1d01b BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION -// 1d01c BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION -// 1d01d BYZANTINE MUSICAL SYMBOL SAXIMATA -// 1d01e BYZANTINE MUSICAL SYMBOL PARICHON -// 1d01f BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA -// 1d020 BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION -// 1d021 BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION -// 1d022 BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION -// 1d023 BYZANTINE MUSICAL SYMBOL APOTHEMA -// 1d024 BYZANTINE MUSICAL SYMBOL KLASMA -// 1d025 BYZANTINE MUSICAL SYMBOL REVMA -// 1d026 BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION -// 1d027 BYZANTINE MUSICAL SYMBOL TINAGMA -// 1d028 BYZANTINE MUSICAL SYMBOL ANATRICHISMA -// 1d029 BYZANTINE MUSICAL SYMBOL SEISMA -// 1d02a BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION -// 1d02b BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU -// 1d02c BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION -// 1d02d BYZANTINE MUSICAL SYMBOL THEMA -// 1d02e BYZANTINE MUSICAL SYMBOL LEMOI -// 1d02f BYZANTINE MUSICAL SYMBOL DYO -// 1d030 BYZANTINE MUSICAL SYMBOL TRIA -// 1d031 BYZANTINE MUSICAL SYMBOL TESSERA -// 1d032 BYZANTINE MUSICAL SYMBOL KRATIMATA -// 1d033 BYZANTINE MUSICAL SYMBOL APESO EXO NEO -// 1d034 BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION -// 1d035 BYZANTINE MUSICAL SYMBOL IMIFTHORA -// 1d036 BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION -// 1d037 BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON -// 1d038 BYZANTINE MUSICAL SYMBOL PELASTON -// 1d039 BYZANTINE MUSICAL SYMBOL PSIFISTON -// 1d03a BYZANTINE MUSICAL SYMBOL KONTEVMA -// 1d03b BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION -// 1d03c BYZANTINE MUSICAL SYMBOL RAPISMA -// 1d03d BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION -// 1d03e BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION -// 1d03f BYZANTINE MUSICAL SYMBOL ICHADIN -// 1d040 BYZANTINE MUSICAL SYMBOL NANA -// 1d041 BYZANTINE MUSICAL SYMBOL PETASMA -// 1d042 BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO -// 1d043 BYZANTINE MUSICAL SYMBOL TROMIKON ALLO -// 1d044 BYZANTINE MUSICAL SYMBOL STRAGGISMATA -// 1d045 BYZANTINE MUSICAL SYMBOL GRONTHISMATA -// 1d046 BYZANTINE MUSICAL SYMBOL ISON NEO -// 1d047 BYZANTINE MUSICAL SYMBOL OLIGON NEO -// 1d048 BYZANTINE MUSICAL SYMBOL OXEIA NEO -// 1d049 BYZANTINE MUSICAL SYMBOL PETASTI -// 1d04a BYZANTINE MUSICAL SYMBOL KOUFISMA -// 1d04b BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA -// 1d04c BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA -// 1d04d BYZANTINE MUSICAL SYMBOL PELASTON NEO -// 1d04e BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO -// 1d04f BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO -// 1d050 BYZANTINE MUSICAL SYMBOL YPSILI -// 1d051 BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO -// 1d052 BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO -// 1d053 BYZANTINE MUSICAL SYMBOL YPORROI -// 1d054 BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON -// 1d055 BYZANTINE MUSICAL SYMBOL ELAFRON -// 1d056 BYZANTINE MUSICAL SYMBOL CHAMILI -// 1d057 BYZANTINE MUSICAL SYMBOL MIKRON ISON -// 1d058 BYZANTINE MUSICAL SYMBOL VAREIA NEO -// 1d059 BYZANTINE MUSICAL SYMBOL PIASMA NEO -// 1d05a BYZANTINE MUSICAL SYMBOL PSIFISTON NEO -// 1d05b BYZANTINE MUSICAL SYMBOL OMALON -// 1d05c BYZANTINE MUSICAL SYMBOL ANTIKENOMA -// 1d05d BYZANTINE MUSICAL SYMBOL LYGISMA -// 1d05e BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO -// 1d05f BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO -// 1d060 BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA -// 1d061 BYZANTINE MUSICAL SYMBOL KYLISMA -// 1d062 BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA -// 1d063 BYZANTINE MUSICAL SYMBOL TROMIKON NEO -// 1d064 BYZANTINE MUSICAL SYMBOL EKSTREPTON -// 1d065 BYZANTINE MUSICAL SYMBOL SYNAGMA NEO -// 1d066 BYZANTINE MUSICAL SYMBOL SYRMA -// 1d067 BYZANTINE MUSICAL SYMBOL CHOREVMA NEO -// 1d068 BYZANTINE MUSICAL SYMBOL EPEGERMA -// 1d069 BYZANTINE MUSICAL SYMBOL SEISMA NEO -// 1d06a BYZANTINE MUSICAL SYMBOL XIRON KLASMA -// 1d06b BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON -// 1d06c BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA -// 1d06d BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA -// 1d06e BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA -// 1d06f BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA -// 1d070 BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA -// 1d071 BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA -// 1d072 BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON -// 1d073 BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON -// 1d074 BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON -// 1d075 BYZANTINE MUSICAL SYMBOL OYRANISMA NEO -// 1d076 BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO -// 1d077 BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO -// 1d078 BYZANTINE MUSICAL SYMBOL THEMA APLOUN -// 1d079 BYZANTINE MUSICAL SYMBOL THES KAI APOTHES -// 1d07a BYZANTINE MUSICAL SYMBOL KATAVASMA -// 1d07b BYZANTINE MUSICAL SYMBOL ENDOFONON -// 1d07c BYZANTINE MUSICAL SYMBOL YFEN KATO -// 1d07d BYZANTINE MUSICAL SYMBOL YFEN ANO -// 1d07e BYZANTINE MUSICAL SYMBOL STAVROS -// 1d07f BYZANTINE MUSICAL SYMBOL KLASMA ANO -// 1d080 BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION -// 1d081 BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION -// 1d082 BYZANTINE MUSICAL SYMBOL KRATIMA ALLO -// 1d083 BYZANTINE MUSICAL SYMBOL KRATIMA NEO -// 1d084 BYZANTINE MUSICAL SYMBOL APODERMA NEO -// 1d085 BYZANTINE MUSICAL SYMBOL APLI -// 1d086 BYZANTINE MUSICAL SYMBOL DIPLI -// 1d087 BYZANTINE MUSICAL SYMBOL TRIPLI -// 1d088 BYZANTINE MUSICAL SYMBOL TETRAPLI -// 1d089 BYZANTINE MUSICAL SYMBOL KORONIS -// 1d08a BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU -// 1d08b BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON -// 1d08c BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON -// 1d08d BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON -// 1d08e BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU -// 1d08f BYZANTINE MUSICAL SYMBOL GORGON NEO ANO -// 1d090 BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA -// 1d091 BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA -// 1d092 BYZANTINE MUSICAL SYMBOL DIGORGON -// 1d093 BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO -// 1d094 BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO -// 1d095 BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA -// 1d096 BYZANTINE MUSICAL SYMBOL TRIGORGON -// 1d097 BYZANTINE MUSICAL SYMBOL ARGON -// 1d098 BYZANTINE MUSICAL SYMBOL IMIDIARGON -// 1d099 BYZANTINE MUSICAL SYMBOL DIARGON -// 1d09a BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI -// 1d09b BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI -// 1d09c BYZANTINE MUSICAL SYMBOL AGOGI ARGI -// 1d09d BYZANTINE MUSICAL SYMBOL AGOGI METRIA -// 1d09e BYZANTINE MUSICAL SYMBOL AGOGI MESI -// 1d09f BYZANTINE MUSICAL SYMBOL AGOGI GORGI -// 1d0a0 BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI -// 1d0a1 BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI -// 1d0a2 BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS -// 1d0a3 BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS -// 1d0a4 BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS -// 1d0a5 BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS -// 1d0a6 BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS -// 1d0a7 BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS -// 1d0a8 BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS -// 1d0a9 BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS -// 1d0aa BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS -// 1d0ab BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS -// 1d0ac BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS -// 1d0ad BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS -// 1d0ae BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS -// 1d0af BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS -// 1d0b0 BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS -// 1d0b1 BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS -// 1d0b2 BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS -// 1d0b3 BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS -// 1d0b4 BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN -// 1d0b5 BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN -// 1d0b6 BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU -// 1d0b7 BYZANTINE MUSICAL SYMBOL IMIFONON -// 1d0b8 BYZANTINE MUSICAL SYMBOL IMIFTHORON -// 1d0b9 BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU -// 1d0ba BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA -// 1d0bb BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA -// 1d0bc BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS -// 1d0bd BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI -// 1d0be BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI -// 1d0bf BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE -// 1d0c0 BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO -// 1d0c1 BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO -// 1d0c2 BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO -// 1d0c3 BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS -// 1d0c4 BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS -// 1d0c5 BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS -// 1d0c6 BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI -// 1d0c7 BYZANTINE MUSICAL SYMBOL FTHORA NENANO -// 1d0c8 BYZANTINE MUSICAL SYMBOL CHROA ZYGOS -// 1d0c9 BYZANTINE MUSICAL SYMBOL CHROA KLITON -// 1d0ca BYZANTINE MUSICAL SYMBOL CHROA SPATHI -// 1d0cb BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION -// 1d0cc BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA -// 1d0cd BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION -// 1d0ce BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION -// 1d0cf BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION -// 1d0d0 BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA -// 1d0d1 BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA -// 1d0d2 BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA -// 1d0d3 BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA -// 1d0d4 BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA -// 1d0d5 BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA -// 1d0d6 BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA -// 1d0d7 BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA -// 1d0d8 BYZANTINE MUSICAL SYMBOL GENIKI DIESIS -// 1d0d9 BYZANTINE MUSICAL SYMBOL GENIKI YFESIS -// 1d0da BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI -// 1d0db BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI -// 1d0dc BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI -// 1d0dd BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS -// 1d0de BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS -// 1d0df BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU -// 1d0e0 BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU -// 1d0e1 BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU -// 1d0e2 BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS -// 1d0e3 BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU -// 1d0e4 BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU -// 1d0e5 BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU -// 1d0e6 BYZANTINE MUSICAL SYMBOL DIGRAMMA GG -// 1d0e7 BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU -// 1d0e8 BYZANTINE MUSICAL SYMBOL STIGMA -// 1d0e9 BYZANTINE MUSICAL SYMBOL ARKTIKO PA -// 1d0ea BYZANTINE MUSICAL SYMBOL ARKTIKO VOU -// 1d0eb BYZANTINE MUSICAL SYMBOL ARKTIKO GA -// 1d0ec BYZANTINE MUSICAL SYMBOL ARKTIKO DI -// 1d0ed BYZANTINE MUSICAL SYMBOL ARKTIKO KE -// 1d0ee BYZANTINE MUSICAL SYMBOL ARKTIKO ZO -// 1d0ef BYZANTINE MUSICAL SYMBOL ARKTIKO NI -// 1d0f0 BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO -// 1d0f1 BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO -// 1d0f2 BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO -// 1d0f3 BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO -// 1d0f4 BYZANTINE MUSICAL SYMBOL KLASMA KATO -// 1d0f5 BYZANTINE MUSICAL SYMBOL GORGON NEO KATO - { 0x1D000, 0xF6, 0x8, 0, 0 }, -// 1d100 MUSICAL SYMBOL SINGLE BARLINE -// 1d101 MUSICAL SYMBOL DOUBLE BARLINE -// 1d102 MUSICAL SYMBOL FINAL BARLINE -// 1d103 MUSICAL SYMBOL REVERSE FINAL BARLINE -// 1d104 MUSICAL SYMBOL DASHED BARLINE -// 1d105 MUSICAL SYMBOL SHORT BARLINE -// 1d106 MUSICAL SYMBOL LEFT REPEAT SIGN -// 1d107 MUSICAL SYMBOL RIGHT REPEAT SIGN -// 1d108 MUSICAL SYMBOL REPEAT DOTS -// 1d109 MUSICAL SYMBOL DAL SEGNO -// 1d10a MUSICAL SYMBOL DA CAPO -// 1d10b MUSICAL SYMBOL SEGNO -// 1d10c MUSICAL SYMBOL CODA -// 1d10d MUSICAL SYMBOL REPEATED FIGURE-1 -// 1d10e MUSICAL SYMBOL REPEATED FIGURE-2 -// 1d10f MUSICAL SYMBOL REPEATED FIGURE-3 -// 1d110 MUSICAL SYMBOL FERMATA -// 1d111 MUSICAL SYMBOL FERMATA BELOW -// 1d112 MUSICAL SYMBOL BREATH MARK -// 1d113 MUSICAL SYMBOL CAESURA -// 1d114 MUSICAL SYMBOL BRACE -// 1d115 MUSICAL SYMBOL BRACKET -// 1d116 MUSICAL SYMBOL ONE-LINE STAFF -// 1d117 MUSICAL SYMBOL TWO-LINE STAFF -// 1d118 MUSICAL SYMBOL THREE-LINE STAFF -// 1d119 MUSICAL SYMBOL FOUR-LINE STAFF -// 1d11a MUSICAL SYMBOL FIVE-LINE STAFF -// 1d11b MUSICAL SYMBOL SIX-LINE STAFF -// 1d11c MUSICAL SYMBOL SIX-STRING FRETBOARD -// 1d11d MUSICAL SYMBOL FOUR-STRING FRETBOARD -// 1d11e MUSICAL SYMBOL G CLEF -// 1d11f MUSICAL SYMBOL G CLEF OTTAVA ALTA -// 1d120 MUSICAL SYMBOL G CLEF OTTAVA BASSA -// 1d121 MUSICAL SYMBOL C CLEF -// 1d122 MUSICAL SYMBOL F CLEF -// 1d123 MUSICAL SYMBOL F CLEF OTTAVA ALTA -// 1d124 MUSICAL SYMBOL F CLEF OTTAVA BASSA -// 1d125 MUSICAL SYMBOL DRUM CLEF-1 -// 1d126 MUSICAL SYMBOL DRUM CLEF-2 - { 0x1D100, 0x27, 0x8, 0, 0 }, -// 1d129 MUSICAL SYMBOL MULTIPLE MEASURE REST -// 1d12a MUSICAL SYMBOL DOUBLE SHARP -// 1d12b MUSICAL SYMBOL DOUBLE FLAT -// 1d12c MUSICAL SYMBOL FLAT UP -// 1d12d MUSICAL SYMBOL FLAT DOWN -// 1d12e MUSICAL SYMBOL NATURAL UP -// 1d12f MUSICAL SYMBOL NATURAL DOWN -// 1d130 MUSICAL SYMBOL SHARP UP -// 1d131 MUSICAL SYMBOL SHARP DOWN -// 1d132 MUSICAL SYMBOL QUARTER TONE SHARP -// 1d133 MUSICAL SYMBOL QUARTER TONE FLAT -// 1d134 MUSICAL SYMBOL COMMON TIME -// 1d135 MUSICAL SYMBOL CUT TIME -// 1d136 MUSICAL SYMBOL OTTAVA ALTA -// 1d137 MUSICAL SYMBOL OTTAVA BASSA -// 1d138 MUSICAL SYMBOL QUINDICESIMA ALTA -// 1d139 MUSICAL SYMBOL QUINDICESIMA BASSA -// 1d13a MUSICAL SYMBOL MULTI REST -// 1d13b MUSICAL SYMBOL WHOLE REST -// 1d13c MUSICAL SYMBOL HALF REST -// 1d13d MUSICAL SYMBOL QUARTER REST -// 1d13e MUSICAL SYMBOL EIGHTH REST -// 1d13f MUSICAL SYMBOL SIXTEENTH REST -// 1d140 MUSICAL SYMBOL THIRTY-SECOND REST -// 1d141 MUSICAL SYMBOL SIXTY-FOURTH REST -// 1d142 MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST -// 1d143 MUSICAL SYMBOL X NOTEHEAD -// 1d144 MUSICAL SYMBOL PLUS NOTEHEAD -// 1d145 MUSICAL SYMBOL CIRCLE X NOTEHEAD -// 1d146 MUSICAL SYMBOL SQUARE NOTEHEAD WHITE -// 1d147 MUSICAL SYMBOL SQUARE NOTEHEAD BLACK -// 1d148 MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE -// 1d149 MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK -// 1d14a MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE -// 1d14b MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK -// 1d14c MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE -// 1d14d MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK -// 1d14e MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE -// 1d14f MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK -// 1d150 MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE -// 1d151 MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK -// 1d152 MUSICAL SYMBOL MOON NOTEHEAD WHITE -// 1d153 MUSICAL SYMBOL MOON NOTEHEAD BLACK -// 1d154 MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN WHITE -// 1d155 MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACK -// 1d156 MUSICAL SYMBOL PARENTHESIS NOTEHEAD -// 1d157 MUSICAL SYMBOL VOID NOTEHEAD -// 1d158 MUSICAL SYMBOL NOTEHEAD BLACK -// 1d159 MUSICAL SYMBOL NULL NOTEHEAD -// 1d15a MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE -// 1d15b MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK -// 1d15c MUSICAL SYMBOL BREVE -// 1d15d MUSICAL SYMBOL WHOLE NOTE -// 1d15e MUSICAL SYMBOL HALF NOTE -// 1d15f MUSICAL SYMBOL QUARTER NOTE -// 1d160 MUSICAL SYMBOL EIGHTH NOTE -// 1d161 MUSICAL SYMBOL SIXTEENTH NOTE -// 1d162 MUSICAL SYMBOL THIRTY-SECOND NOTE -// 1d163 MUSICAL SYMBOL SIXTY-FOURTH NOTE -// 1d164 MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE - { 0x1D129, 0x3C, 0x8, 0, 0 }, -// 1d165 MUSICAL SYMBOL COMBINING STEM -// 1d166 MUSICAL SYMBOL COMBINING SPRECHGESANG STEM -// 1d167 MUSICAL SYMBOL COMBINING TREMOLO-1 -// 1d168 MUSICAL SYMBOL COMBINING TREMOLO-2 -// 1d169 MUSICAL SYMBOL COMBINING TREMOLO-3 - { 0x1D165, 0x5, 0x0, 0, 0 }, -// 1d16a MUSICAL SYMBOL FINGERED TREMOLO-1 -// 1d16b MUSICAL SYMBOL FINGERED TREMOLO-2 -// 1d16c MUSICAL SYMBOL FINGERED TREMOLO-3 - { 0x1D16A, 0x3, 0x8, 0, 0 }, -// 1d16d MUSICAL SYMBOL COMBINING AUGMENTATION DOT -// 1d16e MUSICAL SYMBOL COMBINING FLAG-1 -// 1d16f MUSICAL SYMBOL COMBINING FLAG-2 -// 1d170 MUSICAL SYMBOL COMBINING FLAG-3 -// 1d171 MUSICAL SYMBOL COMBINING FLAG-4 -// 1d172 MUSICAL SYMBOL COMBINING FLAG-5 -// 1d173 MUSICAL SYMBOL BEGIN BEAM -// 1d174 MUSICAL SYMBOL END BEAM -// 1d175 MUSICAL SYMBOL BEGIN TIE -// 1d176 MUSICAL SYMBOL END TIE -// 1d177 MUSICAL SYMBOL BEGIN SLUR -// 1d178 MUSICAL SYMBOL END SLUR -// 1d179 MUSICAL SYMBOL BEGIN PHRASE -// 1d17a MUSICAL SYMBOL END PHRASE -// 1d17b MUSICAL SYMBOL COMBINING ACCENT -// 1d17c MUSICAL SYMBOL COMBINING STACCATO -// 1d17d MUSICAL SYMBOL COMBINING TENUTO -// 1d17e MUSICAL SYMBOL COMBINING STACCATISSIMO -// 1d17f MUSICAL SYMBOL COMBINING MARCATO -// 1d180 MUSICAL SYMBOL COMBINING MARCATO-STACCATO -// 1d181 MUSICAL SYMBOL COMBINING ACCENT-STACCATO -// 1d182 MUSICAL SYMBOL COMBINING LOURE - { 0x1D16D, 0x16, 0x0, 0, 0 }, -// 1d183 MUSICAL SYMBOL ARPEGGIATO UP -// 1d184 MUSICAL SYMBOL ARPEGGIATO DOWN - { 0x1D183, 0x2, 0x8, 0, 0 }, -// 1d185 MUSICAL SYMBOL COMBINING DOIT -// 1d186 MUSICAL SYMBOL COMBINING RIP -// 1d187 MUSICAL SYMBOL COMBINING FLIP -// 1d188 MUSICAL SYMBOL COMBINING SMEAR -// 1d189 MUSICAL SYMBOL COMBINING BEND -// 1d18a MUSICAL SYMBOL COMBINING DOUBLE TONGUE -// 1d18b MUSICAL SYMBOL COMBINING TRIPLE TONGUE - { 0x1D185, 0x7, 0x0, 0, 0 }, -// 1d18c MUSICAL SYMBOL RINFORZANDO -// 1d18d MUSICAL SYMBOL SUBITO -// 1d18e MUSICAL SYMBOL Z -// 1d18f MUSICAL SYMBOL PIANO -// 1d190 MUSICAL SYMBOL MEZZO -// 1d191 MUSICAL SYMBOL FORTE -// 1d192 MUSICAL SYMBOL CRESCENDO -// 1d193 MUSICAL SYMBOL DECRESCENDO -// 1d194 MUSICAL SYMBOL GRACE NOTE SLASH -// 1d195 MUSICAL SYMBOL GRACE NOTE NO SLASH -// 1d196 MUSICAL SYMBOL TR -// 1d197 MUSICAL SYMBOL TURN -// 1d198 MUSICAL SYMBOL INVERTED TURN -// 1d199 MUSICAL SYMBOL TURN SLASH -// 1d19a MUSICAL SYMBOL TURN UP -// 1d19b MUSICAL SYMBOL ORNAMENT STROKE-1 -// 1d19c MUSICAL SYMBOL ORNAMENT STROKE-2 -// 1d19d MUSICAL SYMBOL ORNAMENT STROKE-3 -// 1d19e MUSICAL SYMBOL ORNAMENT STROKE-4 -// 1d19f MUSICAL SYMBOL ORNAMENT STROKE-5 -// 1d1a0 MUSICAL SYMBOL ORNAMENT STROKE-6 -// 1d1a1 MUSICAL SYMBOL ORNAMENT STROKE-7 -// 1d1a2 MUSICAL SYMBOL ORNAMENT STROKE-8 -// 1d1a3 MUSICAL SYMBOL ORNAMENT STROKE-9 -// 1d1a4 MUSICAL SYMBOL ORNAMENT STROKE-10 -// 1d1a5 MUSICAL SYMBOL ORNAMENT STROKE-11 -// 1d1a6 MUSICAL SYMBOL HAUPTSTIMME -// 1d1a7 MUSICAL SYMBOL NEBENSTIMME -// 1d1a8 MUSICAL SYMBOL END OF STIMME -// 1d1a9 MUSICAL SYMBOL DEGREE SLASH - { 0x1D18C, 0x1E, 0x8, 0, 0 }, -// 1d1aa MUSICAL SYMBOL COMBINING DOWN BOW -// 1d1ab MUSICAL SYMBOL COMBINING UP BOW -// 1d1ac MUSICAL SYMBOL COMBINING HARMONIC -// 1d1ad MUSICAL SYMBOL COMBINING SNAP PIZZICATO - { 0x1D1AA, 0x4, 0x0, 0, 0 }, -// 1d1ae MUSICAL SYMBOL PEDAL MARK -// 1d1af MUSICAL SYMBOL PEDAL UP MARK -// 1d1b0 MUSICAL SYMBOL HALF PEDAL MARK -// 1d1b1 MUSICAL SYMBOL GLISSANDO UP -// 1d1b2 MUSICAL SYMBOL GLISSANDO DOWN -// 1d1b3 MUSICAL SYMBOL WITH FINGERNAILS -// 1d1b4 MUSICAL SYMBOL DAMP -// 1d1b5 MUSICAL SYMBOL DAMP ALL -// 1d1b6 MUSICAL SYMBOL MAXIMA -// 1d1b7 MUSICAL SYMBOL LONGA -// 1d1b8 MUSICAL SYMBOL BREVIS -// 1d1b9 MUSICAL SYMBOL SEMIBREVIS WHITE -// 1d1ba MUSICAL SYMBOL SEMIBREVIS BLACK -// 1d1bb MUSICAL SYMBOL MINIMA -// 1d1bc MUSICAL SYMBOL MINIMA BLACK -// 1d1bd MUSICAL SYMBOL SEMIMINIMA WHITE -// 1d1be MUSICAL SYMBOL SEMIMINIMA BLACK -// 1d1bf MUSICAL SYMBOL FUSA WHITE -// 1d1c0 MUSICAL SYMBOL FUSA BLACK -// 1d1c1 MUSICAL SYMBOL LONGA PERFECTA REST -// 1d1c2 MUSICAL SYMBOL LONGA IMPERFECTA REST -// 1d1c3 MUSICAL SYMBOL BREVIS REST -// 1d1c4 MUSICAL SYMBOL SEMIBREVIS REST -// 1d1c5 MUSICAL SYMBOL MINIMA REST -// 1d1c6 MUSICAL SYMBOL SEMIMINIMA REST -// 1d1c7 MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA -// 1d1c8 MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA -// 1d1c9 MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1 -// 1d1ca MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA -// 1d1cb MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA -// 1d1cc MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1 -// 1d1cd MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2 -// 1d1ce MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3 -// 1d1cf MUSICAL SYMBOL CROIX -// 1d1d0 MUSICAL SYMBOL GREGORIAN C CLEF -// 1d1d1 MUSICAL SYMBOL GREGORIAN F CLEF -// 1d1d2 MUSICAL SYMBOL SQUARE B -// 1d1d3 MUSICAL SYMBOL VIRGA -// 1d1d4 MUSICAL SYMBOL PODATUS -// 1d1d5 MUSICAL SYMBOL CLIVIS -// 1d1d6 MUSICAL SYMBOL SCANDICUS -// 1d1d7 MUSICAL SYMBOL CLIMACUS -// 1d1d8 MUSICAL SYMBOL TORCULUS -// 1d1d9 MUSICAL SYMBOL PORRECTUS -// 1d1da MUSICAL SYMBOL PORRECTUS FLEXUS -// 1d1db MUSICAL SYMBOL SCANDICUS FLEXUS -// 1d1dc MUSICAL SYMBOL TORCULUS RESUPINUS -// 1d1dd MUSICAL SYMBOL PES SUBPUNCTIS - { 0x1D1AE, 0x30, 0x8, 0, 0 }, -// 1d200 GREEK VOCAL NOTATION SYMBOL-1 -// 1d201 GREEK VOCAL NOTATION SYMBOL-2 -// 1d202 GREEK VOCAL NOTATION SYMBOL-3 -// 1d203 GREEK VOCAL NOTATION SYMBOL-4 -// 1d204 GREEK VOCAL NOTATION SYMBOL-5 -// 1d205 GREEK VOCAL NOTATION SYMBOL-6 -// 1d206 GREEK VOCAL NOTATION SYMBOL-7 -// 1d207 GREEK VOCAL NOTATION SYMBOL-8 -// 1d208 GREEK VOCAL NOTATION SYMBOL-9 -// 1d209 GREEK VOCAL NOTATION SYMBOL-10 -// 1d20a GREEK VOCAL NOTATION SYMBOL-11 -// 1d20b GREEK VOCAL NOTATION SYMBOL-12 -// 1d20c GREEK VOCAL NOTATION SYMBOL-13 -// 1d20d GREEK VOCAL NOTATION SYMBOL-14 -// 1d20e GREEK VOCAL NOTATION SYMBOL-15 -// 1d20f GREEK VOCAL NOTATION SYMBOL-16 -// 1d210 GREEK VOCAL NOTATION SYMBOL-17 -// 1d211 GREEK VOCAL NOTATION SYMBOL-18 -// 1d212 GREEK VOCAL NOTATION SYMBOL-19 -// 1d213 GREEK VOCAL NOTATION SYMBOL-20 -// 1d214 GREEK VOCAL NOTATION SYMBOL-21 -// 1d215 GREEK VOCAL NOTATION SYMBOL-22 -// 1d216 GREEK VOCAL NOTATION SYMBOL-23 -// 1d217 GREEK VOCAL NOTATION SYMBOL-24 -// 1d218 GREEK VOCAL NOTATION SYMBOL-50 -// 1d219 GREEK VOCAL NOTATION SYMBOL-51 -// 1d21a GREEK VOCAL NOTATION SYMBOL-52 -// 1d21b GREEK VOCAL NOTATION SYMBOL-53 -// 1d21c GREEK VOCAL NOTATION SYMBOL-54 -// 1d21d GREEK INSTRUMENTAL NOTATION SYMBOL-1 -// 1d21e GREEK INSTRUMENTAL NOTATION SYMBOL-2 -// 1d21f GREEK INSTRUMENTAL NOTATION SYMBOL-4 -// 1d220 GREEK INSTRUMENTAL NOTATION SYMBOL-5 -// 1d221 GREEK INSTRUMENTAL NOTATION SYMBOL-7 -// 1d222 GREEK INSTRUMENTAL NOTATION SYMBOL-8 -// 1d223 GREEK INSTRUMENTAL NOTATION SYMBOL-11 -// 1d224 GREEK INSTRUMENTAL NOTATION SYMBOL-12 -// 1d225 GREEK INSTRUMENTAL NOTATION SYMBOL-13 -// 1d226 GREEK INSTRUMENTAL NOTATION SYMBOL-14 -// 1d227 GREEK INSTRUMENTAL NOTATION SYMBOL-17 -// 1d228 GREEK INSTRUMENTAL NOTATION SYMBOL-18 -// 1d229 GREEK INSTRUMENTAL NOTATION SYMBOL-19 -// 1d22a GREEK INSTRUMENTAL NOTATION SYMBOL-23 -// 1d22b GREEK INSTRUMENTAL NOTATION SYMBOL-24 -// 1d22c GREEK INSTRUMENTAL NOTATION SYMBOL-25 -// 1d22d GREEK INSTRUMENTAL NOTATION SYMBOL-26 -// 1d22e GREEK INSTRUMENTAL NOTATION SYMBOL-27 -// 1d22f GREEK INSTRUMENTAL NOTATION SYMBOL-29 -// 1d230 GREEK INSTRUMENTAL NOTATION SYMBOL-30 -// 1d231 GREEK INSTRUMENTAL NOTATION SYMBOL-32 -// 1d232 GREEK INSTRUMENTAL NOTATION SYMBOL-36 -// 1d233 GREEK INSTRUMENTAL NOTATION SYMBOL-37 -// 1d234 GREEK INSTRUMENTAL NOTATION SYMBOL-38 -// 1d235 GREEK INSTRUMENTAL NOTATION SYMBOL-39 -// 1d236 GREEK INSTRUMENTAL NOTATION SYMBOL-40 -// 1d237 GREEK INSTRUMENTAL NOTATION SYMBOL-42 -// 1d238 GREEK INSTRUMENTAL NOTATION SYMBOL-43 -// 1d239 GREEK INSTRUMENTAL NOTATION SYMBOL-45 -// 1d23a GREEK INSTRUMENTAL NOTATION SYMBOL-47 -// 1d23b GREEK INSTRUMENTAL NOTATION SYMBOL-48 -// 1d23c GREEK INSTRUMENTAL NOTATION SYMBOL-49 -// 1d23d GREEK INSTRUMENTAL NOTATION SYMBOL-50 -// 1d23e GREEK INSTRUMENTAL NOTATION SYMBOL-51 -// 1d23f GREEK INSTRUMENTAL NOTATION SYMBOL-52 -// 1d240 GREEK INSTRUMENTAL NOTATION SYMBOL-53 -// 1d241 GREEK INSTRUMENTAL NOTATION SYMBOL-54 - { 0x1D200, 0x42, 0x8, 0, 0 }, -// 1d242 COMBINING GREEK MUSICAL TRISEME -// 1d243 COMBINING GREEK MUSICAL TETRASEME -// 1d244 COMBINING GREEK MUSICAL PENTASEME - { 0x1D242, 0x3, 0x0, 0, 0 }, -// 1d245 GREEK MUSICAL LEIMMA - { 0x1D245, 0x1, 0x8, 0, 0 }, -// 1d300 MONOGRAM FOR EARTH -// 1d301 DIGRAM FOR HEAVENLY EARTH -// 1d302 DIGRAM FOR HUMAN EARTH -// 1d303 DIGRAM FOR EARTHLY HEAVEN -// 1d304 DIGRAM FOR EARTHLY HUMAN -// 1d305 DIGRAM FOR EARTH -// 1d306 TETRAGRAM FOR CENTRE -// 1d307 TETRAGRAM FOR FULL CIRCLE -// 1d308 TETRAGRAM FOR MIRED -// 1d309 TETRAGRAM FOR BARRIER -// 1d30a TETRAGRAM FOR KEEPING SMALL -// 1d30b TETRAGRAM FOR CONTRARIETY -// 1d30c TETRAGRAM FOR ASCENT -// 1d30d TETRAGRAM FOR OPPOSITION -// 1d30e TETRAGRAM FOR BRANCHING OUT -// 1d30f TETRAGRAM FOR DEFECTIVENESS OR DISTORTION -// 1d310 TETRAGRAM FOR DIVERGENCE -// 1d311 TETRAGRAM FOR YOUTHFULNESS -// 1d312 TETRAGRAM FOR INCREASE -// 1d313 TETRAGRAM FOR PENETRATION -// 1d314 TETRAGRAM FOR REACH -// 1d315 TETRAGRAM FOR CONTACT -// 1d316 TETRAGRAM FOR HOLDING BACK -// 1d317 TETRAGRAM FOR WAITING -// 1d318 TETRAGRAM FOR FOLLOWING -// 1d319 TETRAGRAM FOR ADVANCE -// 1d31a TETRAGRAM FOR RELEASE -// 1d31b TETRAGRAM FOR RESISTANCE -// 1d31c TETRAGRAM FOR EASE -// 1d31d TETRAGRAM FOR JOY -// 1d31e TETRAGRAM FOR CONTENTION -// 1d31f TETRAGRAM FOR ENDEAVOUR -// 1d320 TETRAGRAM FOR DUTIES -// 1d321 TETRAGRAM FOR CHANGE -// 1d322 TETRAGRAM FOR DECISIVENESS -// 1d323 TETRAGRAM FOR BOLD RESOLUTION -// 1d324 TETRAGRAM FOR PACKING -// 1d325 TETRAGRAM FOR LEGION -// 1d326 TETRAGRAM FOR CLOSENESS -// 1d327 TETRAGRAM FOR KINSHIP -// 1d328 TETRAGRAM FOR GATHERING -// 1d329 TETRAGRAM FOR STRENGTH -// 1d32a TETRAGRAM FOR PURITY -// 1d32b TETRAGRAM FOR FULLNESS -// 1d32c TETRAGRAM FOR RESIDENCE -// 1d32d TETRAGRAM FOR LAW OR MODEL -// 1d32e TETRAGRAM FOR RESPONSE -// 1d32f TETRAGRAM FOR GOING TO MEET -// 1d330 TETRAGRAM FOR ENCOUNTERS -// 1d331 TETRAGRAM FOR STOVE -// 1d332 TETRAGRAM FOR GREATNESS -// 1d333 TETRAGRAM FOR ENLARGEMENT -// 1d334 TETRAGRAM FOR PATTERN -// 1d335 TETRAGRAM FOR RITUAL -// 1d336 TETRAGRAM FOR FLIGHT -// 1d337 TETRAGRAM FOR VASTNESS OR WASTING -// 1d338 TETRAGRAM FOR CONSTANCY -// 1d339 TETRAGRAM FOR MEASURE -// 1d33a TETRAGRAM FOR ETERNITY -// 1d33b TETRAGRAM FOR UNITY -// 1d33c TETRAGRAM FOR DIMINISHMENT -// 1d33d TETRAGRAM FOR CLOSED MOUTH -// 1d33e TETRAGRAM FOR GUARDEDNESS -// 1d33f TETRAGRAM FOR GATHERING IN -// 1d340 TETRAGRAM FOR MASSING -// 1d341 TETRAGRAM FOR ACCUMULATION -// 1d342 TETRAGRAM FOR EMBELLISHMENT -// 1d343 TETRAGRAM FOR DOUBT -// 1d344 TETRAGRAM FOR WATCH -// 1d345 TETRAGRAM FOR SINKING -// 1d346 TETRAGRAM FOR INNER -// 1d347 TETRAGRAM FOR DEPARTURE -// 1d348 TETRAGRAM FOR DARKENING -// 1d349 TETRAGRAM FOR DIMMING -// 1d34a TETRAGRAM FOR EXHAUSTION -// 1d34b TETRAGRAM FOR SEVERANCE -// 1d34c TETRAGRAM FOR STOPPAGE -// 1d34d TETRAGRAM FOR HARDNESS -// 1d34e TETRAGRAM FOR COMPLETION -// 1d34f TETRAGRAM FOR CLOSURE -// 1d350 TETRAGRAM FOR FAILURE -// 1d351 TETRAGRAM FOR AGGRAVATION -// 1d352 TETRAGRAM FOR COMPLIANCE -// 1d353 TETRAGRAM FOR ON THE VERGE -// 1d354 TETRAGRAM FOR DIFFICULTIES -// 1d355 TETRAGRAM FOR LABOURING -// 1d356 TETRAGRAM FOR FOSTERING - { 0x1D300, 0x57, 0x8, 0, 0 }, -// 1d360 COUNTING ROD UNIT DIGIT ONE -// 1d361 COUNTING ROD UNIT DIGIT TWO -// 1d362 COUNTING ROD UNIT DIGIT THREE -// 1d363 COUNTING ROD UNIT DIGIT FOUR -// 1d364 COUNTING ROD UNIT DIGIT FIVE -// 1d365 COUNTING ROD UNIT DIGIT SIX -// 1d366 COUNTING ROD UNIT DIGIT SEVEN -// 1d367 COUNTING ROD UNIT DIGIT EIGHT -// 1d368 COUNTING ROD UNIT DIGIT NINE -// 1d369 COUNTING ROD TENS DIGIT ONE -// 1d36a COUNTING ROD TENS DIGIT TWO -// 1d36b COUNTING ROD TENS DIGIT THREE -// 1d36c COUNTING ROD TENS DIGIT FOUR -// 1d36d COUNTING ROD TENS DIGIT FIVE -// 1d36e COUNTING ROD TENS DIGIT SIX -// 1d36f COUNTING ROD TENS DIGIT SEVEN -// 1d370 COUNTING ROD TENS DIGIT EIGHT -// 1d371 COUNTING ROD TENS DIGIT NINE - { 0x1D360, 0x12, 0x8, 0, 0 }, -// 1d400 MATHEMATICAL BOLD CAPITAL A -// 1d401 MATHEMATICAL BOLD CAPITAL B -// 1d402 MATHEMATICAL BOLD CAPITAL C -// 1d403 MATHEMATICAL BOLD CAPITAL D -// 1d404 MATHEMATICAL BOLD CAPITAL E -// 1d405 MATHEMATICAL BOLD CAPITAL F -// 1d406 MATHEMATICAL BOLD CAPITAL G -// 1d407 MATHEMATICAL BOLD CAPITAL H -// 1d408 MATHEMATICAL BOLD CAPITAL I -// 1d409 MATHEMATICAL BOLD CAPITAL J -// 1d40a MATHEMATICAL BOLD CAPITAL K -// 1d40b MATHEMATICAL BOLD CAPITAL L -// 1d40c MATHEMATICAL BOLD CAPITAL M -// 1d40d MATHEMATICAL BOLD CAPITAL N -// 1d40e MATHEMATICAL BOLD CAPITAL O -// 1d40f MATHEMATICAL BOLD CAPITAL P -// 1d410 MATHEMATICAL BOLD CAPITAL Q -// 1d411 MATHEMATICAL BOLD CAPITAL R -// 1d412 MATHEMATICAL BOLD CAPITAL S -// 1d413 MATHEMATICAL BOLD CAPITAL T -// 1d414 MATHEMATICAL BOLD CAPITAL U -// 1d415 MATHEMATICAL BOLD CAPITAL V -// 1d416 MATHEMATICAL BOLD CAPITAL W -// 1d417 MATHEMATICAL BOLD CAPITAL X -// 1d418 MATHEMATICAL BOLD CAPITAL Y -// 1d419 MATHEMATICAL BOLD CAPITAL Z - { 0x1D400, 0x1A, 0x89, 0, 0 }, -// 1d41a MATHEMATICAL BOLD SMALL A -// 1d41b MATHEMATICAL BOLD SMALL B -// 1d41c MATHEMATICAL BOLD SMALL C -// 1d41d MATHEMATICAL BOLD SMALL D -// 1d41e MATHEMATICAL BOLD SMALL E -// 1d41f MATHEMATICAL BOLD SMALL F -// 1d420 MATHEMATICAL BOLD SMALL G -// 1d421 MATHEMATICAL BOLD SMALL H -// 1d422 MATHEMATICAL BOLD SMALL I -// 1d423 MATHEMATICAL BOLD SMALL J -// 1d424 MATHEMATICAL BOLD SMALL K -// 1d425 MATHEMATICAL BOLD SMALL L -// 1d426 MATHEMATICAL BOLD SMALL M -// 1d427 MATHEMATICAL BOLD SMALL N -// 1d428 MATHEMATICAL BOLD SMALL O -// 1d429 MATHEMATICAL BOLD SMALL P -// 1d42a MATHEMATICAL BOLD SMALL Q -// 1d42b MATHEMATICAL BOLD SMALL R -// 1d42c MATHEMATICAL BOLD SMALL S -// 1d42d MATHEMATICAL BOLD SMALL T -// 1d42e MATHEMATICAL BOLD SMALL U -// 1d42f MATHEMATICAL BOLD SMALL V -// 1d430 MATHEMATICAL BOLD SMALL W -// 1d431 MATHEMATICAL BOLD SMALL X -// 1d432 MATHEMATICAL BOLD SMALL Y -// 1d433 MATHEMATICAL BOLD SMALL Z - { 0x1D41A, 0x1A, 0x49, 0, 0 }, -// 1d434 MATHEMATICAL ITALIC CAPITAL A -// 1d435 MATHEMATICAL ITALIC CAPITAL B -// 1d436 MATHEMATICAL ITALIC CAPITAL C -// 1d437 MATHEMATICAL ITALIC CAPITAL D -// 1d438 MATHEMATICAL ITALIC CAPITAL E -// 1d439 MATHEMATICAL ITALIC CAPITAL F -// 1d43a MATHEMATICAL ITALIC CAPITAL G -// 1d43b MATHEMATICAL ITALIC CAPITAL H -// 1d43c MATHEMATICAL ITALIC CAPITAL I -// 1d43d MATHEMATICAL ITALIC CAPITAL J -// 1d43e MATHEMATICAL ITALIC CAPITAL K -// 1d43f MATHEMATICAL ITALIC CAPITAL L -// 1d440 MATHEMATICAL ITALIC CAPITAL M -// 1d441 MATHEMATICAL ITALIC CAPITAL N -// 1d442 MATHEMATICAL ITALIC CAPITAL O -// 1d443 MATHEMATICAL ITALIC CAPITAL P -// 1d444 MATHEMATICAL ITALIC CAPITAL Q -// 1d445 MATHEMATICAL ITALIC CAPITAL R -// 1d446 MATHEMATICAL ITALIC CAPITAL S -// 1d447 MATHEMATICAL ITALIC CAPITAL T -// 1d448 MATHEMATICAL ITALIC CAPITAL U -// 1d449 MATHEMATICAL ITALIC CAPITAL V -// 1d44a MATHEMATICAL ITALIC CAPITAL W -// 1d44b MATHEMATICAL ITALIC CAPITAL X -// 1d44c MATHEMATICAL ITALIC CAPITAL Y -// 1d44d MATHEMATICAL ITALIC CAPITAL Z - { 0x1D434, 0x1A, 0x89, 0, 0 }, -// 1d44e MATHEMATICAL ITALIC SMALL A -// 1d44f MATHEMATICAL ITALIC SMALL B -// 1d450 MATHEMATICAL ITALIC SMALL C -// 1d451 MATHEMATICAL ITALIC SMALL D -// 1d452 MATHEMATICAL ITALIC SMALL E -// 1d453 MATHEMATICAL ITALIC SMALL F -// 1d454 MATHEMATICAL ITALIC SMALL G - { 0x1D44E, 0x7, 0x49, 0, 0 }, -// 1d456 MATHEMATICAL ITALIC SMALL I -// 1d457 MATHEMATICAL ITALIC SMALL J -// 1d458 MATHEMATICAL ITALIC SMALL K -// 1d459 MATHEMATICAL ITALIC SMALL L -// 1d45a MATHEMATICAL ITALIC SMALL M -// 1d45b MATHEMATICAL ITALIC SMALL N -// 1d45c MATHEMATICAL ITALIC SMALL O -// 1d45d MATHEMATICAL ITALIC SMALL P -// 1d45e MATHEMATICAL ITALIC SMALL Q -// 1d45f MATHEMATICAL ITALIC SMALL R -// 1d460 MATHEMATICAL ITALIC SMALL S -// 1d461 MATHEMATICAL ITALIC SMALL T -// 1d462 MATHEMATICAL ITALIC SMALL U -// 1d463 MATHEMATICAL ITALIC SMALL V -// 1d464 MATHEMATICAL ITALIC SMALL W -// 1d465 MATHEMATICAL ITALIC SMALL X -// 1d466 MATHEMATICAL ITALIC SMALL Y -// 1d467 MATHEMATICAL ITALIC SMALL Z - { 0x1D456, 0x12, 0x49, 0, 0 }, -// 1d468 MATHEMATICAL BOLD ITALIC CAPITAL A -// 1d469 MATHEMATICAL BOLD ITALIC CAPITAL B -// 1d46a MATHEMATICAL BOLD ITALIC CAPITAL C -// 1d46b MATHEMATICAL BOLD ITALIC CAPITAL D -// 1d46c MATHEMATICAL BOLD ITALIC CAPITAL E -// 1d46d MATHEMATICAL BOLD ITALIC CAPITAL F -// 1d46e MATHEMATICAL BOLD ITALIC CAPITAL G -// 1d46f MATHEMATICAL BOLD ITALIC CAPITAL H -// 1d470 MATHEMATICAL BOLD ITALIC CAPITAL I -// 1d471 MATHEMATICAL BOLD ITALIC CAPITAL J -// 1d472 MATHEMATICAL BOLD ITALIC CAPITAL K -// 1d473 MATHEMATICAL BOLD ITALIC CAPITAL L -// 1d474 MATHEMATICAL BOLD ITALIC CAPITAL M -// 1d475 MATHEMATICAL BOLD ITALIC CAPITAL N -// 1d476 MATHEMATICAL BOLD ITALIC CAPITAL O -// 1d477 MATHEMATICAL BOLD ITALIC CAPITAL P -// 1d478 MATHEMATICAL BOLD ITALIC CAPITAL Q -// 1d479 MATHEMATICAL BOLD ITALIC CAPITAL R -// 1d47a MATHEMATICAL BOLD ITALIC CAPITAL S -// 1d47b MATHEMATICAL BOLD ITALIC CAPITAL T -// 1d47c MATHEMATICAL BOLD ITALIC CAPITAL U -// 1d47d MATHEMATICAL BOLD ITALIC CAPITAL V -// 1d47e MATHEMATICAL BOLD ITALIC CAPITAL W -// 1d47f MATHEMATICAL BOLD ITALIC CAPITAL X -// 1d480 MATHEMATICAL BOLD ITALIC CAPITAL Y -// 1d481 MATHEMATICAL BOLD ITALIC CAPITAL Z - { 0x1D468, 0x1A, 0x89, 0, 0 }, -// 1d482 MATHEMATICAL BOLD ITALIC SMALL A -// 1d483 MATHEMATICAL BOLD ITALIC SMALL B -// 1d484 MATHEMATICAL BOLD ITALIC SMALL C -// 1d485 MATHEMATICAL BOLD ITALIC SMALL D -// 1d486 MATHEMATICAL BOLD ITALIC SMALL E -// 1d487 MATHEMATICAL BOLD ITALIC SMALL F -// 1d488 MATHEMATICAL BOLD ITALIC SMALL G -// 1d489 MATHEMATICAL BOLD ITALIC SMALL H -// 1d48a MATHEMATICAL BOLD ITALIC SMALL I -// 1d48b MATHEMATICAL BOLD ITALIC SMALL J -// 1d48c MATHEMATICAL BOLD ITALIC SMALL K -// 1d48d MATHEMATICAL BOLD ITALIC SMALL L -// 1d48e MATHEMATICAL BOLD ITALIC SMALL M -// 1d48f MATHEMATICAL BOLD ITALIC SMALL N -// 1d490 MATHEMATICAL BOLD ITALIC SMALL O -// 1d491 MATHEMATICAL BOLD ITALIC SMALL P -// 1d492 MATHEMATICAL BOLD ITALIC SMALL Q -// 1d493 MATHEMATICAL BOLD ITALIC SMALL R -// 1d494 MATHEMATICAL BOLD ITALIC SMALL S -// 1d495 MATHEMATICAL BOLD ITALIC SMALL T -// 1d496 MATHEMATICAL BOLD ITALIC SMALL U -// 1d497 MATHEMATICAL BOLD ITALIC SMALL V -// 1d498 MATHEMATICAL BOLD ITALIC SMALL W -// 1d499 MATHEMATICAL BOLD ITALIC SMALL X -// 1d49a MATHEMATICAL BOLD ITALIC SMALL Y -// 1d49b MATHEMATICAL BOLD ITALIC SMALL Z - { 0x1D482, 0x1A, 0x49, 0, 0 }, -// 1d49c MATHEMATICAL SCRIPT CAPITAL A - { 0x1D49C, 0x1, 0x89, 0, 0 }, -// 1d49e MATHEMATICAL SCRIPT CAPITAL C -// 1d49f MATHEMATICAL SCRIPT CAPITAL D - { 0x1D49E, 0x2, 0x89, 0, 0 }, -// 1d4a2 MATHEMATICAL SCRIPT CAPITAL G - { 0x1D4A2, 0x1, 0x89, 0, 0 }, -// 1d4a5 MATHEMATICAL SCRIPT CAPITAL J -// 1d4a6 MATHEMATICAL SCRIPT CAPITAL K - { 0x1D4A5, 0x2, 0x89, 0, 0 }, -// 1d4a9 MATHEMATICAL SCRIPT CAPITAL N -// 1d4aa MATHEMATICAL SCRIPT CAPITAL O -// 1d4ab MATHEMATICAL SCRIPT CAPITAL P -// 1d4ac MATHEMATICAL SCRIPT CAPITAL Q - { 0x1D4A9, 0x4, 0x89, 0, 0 }, -// 1d4ae MATHEMATICAL SCRIPT CAPITAL S -// 1d4af MATHEMATICAL SCRIPT CAPITAL T -// 1d4b0 MATHEMATICAL SCRIPT CAPITAL U -// 1d4b1 MATHEMATICAL SCRIPT CAPITAL V -// 1d4b2 MATHEMATICAL SCRIPT CAPITAL W -// 1d4b3 MATHEMATICAL SCRIPT CAPITAL X -// 1d4b4 MATHEMATICAL SCRIPT CAPITAL Y -// 1d4b5 MATHEMATICAL SCRIPT CAPITAL Z - { 0x1D4AE, 0x8, 0x89, 0, 0 }, -// 1d4b6 MATHEMATICAL SCRIPT SMALL A -// 1d4b7 MATHEMATICAL SCRIPT SMALL B -// 1d4b8 MATHEMATICAL SCRIPT SMALL C -// 1d4b9 MATHEMATICAL SCRIPT SMALL D - { 0x1D4B6, 0x4, 0x49, 0, 0 }, -// 1d4bb MATHEMATICAL SCRIPT SMALL F - { 0x1D4BB, 0x1, 0x49, 0, 0 }, -// 1d4bd MATHEMATICAL SCRIPT SMALL H -// 1d4be MATHEMATICAL SCRIPT SMALL I -// 1d4bf MATHEMATICAL SCRIPT SMALL J -// 1d4c0 MATHEMATICAL SCRIPT SMALL K -// 1d4c1 MATHEMATICAL SCRIPT SMALL L -// 1d4c2 MATHEMATICAL SCRIPT SMALL M -// 1d4c3 MATHEMATICAL SCRIPT SMALL N - { 0x1D4BD, 0x7, 0x49, 0, 0 }, -// 1d4c5 MATHEMATICAL SCRIPT SMALL P -// 1d4c6 MATHEMATICAL SCRIPT SMALL Q -// 1d4c7 MATHEMATICAL SCRIPT SMALL R -// 1d4c8 MATHEMATICAL SCRIPT SMALL S -// 1d4c9 MATHEMATICAL SCRIPT SMALL T -// 1d4ca MATHEMATICAL SCRIPT SMALL U -// 1d4cb MATHEMATICAL SCRIPT SMALL V -// 1d4cc MATHEMATICAL SCRIPT SMALL W -// 1d4cd MATHEMATICAL SCRIPT SMALL X -// 1d4ce MATHEMATICAL SCRIPT SMALL Y -// 1d4cf MATHEMATICAL SCRIPT SMALL Z - { 0x1D4C5, 0xB, 0x49, 0, 0 }, -// 1d4d0 MATHEMATICAL BOLD SCRIPT CAPITAL A -// 1d4d1 MATHEMATICAL BOLD SCRIPT CAPITAL B -// 1d4d2 MATHEMATICAL BOLD SCRIPT CAPITAL C -// 1d4d3 MATHEMATICAL BOLD SCRIPT CAPITAL D -// 1d4d4 MATHEMATICAL BOLD SCRIPT CAPITAL E -// 1d4d5 MATHEMATICAL BOLD SCRIPT CAPITAL F -// 1d4d6 MATHEMATICAL BOLD SCRIPT CAPITAL G -// 1d4d7 MATHEMATICAL BOLD SCRIPT CAPITAL H -// 1d4d8 MATHEMATICAL BOLD SCRIPT CAPITAL I -// 1d4d9 MATHEMATICAL BOLD SCRIPT CAPITAL J -// 1d4da MATHEMATICAL BOLD SCRIPT CAPITAL K -// 1d4db MATHEMATICAL BOLD SCRIPT CAPITAL L -// 1d4dc MATHEMATICAL BOLD SCRIPT CAPITAL M -// 1d4dd MATHEMATICAL BOLD SCRIPT CAPITAL N -// 1d4de MATHEMATICAL BOLD SCRIPT CAPITAL O -// 1d4df MATHEMATICAL BOLD SCRIPT CAPITAL P -// 1d4e0 MATHEMATICAL BOLD SCRIPT CAPITAL Q -// 1d4e1 MATHEMATICAL BOLD SCRIPT CAPITAL R -// 1d4e2 MATHEMATICAL BOLD SCRIPT CAPITAL S -// 1d4e3 MATHEMATICAL BOLD SCRIPT CAPITAL T -// 1d4e4 MATHEMATICAL BOLD SCRIPT CAPITAL U -// 1d4e5 MATHEMATICAL BOLD SCRIPT CAPITAL V -// 1d4e6 MATHEMATICAL BOLD SCRIPT CAPITAL W -// 1d4e7 MATHEMATICAL BOLD SCRIPT CAPITAL X -// 1d4e8 MATHEMATICAL BOLD SCRIPT CAPITAL Y -// 1d4e9 MATHEMATICAL BOLD SCRIPT CAPITAL Z - { 0x1D4D0, 0x1A, 0x89, 0, 0 }, -// 1d4ea MATHEMATICAL BOLD SCRIPT SMALL A -// 1d4eb MATHEMATICAL BOLD SCRIPT SMALL B -// 1d4ec MATHEMATICAL BOLD SCRIPT SMALL C -// 1d4ed MATHEMATICAL BOLD SCRIPT SMALL D -// 1d4ee MATHEMATICAL BOLD SCRIPT SMALL E -// 1d4ef MATHEMATICAL BOLD SCRIPT SMALL F -// 1d4f0 MATHEMATICAL BOLD SCRIPT SMALL G -// 1d4f1 MATHEMATICAL BOLD SCRIPT SMALL H -// 1d4f2 MATHEMATICAL BOLD SCRIPT SMALL I -// 1d4f3 MATHEMATICAL BOLD SCRIPT SMALL J -// 1d4f4 MATHEMATICAL BOLD SCRIPT SMALL K -// 1d4f5 MATHEMATICAL BOLD SCRIPT SMALL L -// 1d4f6 MATHEMATICAL BOLD SCRIPT SMALL M -// 1d4f7 MATHEMATICAL BOLD SCRIPT SMALL N -// 1d4f8 MATHEMATICAL BOLD SCRIPT SMALL O -// 1d4f9 MATHEMATICAL BOLD SCRIPT SMALL P -// 1d4fa MATHEMATICAL BOLD SCRIPT SMALL Q -// 1d4fb MATHEMATICAL BOLD SCRIPT SMALL R -// 1d4fc MATHEMATICAL BOLD SCRIPT SMALL S -// 1d4fd MATHEMATICAL BOLD SCRIPT SMALL T -// 1d4fe MATHEMATICAL BOLD SCRIPT SMALL U -// 1d4ff MATHEMATICAL BOLD SCRIPT SMALL V -// 1d500 MATHEMATICAL BOLD SCRIPT SMALL W -// 1d501 MATHEMATICAL BOLD SCRIPT SMALL X -// 1d502 MATHEMATICAL BOLD SCRIPT SMALL Y -// 1d503 MATHEMATICAL BOLD SCRIPT SMALL Z - { 0x1D4EA, 0x1A, 0x49, 0, 0 }, -// 1d504 MATHEMATICAL FRAKTUR CAPITAL A -// 1d505 MATHEMATICAL FRAKTUR CAPITAL B - { 0x1D504, 0x2, 0x89, 0, 0 }, -// 1d507 MATHEMATICAL FRAKTUR CAPITAL D -// 1d508 MATHEMATICAL FRAKTUR CAPITAL E -// 1d509 MATHEMATICAL FRAKTUR CAPITAL F -// 1d50a MATHEMATICAL FRAKTUR CAPITAL G - { 0x1D507, 0x4, 0x89, 0, 0 }, -// 1d50d MATHEMATICAL FRAKTUR CAPITAL J -// 1d50e MATHEMATICAL FRAKTUR CAPITAL K -// 1d50f MATHEMATICAL FRAKTUR CAPITAL L -// 1d510 MATHEMATICAL FRAKTUR CAPITAL M -// 1d511 MATHEMATICAL FRAKTUR CAPITAL N -// 1d512 MATHEMATICAL FRAKTUR CAPITAL O -// 1d513 MATHEMATICAL FRAKTUR CAPITAL P -// 1d514 MATHEMATICAL FRAKTUR CAPITAL Q - { 0x1D50D, 0x8, 0x89, 0, 0 }, -// 1d516 MATHEMATICAL FRAKTUR CAPITAL S -// 1d517 MATHEMATICAL FRAKTUR CAPITAL T -// 1d518 MATHEMATICAL FRAKTUR CAPITAL U -// 1d519 MATHEMATICAL FRAKTUR CAPITAL V -// 1d51a MATHEMATICAL FRAKTUR CAPITAL W -// 1d51b MATHEMATICAL FRAKTUR CAPITAL X -// 1d51c MATHEMATICAL FRAKTUR CAPITAL Y - { 0x1D516, 0x7, 0x89, 0, 0 }, -// 1d51e MATHEMATICAL FRAKTUR SMALL A -// 1d51f MATHEMATICAL FRAKTUR SMALL B -// 1d520 MATHEMATICAL FRAKTUR SMALL C -// 1d521 MATHEMATICAL FRAKTUR SMALL D -// 1d522 MATHEMATICAL FRAKTUR SMALL E -// 1d523 MATHEMATICAL FRAKTUR SMALL F -// 1d524 MATHEMATICAL FRAKTUR SMALL G -// 1d525 MATHEMATICAL FRAKTUR SMALL H -// 1d526 MATHEMATICAL FRAKTUR SMALL I -// 1d527 MATHEMATICAL FRAKTUR SMALL J -// 1d528 MATHEMATICAL FRAKTUR SMALL K -// 1d529 MATHEMATICAL FRAKTUR SMALL L -// 1d52a MATHEMATICAL FRAKTUR SMALL M -// 1d52b MATHEMATICAL FRAKTUR SMALL N -// 1d52c MATHEMATICAL FRAKTUR SMALL O -// 1d52d MATHEMATICAL FRAKTUR SMALL P -// 1d52e MATHEMATICAL FRAKTUR SMALL Q -// 1d52f MATHEMATICAL FRAKTUR SMALL R -// 1d530 MATHEMATICAL FRAKTUR SMALL S -// 1d531 MATHEMATICAL FRAKTUR SMALL T -// 1d532 MATHEMATICAL FRAKTUR SMALL U -// 1d533 MATHEMATICAL FRAKTUR SMALL V -// 1d534 MATHEMATICAL FRAKTUR SMALL W -// 1d535 MATHEMATICAL FRAKTUR SMALL X -// 1d536 MATHEMATICAL FRAKTUR SMALL Y -// 1d537 MATHEMATICAL FRAKTUR SMALL Z - { 0x1D51E, 0x1A, 0x49, 0, 0 }, -// 1d538 MATHEMATICAL DOUBLE-STRUCK CAPITAL A -// 1d539 MATHEMATICAL DOUBLE-STRUCK CAPITAL B - { 0x1D538, 0x2, 0x89, 0, 0 }, -// 1d53b MATHEMATICAL DOUBLE-STRUCK CAPITAL D -// 1d53c MATHEMATICAL DOUBLE-STRUCK CAPITAL E -// 1d53d MATHEMATICAL DOUBLE-STRUCK CAPITAL F -// 1d53e MATHEMATICAL DOUBLE-STRUCK CAPITAL G - { 0x1D53B, 0x4, 0x89, 0, 0 }, -// 1d540 MATHEMATICAL DOUBLE-STRUCK CAPITAL I -// 1d541 MATHEMATICAL DOUBLE-STRUCK CAPITAL J -// 1d542 MATHEMATICAL DOUBLE-STRUCK CAPITAL K -// 1d543 MATHEMATICAL DOUBLE-STRUCK CAPITAL L -// 1d544 MATHEMATICAL DOUBLE-STRUCK CAPITAL M - { 0x1D540, 0x5, 0x89, 0, 0 }, -// 1d546 MATHEMATICAL DOUBLE-STRUCK CAPITAL O - { 0x1D546, 0x1, 0x89, 0, 0 }, -// 1d54a MATHEMATICAL DOUBLE-STRUCK CAPITAL S -// 1d54b MATHEMATICAL DOUBLE-STRUCK CAPITAL T -// 1d54c MATHEMATICAL DOUBLE-STRUCK CAPITAL U -// 1d54d MATHEMATICAL DOUBLE-STRUCK CAPITAL V -// 1d54e MATHEMATICAL DOUBLE-STRUCK CAPITAL W -// 1d54f MATHEMATICAL DOUBLE-STRUCK CAPITAL X -// 1d550 MATHEMATICAL DOUBLE-STRUCK CAPITAL Y - { 0x1D54A, 0x7, 0x89, 0, 0 }, -// 1d552 MATHEMATICAL DOUBLE-STRUCK SMALL A -// 1d553 MATHEMATICAL DOUBLE-STRUCK SMALL B -// 1d554 MATHEMATICAL DOUBLE-STRUCK SMALL C -// 1d555 MATHEMATICAL DOUBLE-STRUCK SMALL D -// 1d556 MATHEMATICAL DOUBLE-STRUCK SMALL E -// 1d557 MATHEMATICAL DOUBLE-STRUCK SMALL F -// 1d558 MATHEMATICAL DOUBLE-STRUCK SMALL G -// 1d559 MATHEMATICAL DOUBLE-STRUCK SMALL H -// 1d55a MATHEMATICAL DOUBLE-STRUCK SMALL I -// 1d55b MATHEMATICAL DOUBLE-STRUCK SMALL J -// 1d55c MATHEMATICAL DOUBLE-STRUCK SMALL K -// 1d55d MATHEMATICAL DOUBLE-STRUCK SMALL L -// 1d55e MATHEMATICAL DOUBLE-STRUCK SMALL M -// 1d55f MATHEMATICAL DOUBLE-STRUCK SMALL N -// 1d560 MATHEMATICAL DOUBLE-STRUCK SMALL O -// 1d561 MATHEMATICAL DOUBLE-STRUCK SMALL P -// 1d562 MATHEMATICAL DOUBLE-STRUCK SMALL Q -// 1d563 MATHEMATICAL DOUBLE-STRUCK SMALL R -// 1d564 MATHEMATICAL DOUBLE-STRUCK SMALL S -// 1d565 MATHEMATICAL DOUBLE-STRUCK SMALL T -// 1d566 MATHEMATICAL DOUBLE-STRUCK SMALL U -// 1d567 MATHEMATICAL DOUBLE-STRUCK SMALL V -// 1d568 MATHEMATICAL DOUBLE-STRUCK SMALL W -// 1d569 MATHEMATICAL DOUBLE-STRUCK SMALL X -// 1d56a MATHEMATICAL DOUBLE-STRUCK SMALL Y -// 1d56b MATHEMATICAL DOUBLE-STRUCK SMALL Z - { 0x1D552, 0x1A, 0x49, 0, 0 }, -// 1d56c MATHEMATICAL BOLD FRAKTUR CAPITAL A -// 1d56d MATHEMATICAL BOLD FRAKTUR CAPITAL B -// 1d56e MATHEMATICAL BOLD FRAKTUR CAPITAL C -// 1d56f MATHEMATICAL BOLD FRAKTUR CAPITAL D -// 1d570 MATHEMATICAL BOLD FRAKTUR CAPITAL E -// 1d571 MATHEMATICAL BOLD FRAKTUR CAPITAL F -// 1d572 MATHEMATICAL BOLD FRAKTUR CAPITAL G -// 1d573 MATHEMATICAL BOLD FRAKTUR CAPITAL H -// 1d574 MATHEMATICAL BOLD FRAKTUR CAPITAL I -// 1d575 MATHEMATICAL BOLD FRAKTUR CAPITAL J -// 1d576 MATHEMATICAL BOLD FRAKTUR CAPITAL K -// 1d577 MATHEMATICAL BOLD FRAKTUR CAPITAL L -// 1d578 MATHEMATICAL BOLD FRAKTUR CAPITAL M -// 1d579 MATHEMATICAL BOLD FRAKTUR CAPITAL N -// 1d57a MATHEMATICAL BOLD FRAKTUR CAPITAL O -// 1d57b MATHEMATICAL BOLD FRAKTUR CAPITAL P -// 1d57c MATHEMATICAL BOLD FRAKTUR CAPITAL Q -// 1d57d MATHEMATICAL BOLD FRAKTUR CAPITAL R -// 1d57e MATHEMATICAL BOLD FRAKTUR CAPITAL S -// 1d57f MATHEMATICAL BOLD FRAKTUR CAPITAL T -// 1d580 MATHEMATICAL BOLD FRAKTUR CAPITAL U -// 1d581 MATHEMATICAL BOLD FRAKTUR CAPITAL V -// 1d582 MATHEMATICAL BOLD FRAKTUR CAPITAL W -// 1d583 MATHEMATICAL BOLD FRAKTUR CAPITAL X -// 1d584 MATHEMATICAL BOLD FRAKTUR CAPITAL Y -// 1d585 MATHEMATICAL BOLD FRAKTUR CAPITAL Z - { 0x1D56C, 0x1A, 0x89, 0, 0 }, -// 1d586 MATHEMATICAL BOLD FRAKTUR SMALL A -// 1d587 MATHEMATICAL BOLD FRAKTUR SMALL B -// 1d588 MATHEMATICAL BOLD FRAKTUR SMALL C -// 1d589 MATHEMATICAL BOLD FRAKTUR SMALL D -// 1d58a MATHEMATICAL BOLD FRAKTUR SMALL E -// 1d58b MATHEMATICAL BOLD FRAKTUR SMALL F -// 1d58c MATHEMATICAL BOLD FRAKTUR SMALL G -// 1d58d MATHEMATICAL BOLD FRAKTUR SMALL H -// 1d58e MATHEMATICAL BOLD FRAKTUR SMALL I -// 1d58f MATHEMATICAL BOLD FRAKTUR SMALL J -// 1d590 MATHEMATICAL BOLD FRAKTUR SMALL K -// 1d591 MATHEMATICAL BOLD FRAKTUR SMALL L -// 1d592 MATHEMATICAL BOLD FRAKTUR SMALL M -// 1d593 MATHEMATICAL BOLD FRAKTUR SMALL N -// 1d594 MATHEMATICAL BOLD FRAKTUR SMALL O -// 1d595 MATHEMATICAL BOLD FRAKTUR SMALL P -// 1d596 MATHEMATICAL BOLD FRAKTUR SMALL Q -// 1d597 MATHEMATICAL BOLD FRAKTUR SMALL R -// 1d598 MATHEMATICAL BOLD FRAKTUR SMALL S -// 1d599 MATHEMATICAL BOLD FRAKTUR SMALL T -// 1d59a MATHEMATICAL BOLD FRAKTUR SMALL U -// 1d59b MATHEMATICAL BOLD FRAKTUR SMALL V -// 1d59c MATHEMATICAL BOLD FRAKTUR SMALL W -// 1d59d MATHEMATICAL BOLD FRAKTUR SMALL X -// 1d59e MATHEMATICAL BOLD FRAKTUR SMALL Y -// 1d59f MATHEMATICAL BOLD FRAKTUR SMALL Z - { 0x1D586, 0x1A, 0x49, 0, 0 }, -// 1d5a0 MATHEMATICAL SANS-SERIF CAPITAL A -// 1d5a1 MATHEMATICAL SANS-SERIF CAPITAL B -// 1d5a2 MATHEMATICAL SANS-SERIF CAPITAL C -// 1d5a3 MATHEMATICAL SANS-SERIF CAPITAL D -// 1d5a4 MATHEMATICAL SANS-SERIF CAPITAL E -// 1d5a5 MATHEMATICAL SANS-SERIF CAPITAL F -// 1d5a6 MATHEMATICAL SANS-SERIF CAPITAL G -// 1d5a7 MATHEMATICAL SANS-SERIF CAPITAL H -// 1d5a8 MATHEMATICAL SANS-SERIF CAPITAL I -// 1d5a9 MATHEMATICAL SANS-SERIF CAPITAL J -// 1d5aa MATHEMATICAL SANS-SERIF CAPITAL K -// 1d5ab MATHEMATICAL SANS-SERIF CAPITAL L -// 1d5ac MATHEMATICAL SANS-SERIF CAPITAL M -// 1d5ad MATHEMATICAL SANS-SERIF CAPITAL N -// 1d5ae MATHEMATICAL SANS-SERIF CAPITAL O -// 1d5af MATHEMATICAL SANS-SERIF CAPITAL P -// 1d5b0 MATHEMATICAL SANS-SERIF CAPITAL Q -// 1d5b1 MATHEMATICAL SANS-SERIF CAPITAL R -// 1d5b2 MATHEMATICAL SANS-SERIF CAPITAL S -// 1d5b3 MATHEMATICAL SANS-SERIF CAPITAL T -// 1d5b4 MATHEMATICAL SANS-SERIF CAPITAL U -// 1d5b5 MATHEMATICAL SANS-SERIF CAPITAL V -// 1d5b6 MATHEMATICAL SANS-SERIF CAPITAL W -// 1d5b7 MATHEMATICAL SANS-SERIF CAPITAL X -// 1d5b8 MATHEMATICAL SANS-SERIF CAPITAL Y -// 1d5b9 MATHEMATICAL SANS-SERIF CAPITAL Z - { 0x1D5A0, 0x1A, 0x89, 0, 0 }, -// 1d5ba MATHEMATICAL SANS-SERIF SMALL A -// 1d5bb MATHEMATICAL SANS-SERIF SMALL B -// 1d5bc MATHEMATICAL SANS-SERIF SMALL C -// 1d5bd MATHEMATICAL SANS-SERIF SMALL D -// 1d5be MATHEMATICAL SANS-SERIF SMALL E -// 1d5bf MATHEMATICAL SANS-SERIF SMALL F -// 1d5c0 MATHEMATICAL SANS-SERIF SMALL G -// 1d5c1 MATHEMATICAL SANS-SERIF SMALL H -// 1d5c2 MATHEMATICAL SANS-SERIF SMALL I -// 1d5c3 MATHEMATICAL SANS-SERIF SMALL J -// 1d5c4 MATHEMATICAL SANS-SERIF SMALL K -// 1d5c5 MATHEMATICAL SANS-SERIF SMALL L -// 1d5c6 MATHEMATICAL SANS-SERIF SMALL M -// 1d5c7 MATHEMATICAL SANS-SERIF SMALL N -// 1d5c8 MATHEMATICAL SANS-SERIF SMALL O -// 1d5c9 MATHEMATICAL SANS-SERIF SMALL P -// 1d5ca MATHEMATICAL SANS-SERIF SMALL Q -// 1d5cb MATHEMATICAL SANS-SERIF SMALL R -// 1d5cc MATHEMATICAL SANS-SERIF SMALL S -// 1d5cd MATHEMATICAL SANS-SERIF SMALL T -// 1d5ce MATHEMATICAL SANS-SERIF SMALL U -// 1d5cf MATHEMATICAL SANS-SERIF SMALL V -// 1d5d0 MATHEMATICAL SANS-SERIF SMALL W -// 1d5d1 MATHEMATICAL SANS-SERIF SMALL X -// 1d5d2 MATHEMATICAL SANS-SERIF SMALL Y -// 1d5d3 MATHEMATICAL SANS-SERIF SMALL Z - { 0x1D5BA, 0x1A, 0x49, 0, 0 }, -// 1d5d4 MATHEMATICAL SANS-SERIF BOLD CAPITAL A -// 1d5d5 MATHEMATICAL SANS-SERIF BOLD CAPITAL B -// 1d5d6 MATHEMATICAL SANS-SERIF BOLD CAPITAL C -// 1d5d7 MATHEMATICAL SANS-SERIF BOLD CAPITAL D -// 1d5d8 MATHEMATICAL SANS-SERIF BOLD CAPITAL E -// 1d5d9 MATHEMATICAL SANS-SERIF BOLD CAPITAL F -// 1d5da MATHEMATICAL SANS-SERIF BOLD CAPITAL G -// 1d5db MATHEMATICAL SANS-SERIF BOLD CAPITAL H -// 1d5dc MATHEMATICAL SANS-SERIF BOLD CAPITAL I -// 1d5dd MATHEMATICAL SANS-SERIF BOLD CAPITAL J -// 1d5de MATHEMATICAL SANS-SERIF BOLD CAPITAL K -// 1d5df MATHEMATICAL SANS-SERIF BOLD CAPITAL L -// 1d5e0 MATHEMATICAL SANS-SERIF BOLD CAPITAL M -// 1d5e1 MATHEMATICAL SANS-SERIF BOLD CAPITAL N -// 1d5e2 MATHEMATICAL SANS-SERIF BOLD CAPITAL O -// 1d5e3 MATHEMATICAL SANS-SERIF BOLD CAPITAL P -// 1d5e4 MATHEMATICAL SANS-SERIF BOLD CAPITAL Q -// 1d5e5 MATHEMATICAL SANS-SERIF BOLD CAPITAL R -// 1d5e6 MATHEMATICAL SANS-SERIF BOLD CAPITAL S -// 1d5e7 MATHEMATICAL SANS-SERIF BOLD CAPITAL T -// 1d5e8 MATHEMATICAL SANS-SERIF BOLD CAPITAL U -// 1d5e9 MATHEMATICAL SANS-SERIF BOLD CAPITAL V -// 1d5ea MATHEMATICAL SANS-SERIF BOLD CAPITAL W -// 1d5eb MATHEMATICAL SANS-SERIF BOLD CAPITAL X -// 1d5ec MATHEMATICAL SANS-SERIF BOLD CAPITAL Y -// 1d5ed MATHEMATICAL SANS-SERIF BOLD CAPITAL Z - { 0x1D5D4, 0x1A, 0x89, 0, 0 }, -// 1d5ee MATHEMATICAL SANS-SERIF BOLD SMALL A -// 1d5ef MATHEMATICAL SANS-SERIF BOLD SMALL B -// 1d5f0 MATHEMATICAL SANS-SERIF BOLD SMALL C -// 1d5f1 MATHEMATICAL SANS-SERIF BOLD SMALL D -// 1d5f2 MATHEMATICAL SANS-SERIF BOLD SMALL E -// 1d5f3 MATHEMATICAL SANS-SERIF BOLD SMALL F -// 1d5f4 MATHEMATICAL SANS-SERIF BOLD SMALL G -// 1d5f5 MATHEMATICAL SANS-SERIF BOLD SMALL H -// 1d5f6 MATHEMATICAL SANS-SERIF BOLD SMALL I -// 1d5f7 MATHEMATICAL SANS-SERIF BOLD SMALL J -// 1d5f8 MATHEMATICAL SANS-SERIF BOLD SMALL K -// 1d5f9 MATHEMATICAL SANS-SERIF BOLD SMALL L -// 1d5fa MATHEMATICAL SANS-SERIF BOLD SMALL M -// 1d5fb MATHEMATICAL SANS-SERIF BOLD SMALL N -// 1d5fc MATHEMATICAL SANS-SERIF BOLD SMALL O -// 1d5fd MATHEMATICAL SANS-SERIF BOLD SMALL P -// 1d5fe MATHEMATICAL SANS-SERIF BOLD SMALL Q -// 1d5ff MATHEMATICAL SANS-SERIF BOLD SMALL R -// 1d600 MATHEMATICAL SANS-SERIF BOLD SMALL S -// 1d601 MATHEMATICAL SANS-SERIF BOLD SMALL T -// 1d602 MATHEMATICAL SANS-SERIF BOLD SMALL U -// 1d603 MATHEMATICAL SANS-SERIF BOLD SMALL V -// 1d604 MATHEMATICAL SANS-SERIF BOLD SMALL W -// 1d605 MATHEMATICAL SANS-SERIF BOLD SMALL X -// 1d606 MATHEMATICAL SANS-SERIF BOLD SMALL Y -// 1d607 MATHEMATICAL SANS-SERIF BOLD SMALL Z - { 0x1D5EE, 0x1A, 0x49, 0, 0 }, -// 1d608 MATHEMATICAL SANS-SERIF ITALIC CAPITAL A -// 1d609 MATHEMATICAL SANS-SERIF ITALIC CAPITAL B -// 1d60a MATHEMATICAL SANS-SERIF ITALIC CAPITAL C -// 1d60b MATHEMATICAL SANS-SERIF ITALIC CAPITAL D -// 1d60c MATHEMATICAL SANS-SERIF ITALIC CAPITAL E -// 1d60d MATHEMATICAL SANS-SERIF ITALIC CAPITAL F -// 1d60e MATHEMATICAL SANS-SERIF ITALIC CAPITAL G -// 1d60f MATHEMATICAL SANS-SERIF ITALIC CAPITAL H -// 1d610 MATHEMATICAL SANS-SERIF ITALIC CAPITAL I -// 1d611 MATHEMATICAL SANS-SERIF ITALIC CAPITAL J -// 1d612 MATHEMATICAL SANS-SERIF ITALIC CAPITAL K -// 1d613 MATHEMATICAL SANS-SERIF ITALIC CAPITAL L -// 1d614 MATHEMATICAL SANS-SERIF ITALIC CAPITAL M -// 1d615 MATHEMATICAL SANS-SERIF ITALIC CAPITAL N -// 1d616 MATHEMATICAL SANS-SERIF ITALIC CAPITAL O -// 1d617 MATHEMATICAL SANS-SERIF ITALIC CAPITAL P -// 1d618 MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q -// 1d619 MATHEMATICAL SANS-SERIF ITALIC CAPITAL R -// 1d61a MATHEMATICAL SANS-SERIF ITALIC CAPITAL S -// 1d61b MATHEMATICAL SANS-SERIF ITALIC CAPITAL T -// 1d61c MATHEMATICAL SANS-SERIF ITALIC CAPITAL U -// 1d61d MATHEMATICAL SANS-SERIF ITALIC CAPITAL V -// 1d61e MATHEMATICAL SANS-SERIF ITALIC CAPITAL W -// 1d61f MATHEMATICAL SANS-SERIF ITALIC CAPITAL X -// 1d620 MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y -// 1d621 MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z - { 0x1D608, 0x1A, 0x89, 0, 0 }, -// 1d622 MATHEMATICAL SANS-SERIF ITALIC SMALL A -// 1d623 MATHEMATICAL SANS-SERIF ITALIC SMALL B -// 1d624 MATHEMATICAL SANS-SERIF ITALIC SMALL C -// 1d625 MATHEMATICAL SANS-SERIF ITALIC SMALL D -// 1d626 MATHEMATICAL SANS-SERIF ITALIC SMALL E -// 1d627 MATHEMATICAL SANS-SERIF ITALIC SMALL F -// 1d628 MATHEMATICAL SANS-SERIF ITALIC SMALL G -// 1d629 MATHEMATICAL SANS-SERIF ITALIC SMALL H -// 1d62a MATHEMATICAL SANS-SERIF ITALIC SMALL I -// 1d62b MATHEMATICAL SANS-SERIF ITALIC SMALL J -// 1d62c MATHEMATICAL SANS-SERIF ITALIC SMALL K -// 1d62d MATHEMATICAL SANS-SERIF ITALIC SMALL L -// 1d62e MATHEMATICAL SANS-SERIF ITALIC SMALL M -// 1d62f MATHEMATICAL SANS-SERIF ITALIC SMALL N -// 1d630 MATHEMATICAL SANS-SERIF ITALIC SMALL O -// 1d631 MATHEMATICAL SANS-SERIF ITALIC SMALL P -// 1d632 MATHEMATICAL SANS-SERIF ITALIC SMALL Q -// 1d633 MATHEMATICAL SANS-SERIF ITALIC SMALL R -// 1d634 MATHEMATICAL SANS-SERIF ITALIC SMALL S -// 1d635 MATHEMATICAL SANS-SERIF ITALIC SMALL T -// 1d636 MATHEMATICAL SANS-SERIF ITALIC SMALL U -// 1d637 MATHEMATICAL SANS-SERIF ITALIC SMALL V -// 1d638 MATHEMATICAL SANS-SERIF ITALIC SMALL W -// 1d639 MATHEMATICAL SANS-SERIF ITALIC SMALL X -// 1d63a MATHEMATICAL SANS-SERIF ITALIC SMALL Y -// 1d63b MATHEMATICAL SANS-SERIF ITALIC SMALL Z - { 0x1D622, 0x1A, 0x49, 0, 0 }, -// 1d63c MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A -// 1d63d MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B -// 1d63e MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C -// 1d63f MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D -// 1d640 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E -// 1d641 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F -// 1d642 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G -// 1d643 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H -// 1d644 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I -// 1d645 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J -// 1d646 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K -// 1d647 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L -// 1d648 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M -// 1d649 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N -// 1d64a MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O -// 1d64b MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P -// 1d64c MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q -// 1d64d MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R -// 1d64e MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S -// 1d64f MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T -// 1d650 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U -// 1d651 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V -// 1d652 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W -// 1d653 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X -// 1d654 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y -// 1d655 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z - { 0x1D63C, 0x1A, 0x89, 0, 0 }, -// 1d656 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A -// 1d657 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B -// 1d658 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C -// 1d659 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D -// 1d65a MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E -// 1d65b MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F -// 1d65c MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G -// 1d65d MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H -// 1d65e MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I -// 1d65f MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J -// 1d660 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K -// 1d661 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L -// 1d662 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M -// 1d663 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N -// 1d664 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O -// 1d665 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P -// 1d666 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q -// 1d667 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R -// 1d668 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S -// 1d669 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T -// 1d66a MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U -// 1d66b MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V -// 1d66c MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W -// 1d66d MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X -// 1d66e MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y -// 1d66f MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z - { 0x1D656, 0x1A, 0x49, 0, 0 }, -// 1d670 MATHEMATICAL MONOSPACE CAPITAL A -// 1d671 MATHEMATICAL MONOSPACE CAPITAL B -// 1d672 MATHEMATICAL MONOSPACE CAPITAL C -// 1d673 MATHEMATICAL MONOSPACE CAPITAL D -// 1d674 MATHEMATICAL MONOSPACE CAPITAL E -// 1d675 MATHEMATICAL MONOSPACE CAPITAL F -// 1d676 MATHEMATICAL MONOSPACE CAPITAL G -// 1d677 MATHEMATICAL MONOSPACE CAPITAL H -// 1d678 MATHEMATICAL MONOSPACE CAPITAL I -// 1d679 MATHEMATICAL MONOSPACE CAPITAL J -// 1d67a MATHEMATICAL MONOSPACE CAPITAL K -// 1d67b MATHEMATICAL MONOSPACE CAPITAL L -// 1d67c MATHEMATICAL MONOSPACE CAPITAL M -// 1d67d MATHEMATICAL MONOSPACE CAPITAL N -// 1d67e MATHEMATICAL MONOSPACE CAPITAL O -// 1d67f MATHEMATICAL MONOSPACE CAPITAL P -// 1d680 MATHEMATICAL MONOSPACE CAPITAL Q -// 1d681 MATHEMATICAL MONOSPACE CAPITAL R -// 1d682 MATHEMATICAL MONOSPACE CAPITAL S -// 1d683 MATHEMATICAL MONOSPACE CAPITAL T -// 1d684 MATHEMATICAL MONOSPACE CAPITAL U -// 1d685 MATHEMATICAL MONOSPACE CAPITAL V -// 1d686 MATHEMATICAL MONOSPACE CAPITAL W -// 1d687 MATHEMATICAL MONOSPACE CAPITAL X -// 1d688 MATHEMATICAL MONOSPACE CAPITAL Y -// 1d689 MATHEMATICAL MONOSPACE CAPITAL Z - { 0x1D670, 0x1A, 0x89, 0, 0 }, -// 1d68a MATHEMATICAL MONOSPACE SMALL A -// 1d68b MATHEMATICAL MONOSPACE SMALL B -// 1d68c MATHEMATICAL MONOSPACE SMALL C -// 1d68d MATHEMATICAL MONOSPACE SMALL D -// 1d68e MATHEMATICAL MONOSPACE SMALL E -// 1d68f MATHEMATICAL MONOSPACE SMALL F -// 1d690 MATHEMATICAL MONOSPACE SMALL G -// 1d691 MATHEMATICAL MONOSPACE SMALL H -// 1d692 MATHEMATICAL MONOSPACE SMALL I -// 1d693 MATHEMATICAL MONOSPACE SMALL J -// 1d694 MATHEMATICAL MONOSPACE SMALL K -// 1d695 MATHEMATICAL MONOSPACE SMALL L -// 1d696 MATHEMATICAL MONOSPACE SMALL M -// 1d697 MATHEMATICAL MONOSPACE SMALL N -// 1d698 MATHEMATICAL MONOSPACE SMALL O -// 1d699 MATHEMATICAL MONOSPACE SMALL P -// 1d69a MATHEMATICAL MONOSPACE SMALL Q -// 1d69b MATHEMATICAL MONOSPACE SMALL R -// 1d69c MATHEMATICAL MONOSPACE SMALL S -// 1d69d MATHEMATICAL MONOSPACE SMALL T -// 1d69e MATHEMATICAL MONOSPACE SMALL U -// 1d69f MATHEMATICAL MONOSPACE SMALL V -// 1d6a0 MATHEMATICAL MONOSPACE SMALL W -// 1d6a1 MATHEMATICAL MONOSPACE SMALL X -// 1d6a2 MATHEMATICAL MONOSPACE SMALL Y -// 1d6a3 MATHEMATICAL MONOSPACE SMALL Z -// 1d6a4 MATHEMATICAL ITALIC SMALL DOTLESS I -// 1d6a5 MATHEMATICAL ITALIC SMALL DOTLESS J - { 0x1D68A, 0x1C, 0x49, 0, 0 }, -// 1d6a8 MATHEMATICAL BOLD CAPITAL ALPHA -// 1d6a9 MATHEMATICAL BOLD CAPITAL BETA -// 1d6aa MATHEMATICAL BOLD CAPITAL GAMMA -// 1d6ab MATHEMATICAL BOLD CAPITAL DELTA -// 1d6ac MATHEMATICAL BOLD CAPITAL EPSILON -// 1d6ad MATHEMATICAL BOLD CAPITAL ZETA -// 1d6ae MATHEMATICAL BOLD CAPITAL ETA -// 1d6af MATHEMATICAL BOLD CAPITAL THETA -// 1d6b0 MATHEMATICAL BOLD CAPITAL IOTA -// 1d6b1 MATHEMATICAL BOLD CAPITAL KAPPA -// 1d6b2 MATHEMATICAL BOLD CAPITAL LAMDA -// 1d6b3 MATHEMATICAL BOLD CAPITAL MU -// 1d6b4 MATHEMATICAL BOLD CAPITAL NU -// 1d6b5 MATHEMATICAL BOLD CAPITAL XI -// 1d6b6 MATHEMATICAL BOLD CAPITAL OMICRON -// 1d6b7 MATHEMATICAL BOLD CAPITAL PI -// 1d6b8 MATHEMATICAL BOLD CAPITAL RHO -// 1d6b9 MATHEMATICAL BOLD CAPITAL THETA SYMBOL -// 1d6ba MATHEMATICAL BOLD CAPITAL SIGMA -// 1d6bb MATHEMATICAL BOLD CAPITAL TAU -// 1d6bc MATHEMATICAL BOLD CAPITAL UPSILON -// 1d6bd MATHEMATICAL BOLD CAPITAL PHI -// 1d6be MATHEMATICAL BOLD CAPITAL CHI -// 1d6bf MATHEMATICAL BOLD CAPITAL PSI -// 1d6c0 MATHEMATICAL BOLD CAPITAL OMEGA - { 0x1D6A8, 0x19, 0x89, 0, 0 }, -// 1d6c1 MATHEMATICAL BOLD NABLA - { 0x1D6C1, 0x1, 0x8, 0, 0 }, -// 1d6c2 MATHEMATICAL BOLD SMALL ALPHA -// 1d6c3 MATHEMATICAL BOLD SMALL BETA -// 1d6c4 MATHEMATICAL BOLD SMALL GAMMA -// 1d6c5 MATHEMATICAL BOLD SMALL DELTA -// 1d6c6 MATHEMATICAL BOLD SMALL EPSILON -// 1d6c7 MATHEMATICAL BOLD SMALL ZETA -// 1d6c8 MATHEMATICAL BOLD SMALL ETA -// 1d6c9 MATHEMATICAL BOLD SMALL THETA -// 1d6ca MATHEMATICAL BOLD SMALL IOTA -// 1d6cb MATHEMATICAL BOLD SMALL KAPPA -// 1d6cc MATHEMATICAL BOLD SMALL LAMDA -// 1d6cd MATHEMATICAL BOLD SMALL MU -// 1d6ce MATHEMATICAL BOLD SMALL NU -// 1d6cf MATHEMATICAL BOLD SMALL XI -// 1d6d0 MATHEMATICAL BOLD SMALL OMICRON -// 1d6d1 MATHEMATICAL BOLD SMALL PI -// 1d6d2 MATHEMATICAL BOLD SMALL RHO -// 1d6d3 MATHEMATICAL BOLD SMALL FINAL SIGMA -// 1d6d4 MATHEMATICAL BOLD SMALL SIGMA -// 1d6d5 MATHEMATICAL BOLD SMALL TAU -// 1d6d6 MATHEMATICAL BOLD SMALL UPSILON -// 1d6d7 MATHEMATICAL BOLD SMALL PHI -// 1d6d8 MATHEMATICAL BOLD SMALL CHI -// 1d6d9 MATHEMATICAL BOLD SMALL PSI -// 1d6da MATHEMATICAL BOLD SMALL OMEGA - { 0x1D6C2, 0x19, 0x49, 0, 0 }, -// 1d6db MATHEMATICAL BOLD PARTIAL DIFFERENTIAL - { 0x1D6DB, 0x1, 0x8, 0, 0 }, -// 1d6dc MATHEMATICAL BOLD EPSILON SYMBOL -// 1d6dd MATHEMATICAL BOLD THETA SYMBOL -// 1d6de MATHEMATICAL BOLD KAPPA SYMBOL -// 1d6df MATHEMATICAL BOLD PHI SYMBOL -// 1d6e0 MATHEMATICAL BOLD RHO SYMBOL -// 1d6e1 MATHEMATICAL BOLD PI SYMBOL - { 0x1D6DC, 0x6, 0x49, 0, 0 }, -// 1d6e2 MATHEMATICAL ITALIC CAPITAL ALPHA -// 1d6e3 MATHEMATICAL ITALIC CAPITAL BETA -// 1d6e4 MATHEMATICAL ITALIC CAPITAL GAMMA -// 1d6e5 MATHEMATICAL ITALIC CAPITAL DELTA -// 1d6e6 MATHEMATICAL ITALIC CAPITAL EPSILON -// 1d6e7 MATHEMATICAL ITALIC CAPITAL ZETA -// 1d6e8 MATHEMATICAL ITALIC CAPITAL ETA -// 1d6e9 MATHEMATICAL ITALIC CAPITAL THETA -// 1d6ea MATHEMATICAL ITALIC CAPITAL IOTA -// 1d6eb MATHEMATICAL ITALIC CAPITAL KAPPA -// 1d6ec MATHEMATICAL ITALIC CAPITAL LAMDA -// 1d6ed MATHEMATICAL ITALIC CAPITAL MU -// 1d6ee MATHEMATICAL ITALIC CAPITAL NU -// 1d6ef MATHEMATICAL ITALIC CAPITAL XI -// 1d6f0 MATHEMATICAL ITALIC CAPITAL OMICRON -// 1d6f1 MATHEMATICAL ITALIC CAPITAL PI -// 1d6f2 MATHEMATICAL ITALIC CAPITAL RHO -// 1d6f3 MATHEMATICAL ITALIC CAPITAL THETA SYMBOL -// 1d6f4 MATHEMATICAL ITALIC CAPITAL SIGMA -// 1d6f5 MATHEMATICAL ITALIC CAPITAL TAU -// 1d6f6 MATHEMATICAL ITALIC CAPITAL UPSILON -// 1d6f7 MATHEMATICAL ITALIC CAPITAL PHI -// 1d6f8 MATHEMATICAL ITALIC CAPITAL CHI -// 1d6f9 MATHEMATICAL ITALIC CAPITAL PSI -// 1d6fa MATHEMATICAL ITALIC CAPITAL OMEGA - { 0x1D6E2, 0x19, 0x89, 0, 0 }, -// 1d6fb MATHEMATICAL ITALIC NABLA - { 0x1D6FB, 0x1, 0x8, 0, 0 }, -// 1d6fc MATHEMATICAL ITALIC SMALL ALPHA -// 1d6fd MATHEMATICAL ITALIC SMALL BETA -// 1d6fe MATHEMATICAL ITALIC SMALL GAMMA -// 1d6ff MATHEMATICAL ITALIC SMALL DELTA -// 1d700 MATHEMATICAL ITALIC SMALL EPSILON -// 1d701 MATHEMATICAL ITALIC SMALL ZETA -// 1d702 MATHEMATICAL ITALIC SMALL ETA -// 1d703 MATHEMATICAL ITALIC SMALL THETA -// 1d704 MATHEMATICAL ITALIC SMALL IOTA -// 1d705 MATHEMATICAL ITALIC SMALL KAPPA -// 1d706 MATHEMATICAL ITALIC SMALL LAMDA -// 1d707 MATHEMATICAL ITALIC SMALL MU -// 1d708 MATHEMATICAL ITALIC SMALL NU -// 1d709 MATHEMATICAL ITALIC SMALL XI -// 1d70a MATHEMATICAL ITALIC SMALL OMICRON -// 1d70b MATHEMATICAL ITALIC SMALL PI -// 1d70c MATHEMATICAL ITALIC SMALL RHO -// 1d70d MATHEMATICAL ITALIC SMALL FINAL SIGMA -// 1d70e MATHEMATICAL ITALIC SMALL SIGMA -// 1d70f MATHEMATICAL ITALIC SMALL TAU -// 1d710 MATHEMATICAL ITALIC SMALL UPSILON -// 1d711 MATHEMATICAL ITALIC SMALL PHI -// 1d712 MATHEMATICAL ITALIC SMALL CHI -// 1d713 MATHEMATICAL ITALIC SMALL PSI -// 1d714 MATHEMATICAL ITALIC SMALL OMEGA - { 0x1D6FC, 0x19, 0x49, 0, 0 }, -// 1d715 MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL - { 0x1D715, 0x1, 0x8, 0, 0 }, -// 1d716 MATHEMATICAL ITALIC EPSILON SYMBOL -// 1d717 MATHEMATICAL ITALIC THETA SYMBOL -// 1d718 MATHEMATICAL ITALIC KAPPA SYMBOL -// 1d719 MATHEMATICAL ITALIC PHI SYMBOL -// 1d71a MATHEMATICAL ITALIC RHO SYMBOL -// 1d71b MATHEMATICAL ITALIC PI SYMBOL - { 0x1D716, 0x6, 0x49, 0, 0 }, -// 1d71c MATHEMATICAL BOLD ITALIC CAPITAL ALPHA -// 1d71d MATHEMATICAL BOLD ITALIC CAPITAL BETA -// 1d71e MATHEMATICAL BOLD ITALIC CAPITAL GAMMA -// 1d71f MATHEMATICAL BOLD ITALIC CAPITAL DELTA -// 1d720 MATHEMATICAL BOLD ITALIC CAPITAL EPSILON -// 1d721 MATHEMATICAL BOLD ITALIC CAPITAL ZETA -// 1d722 MATHEMATICAL BOLD ITALIC CAPITAL ETA -// 1d723 MATHEMATICAL BOLD ITALIC CAPITAL THETA -// 1d724 MATHEMATICAL BOLD ITALIC CAPITAL IOTA -// 1d725 MATHEMATICAL BOLD ITALIC CAPITAL KAPPA -// 1d726 MATHEMATICAL BOLD ITALIC CAPITAL LAMDA -// 1d727 MATHEMATICAL BOLD ITALIC CAPITAL MU -// 1d728 MATHEMATICAL BOLD ITALIC CAPITAL NU -// 1d729 MATHEMATICAL BOLD ITALIC CAPITAL XI -// 1d72a MATHEMATICAL BOLD ITALIC CAPITAL OMICRON -// 1d72b MATHEMATICAL BOLD ITALIC CAPITAL PI -// 1d72c MATHEMATICAL BOLD ITALIC CAPITAL RHO -// 1d72d MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL -// 1d72e MATHEMATICAL BOLD ITALIC CAPITAL SIGMA -// 1d72f MATHEMATICAL BOLD ITALIC CAPITAL TAU -// 1d730 MATHEMATICAL BOLD ITALIC CAPITAL UPSILON -// 1d731 MATHEMATICAL BOLD ITALIC CAPITAL PHI -// 1d732 MATHEMATICAL BOLD ITALIC CAPITAL CHI -// 1d733 MATHEMATICAL BOLD ITALIC CAPITAL PSI -// 1d734 MATHEMATICAL BOLD ITALIC CAPITAL OMEGA - { 0x1D71C, 0x19, 0x89, 0, 0 }, -// 1d735 MATHEMATICAL BOLD ITALIC NABLA - { 0x1D735, 0x1, 0x8, 0, 0 }, -// 1d736 MATHEMATICAL BOLD ITALIC SMALL ALPHA -// 1d737 MATHEMATICAL BOLD ITALIC SMALL BETA -// 1d738 MATHEMATICAL BOLD ITALIC SMALL GAMMA -// 1d739 MATHEMATICAL BOLD ITALIC SMALL DELTA -// 1d73a MATHEMATICAL BOLD ITALIC SMALL EPSILON -// 1d73b MATHEMATICAL BOLD ITALIC SMALL ZETA -// 1d73c MATHEMATICAL BOLD ITALIC SMALL ETA -// 1d73d MATHEMATICAL BOLD ITALIC SMALL THETA -// 1d73e MATHEMATICAL BOLD ITALIC SMALL IOTA -// 1d73f MATHEMATICAL BOLD ITALIC SMALL KAPPA -// 1d740 MATHEMATICAL BOLD ITALIC SMALL LAMDA -// 1d741 MATHEMATICAL BOLD ITALIC SMALL MU -// 1d742 MATHEMATICAL BOLD ITALIC SMALL NU -// 1d743 MATHEMATICAL BOLD ITALIC SMALL XI -// 1d744 MATHEMATICAL BOLD ITALIC SMALL OMICRON -// 1d745 MATHEMATICAL BOLD ITALIC SMALL PI -// 1d746 MATHEMATICAL BOLD ITALIC SMALL RHO -// 1d747 MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA -// 1d748 MATHEMATICAL BOLD ITALIC SMALL SIGMA -// 1d749 MATHEMATICAL BOLD ITALIC SMALL TAU -// 1d74a MATHEMATICAL BOLD ITALIC SMALL UPSILON -// 1d74b MATHEMATICAL BOLD ITALIC SMALL PHI -// 1d74c MATHEMATICAL BOLD ITALIC SMALL CHI -// 1d74d MATHEMATICAL BOLD ITALIC SMALL PSI -// 1d74e MATHEMATICAL BOLD ITALIC SMALL OMEGA - { 0x1D736, 0x19, 0x49, 0, 0 }, -// 1d74f MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL - { 0x1D74F, 0x1, 0x8, 0, 0 }, -// 1d750 MATHEMATICAL BOLD ITALIC EPSILON SYMBOL -// 1d751 MATHEMATICAL BOLD ITALIC THETA SYMBOL -// 1d752 MATHEMATICAL BOLD ITALIC KAPPA SYMBOL -// 1d753 MATHEMATICAL BOLD ITALIC PHI SYMBOL -// 1d754 MATHEMATICAL BOLD ITALIC RHO SYMBOL -// 1d755 MATHEMATICAL BOLD ITALIC PI SYMBOL - { 0x1D750, 0x6, 0x49, 0, 0 }, -// 1d756 MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA -// 1d757 MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA -// 1d758 MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA -// 1d759 MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA -// 1d75a MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON -// 1d75b MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA -// 1d75c MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA -// 1d75d MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA -// 1d75e MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA -// 1d75f MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA -// 1d760 MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA -// 1d761 MATHEMATICAL SANS-SERIF BOLD CAPITAL MU -// 1d762 MATHEMATICAL SANS-SERIF BOLD CAPITAL NU -// 1d763 MATHEMATICAL SANS-SERIF BOLD CAPITAL XI -// 1d764 MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON -// 1d765 MATHEMATICAL SANS-SERIF BOLD CAPITAL PI -// 1d766 MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO -// 1d767 MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL -// 1d768 MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA -// 1d769 MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU -// 1d76a MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON -// 1d76b MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI -// 1d76c MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI -// 1d76d MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI -// 1d76e MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA - { 0x1D756, 0x19, 0x89, 0, 0 }, -// 1d76f MATHEMATICAL SANS-SERIF BOLD NABLA - { 0x1D76F, 0x1, 0x8, 0, 0 }, -// 1d770 MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA -// 1d771 MATHEMATICAL SANS-SERIF BOLD SMALL BETA -// 1d772 MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA -// 1d773 MATHEMATICAL SANS-SERIF BOLD SMALL DELTA -// 1d774 MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON -// 1d775 MATHEMATICAL SANS-SERIF BOLD SMALL ZETA -// 1d776 MATHEMATICAL SANS-SERIF BOLD SMALL ETA -// 1d777 MATHEMATICAL SANS-SERIF BOLD SMALL THETA -// 1d778 MATHEMATICAL SANS-SERIF BOLD SMALL IOTA -// 1d779 MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA -// 1d77a MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA -// 1d77b MATHEMATICAL SANS-SERIF BOLD SMALL MU -// 1d77c MATHEMATICAL SANS-SERIF BOLD SMALL NU -// 1d77d MATHEMATICAL SANS-SERIF BOLD SMALL XI -// 1d77e MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON -// 1d77f MATHEMATICAL SANS-SERIF BOLD SMALL PI -// 1d780 MATHEMATICAL SANS-SERIF BOLD SMALL RHO -// 1d781 MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA -// 1d782 MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA -// 1d783 MATHEMATICAL SANS-SERIF BOLD SMALL TAU -// 1d784 MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON -// 1d785 MATHEMATICAL SANS-SERIF BOLD SMALL PHI -// 1d786 MATHEMATICAL SANS-SERIF BOLD SMALL CHI -// 1d787 MATHEMATICAL SANS-SERIF BOLD SMALL PSI -// 1d788 MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA - { 0x1D770, 0x19, 0x49, 0, 0 }, -// 1d789 MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL - { 0x1D789, 0x1, 0x8, 0, 0 }, -// 1d78a MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL -// 1d78b MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL -// 1d78c MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL -// 1d78d MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL -// 1d78e MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL -// 1d78f MATHEMATICAL SANS-SERIF BOLD PI SYMBOL - { 0x1D78A, 0x6, 0x49, 0, 0 }, -// 1d790 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA -// 1d791 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA -// 1d792 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA -// 1d793 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA -// 1d794 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON -// 1d795 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA -// 1d796 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA -// 1d797 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA -// 1d798 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA -// 1d799 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA -// 1d79a MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA -// 1d79b MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU -// 1d79c MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU -// 1d79d MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI -// 1d79e MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON -// 1d79f MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI -// 1d7a0 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO -// 1d7a1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL -// 1d7a2 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA -// 1d7a3 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU -// 1d7a4 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON -// 1d7a5 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI -// 1d7a6 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI -// 1d7a7 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI -// 1d7a8 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA - { 0x1D790, 0x19, 0x89, 0, 0 }, -// 1d7a9 MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA - { 0x1D7A9, 0x1, 0x8, 0, 0 }, -// 1d7aa MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA -// 1d7ab MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA -// 1d7ac MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA -// 1d7ad MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA -// 1d7ae MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON -// 1d7af MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA -// 1d7b0 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA -// 1d7b1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA -// 1d7b2 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA -// 1d7b3 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA -// 1d7b4 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA -// 1d7b5 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU -// 1d7b6 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU -// 1d7b7 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI -// 1d7b8 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON -// 1d7b9 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI -// 1d7ba MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO -// 1d7bb MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA -// 1d7bc MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA -// 1d7bd MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU -// 1d7be MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON -// 1d7bf MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI -// 1d7c0 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI -// 1d7c1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI -// 1d7c2 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA - { 0x1D7AA, 0x19, 0x49, 0, 0 }, -// 1d7c3 MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL - { 0x1D7C3, 0x1, 0x8, 0, 0 }, -// 1d7c4 MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL -// 1d7c5 MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL -// 1d7c6 MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL -// 1d7c7 MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL -// 1d7c8 MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL -// 1d7c9 MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL - { 0x1D7C4, 0x6, 0x49, 0, 0 }, -// 1d7ca MATHEMATICAL BOLD CAPITAL DIGAMMA - { 0x1D7CA, 0x1, 0x89, 0, 0 }, -// 1d7cb MATHEMATICAL BOLD SMALL DIGAMMA - { 0x1D7CB, 0x1, 0x49, 0, 0 }, -// 1d7ce MATHEMATICAL BOLD DIGIT ZERO -// 1d7cf MATHEMATICAL BOLD DIGIT ONE -// 1d7d0 MATHEMATICAL BOLD DIGIT TWO -// 1d7d1 MATHEMATICAL BOLD DIGIT THREE -// 1d7d2 MATHEMATICAL BOLD DIGIT FOUR -// 1d7d3 MATHEMATICAL BOLD DIGIT FIVE -// 1d7d4 MATHEMATICAL BOLD DIGIT SIX -// 1d7d5 MATHEMATICAL BOLD DIGIT SEVEN -// 1d7d6 MATHEMATICAL BOLD DIGIT EIGHT -// 1d7d7 MATHEMATICAL BOLD DIGIT NINE -// 1d7d8 MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO -// 1d7d9 MATHEMATICAL DOUBLE-STRUCK DIGIT ONE -// 1d7da MATHEMATICAL DOUBLE-STRUCK DIGIT TWO -// 1d7db MATHEMATICAL DOUBLE-STRUCK DIGIT THREE -// 1d7dc MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR -// 1d7dd MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE -// 1d7de MATHEMATICAL DOUBLE-STRUCK DIGIT SIX -// 1d7df MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN -// 1d7e0 MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT -// 1d7e1 MATHEMATICAL DOUBLE-STRUCK DIGIT NINE -// 1d7e2 MATHEMATICAL SANS-SERIF DIGIT ZERO -// 1d7e3 MATHEMATICAL SANS-SERIF DIGIT ONE -// 1d7e4 MATHEMATICAL SANS-SERIF DIGIT TWO -// 1d7e5 MATHEMATICAL SANS-SERIF DIGIT THREE -// 1d7e6 MATHEMATICAL SANS-SERIF DIGIT FOUR -// 1d7e7 MATHEMATICAL SANS-SERIF DIGIT FIVE -// 1d7e8 MATHEMATICAL SANS-SERIF DIGIT SIX -// 1d7e9 MATHEMATICAL SANS-SERIF DIGIT SEVEN -// 1d7ea MATHEMATICAL SANS-SERIF DIGIT EIGHT -// 1d7eb MATHEMATICAL SANS-SERIF DIGIT NINE -// 1d7ec MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO -// 1d7ed MATHEMATICAL SANS-SERIF BOLD DIGIT ONE -// 1d7ee MATHEMATICAL SANS-SERIF BOLD DIGIT TWO -// 1d7ef MATHEMATICAL SANS-SERIF BOLD DIGIT THREE -// 1d7f0 MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR -// 1d7f1 MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE -// 1d7f2 MATHEMATICAL SANS-SERIF BOLD DIGIT SIX -// 1d7f3 MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN -// 1d7f4 MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT -// 1d7f5 MATHEMATICAL SANS-SERIF BOLD DIGIT NINE -// 1d7f6 MATHEMATICAL MONOSPACE DIGIT ZERO -// 1d7f7 MATHEMATICAL MONOSPACE DIGIT ONE -// 1d7f8 MATHEMATICAL MONOSPACE DIGIT TWO -// 1d7f9 MATHEMATICAL MONOSPACE DIGIT THREE -// 1d7fa MATHEMATICAL MONOSPACE DIGIT FOUR -// 1d7fb MATHEMATICAL MONOSPACE DIGIT FIVE -// 1d7fc MATHEMATICAL MONOSPACE DIGIT SIX -// 1d7fd MATHEMATICAL MONOSPACE DIGIT SEVEN -// 1d7fe MATHEMATICAL MONOSPACE DIGIT EIGHT -// 1d7ff MATHEMATICAL MONOSPACE DIGIT NINE - { 0x1D7CE, 0x32, 0x108, 0, 0 }, -// 1e800 MENDE KIKAKUI SYLLABLE M001 KI -// 1e801 MENDE KIKAKUI SYLLABLE M002 KA -// 1e802 MENDE KIKAKUI SYLLABLE M003 KU -// 1e803 MENDE KIKAKUI SYLLABLE M065 KEE -// 1e804 MENDE KIKAKUI SYLLABLE M095 KE -// 1e805 MENDE KIKAKUI SYLLABLE M076 KOO -// 1e806 MENDE KIKAKUI SYLLABLE M048 KO -// 1e807 MENDE KIKAKUI SYLLABLE M179 KUA -// 1e808 MENDE KIKAKUI SYLLABLE M004 WI -// 1e809 MENDE KIKAKUI SYLLABLE M005 WA -// 1e80a MENDE KIKAKUI SYLLABLE M006 WU -// 1e80b MENDE KIKAKUI SYLLABLE M126 WEE -// 1e80c MENDE KIKAKUI SYLLABLE M118 WE -// 1e80d MENDE KIKAKUI SYLLABLE M114 WOO -// 1e80e MENDE KIKAKUI SYLLABLE M045 WO -// 1e80f MENDE KIKAKUI SYLLABLE M194 WUI -// 1e810 MENDE KIKAKUI SYLLABLE M143 WEI -// 1e811 MENDE KIKAKUI SYLLABLE M061 WVI -// 1e812 MENDE KIKAKUI SYLLABLE M049 WVA -// 1e813 MENDE KIKAKUI SYLLABLE M139 WVE -// 1e814 MENDE KIKAKUI SYLLABLE M007 MIN -// 1e815 MENDE KIKAKUI SYLLABLE M008 MAN -// 1e816 MENDE KIKAKUI SYLLABLE M009 MUN -// 1e817 MENDE KIKAKUI SYLLABLE M059 MEN -// 1e818 MENDE KIKAKUI SYLLABLE M094 MON -// 1e819 MENDE KIKAKUI SYLLABLE M154 MUAN -// 1e81a MENDE KIKAKUI SYLLABLE M189 MUEN -// 1e81b MENDE KIKAKUI SYLLABLE M010 BI -// 1e81c MENDE KIKAKUI SYLLABLE M011 BA -// 1e81d MENDE KIKAKUI SYLLABLE M012 BU -// 1e81e MENDE KIKAKUI SYLLABLE M150 BEE -// 1e81f MENDE KIKAKUI SYLLABLE M097 BE -// 1e820 MENDE KIKAKUI SYLLABLE M103 BOO -// 1e821 MENDE KIKAKUI SYLLABLE M138 BO -// 1e822 MENDE KIKAKUI SYLLABLE M013 I -// 1e823 MENDE KIKAKUI SYLLABLE M014 A -// 1e824 MENDE KIKAKUI SYLLABLE M015 U -// 1e825 MENDE KIKAKUI SYLLABLE M163 EE -// 1e826 MENDE KIKAKUI SYLLABLE M100 E -// 1e827 MENDE KIKAKUI SYLLABLE M165 OO -// 1e828 MENDE KIKAKUI SYLLABLE M147 O -// 1e829 MENDE KIKAKUI SYLLABLE M137 EI -// 1e82a MENDE KIKAKUI SYLLABLE M131 IN -// 1e82b MENDE KIKAKUI SYLLABLE M135 IN -// 1e82c MENDE KIKAKUI SYLLABLE M195 AN -// 1e82d MENDE KIKAKUI SYLLABLE M178 EN -// 1e82e MENDE KIKAKUI SYLLABLE M019 SI -// 1e82f MENDE KIKAKUI SYLLABLE M020 SA -// 1e830 MENDE KIKAKUI SYLLABLE M021 SU -// 1e831 MENDE KIKAKUI SYLLABLE M162 SEE -// 1e832 MENDE KIKAKUI SYLLABLE M116 SE -// 1e833 MENDE KIKAKUI SYLLABLE M136 SOO -// 1e834 MENDE KIKAKUI SYLLABLE M079 SO -// 1e835 MENDE KIKAKUI SYLLABLE M196 SIA -// 1e836 MENDE KIKAKUI SYLLABLE M025 LI -// 1e837 MENDE KIKAKUI SYLLABLE M026 LA -// 1e838 MENDE KIKAKUI SYLLABLE M027 LU -// 1e839 MENDE KIKAKUI SYLLABLE M084 LEE -// 1e83a MENDE KIKAKUI SYLLABLE M073 LE -// 1e83b MENDE KIKAKUI SYLLABLE M054 LOO -// 1e83c MENDE KIKAKUI SYLLABLE M153 LO -// 1e83d MENDE KIKAKUI SYLLABLE M110 LONG LE -// 1e83e MENDE KIKAKUI SYLLABLE M016 DI -// 1e83f MENDE KIKAKUI SYLLABLE M017 DA -// 1e840 MENDE KIKAKUI SYLLABLE M018 DU -// 1e841 MENDE KIKAKUI SYLLABLE M089 DEE -// 1e842 MENDE KIKAKUI SYLLABLE M180 DOO -// 1e843 MENDE KIKAKUI SYLLABLE M181 DO -// 1e844 MENDE KIKAKUI SYLLABLE M022 TI -// 1e845 MENDE KIKAKUI SYLLABLE M023 TA -// 1e846 MENDE KIKAKUI SYLLABLE M024 TU -// 1e847 MENDE KIKAKUI SYLLABLE M091 TEE -// 1e848 MENDE KIKAKUI SYLLABLE M055 TE -// 1e849 MENDE KIKAKUI SYLLABLE M104 TOO -// 1e84a MENDE KIKAKUI SYLLABLE M069 TO -// 1e84b MENDE KIKAKUI SYLLABLE M028 JI -// 1e84c MENDE KIKAKUI SYLLABLE M029 JA -// 1e84d MENDE KIKAKUI SYLLABLE M030 JU -// 1e84e MENDE KIKAKUI SYLLABLE M157 JEE -// 1e84f MENDE KIKAKUI SYLLABLE M113 JE -// 1e850 MENDE KIKAKUI SYLLABLE M160 JOO -// 1e851 MENDE KIKAKUI SYLLABLE M063 JO -// 1e852 MENDE KIKAKUI SYLLABLE M175 LONG JO -// 1e853 MENDE KIKAKUI SYLLABLE M031 YI -// 1e854 MENDE KIKAKUI SYLLABLE M032 YA -// 1e855 MENDE KIKAKUI SYLLABLE M033 YU -// 1e856 MENDE KIKAKUI SYLLABLE M109 YEE -// 1e857 MENDE KIKAKUI SYLLABLE M080 YE -// 1e858 MENDE KIKAKUI SYLLABLE M141 YOO -// 1e859 MENDE KIKAKUI SYLLABLE M121 YO -// 1e85a MENDE KIKAKUI SYLLABLE M034 FI -// 1e85b MENDE KIKAKUI SYLLABLE M035 FA -// 1e85c MENDE KIKAKUI SYLLABLE M036 FU -// 1e85d MENDE KIKAKUI SYLLABLE M078 FEE -// 1e85e MENDE KIKAKUI SYLLABLE M075 FE -// 1e85f MENDE KIKAKUI SYLLABLE M133 FOO -// 1e860 MENDE KIKAKUI SYLLABLE M088 FO -// 1e861 MENDE KIKAKUI SYLLABLE M197 FUA -// 1e862 MENDE KIKAKUI SYLLABLE M101 FAN -// 1e863 MENDE KIKAKUI SYLLABLE M037 NIN -// 1e864 MENDE KIKAKUI SYLLABLE M038 NAN -// 1e865 MENDE KIKAKUI SYLLABLE M039 NUN -// 1e866 MENDE KIKAKUI SYLLABLE M117 NEN -// 1e867 MENDE KIKAKUI SYLLABLE M169 NON -// 1e868 MENDE KIKAKUI SYLLABLE M176 HI -// 1e869 MENDE KIKAKUI SYLLABLE M041 HA -// 1e86a MENDE KIKAKUI SYLLABLE M186 HU -// 1e86b MENDE KIKAKUI SYLLABLE M040 HEE -// 1e86c MENDE KIKAKUI SYLLABLE M096 HE -// 1e86d MENDE KIKAKUI SYLLABLE M042 HOO -// 1e86e MENDE KIKAKUI SYLLABLE M140 HO -// 1e86f MENDE KIKAKUI SYLLABLE M083 HEEI -// 1e870 MENDE KIKAKUI SYLLABLE M128 HOOU -// 1e871 MENDE KIKAKUI SYLLABLE M053 HIN -// 1e872 MENDE KIKAKUI SYLLABLE M130 HAN -// 1e873 MENDE KIKAKUI SYLLABLE M087 HUN -// 1e874 MENDE KIKAKUI SYLLABLE M052 HEN -// 1e875 MENDE KIKAKUI SYLLABLE M193 HON -// 1e876 MENDE KIKAKUI SYLLABLE M046 HUAN -// 1e877 MENDE KIKAKUI SYLLABLE M090 NGGI -// 1e878 MENDE KIKAKUI SYLLABLE M043 NGGA -// 1e879 MENDE KIKAKUI SYLLABLE M082 NGGU -// 1e87a MENDE KIKAKUI SYLLABLE M115 NGGEE -// 1e87b MENDE KIKAKUI SYLLABLE M146 NGGE -// 1e87c MENDE KIKAKUI SYLLABLE M156 NGGOO -// 1e87d MENDE KIKAKUI SYLLABLE M120 NGGO -// 1e87e MENDE KIKAKUI SYLLABLE M159 NGGAA -// 1e87f MENDE KIKAKUI SYLLABLE M127 NGGUA -// 1e880 MENDE KIKAKUI SYLLABLE M086 LONG NGGE -// 1e881 MENDE KIKAKUI SYLLABLE M106 LONG NGGOO -// 1e882 MENDE KIKAKUI SYLLABLE M183 LONG NGGO -// 1e883 MENDE KIKAKUI SYLLABLE M155 GI -// 1e884 MENDE KIKAKUI SYLLABLE M111 GA -// 1e885 MENDE KIKAKUI SYLLABLE M168 GU -// 1e886 MENDE KIKAKUI SYLLABLE M190 GEE -// 1e887 MENDE KIKAKUI SYLLABLE M166 GUEI -// 1e888 MENDE KIKAKUI SYLLABLE M167 GUAN -// 1e889 MENDE KIKAKUI SYLLABLE M184 NGEN -// 1e88a MENDE KIKAKUI SYLLABLE M057 NGON -// 1e88b MENDE KIKAKUI SYLLABLE M177 NGUAN -// 1e88c MENDE KIKAKUI SYLLABLE M068 PI -// 1e88d MENDE KIKAKUI SYLLABLE M099 PA -// 1e88e MENDE KIKAKUI SYLLABLE M050 PU -// 1e88f MENDE KIKAKUI SYLLABLE M081 PEE -// 1e890 MENDE KIKAKUI SYLLABLE M051 PE -// 1e891 MENDE KIKAKUI SYLLABLE M102 POO -// 1e892 MENDE KIKAKUI SYLLABLE M066 PO -// 1e893 MENDE KIKAKUI SYLLABLE M145 MBI -// 1e894 MENDE KIKAKUI SYLLABLE M062 MBA -// 1e895 MENDE KIKAKUI SYLLABLE M122 MBU -// 1e896 MENDE KIKAKUI SYLLABLE M047 MBEE -// 1e897 MENDE KIKAKUI SYLLABLE M188 MBEE -// 1e898 MENDE KIKAKUI SYLLABLE M072 MBE -// 1e899 MENDE KIKAKUI SYLLABLE M172 MBOO -// 1e89a MENDE KIKAKUI SYLLABLE M174 MBO -// 1e89b MENDE KIKAKUI SYLLABLE M187 MBUU -// 1e89c MENDE KIKAKUI SYLLABLE M161 LONG MBE -// 1e89d MENDE KIKAKUI SYLLABLE M105 LONG MBOO -// 1e89e MENDE KIKAKUI SYLLABLE M142 LONG MBO -// 1e89f MENDE KIKAKUI SYLLABLE M132 KPI -// 1e8a0 MENDE KIKAKUI SYLLABLE M092 KPA -// 1e8a1 MENDE KIKAKUI SYLLABLE M074 KPU -// 1e8a2 MENDE KIKAKUI SYLLABLE M044 KPEE -// 1e8a3 MENDE KIKAKUI SYLLABLE M108 KPE -// 1e8a4 MENDE KIKAKUI SYLLABLE M112 KPOO -// 1e8a5 MENDE KIKAKUI SYLLABLE M158 KPO -// 1e8a6 MENDE KIKAKUI SYLLABLE M124 GBI -// 1e8a7 MENDE KIKAKUI SYLLABLE M056 GBA -// 1e8a8 MENDE KIKAKUI SYLLABLE M148 GBU -// 1e8a9 MENDE KIKAKUI SYLLABLE M093 GBEE -// 1e8aa MENDE KIKAKUI SYLLABLE M107 GBE -// 1e8ab MENDE KIKAKUI SYLLABLE M071 GBOO -// 1e8ac MENDE KIKAKUI SYLLABLE M070 GBO -// 1e8ad MENDE KIKAKUI SYLLABLE M171 RA -// 1e8ae MENDE KIKAKUI SYLLABLE M123 NDI -// 1e8af MENDE KIKAKUI SYLLABLE M129 NDA -// 1e8b0 MENDE KIKAKUI SYLLABLE M125 NDU -// 1e8b1 MENDE KIKAKUI SYLLABLE M191 NDEE -// 1e8b2 MENDE KIKAKUI SYLLABLE M119 NDE -// 1e8b3 MENDE KIKAKUI SYLLABLE M067 NDOO -// 1e8b4 MENDE KIKAKUI SYLLABLE M064 NDO -// 1e8b5 MENDE KIKAKUI SYLLABLE M152 NJA -// 1e8b6 MENDE KIKAKUI SYLLABLE M192 NJU -// 1e8b7 MENDE KIKAKUI SYLLABLE M149 NJEE -// 1e8b8 MENDE KIKAKUI SYLLABLE M134 NJOO -// 1e8b9 MENDE KIKAKUI SYLLABLE M182 VI -// 1e8ba MENDE KIKAKUI SYLLABLE M185 VA -// 1e8bb MENDE KIKAKUI SYLLABLE M151 VU -// 1e8bc MENDE KIKAKUI SYLLABLE M173 VEE -// 1e8bd MENDE KIKAKUI SYLLABLE M085 VE -// 1e8be MENDE KIKAKUI SYLLABLE M144 VOO -// 1e8bf MENDE KIKAKUI SYLLABLE M077 VO -// 1e8c0 MENDE KIKAKUI SYLLABLE M164 NYIN -// 1e8c1 MENDE KIKAKUI SYLLABLE M058 NYAN -// 1e8c2 MENDE KIKAKUI SYLLABLE M170 NYUN -// 1e8c3 MENDE KIKAKUI SYLLABLE M098 NYEN -// 1e8c4 MENDE KIKAKUI SYLLABLE M060 NYON - { 0x1E800, 0xC5, 0x9, 0, 0 }, -// 1e8c7 MENDE KIKAKUI DIGIT ONE -// 1e8c8 MENDE KIKAKUI DIGIT TWO -// 1e8c9 MENDE KIKAKUI DIGIT THREE -// 1e8ca MENDE KIKAKUI DIGIT FOUR -// 1e8cb MENDE KIKAKUI DIGIT FIVE -// 1e8cc MENDE KIKAKUI DIGIT SIX -// 1e8cd MENDE KIKAKUI DIGIT SEVEN -// 1e8ce MENDE KIKAKUI DIGIT EIGHT -// 1e8cf MENDE KIKAKUI DIGIT NINE - { 0x1E8C7, 0x9, 0x8, 0, 0 }, -// 1e8d0 MENDE KIKAKUI COMBINING NUMBER TEENS -// 1e8d1 MENDE KIKAKUI COMBINING NUMBER TENS -// 1e8d2 MENDE KIKAKUI COMBINING NUMBER HUNDREDS -// 1e8d3 MENDE KIKAKUI COMBINING NUMBER THOUSANDS -// 1e8d4 MENDE KIKAKUI COMBINING NUMBER TEN THOUSANDS -// 1e8d5 MENDE KIKAKUI COMBINING NUMBER HUNDRED THOUSANDS -// 1e8d6 MENDE KIKAKUI COMBINING NUMBER MILLIONS - { 0x1E8D0, 0x7, 0x0, 0, 0 }, -// 1ee00 ARABIC MATHEMATICAL ALEF -// 1ee01 ARABIC MATHEMATICAL BEH -// 1ee02 ARABIC MATHEMATICAL JEEM -// 1ee03 ARABIC MATHEMATICAL DAL - { 0x1EE00, 0x4, 0x9, 0, 0 }, -// 1ee05 ARABIC MATHEMATICAL WAW -// 1ee06 ARABIC MATHEMATICAL ZAIN -// 1ee07 ARABIC MATHEMATICAL HAH -// 1ee08 ARABIC MATHEMATICAL TAH -// 1ee09 ARABIC MATHEMATICAL YEH -// 1ee0a ARABIC MATHEMATICAL KAF -// 1ee0b ARABIC MATHEMATICAL LAM -// 1ee0c ARABIC MATHEMATICAL MEEM -// 1ee0d ARABIC MATHEMATICAL NOON -// 1ee0e ARABIC MATHEMATICAL SEEN -// 1ee0f ARABIC MATHEMATICAL AIN -// 1ee10 ARABIC MATHEMATICAL FEH -// 1ee11 ARABIC MATHEMATICAL SAD -// 1ee12 ARABIC MATHEMATICAL QAF -// 1ee13 ARABIC MATHEMATICAL REH -// 1ee14 ARABIC MATHEMATICAL SHEEN -// 1ee15 ARABIC MATHEMATICAL TEH -// 1ee16 ARABIC MATHEMATICAL THEH -// 1ee17 ARABIC MATHEMATICAL KHAH -// 1ee18 ARABIC MATHEMATICAL THAL -// 1ee19 ARABIC MATHEMATICAL DAD -// 1ee1a ARABIC MATHEMATICAL ZAH -// 1ee1b ARABIC MATHEMATICAL GHAIN -// 1ee1c ARABIC MATHEMATICAL DOTLESS BEH -// 1ee1d ARABIC MATHEMATICAL DOTLESS NOON -// 1ee1e ARABIC MATHEMATICAL DOTLESS FEH -// 1ee1f ARABIC MATHEMATICAL DOTLESS QAF - { 0x1EE05, 0x1B, 0x9, 0, 0 }, -// 1ee21 ARABIC MATHEMATICAL INITIAL BEH -// 1ee22 ARABIC MATHEMATICAL INITIAL JEEM - { 0x1EE21, 0x2, 0x9, 0, 0 }, -// 1ee24 ARABIC MATHEMATICAL INITIAL HEH - { 0x1EE24, 0x1, 0x9, 0, 0 }, -// 1ee27 ARABIC MATHEMATICAL INITIAL HAH - { 0x1EE27, 0x1, 0x9, 0, 0 }, -// 1ee29 ARABIC MATHEMATICAL INITIAL YEH -// 1ee2a ARABIC MATHEMATICAL INITIAL KAF -// 1ee2b ARABIC MATHEMATICAL INITIAL LAM -// 1ee2c ARABIC MATHEMATICAL INITIAL MEEM -// 1ee2d ARABIC MATHEMATICAL INITIAL NOON -// 1ee2e ARABIC MATHEMATICAL INITIAL SEEN -// 1ee2f ARABIC MATHEMATICAL INITIAL AIN -// 1ee30 ARABIC MATHEMATICAL INITIAL FEH -// 1ee31 ARABIC MATHEMATICAL INITIAL SAD -// 1ee32 ARABIC MATHEMATICAL INITIAL QAF - { 0x1EE29, 0xA, 0x9, 0, 0 }, -// 1ee34 ARABIC MATHEMATICAL INITIAL SHEEN -// 1ee35 ARABIC MATHEMATICAL INITIAL TEH -// 1ee36 ARABIC MATHEMATICAL INITIAL THEH -// 1ee37 ARABIC MATHEMATICAL INITIAL KHAH - { 0x1EE34, 0x4, 0x9, 0, 0 }, -// 1ee39 ARABIC MATHEMATICAL INITIAL DAD - { 0x1EE39, 0x1, 0x9, 0, 0 }, -// 1ee3b ARABIC MATHEMATICAL INITIAL GHAIN - { 0x1EE3B, 0x1, 0x9, 0, 0 }, -// 1ee42 ARABIC MATHEMATICAL TAILED JEEM - { 0x1EE42, 0x1, 0x9, 0, 0 }, -// 1ee47 ARABIC MATHEMATICAL TAILED HAH - { 0x1EE47, 0x1, 0x9, 0, 0 }, -// 1ee49 ARABIC MATHEMATICAL TAILED YEH - { 0x1EE49, 0x1, 0x9, 0, 0 }, -// 1ee4b ARABIC MATHEMATICAL TAILED LAM - { 0x1EE4B, 0x1, 0x9, 0, 0 }, -// 1ee4d ARABIC MATHEMATICAL TAILED NOON -// 1ee4e ARABIC MATHEMATICAL TAILED SEEN -// 1ee4f ARABIC MATHEMATICAL TAILED AIN - { 0x1EE4D, 0x3, 0x9, 0, 0 }, -// 1ee51 ARABIC MATHEMATICAL TAILED SAD -// 1ee52 ARABIC MATHEMATICAL TAILED QAF - { 0x1EE51, 0x2, 0x9, 0, 0 }, -// 1ee54 ARABIC MATHEMATICAL TAILED SHEEN - { 0x1EE54, 0x1, 0x9, 0, 0 }, -// 1ee57 ARABIC MATHEMATICAL TAILED KHAH - { 0x1EE57, 0x1, 0x9, 0, 0 }, -// 1ee59 ARABIC MATHEMATICAL TAILED DAD - { 0x1EE59, 0x1, 0x9, 0, 0 }, -// 1ee5b ARABIC MATHEMATICAL TAILED GHAIN - { 0x1EE5B, 0x1, 0x9, 0, 0 }, -// 1ee5d ARABIC MATHEMATICAL TAILED DOTLESS NOON - { 0x1EE5D, 0x1, 0x9, 0, 0 }, -// 1ee5f ARABIC MATHEMATICAL TAILED DOTLESS QAF - { 0x1EE5F, 0x1, 0x9, 0, 0 }, -// 1ee61 ARABIC MATHEMATICAL STRETCHED BEH -// 1ee62 ARABIC MATHEMATICAL STRETCHED JEEM - { 0x1EE61, 0x2, 0x9, 0, 0 }, -// 1ee64 ARABIC MATHEMATICAL STRETCHED HEH - { 0x1EE64, 0x1, 0x9, 0, 0 }, -// 1ee67 ARABIC MATHEMATICAL STRETCHED HAH -// 1ee68 ARABIC MATHEMATICAL STRETCHED TAH -// 1ee69 ARABIC MATHEMATICAL STRETCHED YEH -// 1ee6a ARABIC MATHEMATICAL STRETCHED KAF - { 0x1EE67, 0x4, 0x9, 0, 0 }, -// 1ee6c ARABIC MATHEMATICAL STRETCHED MEEM -// 1ee6d ARABIC MATHEMATICAL STRETCHED NOON -// 1ee6e ARABIC MATHEMATICAL STRETCHED SEEN -// 1ee6f ARABIC MATHEMATICAL STRETCHED AIN -// 1ee70 ARABIC MATHEMATICAL STRETCHED FEH -// 1ee71 ARABIC MATHEMATICAL STRETCHED SAD -// 1ee72 ARABIC MATHEMATICAL STRETCHED QAF - { 0x1EE6C, 0x7, 0x9, 0, 0 }, -// 1ee74 ARABIC MATHEMATICAL STRETCHED SHEEN -// 1ee75 ARABIC MATHEMATICAL STRETCHED TEH -// 1ee76 ARABIC MATHEMATICAL STRETCHED THEH -// 1ee77 ARABIC MATHEMATICAL STRETCHED KHAH - { 0x1EE74, 0x4, 0x9, 0, 0 }, -// 1ee79 ARABIC MATHEMATICAL STRETCHED DAD -// 1ee7a ARABIC MATHEMATICAL STRETCHED ZAH -// 1ee7b ARABIC MATHEMATICAL STRETCHED GHAIN -// 1ee7c ARABIC MATHEMATICAL STRETCHED DOTLESS BEH - { 0x1EE79, 0x4, 0x9, 0, 0 }, -// 1ee7e ARABIC MATHEMATICAL STRETCHED DOTLESS FEH - { 0x1EE7E, 0x1, 0x9, 0, 0 }, -// 1ee80 ARABIC MATHEMATICAL LOOPED ALEF -// 1ee81 ARABIC MATHEMATICAL LOOPED BEH -// 1ee82 ARABIC MATHEMATICAL LOOPED JEEM -// 1ee83 ARABIC MATHEMATICAL LOOPED DAL -// 1ee84 ARABIC MATHEMATICAL LOOPED HEH -// 1ee85 ARABIC MATHEMATICAL LOOPED WAW -// 1ee86 ARABIC MATHEMATICAL LOOPED ZAIN -// 1ee87 ARABIC MATHEMATICAL LOOPED HAH -// 1ee88 ARABIC MATHEMATICAL LOOPED TAH -// 1ee89 ARABIC MATHEMATICAL LOOPED YEH - { 0x1EE80, 0xA, 0x9, 0, 0 }, -// 1ee8b ARABIC MATHEMATICAL LOOPED LAM -// 1ee8c ARABIC MATHEMATICAL LOOPED MEEM -// 1ee8d ARABIC MATHEMATICAL LOOPED NOON -// 1ee8e ARABIC MATHEMATICAL LOOPED SEEN -// 1ee8f ARABIC MATHEMATICAL LOOPED AIN -// 1ee90 ARABIC MATHEMATICAL LOOPED FEH -// 1ee91 ARABIC MATHEMATICAL LOOPED SAD -// 1ee92 ARABIC MATHEMATICAL LOOPED QAF -// 1ee93 ARABIC MATHEMATICAL LOOPED REH -// 1ee94 ARABIC MATHEMATICAL LOOPED SHEEN -// 1ee95 ARABIC MATHEMATICAL LOOPED TEH -// 1ee96 ARABIC MATHEMATICAL LOOPED THEH -// 1ee97 ARABIC MATHEMATICAL LOOPED KHAH -// 1ee98 ARABIC MATHEMATICAL LOOPED THAL -// 1ee99 ARABIC MATHEMATICAL LOOPED DAD -// 1ee9a ARABIC MATHEMATICAL LOOPED ZAH -// 1ee9b ARABIC MATHEMATICAL LOOPED GHAIN - { 0x1EE8B, 0x11, 0x9, 0, 0 }, -// 1eea1 ARABIC MATHEMATICAL DOUBLE-STRUCK BEH -// 1eea2 ARABIC MATHEMATICAL DOUBLE-STRUCK JEEM -// 1eea3 ARABIC MATHEMATICAL DOUBLE-STRUCK DAL - { 0x1EEA1, 0x3, 0x9, 0, 0 }, -// 1eea5 ARABIC MATHEMATICAL DOUBLE-STRUCK WAW -// 1eea6 ARABIC MATHEMATICAL DOUBLE-STRUCK ZAIN -// 1eea7 ARABIC MATHEMATICAL DOUBLE-STRUCK HAH -// 1eea8 ARABIC MATHEMATICAL DOUBLE-STRUCK TAH -// 1eea9 ARABIC MATHEMATICAL DOUBLE-STRUCK YEH - { 0x1EEA5, 0x5, 0x9, 0, 0 }, -// 1eeab ARABIC MATHEMATICAL DOUBLE-STRUCK LAM -// 1eeac ARABIC MATHEMATICAL DOUBLE-STRUCK MEEM -// 1eead ARABIC MATHEMATICAL DOUBLE-STRUCK NOON -// 1eeae ARABIC MATHEMATICAL DOUBLE-STRUCK SEEN -// 1eeaf ARABIC MATHEMATICAL DOUBLE-STRUCK AIN -// 1eeb0 ARABIC MATHEMATICAL DOUBLE-STRUCK FEH -// 1eeb1 ARABIC MATHEMATICAL DOUBLE-STRUCK SAD -// 1eeb2 ARABIC MATHEMATICAL DOUBLE-STRUCK QAF -// 1eeb3 ARABIC MATHEMATICAL DOUBLE-STRUCK REH -// 1eeb4 ARABIC MATHEMATICAL DOUBLE-STRUCK SHEEN -// 1eeb5 ARABIC MATHEMATICAL DOUBLE-STRUCK TEH -// 1eeb6 ARABIC MATHEMATICAL DOUBLE-STRUCK THEH -// 1eeb7 ARABIC MATHEMATICAL DOUBLE-STRUCK KHAH -// 1eeb8 ARABIC MATHEMATICAL DOUBLE-STRUCK THAL -// 1eeb9 ARABIC MATHEMATICAL DOUBLE-STRUCK DAD -// 1eeba ARABIC MATHEMATICAL DOUBLE-STRUCK ZAH -// 1eebb ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN - { 0x1EEAB, 0x11, 0x9, 0, 0 }, -// 1eef0 ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL -// 1eef1 ARABIC MATHEMATICAL OPERATOR HAH WITH DAL - { 0x1EEF0, 0x2, 0x8, 0, 0 }, -// 1f000 MAHJONG TILE EAST WIND -// 1f001 MAHJONG TILE SOUTH WIND -// 1f002 MAHJONG TILE WEST WIND -// 1f003 MAHJONG TILE NORTH WIND -// 1f004 MAHJONG TILE RED DRAGON -// 1f005 MAHJONG TILE GREEN DRAGON -// 1f006 MAHJONG TILE WHITE DRAGON -// 1f007 MAHJONG TILE ONE OF CHARACTERS -// 1f008 MAHJONG TILE TWO OF CHARACTERS -// 1f009 MAHJONG TILE THREE OF CHARACTERS -// 1f00a MAHJONG TILE FOUR OF CHARACTERS -// 1f00b MAHJONG TILE FIVE OF CHARACTERS -// 1f00c MAHJONG TILE SIX OF CHARACTERS -// 1f00d MAHJONG TILE SEVEN OF CHARACTERS -// 1f00e MAHJONG TILE EIGHT OF CHARACTERS -// 1f00f MAHJONG TILE NINE OF CHARACTERS -// 1f010 MAHJONG TILE ONE OF BAMBOOS -// 1f011 MAHJONG TILE TWO OF BAMBOOS -// 1f012 MAHJONG TILE THREE OF BAMBOOS -// 1f013 MAHJONG TILE FOUR OF BAMBOOS -// 1f014 MAHJONG TILE FIVE OF BAMBOOS -// 1f015 MAHJONG TILE SIX OF BAMBOOS -// 1f016 MAHJONG TILE SEVEN OF BAMBOOS -// 1f017 MAHJONG TILE EIGHT OF BAMBOOS -// 1f018 MAHJONG TILE NINE OF BAMBOOS -// 1f019 MAHJONG TILE ONE OF CIRCLES -// 1f01a MAHJONG TILE TWO OF CIRCLES -// 1f01b MAHJONG TILE THREE OF CIRCLES -// 1f01c MAHJONG TILE FOUR OF CIRCLES -// 1f01d MAHJONG TILE FIVE OF CIRCLES -// 1f01e MAHJONG TILE SIX OF CIRCLES -// 1f01f MAHJONG TILE SEVEN OF CIRCLES -// 1f020 MAHJONG TILE EIGHT OF CIRCLES -// 1f021 MAHJONG TILE NINE OF CIRCLES -// 1f022 MAHJONG TILE PLUM -// 1f023 MAHJONG TILE ORCHID -// 1f024 MAHJONG TILE BAMBOO -// 1f025 MAHJONG TILE CHRYSANTHEMUM -// 1f026 MAHJONG TILE SPRING -// 1f027 MAHJONG TILE SUMMER -// 1f028 MAHJONG TILE AUTUMN -// 1f029 MAHJONG TILE WINTER -// 1f02a MAHJONG TILE JOKER -// 1f02b MAHJONG TILE BACK - { 0x1F000, 0x2C, 0x8, 0, 0 }, -// 1f030 DOMINO TILE HORIZONTAL BACK -// 1f031 DOMINO TILE HORIZONTAL-00-00 -// 1f032 DOMINO TILE HORIZONTAL-00-01 -// 1f033 DOMINO TILE HORIZONTAL-00-02 -// 1f034 DOMINO TILE HORIZONTAL-00-03 -// 1f035 DOMINO TILE HORIZONTAL-00-04 -// 1f036 DOMINO TILE HORIZONTAL-00-05 -// 1f037 DOMINO TILE HORIZONTAL-00-06 -// 1f038 DOMINO TILE HORIZONTAL-01-00 -// 1f039 DOMINO TILE HORIZONTAL-01-01 -// 1f03a DOMINO TILE HORIZONTAL-01-02 -// 1f03b DOMINO TILE HORIZONTAL-01-03 -// 1f03c DOMINO TILE HORIZONTAL-01-04 -// 1f03d DOMINO TILE HORIZONTAL-01-05 -// 1f03e DOMINO TILE HORIZONTAL-01-06 -// 1f03f DOMINO TILE HORIZONTAL-02-00 -// 1f040 DOMINO TILE HORIZONTAL-02-01 -// 1f041 DOMINO TILE HORIZONTAL-02-02 -// 1f042 DOMINO TILE HORIZONTAL-02-03 -// 1f043 DOMINO TILE HORIZONTAL-02-04 -// 1f044 DOMINO TILE HORIZONTAL-02-05 -// 1f045 DOMINO TILE HORIZONTAL-02-06 -// 1f046 DOMINO TILE HORIZONTAL-03-00 -// 1f047 DOMINO TILE HORIZONTAL-03-01 -// 1f048 DOMINO TILE HORIZONTAL-03-02 -// 1f049 DOMINO TILE HORIZONTAL-03-03 -// 1f04a DOMINO TILE HORIZONTAL-03-04 -// 1f04b DOMINO TILE HORIZONTAL-03-05 -// 1f04c DOMINO TILE HORIZONTAL-03-06 -// 1f04d DOMINO TILE HORIZONTAL-04-00 -// 1f04e DOMINO TILE HORIZONTAL-04-01 -// 1f04f DOMINO TILE HORIZONTAL-04-02 -// 1f050 DOMINO TILE HORIZONTAL-04-03 -// 1f051 DOMINO TILE HORIZONTAL-04-04 -// 1f052 DOMINO TILE HORIZONTAL-04-05 -// 1f053 DOMINO TILE HORIZONTAL-04-06 -// 1f054 DOMINO TILE HORIZONTAL-05-00 -// 1f055 DOMINO TILE HORIZONTAL-05-01 -// 1f056 DOMINO TILE HORIZONTAL-05-02 -// 1f057 DOMINO TILE HORIZONTAL-05-03 -// 1f058 DOMINO TILE HORIZONTAL-05-04 -// 1f059 DOMINO TILE HORIZONTAL-05-05 -// 1f05a DOMINO TILE HORIZONTAL-05-06 -// 1f05b DOMINO TILE HORIZONTAL-06-00 -// 1f05c DOMINO TILE HORIZONTAL-06-01 -// 1f05d DOMINO TILE HORIZONTAL-06-02 -// 1f05e DOMINO TILE HORIZONTAL-06-03 -// 1f05f DOMINO TILE HORIZONTAL-06-04 -// 1f060 DOMINO TILE HORIZONTAL-06-05 -// 1f061 DOMINO TILE HORIZONTAL-06-06 -// 1f062 DOMINO TILE VERTICAL BACK -// 1f063 DOMINO TILE VERTICAL-00-00 -// 1f064 DOMINO TILE VERTICAL-00-01 -// 1f065 DOMINO TILE VERTICAL-00-02 -// 1f066 DOMINO TILE VERTICAL-00-03 -// 1f067 DOMINO TILE VERTICAL-00-04 -// 1f068 DOMINO TILE VERTICAL-00-05 -// 1f069 DOMINO TILE VERTICAL-00-06 -// 1f06a DOMINO TILE VERTICAL-01-00 -// 1f06b DOMINO TILE VERTICAL-01-01 -// 1f06c DOMINO TILE VERTICAL-01-02 -// 1f06d DOMINO TILE VERTICAL-01-03 -// 1f06e DOMINO TILE VERTICAL-01-04 -// 1f06f DOMINO TILE VERTICAL-01-05 -// 1f070 DOMINO TILE VERTICAL-01-06 -// 1f071 DOMINO TILE VERTICAL-02-00 -// 1f072 DOMINO TILE VERTICAL-02-01 -// 1f073 DOMINO TILE VERTICAL-02-02 -// 1f074 DOMINO TILE VERTICAL-02-03 -// 1f075 DOMINO TILE VERTICAL-02-04 -// 1f076 DOMINO TILE VERTICAL-02-05 -// 1f077 DOMINO TILE VERTICAL-02-06 -// 1f078 DOMINO TILE VERTICAL-03-00 -// 1f079 DOMINO TILE VERTICAL-03-01 -// 1f07a DOMINO TILE VERTICAL-03-02 -// 1f07b DOMINO TILE VERTICAL-03-03 -// 1f07c DOMINO TILE VERTICAL-03-04 -// 1f07d DOMINO TILE VERTICAL-03-05 -// 1f07e DOMINO TILE VERTICAL-03-06 -// 1f07f DOMINO TILE VERTICAL-04-00 -// 1f080 DOMINO TILE VERTICAL-04-01 -// 1f081 DOMINO TILE VERTICAL-04-02 -// 1f082 DOMINO TILE VERTICAL-04-03 -// 1f083 DOMINO TILE VERTICAL-04-04 -// 1f084 DOMINO TILE VERTICAL-04-05 -// 1f085 DOMINO TILE VERTICAL-04-06 -// 1f086 DOMINO TILE VERTICAL-05-00 -// 1f087 DOMINO TILE VERTICAL-05-01 -// 1f088 DOMINO TILE VERTICAL-05-02 -// 1f089 DOMINO TILE VERTICAL-05-03 -// 1f08a DOMINO TILE VERTICAL-05-04 -// 1f08b DOMINO TILE VERTICAL-05-05 -// 1f08c DOMINO TILE VERTICAL-05-06 -// 1f08d DOMINO TILE VERTICAL-06-00 -// 1f08e DOMINO TILE VERTICAL-06-01 -// 1f08f DOMINO TILE VERTICAL-06-02 -// 1f090 DOMINO TILE VERTICAL-06-03 -// 1f091 DOMINO TILE VERTICAL-06-04 -// 1f092 DOMINO TILE VERTICAL-06-05 -// 1f093 DOMINO TILE VERTICAL-06-06 - { 0x1F030, 0x64, 0x8, 0, 0 }, -// 1f0a0 PLAYING CARD BACK -// 1f0a1 PLAYING CARD ACE OF SPADES -// 1f0a2 PLAYING CARD TWO OF SPADES -// 1f0a3 PLAYING CARD THREE OF SPADES -// 1f0a4 PLAYING CARD FOUR OF SPADES -// 1f0a5 PLAYING CARD FIVE OF SPADES -// 1f0a6 PLAYING CARD SIX OF SPADES -// 1f0a7 PLAYING CARD SEVEN OF SPADES -// 1f0a8 PLAYING CARD EIGHT OF SPADES -// 1f0a9 PLAYING CARD NINE OF SPADES -// 1f0aa PLAYING CARD TEN OF SPADES -// 1f0ab PLAYING CARD JACK OF SPADES -// 1f0ac PLAYING CARD KNIGHT OF SPADES -// 1f0ad PLAYING CARD QUEEN OF SPADES -// 1f0ae PLAYING CARD KING OF SPADES - { 0x1F0A0, 0xF, 0x8, 0, 0 }, -// 1f0b1 PLAYING CARD ACE OF HEARTS -// 1f0b2 PLAYING CARD TWO OF HEARTS -// 1f0b3 PLAYING CARD THREE OF HEARTS -// 1f0b4 PLAYING CARD FOUR OF HEARTS -// 1f0b5 PLAYING CARD FIVE OF HEARTS -// 1f0b6 PLAYING CARD SIX OF HEARTS -// 1f0b7 PLAYING CARD SEVEN OF HEARTS -// 1f0b8 PLAYING CARD EIGHT OF HEARTS -// 1f0b9 PLAYING CARD NINE OF HEARTS -// 1f0ba PLAYING CARD TEN OF HEARTS -// 1f0bb PLAYING CARD JACK OF HEARTS -// 1f0bc PLAYING CARD KNIGHT OF HEARTS -// 1f0bd PLAYING CARD QUEEN OF HEARTS -// 1f0be PLAYING CARD KING OF HEARTS -// 1f0bf PLAYING CARD RED JOKER - { 0x1F0B1, 0xF, 0x8, 0, 0 }, -// 1f0c1 PLAYING CARD ACE OF DIAMONDS -// 1f0c2 PLAYING CARD TWO OF DIAMONDS -// 1f0c3 PLAYING CARD THREE OF DIAMONDS -// 1f0c4 PLAYING CARD FOUR OF DIAMONDS -// 1f0c5 PLAYING CARD FIVE OF DIAMONDS -// 1f0c6 PLAYING CARD SIX OF DIAMONDS -// 1f0c7 PLAYING CARD SEVEN OF DIAMONDS -// 1f0c8 PLAYING CARD EIGHT OF DIAMONDS -// 1f0c9 PLAYING CARD NINE OF DIAMONDS -// 1f0ca PLAYING CARD TEN OF DIAMONDS -// 1f0cb PLAYING CARD JACK OF DIAMONDS -// 1f0cc PLAYING CARD KNIGHT OF DIAMONDS -// 1f0cd PLAYING CARD QUEEN OF DIAMONDS -// 1f0ce PLAYING CARD KING OF DIAMONDS -// 1f0cf PLAYING CARD BLACK JOKER - { 0x1F0C1, 0xF, 0x8, 0, 0 }, -// 1f0d1 PLAYING CARD ACE OF CLUBS -// 1f0d2 PLAYING CARD TWO OF CLUBS -// 1f0d3 PLAYING CARD THREE OF CLUBS -// 1f0d4 PLAYING CARD FOUR OF CLUBS -// 1f0d5 PLAYING CARD FIVE OF CLUBS -// 1f0d6 PLAYING CARD SIX OF CLUBS -// 1f0d7 PLAYING CARD SEVEN OF CLUBS -// 1f0d8 PLAYING CARD EIGHT OF CLUBS -// 1f0d9 PLAYING CARD NINE OF CLUBS -// 1f0da PLAYING CARD TEN OF CLUBS -// 1f0db PLAYING CARD JACK OF CLUBS -// 1f0dc PLAYING CARD KNIGHT OF CLUBS -// 1f0dd PLAYING CARD QUEEN OF CLUBS -// 1f0de PLAYING CARD KING OF CLUBS -// 1f0df PLAYING CARD WHITE JOKER -// 1f0e0 PLAYING CARD FOOL -// 1f0e1 PLAYING CARD TRUMP-1 -// 1f0e2 PLAYING CARD TRUMP-2 -// 1f0e3 PLAYING CARD TRUMP-3 -// 1f0e4 PLAYING CARD TRUMP-4 -// 1f0e5 PLAYING CARD TRUMP-5 -// 1f0e6 PLAYING CARD TRUMP-6 -// 1f0e7 PLAYING CARD TRUMP-7 -// 1f0e8 PLAYING CARD TRUMP-8 -// 1f0e9 PLAYING CARD TRUMP-9 -// 1f0ea PLAYING CARD TRUMP-10 -// 1f0eb PLAYING CARD TRUMP-11 -// 1f0ec PLAYING CARD TRUMP-12 -// 1f0ed PLAYING CARD TRUMP-13 -// 1f0ee PLAYING CARD TRUMP-14 -// 1f0ef PLAYING CARD TRUMP-15 -// 1f0f0 PLAYING CARD TRUMP-16 -// 1f0f1 PLAYING CARD TRUMP-17 -// 1f0f2 PLAYING CARD TRUMP-18 -// 1f0f3 PLAYING CARD TRUMP-19 -// 1f0f4 PLAYING CARD TRUMP-20 -// 1f0f5 PLAYING CARD TRUMP-21 - { 0x1F0D1, 0x25, 0x8, 0, 0 }, -// 1f100 DIGIT ZERO FULL STOP -// 1f101 DIGIT ZERO COMMA -// 1f102 DIGIT ONE COMMA -// 1f103 DIGIT TWO COMMA -// 1f104 DIGIT THREE COMMA -// 1f105 DIGIT FOUR COMMA -// 1f106 DIGIT FIVE COMMA -// 1f107 DIGIT SIX COMMA -// 1f108 DIGIT SEVEN COMMA -// 1f109 DIGIT EIGHT COMMA -// 1f10a DIGIT NINE COMMA -// 1f10b DINGBAT CIRCLED SANS-SERIF DIGIT ZERO -// 1f10c DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO - { 0x1F100, 0xD, 0x8, 0, 0 }, -// 1f110 PARENTHESIZED LATIN CAPITAL LETTER A -// 1f111 PARENTHESIZED LATIN CAPITAL LETTER B -// 1f112 PARENTHESIZED LATIN CAPITAL LETTER C -// 1f113 PARENTHESIZED LATIN CAPITAL LETTER D -// 1f114 PARENTHESIZED LATIN CAPITAL LETTER E -// 1f115 PARENTHESIZED LATIN CAPITAL LETTER F -// 1f116 PARENTHESIZED LATIN CAPITAL LETTER G -// 1f117 PARENTHESIZED LATIN CAPITAL LETTER H -// 1f118 PARENTHESIZED LATIN CAPITAL LETTER I -// 1f119 PARENTHESIZED LATIN CAPITAL LETTER J -// 1f11a PARENTHESIZED LATIN CAPITAL LETTER K -// 1f11b PARENTHESIZED LATIN CAPITAL LETTER L -// 1f11c PARENTHESIZED LATIN CAPITAL LETTER M -// 1f11d PARENTHESIZED LATIN CAPITAL LETTER N -// 1f11e PARENTHESIZED LATIN CAPITAL LETTER O -// 1f11f PARENTHESIZED LATIN CAPITAL LETTER P -// 1f120 PARENTHESIZED LATIN CAPITAL LETTER Q -// 1f121 PARENTHESIZED LATIN CAPITAL LETTER R -// 1f122 PARENTHESIZED LATIN CAPITAL LETTER S -// 1f123 PARENTHESIZED LATIN CAPITAL LETTER T -// 1f124 PARENTHESIZED LATIN CAPITAL LETTER U -// 1f125 PARENTHESIZED LATIN CAPITAL LETTER V -// 1f126 PARENTHESIZED LATIN CAPITAL LETTER W -// 1f127 PARENTHESIZED LATIN CAPITAL LETTER X -// 1f128 PARENTHESIZED LATIN CAPITAL LETTER Y -// 1f129 PARENTHESIZED LATIN CAPITAL LETTER Z -// 1f12a TORTOISE SHELL BRACKETED LATIN CAPITAL LETTER S -// 1f12b CIRCLED ITALIC LATIN CAPITAL LETTER C -// 1f12c CIRCLED ITALIC LATIN CAPITAL LETTER R -// 1f12d CIRCLED CD -// 1f12e CIRCLED WZ - { 0x1F110, 0x1F, 0x8, 0, 0 }, -// 1f130 SQUARED LATIN CAPITAL LETTER A -// 1f131 SQUARED LATIN CAPITAL LETTER B -// 1f132 SQUARED LATIN CAPITAL LETTER C -// 1f133 SQUARED LATIN CAPITAL LETTER D -// 1f134 SQUARED LATIN CAPITAL LETTER E -// 1f135 SQUARED LATIN CAPITAL LETTER F -// 1f136 SQUARED LATIN CAPITAL LETTER G -// 1f137 SQUARED LATIN CAPITAL LETTER H -// 1f138 SQUARED LATIN CAPITAL LETTER I -// 1f139 SQUARED LATIN CAPITAL LETTER J -// 1f13a SQUARED LATIN CAPITAL LETTER K -// 1f13b SQUARED LATIN CAPITAL LETTER L -// 1f13c SQUARED LATIN CAPITAL LETTER M -// 1f13d SQUARED LATIN CAPITAL LETTER N -// 1f13e SQUARED LATIN CAPITAL LETTER O -// 1f13f SQUARED LATIN CAPITAL LETTER P -// 1f140 SQUARED LATIN CAPITAL LETTER Q -// 1f141 SQUARED LATIN CAPITAL LETTER R -// 1f142 SQUARED LATIN CAPITAL LETTER S -// 1f143 SQUARED LATIN CAPITAL LETTER T -// 1f144 SQUARED LATIN CAPITAL LETTER U -// 1f145 SQUARED LATIN CAPITAL LETTER V -// 1f146 SQUARED LATIN CAPITAL LETTER W -// 1f147 SQUARED LATIN CAPITAL LETTER X -// 1f148 SQUARED LATIN CAPITAL LETTER Y -// 1f149 SQUARED LATIN CAPITAL LETTER Z -// 1f14a SQUARED HV -// 1f14b SQUARED MV -// 1f14c SQUARED SD -// 1f14d SQUARED SS -// 1f14e SQUARED PPV -// 1f14f SQUARED WC -// 1f150 NEGATIVE CIRCLED LATIN CAPITAL LETTER A -// 1f151 NEGATIVE CIRCLED LATIN CAPITAL LETTER B -// 1f152 NEGATIVE CIRCLED LATIN CAPITAL LETTER C -// 1f153 NEGATIVE CIRCLED LATIN CAPITAL LETTER D -// 1f154 NEGATIVE CIRCLED LATIN CAPITAL LETTER E -// 1f155 NEGATIVE CIRCLED LATIN CAPITAL LETTER F -// 1f156 NEGATIVE CIRCLED LATIN CAPITAL LETTER G -// 1f157 NEGATIVE CIRCLED LATIN CAPITAL LETTER H -// 1f158 NEGATIVE CIRCLED LATIN CAPITAL LETTER I -// 1f159 NEGATIVE CIRCLED LATIN CAPITAL LETTER J -// 1f15a NEGATIVE CIRCLED LATIN CAPITAL LETTER K -// 1f15b NEGATIVE CIRCLED LATIN CAPITAL LETTER L -// 1f15c NEGATIVE CIRCLED LATIN CAPITAL LETTER M -// 1f15d NEGATIVE CIRCLED LATIN CAPITAL LETTER N -// 1f15e NEGATIVE CIRCLED LATIN CAPITAL LETTER O -// 1f15f NEGATIVE CIRCLED LATIN CAPITAL LETTER P -// 1f160 NEGATIVE CIRCLED LATIN CAPITAL LETTER Q -// 1f161 NEGATIVE CIRCLED LATIN CAPITAL LETTER R -// 1f162 NEGATIVE CIRCLED LATIN CAPITAL LETTER S -// 1f163 NEGATIVE CIRCLED LATIN CAPITAL LETTER T -// 1f164 NEGATIVE CIRCLED LATIN CAPITAL LETTER U -// 1f165 NEGATIVE CIRCLED LATIN CAPITAL LETTER V -// 1f166 NEGATIVE CIRCLED LATIN CAPITAL LETTER W -// 1f167 NEGATIVE CIRCLED LATIN CAPITAL LETTER X -// 1f168 NEGATIVE CIRCLED LATIN CAPITAL LETTER Y -// 1f169 NEGATIVE CIRCLED LATIN CAPITAL LETTER Z -// 1f16a RAISED MC SIGN -// 1f16b RAISED MD SIGN - { 0x1F130, 0x3C, 0x8, 0, 0 }, -// 1f170 NEGATIVE SQUARED LATIN CAPITAL LETTER A -// 1f171 NEGATIVE SQUARED LATIN CAPITAL LETTER B -// 1f172 NEGATIVE SQUARED LATIN CAPITAL LETTER C -// 1f173 NEGATIVE SQUARED LATIN CAPITAL LETTER D -// 1f174 NEGATIVE SQUARED LATIN CAPITAL LETTER E -// 1f175 NEGATIVE SQUARED LATIN CAPITAL LETTER F -// 1f176 NEGATIVE SQUARED LATIN CAPITAL LETTER G -// 1f177 NEGATIVE SQUARED LATIN CAPITAL LETTER H -// 1f178 NEGATIVE SQUARED LATIN CAPITAL LETTER I -// 1f179 NEGATIVE SQUARED LATIN CAPITAL LETTER J -// 1f17a NEGATIVE SQUARED LATIN CAPITAL LETTER K -// 1f17b NEGATIVE SQUARED LATIN CAPITAL LETTER L -// 1f17c NEGATIVE SQUARED LATIN CAPITAL LETTER M -// 1f17d NEGATIVE SQUARED LATIN CAPITAL LETTER N -// 1f17e NEGATIVE SQUARED LATIN CAPITAL LETTER O -// 1f17f NEGATIVE SQUARED LATIN CAPITAL LETTER P -// 1f180 NEGATIVE SQUARED LATIN CAPITAL LETTER Q -// 1f181 NEGATIVE SQUARED LATIN CAPITAL LETTER R -// 1f182 NEGATIVE SQUARED LATIN CAPITAL LETTER S -// 1f183 NEGATIVE SQUARED LATIN CAPITAL LETTER T -// 1f184 NEGATIVE SQUARED LATIN CAPITAL LETTER U -// 1f185 NEGATIVE SQUARED LATIN CAPITAL LETTER V -// 1f186 NEGATIVE SQUARED LATIN CAPITAL LETTER W -// 1f187 NEGATIVE SQUARED LATIN CAPITAL LETTER X -// 1f188 NEGATIVE SQUARED LATIN CAPITAL LETTER Y -// 1f189 NEGATIVE SQUARED LATIN CAPITAL LETTER Z -// 1f18a CROSSED NEGATIVE SQUARED LATIN CAPITAL LETTER P -// 1f18b NEGATIVE SQUARED IC -// 1f18c NEGATIVE SQUARED PA -// 1f18d NEGATIVE SQUARED SA -// 1f18e NEGATIVE SQUARED AB -// 1f18f NEGATIVE SQUARED WC -// 1f190 SQUARE DJ -// 1f191 SQUARED CL -// 1f192 SQUARED COOL -// 1f193 SQUARED FREE -// 1f194 SQUARED ID -// 1f195 SQUARED NEW -// 1f196 SQUARED NG -// 1f197 SQUARED OK -// 1f198 SQUARED SOS -// 1f199 SQUARED UP WITH EXCLAMATION MARK -// 1f19a SQUARED VS - { 0x1F170, 0x2B, 0x8, 0, 0 }, -// 1f1e6 REGIONAL INDICATOR SYMBOL LETTER A -// 1f1e7 REGIONAL INDICATOR SYMBOL LETTER B -// 1f1e8 REGIONAL INDICATOR SYMBOL LETTER C -// 1f1e9 REGIONAL INDICATOR SYMBOL LETTER D -// 1f1ea REGIONAL INDICATOR SYMBOL LETTER E -// 1f1eb REGIONAL INDICATOR SYMBOL LETTER F -// 1f1ec REGIONAL INDICATOR SYMBOL LETTER G -// 1f1ed REGIONAL INDICATOR SYMBOL LETTER H -// 1f1ee REGIONAL INDICATOR SYMBOL LETTER I -// 1f1ef REGIONAL INDICATOR SYMBOL LETTER J -// 1f1f0 REGIONAL INDICATOR SYMBOL LETTER K -// 1f1f1 REGIONAL INDICATOR SYMBOL LETTER L -// 1f1f2 REGIONAL INDICATOR SYMBOL LETTER M -// 1f1f3 REGIONAL INDICATOR SYMBOL LETTER N -// 1f1f4 REGIONAL INDICATOR SYMBOL LETTER O -// 1f1f5 REGIONAL INDICATOR SYMBOL LETTER P -// 1f1f6 REGIONAL INDICATOR SYMBOL LETTER Q -// 1f1f7 REGIONAL INDICATOR SYMBOL LETTER R -// 1f1f8 REGIONAL INDICATOR SYMBOL LETTER S -// 1f1f9 REGIONAL INDICATOR SYMBOL LETTER T -// 1f1fa REGIONAL INDICATOR SYMBOL LETTER U -// 1f1fb REGIONAL INDICATOR SYMBOL LETTER V -// 1f1fc REGIONAL INDICATOR SYMBOL LETTER W -// 1f1fd REGIONAL INDICATOR SYMBOL LETTER X -// 1f1fe REGIONAL INDICATOR SYMBOL LETTER Y -// 1f1ff REGIONAL INDICATOR SYMBOL LETTER Z -// 1f200 SQUARE HIRAGANA HOKA -// 1f201 SQUARED KATAKANA KOKO -// 1f202 SQUARED KATAKANA SA - { 0x1F1E6, 0x1D, 0x8, 0, 0 }, -// 1f210 SQUARED CJK UNIFIED IDEOGRAPH-624B -// 1f211 SQUARED CJK UNIFIED IDEOGRAPH-5B57 -// 1f212 SQUARED CJK UNIFIED IDEOGRAPH-53CC -// 1f213 SQUARED KATAKANA DE -// 1f214 SQUARED CJK UNIFIED IDEOGRAPH-4E8C -// 1f215 SQUARED CJK UNIFIED IDEOGRAPH-591A -// 1f216 SQUARED CJK UNIFIED IDEOGRAPH-89E3 -// 1f217 SQUARED CJK UNIFIED IDEOGRAPH-5929 -// 1f218 SQUARED CJK UNIFIED IDEOGRAPH-4EA4 -// 1f219 SQUARED CJK UNIFIED IDEOGRAPH-6620 -// 1f21a SQUARED CJK UNIFIED IDEOGRAPH-7121 -// 1f21b SQUARED CJK UNIFIED IDEOGRAPH-6599 -// 1f21c SQUARED CJK UNIFIED IDEOGRAPH-524D -// 1f21d SQUARED CJK UNIFIED IDEOGRAPH-5F8C -// 1f21e SQUARED CJK UNIFIED IDEOGRAPH-518D -// 1f21f SQUARED CJK UNIFIED IDEOGRAPH-65B0 -// 1f220 SQUARED CJK UNIFIED IDEOGRAPH-521D -// 1f221 SQUARED CJK UNIFIED IDEOGRAPH-7D42 -// 1f222 SQUARED CJK UNIFIED IDEOGRAPH-751F -// 1f223 SQUARED CJK UNIFIED IDEOGRAPH-8CA9 -// 1f224 SQUARED CJK UNIFIED IDEOGRAPH-58F0 -// 1f225 SQUARED CJK UNIFIED IDEOGRAPH-5439 -// 1f226 SQUARED CJK UNIFIED IDEOGRAPH-6F14 -// 1f227 SQUARED CJK UNIFIED IDEOGRAPH-6295 -// 1f228 SQUARED CJK UNIFIED IDEOGRAPH-6355 -// 1f229 SQUARED CJK UNIFIED IDEOGRAPH-4E00 -// 1f22a SQUARED CJK UNIFIED IDEOGRAPH-4E09 -// 1f22b SQUARED CJK UNIFIED IDEOGRAPH-904A -// 1f22c SQUARED CJK UNIFIED IDEOGRAPH-5DE6 -// 1f22d SQUARED CJK UNIFIED IDEOGRAPH-4E2D -// 1f22e SQUARED CJK UNIFIED IDEOGRAPH-53F3 -// 1f22f SQUARED CJK UNIFIED IDEOGRAPH-6307 -// 1f230 SQUARED CJK UNIFIED IDEOGRAPH-8D70 -// 1f231 SQUARED CJK UNIFIED IDEOGRAPH-6253 -// 1f232 SQUARED CJK UNIFIED IDEOGRAPH-7981 -// 1f233 SQUARED CJK UNIFIED IDEOGRAPH-7A7A -// 1f234 SQUARED CJK UNIFIED IDEOGRAPH-5408 -// 1f235 SQUARED CJK UNIFIED IDEOGRAPH-6E80 -// 1f236 SQUARED CJK UNIFIED IDEOGRAPH-6709 -// 1f237 SQUARED CJK UNIFIED IDEOGRAPH-6708 -// 1f238 SQUARED CJK UNIFIED IDEOGRAPH-7533 -// 1f239 SQUARED CJK UNIFIED IDEOGRAPH-5272 -// 1f23a SQUARED CJK UNIFIED IDEOGRAPH-55B6 - { 0x1F210, 0x2B, 0x8, 0, 0 }, -// 1f240 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C -// 1f241 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E09 -// 1f242 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E8C -// 1f243 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-5B89 -// 1f244 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-70B9 -// 1f245 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6253 -// 1f246 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-76D7 -// 1f247 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-52DD -// 1f248 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557 - { 0x1F240, 0x9, 0x8, 0, 0 }, -// 1f250 CIRCLED IDEOGRAPH ADVANTAGE -// 1f251 CIRCLED IDEOGRAPH ACCEPT - { 0x1F250, 0x2, 0x8, 0, 0 }, -// 1f300 CYCLONE -// 1f301 FOGGY -// 1f302 CLOSED UMBRELLA -// 1f303 NIGHT WITH STARS -// 1f304 SUNRISE OVER MOUNTAINS -// 1f305 SUNRISE -// 1f306 CITYSCAPE AT DUSK -// 1f307 SUNSET OVER BUILDINGS -// 1f308 RAINBOW -// 1f309 BRIDGE AT NIGHT -// 1f30a WATER WAVE -// 1f30b VOLCANO -// 1f30c MILKY WAY -// 1f30d EARTH GLOBE EUROPE-AFRICA -// 1f30e EARTH GLOBE AMERICAS -// 1f30f EARTH GLOBE ASIA-AUSTRALIA -// 1f310 GLOBE WITH MERIDIANS -// 1f311 NEW MOON SYMBOL -// 1f312 WAXING CRESCENT MOON SYMBOL -// 1f313 FIRST QUARTER MOON SYMBOL -// 1f314 WAXING GIBBOUS MOON SYMBOL -// 1f315 FULL MOON SYMBOL -// 1f316 WANING GIBBOUS MOON SYMBOL -// 1f317 LAST QUARTER MOON SYMBOL -// 1f318 WANING CRESCENT MOON SYMBOL -// 1f319 CRESCENT MOON -// 1f31a NEW MOON WITH FACE -// 1f31b FIRST QUARTER MOON WITH FACE -// 1f31c LAST QUARTER MOON WITH FACE -// 1f31d FULL MOON WITH FACE -// 1f31e SUN WITH FACE -// 1f31f GLOWING STAR -// 1f320 SHOOTING STAR -// 1f321 THERMOMETER -// 1f322 BLACK DROPLET -// 1f323 WHITE SUN -// 1f324 WHITE SUN WITH SMALL CLOUD -// 1f325 WHITE SUN BEHIND CLOUD -// 1f326 WHITE SUN BEHIND CLOUD WITH RAIN -// 1f327 CLOUD WITH RAIN -// 1f328 CLOUD WITH SNOW -// 1f329 CLOUD WITH LIGHTNING -// 1f32a CLOUD WITH TORNADO -// 1f32b FOG -// 1f32c WIND BLOWING FACE - { 0x1F300, 0x2D, 0x8, 0, 0 }, -// 1f330 CHESTNUT -// 1f331 SEEDLING -// 1f332 EVERGREEN TREE -// 1f333 DECIDUOUS TREE -// 1f334 PALM TREE -// 1f335 CACTUS -// 1f336 HOT PEPPER -// 1f337 TULIP -// 1f338 CHERRY BLOSSOM -// 1f339 ROSE -// 1f33a HIBISCUS -// 1f33b SUNFLOWER -// 1f33c BLOSSOM -// 1f33d EAR OF MAIZE -// 1f33e EAR OF RICE -// 1f33f HERB -// 1f340 FOUR LEAF CLOVER -// 1f341 MAPLE LEAF -// 1f342 FALLEN LEAF -// 1f343 LEAF FLUTTERING IN WIND -// 1f344 MUSHROOM -// 1f345 TOMATO -// 1f346 AUBERGINE -// 1f347 GRAPES -// 1f348 MELON -// 1f349 WATERMELON -// 1f34a TANGERINE -// 1f34b LEMON -// 1f34c BANANA -// 1f34d PINEAPPLE -// 1f34e RED APPLE -// 1f34f GREEN APPLE -// 1f350 PEAR -// 1f351 PEACH -// 1f352 CHERRIES -// 1f353 STRAWBERRY -// 1f354 HAMBURGER -// 1f355 SLICE OF PIZZA -// 1f356 MEAT ON BONE -// 1f357 POULTRY LEG -// 1f358 RICE CRACKER -// 1f359 RICE BALL -// 1f35a COOKED RICE -// 1f35b CURRY AND RICE -// 1f35c STEAMING BOWL -// 1f35d SPAGHETTI -// 1f35e BREAD -// 1f35f FRENCH FRIES -// 1f360 ROASTED SWEET POTATO -// 1f361 DANGO -// 1f362 ODEN -// 1f363 SUSHI -// 1f364 FRIED SHRIMP -// 1f365 FISH CAKE WITH SWIRL DESIGN -// 1f366 SOFT ICE CREAM -// 1f367 SHAVED ICE -// 1f368 ICE CREAM -// 1f369 DOUGHNUT -// 1f36a COOKIE -// 1f36b CHOCOLATE BAR -// 1f36c CANDY -// 1f36d LOLLIPOP -// 1f36e CUSTARD -// 1f36f HONEY POT -// 1f370 SHORTCAKE -// 1f371 BENTO BOX -// 1f372 POT OF FOOD -// 1f373 COOKING -// 1f374 FORK AND KNIFE -// 1f375 TEACUP WITHOUT HANDLE -// 1f376 SAKE BOTTLE AND CUP -// 1f377 WINE GLASS -// 1f378 COCKTAIL GLASS -// 1f379 TROPICAL DRINK -// 1f37a BEER MUG -// 1f37b CLINKING BEER MUGS -// 1f37c BABY BOTTLE -// 1f37d FORK AND KNIFE WITH PLATE - { 0x1F330, 0x4E, 0x8, 0, 0 }, -// 1f380 RIBBON -// 1f381 WRAPPED PRESENT -// 1f382 BIRTHDAY CAKE -// 1f383 JACK-O-LANTERN -// 1f384 CHRISTMAS TREE -// 1f385 FATHER CHRISTMAS -// 1f386 FIREWORKS -// 1f387 FIREWORK SPARKLER -// 1f388 BALLOON -// 1f389 PARTY POPPER -// 1f38a CONFETTI BALL -// 1f38b TANABATA TREE -// 1f38c CROSSED FLAGS -// 1f38d PINE DECORATION -// 1f38e JAPANESE DOLLS -// 1f38f CARP STREAMER -// 1f390 WIND CHIME -// 1f391 MOON VIEWING CEREMONY -// 1f392 SCHOOL SATCHEL -// 1f393 GRADUATION CAP -// 1f394 HEART WITH TIP ON THE LEFT -// 1f395 BOUQUET OF FLOWERS -// 1f396 MILITARY MEDAL -// 1f397 REMINDER RIBBON -// 1f398 MUSICAL KEYBOARD WITH JACKS -// 1f399 STUDIO MICROPHONE -// 1f39a LEVEL SLIDER -// 1f39b CONTROL KNOBS -// 1f39c BEAMED ASCENDING MUSICAL NOTES -// 1f39d BEAMED DESCENDING MUSICAL NOTES -// 1f39e FILM FRAMES -// 1f39f ADMISSION TICKETS -// 1f3a0 CAROUSEL HORSE -// 1f3a1 FERRIS WHEEL -// 1f3a2 ROLLER COASTER -// 1f3a3 FISHING POLE AND FISH -// 1f3a4 MICROPHONE -// 1f3a5 MOVIE CAMERA -// 1f3a6 CINEMA -// 1f3a7 HEADPHONE -// 1f3a8 ARTIST PALETTE -// 1f3a9 TOP HAT -// 1f3aa CIRCUS TENT -// 1f3ab TICKET -// 1f3ac CLAPPER BOARD -// 1f3ad PERFORMING ARTS -// 1f3ae VIDEO GAME -// 1f3af DIRECT HIT -// 1f3b0 SLOT MACHINE -// 1f3b1 BILLIARDS -// 1f3b2 GAME DIE -// 1f3b3 BOWLING -// 1f3b4 FLOWER PLAYING CARDS -// 1f3b5 MUSICAL NOTE -// 1f3b6 MULTIPLE MUSICAL NOTES -// 1f3b7 SAXOPHONE -// 1f3b8 GUITAR -// 1f3b9 MUSICAL KEYBOARD -// 1f3ba TRUMPET -// 1f3bb VIOLIN -// 1f3bc MUSICAL SCORE -// 1f3bd RUNNING SHIRT WITH SASH -// 1f3be TENNIS RACQUET AND BALL -// 1f3bf SKI AND SKI BOOT -// 1f3c0 BASKETBALL AND HOOP -// 1f3c1 CHEQUERED FLAG -// 1f3c2 SNOWBOARDER -// 1f3c3 RUNNER -// 1f3c4 SURFER -// 1f3c5 SPORTS MEDAL -// 1f3c6 TROPHY -// 1f3c7 HORSE RACING -// 1f3c8 AMERICAN FOOTBALL -// 1f3c9 RUGBY FOOTBALL -// 1f3ca SWIMMER -// 1f3cb WEIGHT LIFTER -// 1f3cc GOLFER -// 1f3cd RACING MOTORCYCLE -// 1f3ce RACING CAR - { 0x1F380, 0x4F, 0x8, 0, 0 }, -// 1f3d4 SNOW CAPPED MOUNTAIN -// 1f3d5 CAMPING -// 1f3d6 BEACH WITH UMBRELLA -// 1f3d7 BUILDING CONSTRUCTION -// 1f3d8 HOUSE BUILDINGS -// 1f3d9 CITYSCAPE -// 1f3da DERELICT HOUSE BUILDING -// 1f3db CLASSICAL BUILDING -// 1f3dc DESERT -// 1f3dd DESERT ISLAND -// 1f3de NATIONAL PARK -// 1f3df STADIUM -// 1f3e0 HOUSE BUILDING -// 1f3e1 HOUSE WITH GARDEN -// 1f3e2 OFFICE BUILDING -// 1f3e3 JAPANESE POST OFFICE -// 1f3e4 EUROPEAN POST OFFICE -// 1f3e5 HOSPITAL -// 1f3e6 BANK -// 1f3e7 AUTOMATED TELLER MACHINE -// 1f3e8 HOTEL -// 1f3e9 LOVE HOTEL -// 1f3ea CONVENIENCE STORE -// 1f3eb SCHOOL -// 1f3ec DEPARTMENT STORE -// 1f3ed FACTORY -// 1f3ee IZAKAYA LANTERN -// 1f3ef JAPANESE CASTLE -// 1f3f0 EUROPEAN CASTLE -// 1f3f1 WHITE PENNANT -// 1f3f2 BLACK PENNANT -// 1f3f3 WAVING WHITE FLAG -// 1f3f4 WAVING BLACK FLAG -// 1f3f5 ROSETTE -// 1f3f6 BLACK ROSETTE -// 1f3f7 LABEL - { 0x1F3D4, 0x24, 0x8, 0, 0 }, -// 1f400 RAT -// 1f401 MOUSE -// 1f402 OX -// 1f403 WATER BUFFALO -// 1f404 COW -// 1f405 TIGER -// 1f406 LEOPARD -// 1f407 RABBIT -// 1f408 CAT -// 1f409 DRAGON -// 1f40a CROCODILE -// 1f40b WHALE -// 1f40c SNAIL -// 1f40d SNAKE -// 1f40e HORSE -// 1f40f RAM -// 1f410 GOAT -// 1f411 SHEEP -// 1f412 MONKEY -// 1f413 ROOSTER -// 1f414 CHICKEN -// 1f415 DOG -// 1f416 PIG -// 1f417 BOAR -// 1f418 ELEPHANT -// 1f419 OCTOPUS -// 1f41a SPIRAL SHELL -// 1f41b BUG -// 1f41c ANT -// 1f41d HONEYBEE -// 1f41e LADY BEETLE -// 1f41f FISH -// 1f420 TROPICAL FISH -// 1f421 BLOWFISH -// 1f422 TURTLE -// 1f423 HATCHING CHICK -// 1f424 BABY CHICK -// 1f425 FRONT-FACING BABY CHICK -// 1f426 BIRD -// 1f427 PENGUIN -// 1f428 KOALA -// 1f429 POODLE -// 1f42a DROMEDARY CAMEL -// 1f42b BACTRIAN CAMEL -// 1f42c DOLPHIN -// 1f42d MOUSE FACE -// 1f42e COW FACE -// 1f42f TIGER FACE -// 1f430 RABBIT FACE -// 1f431 CAT FACE -// 1f432 DRAGON FACE -// 1f433 SPOUTING WHALE -// 1f434 HORSE FACE -// 1f435 MONKEY FACE -// 1f436 DOG FACE -// 1f437 PIG FACE -// 1f438 FROG FACE -// 1f439 HAMSTER FACE -// 1f43a WOLF FACE -// 1f43b BEAR FACE -// 1f43c PANDA FACE -// 1f43d PIG NOSE -// 1f43e PAW PRINTS -// 1f43f CHIPMUNK -// 1f440 EYES -// 1f441 EYE -// 1f442 EAR -// 1f443 NOSE -// 1f444 MOUTH -// 1f445 TONGUE -// 1f446 WHITE UP POINTING BACKHAND INDEX -// 1f447 WHITE DOWN POINTING BACKHAND INDEX -// 1f448 WHITE LEFT POINTING BACKHAND INDEX -// 1f449 WHITE RIGHT POINTING BACKHAND INDEX -// 1f44a FISTED HAND SIGN -// 1f44b WAVING HAND SIGN -// 1f44c OK HAND SIGN -// 1f44d THUMBS UP SIGN -// 1f44e THUMBS DOWN SIGN -// 1f44f CLAPPING HANDS SIGN -// 1f450 OPEN HANDS SIGN -// 1f451 CROWN -// 1f452 WOMANS HAT -// 1f453 EYEGLASSES -// 1f454 NECKTIE -// 1f455 T-SHIRT -// 1f456 JEANS -// 1f457 DRESS -// 1f458 KIMONO -// 1f459 BIKINI -// 1f45a WOMANS CLOTHES -// 1f45b PURSE -// 1f45c HANDBAG -// 1f45d POUCH -// 1f45e MANS SHOE -// 1f45f ATHLETIC SHOE -// 1f460 HIGH-HEELED SHOE -// 1f461 WOMANS SANDAL -// 1f462 WOMANS BOOTS -// 1f463 FOOTPRINTS -// 1f464 BUST IN SILHOUETTE -// 1f465 BUSTS IN SILHOUETTE -// 1f466 BOY -// 1f467 GIRL -// 1f468 MAN -// 1f469 WOMAN -// 1f46a FAMILY -// 1f46b MAN AND WOMAN HOLDING HANDS -// 1f46c TWO MEN HOLDING HANDS -// 1f46d TWO WOMEN HOLDING HANDS -// 1f46e POLICE OFFICER -// 1f46f WOMAN WITH BUNNY EARS -// 1f470 BRIDE WITH VEIL -// 1f471 PERSON WITH BLOND HAIR -// 1f472 MAN WITH GUA PI MAO -// 1f473 MAN WITH TURBAN -// 1f474 OLDER MAN -// 1f475 OLDER WOMAN -// 1f476 BABY -// 1f477 CONSTRUCTION WORKER -// 1f478 PRINCESS -// 1f479 JAPANESE OGRE -// 1f47a JAPANESE GOBLIN -// 1f47b GHOST -// 1f47c BABY ANGEL -// 1f47d EXTRATERRESTRIAL ALIEN -// 1f47e ALIEN MONSTER -// 1f47f IMP -// 1f480 SKULL -// 1f481 INFORMATION DESK PERSON -// 1f482 GUARDSMAN -// 1f483 DANCER -// 1f484 LIPSTICK -// 1f485 NAIL POLISH -// 1f486 FACE MASSAGE -// 1f487 HAIRCUT -// 1f488 BARBER POLE -// 1f489 SYRINGE -// 1f48a PILL -// 1f48b KISS MARK -// 1f48c LOVE LETTER -// 1f48d RING -// 1f48e GEM STONE -// 1f48f KISS -// 1f490 BOUQUET -// 1f491 COUPLE WITH HEART -// 1f492 WEDDING -// 1f493 BEATING HEART -// 1f494 BROKEN HEART -// 1f495 TWO HEARTS -// 1f496 SPARKLING HEART -// 1f497 GROWING HEART -// 1f498 HEART WITH ARROW -// 1f499 BLUE HEART -// 1f49a GREEN HEART -// 1f49b YELLOW HEART -// 1f49c PURPLE HEART -// 1f49d HEART WITH RIBBON -// 1f49e REVOLVING HEARTS -// 1f49f HEART DECORATION -// 1f4a0 DIAMOND SHAPE WITH A DOT INSIDE -// 1f4a1 ELECTRIC LIGHT BULB -// 1f4a2 ANGER SYMBOL -// 1f4a3 BOMB -// 1f4a4 SLEEPING SYMBOL -// 1f4a5 COLLISION SYMBOL -// 1f4a6 SPLASHING SWEAT SYMBOL -// 1f4a7 DROPLET -// 1f4a8 DASH SYMBOL -// 1f4a9 PILE OF POO -// 1f4aa FLEXED BICEPS -// 1f4ab DIZZY SYMBOL -// 1f4ac SPEECH BALLOON -// 1f4ad THOUGHT BALLOON -// 1f4ae WHITE FLOWER -// 1f4af HUNDRED POINTS SYMBOL -// 1f4b0 MONEY BAG -// 1f4b1 CURRENCY EXCHANGE -// 1f4b2 HEAVY DOLLAR SIGN -// 1f4b3 CREDIT CARD -// 1f4b4 BANKNOTE WITH YEN SIGN -// 1f4b5 BANKNOTE WITH DOLLAR SIGN -// 1f4b6 BANKNOTE WITH EURO SIGN -// 1f4b7 BANKNOTE WITH POUND SIGN -// 1f4b8 MONEY WITH WINGS -// 1f4b9 CHART WITH UPWARDS TREND AND YEN SIGN -// 1f4ba SEAT -// 1f4bb PERSONAL COMPUTER -// 1f4bc BRIEFCASE -// 1f4bd MINIDISC -// 1f4be FLOPPY DISK -// 1f4bf OPTICAL DISC -// 1f4c0 DVD -// 1f4c1 FILE FOLDER -// 1f4c2 OPEN FILE FOLDER -// 1f4c3 PAGE WITH CURL -// 1f4c4 PAGE FACING UP -// 1f4c5 CALENDAR -// 1f4c6 TEAR-OFF CALENDAR -// 1f4c7 CARD INDEX -// 1f4c8 CHART WITH UPWARDS TREND -// 1f4c9 CHART WITH DOWNWARDS TREND -// 1f4ca BAR CHART -// 1f4cb CLIPBOARD -// 1f4cc PUSHPIN -// 1f4cd ROUND PUSHPIN -// 1f4ce PAPERCLIP -// 1f4cf STRAIGHT RULER -// 1f4d0 TRIANGULAR RULER -// 1f4d1 BOOKMARK TABS -// 1f4d2 LEDGER -// 1f4d3 NOTEBOOK -// 1f4d4 NOTEBOOK WITH DECORATIVE COVER -// 1f4d5 CLOSED BOOK -// 1f4d6 OPEN BOOK -// 1f4d7 GREEN BOOK -// 1f4d8 BLUE BOOK -// 1f4d9 ORANGE BOOK -// 1f4da BOOKS -// 1f4db NAME BADGE -// 1f4dc SCROLL -// 1f4dd MEMO -// 1f4de TELEPHONE RECEIVER -// 1f4df PAGER -// 1f4e0 FAX MACHINE -// 1f4e1 SATELLITE ANTENNA -// 1f4e2 PUBLIC ADDRESS LOUDSPEAKER -// 1f4e3 CHEERING MEGAPHONE -// 1f4e4 OUTBOX TRAY -// 1f4e5 INBOX TRAY -// 1f4e6 PACKAGE -// 1f4e7 E-MAIL SYMBOL -// 1f4e8 INCOMING ENVELOPE -// 1f4e9 ENVELOPE WITH DOWNWARDS ARROW ABOVE -// 1f4ea CLOSED MAILBOX WITH LOWERED FLAG -// 1f4eb CLOSED MAILBOX WITH RAISED FLAG -// 1f4ec OPEN MAILBOX WITH RAISED FLAG -// 1f4ed OPEN MAILBOX WITH LOWERED FLAG -// 1f4ee POSTBOX -// 1f4ef POSTAL HORN -// 1f4f0 NEWSPAPER -// 1f4f1 MOBILE PHONE -// 1f4f2 MOBILE PHONE WITH RIGHTWARDS ARROW AT LEFT -// 1f4f3 VIBRATION MODE -// 1f4f4 MOBILE PHONE OFF -// 1f4f5 NO MOBILE PHONES -// 1f4f6 ANTENNA WITH BARS -// 1f4f7 CAMERA -// 1f4f8 CAMERA WITH FLASH -// 1f4f9 VIDEO CAMERA -// 1f4fa TELEVISION -// 1f4fb RADIO -// 1f4fc VIDEOCASSETTE -// 1f4fd FILM PROJECTOR -// 1f4fe PORTABLE STEREO - { 0x1F400, 0xFF, 0x8, 0, 0 }, -// 1f500 TWISTED RIGHTWARDS ARROWS -// 1f501 CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS -// 1f502 CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS WITH CIRCLED ONE OVERLAY -// 1f503 CLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS -// 1f504 ANTICLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS -// 1f505 LOW BRIGHTNESS SYMBOL -// 1f506 HIGH BRIGHTNESS SYMBOL -// 1f507 SPEAKER WITH CANCELLATION STROKE -// 1f508 SPEAKER -// 1f509 SPEAKER WITH ONE SOUND WAVE -// 1f50a SPEAKER WITH THREE SOUND WAVES -// 1f50b BATTERY -// 1f50c ELECTRIC PLUG -// 1f50d LEFT-POINTING MAGNIFYING GLASS -// 1f50e RIGHT-POINTING MAGNIFYING GLASS -// 1f50f LOCK WITH INK PEN -// 1f510 CLOSED LOCK WITH KEY -// 1f511 KEY -// 1f512 LOCK -// 1f513 OPEN LOCK -// 1f514 BELL -// 1f515 BELL WITH CANCELLATION STROKE -// 1f516 BOOKMARK -// 1f517 LINK SYMBOL -// 1f518 RADIO BUTTON -// 1f519 BACK WITH LEFTWARDS ARROW ABOVE -// 1f51a END WITH LEFTWARDS ARROW ABOVE -// 1f51b ON WITH EXCLAMATION MARK WITH LEFT RIGHT ARROW ABOVE -// 1f51c SOON WITH RIGHTWARDS ARROW ABOVE -// 1f51d TOP WITH UPWARDS ARROW ABOVE -// 1f51e NO ONE UNDER EIGHTEEN SYMBOL -// 1f51f KEYCAP TEN -// 1f520 INPUT SYMBOL FOR LATIN CAPITAL LETTERS -// 1f521 INPUT SYMBOL FOR LATIN SMALL LETTERS -// 1f522 INPUT SYMBOL FOR NUMBERS -// 1f523 INPUT SYMBOL FOR SYMBOLS -// 1f524 INPUT SYMBOL FOR LATIN LETTERS -// 1f525 FIRE -// 1f526 ELECTRIC TORCH -// 1f527 WRENCH -// 1f528 HAMMER -// 1f529 NUT AND BOLT -// 1f52a HOCHO -// 1f52b PISTOL -// 1f52c MICROSCOPE -// 1f52d TELESCOPE -// 1f52e CRYSTAL BALL -// 1f52f SIX POINTED STAR WITH MIDDLE DOT -// 1f530 JAPANESE SYMBOL FOR BEGINNER -// 1f531 TRIDENT EMBLEM -// 1f532 BLACK SQUARE BUTTON -// 1f533 WHITE SQUARE BUTTON -// 1f534 LARGE RED CIRCLE -// 1f535 LARGE BLUE CIRCLE -// 1f536 LARGE ORANGE DIAMOND -// 1f537 LARGE BLUE DIAMOND -// 1f538 SMALL ORANGE DIAMOND -// 1f539 SMALL BLUE DIAMOND -// 1f53a UP-POINTING RED TRIANGLE -// 1f53b DOWN-POINTING RED TRIANGLE -// 1f53c UP-POINTING SMALL RED TRIANGLE -// 1f53d DOWN-POINTING SMALL RED TRIANGLE -// 1f53e LOWER RIGHT SHADOWED WHITE CIRCLE -// 1f53f UPPER RIGHT SHADOWED WHITE CIRCLE -// 1f540 CIRCLED CROSS POMMEE -// 1f541 CROSS POMMEE WITH HALF-CIRCLE BELOW -// 1f542 CROSS POMMEE -// 1f543 NOTCHED LEFT SEMICIRCLE WITH THREE DOTS -// 1f544 NOTCHED RIGHT SEMICIRCLE WITH THREE DOTS -// 1f545 SYMBOL FOR MARKS CHAPTER -// 1f546 WHITE LATIN CROSS -// 1f547 HEAVY LATIN CROSS -// 1f548 CELTIC CROSS -// 1f549 OM SYMBOL -// 1f54a DOVE OF PEACE - { 0x1F500, 0x4B, 0x8, 0, 0 }, -// 1f550 CLOCK FACE ONE OCLOCK -// 1f551 CLOCK FACE TWO OCLOCK -// 1f552 CLOCK FACE THREE OCLOCK -// 1f553 CLOCK FACE FOUR OCLOCK -// 1f554 CLOCK FACE FIVE OCLOCK -// 1f555 CLOCK FACE SIX OCLOCK -// 1f556 CLOCK FACE SEVEN OCLOCK -// 1f557 CLOCK FACE EIGHT OCLOCK -// 1f558 CLOCK FACE NINE OCLOCK -// 1f559 CLOCK FACE TEN OCLOCK -// 1f55a CLOCK FACE ELEVEN OCLOCK -// 1f55b CLOCK FACE TWELVE OCLOCK -// 1f55c CLOCK FACE ONE-THIRTY -// 1f55d CLOCK FACE TWO-THIRTY -// 1f55e CLOCK FACE THREE-THIRTY -// 1f55f CLOCK FACE FOUR-THIRTY -// 1f560 CLOCK FACE FIVE-THIRTY -// 1f561 CLOCK FACE SIX-THIRTY -// 1f562 CLOCK FACE SEVEN-THIRTY -// 1f563 CLOCK FACE EIGHT-THIRTY -// 1f564 CLOCK FACE NINE-THIRTY -// 1f565 CLOCK FACE TEN-THIRTY -// 1f566 CLOCK FACE ELEVEN-THIRTY -// 1f567 CLOCK FACE TWELVE-THIRTY -// 1f568 RIGHT SPEAKER -// 1f569 RIGHT SPEAKER WITH ONE SOUND WAVE -// 1f56a RIGHT SPEAKER WITH THREE SOUND WAVES -// 1f56b BULLHORN -// 1f56c BULLHORN WITH SOUND WAVES -// 1f56d RINGING BELL -// 1f56e BOOK -// 1f56f CANDLE -// 1f570 MANTELPIECE CLOCK -// 1f571 BLACK SKULL AND CROSSBONES -// 1f572 NO PIRACY -// 1f573 HOLE -// 1f574 MAN IN BUSINESS SUIT LEVITATING -// 1f575 SLEUTH OR SPY -// 1f576 DARK SUNGLASSES -// 1f577 SPIDER -// 1f578 SPIDER WEB -// 1f579 JOYSTICK - { 0x1F550, 0x2A, 0x8, 0, 0 }, -// 1f57b LEFT HAND TELEPHONE RECEIVER -// 1f57c TELEPHONE RECEIVER WITH PAGE -// 1f57d RIGHT HAND TELEPHONE RECEIVER -// 1f57e WHITE TOUCHTONE TELEPHONE -// 1f57f BLACK TOUCHTONE TELEPHONE -// 1f580 TELEPHONE ON TOP OF MODEM -// 1f581 CLAMSHELL MOBILE PHONE -// 1f582 BACK OF ENVELOPE -// 1f583 STAMPED ENVELOPE -// 1f584 ENVELOPE WITH LIGHTNING -// 1f585 FLYING ENVELOPE -// 1f586 PEN OVER STAMPED ENVELOPE -// 1f587 LINKED PAPERCLIPS -// 1f588 BLACK PUSHPIN -// 1f589 LOWER LEFT PENCIL -// 1f58a LOWER LEFT BALLPOINT PEN -// 1f58b LOWER LEFT FOUNTAIN PEN -// 1f58c LOWER LEFT PAINTBRUSH -// 1f58d LOWER LEFT CRAYON -// 1f58e LEFT WRITING HAND -// 1f58f TURNED OK HAND SIGN -// 1f590 RAISED HAND WITH FINGERS SPLAYED -// 1f591 REVERSED RAISED HAND WITH FINGERS SPLAYED -// 1f592 REVERSED THUMBS UP SIGN -// 1f593 REVERSED THUMBS DOWN SIGN -// 1f594 REVERSED VICTORY HAND -// 1f595 REVERSED HAND WITH MIDDLE FINGER EXTENDED -// 1f596 RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS -// 1f597 WHITE DOWN POINTING LEFT HAND INDEX -// 1f598 SIDEWAYS WHITE LEFT POINTING INDEX -// 1f599 SIDEWAYS WHITE RIGHT POINTING INDEX -// 1f59a SIDEWAYS BLACK LEFT POINTING INDEX -// 1f59b SIDEWAYS BLACK RIGHT POINTING INDEX -// 1f59c BLACK LEFT POINTING BACKHAND INDEX -// 1f59d BLACK RIGHT POINTING BACKHAND INDEX -// 1f59e SIDEWAYS WHITE UP POINTING INDEX -// 1f59f SIDEWAYS WHITE DOWN POINTING INDEX -// 1f5a0 SIDEWAYS BLACK UP POINTING INDEX -// 1f5a1 SIDEWAYS BLACK DOWN POINTING INDEX -// 1f5a2 BLACK UP POINTING BACKHAND INDEX -// 1f5a3 BLACK DOWN POINTING BACKHAND INDEX - { 0x1F57B, 0x29, 0x8, 0, 0 }, -// 1f5a5 DESKTOP COMPUTER -// 1f5a6 KEYBOARD AND MOUSE -// 1f5a7 THREE NETWORKED COMPUTERS -// 1f5a8 PRINTER -// 1f5a9 POCKET CALCULATOR -// 1f5aa BLACK HARD SHELL FLOPPY DISK -// 1f5ab WHITE HARD SHELL FLOPPY DISK -// 1f5ac SOFT SHELL FLOPPY DISK -// 1f5ad TAPE CARTRIDGE -// 1f5ae WIRED KEYBOARD -// 1f5af ONE BUTTON MOUSE -// 1f5b0 TWO BUTTON MOUSE -// 1f5b1 THREE BUTTON MOUSE -// 1f5b2 TRACKBALL -// 1f5b3 OLD PERSONAL COMPUTER -// 1f5b4 HARD DISK -// 1f5b5 SCREEN -// 1f5b6 PRINTER ICON -// 1f5b7 FAX ICON -// 1f5b8 OPTICAL DISC ICON -// 1f5b9 DOCUMENT WITH TEXT -// 1f5ba DOCUMENT WITH TEXT AND PICTURE -// 1f5bb DOCUMENT WITH PICTURE -// 1f5bc FRAME WITH PICTURE -// 1f5bd FRAME WITH TILES -// 1f5be FRAME WITH AN X -// 1f5bf BLACK FOLDER -// 1f5c0 FOLDER -// 1f5c1 OPEN FOLDER -// 1f5c2 CARD INDEX DIVIDERS -// 1f5c3 CARD FILE BOX -// 1f5c4 FILE CABINET -// 1f5c5 EMPTY NOTE -// 1f5c6 EMPTY NOTE PAGE -// 1f5c7 EMPTY NOTE PAD -// 1f5c8 NOTE -// 1f5c9 NOTE PAGE -// 1f5ca NOTE PAD -// 1f5cb EMPTY DOCUMENT -// 1f5cc EMPTY PAGE -// 1f5cd EMPTY PAGES -// 1f5ce DOCUMENT -// 1f5cf PAGE -// 1f5d0 PAGES -// 1f5d1 WASTEBASKET -// 1f5d2 SPIRAL NOTE PAD -// 1f5d3 SPIRAL CALENDAR PAD -// 1f5d4 DESKTOP WINDOW -// 1f5d5 MINIMIZE -// 1f5d6 MAXIMIZE -// 1f5d7 OVERLAP -// 1f5d8 CLOCKWISE RIGHT AND LEFT SEMICIRCLE ARROWS -// 1f5d9 CANCELLATION X -// 1f5da INCREASE FONT SIZE SYMBOL -// 1f5db DECREASE FONT SIZE SYMBOL -// 1f5dc COMPRESSION -// 1f5dd OLD KEY -// 1f5de ROLLED-UP NEWSPAPER -// 1f5df PAGE WITH CIRCLED TEXT -// 1f5e0 STOCK CHART -// 1f5e1 DAGGER KNIFE -// 1f5e2 LIPS -// 1f5e3 SPEAKING HEAD IN SILHOUETTE -// 1f5e4 THREE RAYS ABOVE -// 1f5e5 THREE RAYS BELOW -// 1f5e6 THREE RAYS LEFT -// 1f5e7 THREE RAYS RIGHT -// 1f5e8 LEFT SPEECH BUBBLE -// 1f5e9 RIGHT SPEECH BUBBLE -// 1f5ea TWO SPEECH BUBBLES -// 1f5eb THREE SPEECH BUBBLES -// 1f5ec LEFT THOUGHT BUBBLE -// 1f5ed RIGHT THOUGHT BUBBLE -// 1f5ee LEFT ANGER BUBBLE -// 1f5ef RIGHT ANGER BUBBLE -// 1f5f0 MOOD BUBBLE -// 1f5f1 LIGHTNING MOOD BUBBLE -// 1f5f2 LIGHTNING MOOD -// 1f5f3 BALLOT BOX WITH BALLOT -// 1f5f4 BALLOT SCRIPT X -// 1f5f5 BALLOT BOX WITH SCRIPT X -// 1f5f6 BALLOT BOLD SCRIPT X -// 1f5f7 BALLOT BOX WITH BOLD SCRIPT X -// 1f5f8 LIGHT CHECK MARK -// 1f5f9 BALLOT BOX WITH BOLD CHECK -// 1f5fa WORLD MAP -// 1f5fb MOUNT FUJI -// 1f5fc TOKYO TOWER -// 1f5fd STATUE OF LIBERTY -// 1f5fe SILHOUETTE OF JAPAN -// 1f5ff MOYAI -// 1f600 GRINNING FACE -// 1f601 GRINNING FACE WITH SMILING EYES -// 1f602 FACE WITH TEARS OF JOY -// 1f603 SMILING FACE WITH OPEN MOUTH -// 1f604 SMILING FACE WITH OPEN MOUTH AND SMILING EYES -// 1f605 SMILING FACE WITH OPEN MOUTH AND COLD SWEAT -// 1f606 SMILING FACE WITH OPEN MOUTH AND TIGHTLY-CLOSED EYES -// 1f607 SMILING FACE WITH HALO -// 1f608 SMILING FACE WITH HORNS -// 1f609 WINKING FACE -// 1f60a SMILING FACE WITH SMILING EYES -// 1f60b FACE SAVOURING DELICIOUS FOOD -// 1f60c RELIEVED FACE -// 1f60d SMILING FACE WITH HEART-SHAPED EYES -// 1f60e SMILING FACE WITH SUNGLASSES -// 1f60f SMIRKING FACE -// 1f610 NEUTRAL FACE -// 1f611 EXPRESSIONLESS FACE -// 1f612 UNAMUSED FACE -// 1f613 FACE WITH COLD SWEAT -// 1f614 PENSIVE FACE -// 1f615 CONFUSED FACE -// 1f616 CONFOUNDED FACE -// 1f617 KISSING FACE -// 1f618 FACE THROWING A KISS -// 1f619 KISSING FACE WITH SMILING EYES -// 1f61a KISSING FACE WITH CLOSED EYES -// 1f61b FACE WITH STUCK-OUT TONGUE -// 1f61c FACE WITH STUCK-OUT TONGUE AND WINKING EYE -// 1f61d FACE WITH STUCK-OUT TONGUE AND TIGHTLY-CLOSED EYES -// 1f61e DISAPPOINTED FACE -// 1f61f WORRIED FACE -// 1f620 ANGRY FACE -// 1f621 POUTING FACE -// 1f622 CRYING FACE -// 1f623 PERSEVERING FACE -// 1f624 FACE WITH LOOK OF TRIUMPH -// 1f625 DISAPPOINTED BUT RELIEVED FACE -// 1f626 FROWNING FACE WITH OPEN MOUTH -// 1f627 ANGUISHED FACE -// 1f628 FEARFUL FACE -// 1f629 WEARY FACE -// 1f62a SLEEPY FACE -// 1f62b TIRED FACE -// 1f62c GRIMACING FACE -// 1f62d LOUDLY CRYING FACE -// 1f62e FACE WITH OPEN MOUTH -// 1f62f HUSHED FACE -// 1f630 FACE WITH OPEN MOUTH AND COLD SWEAT -// 1f631 FACE SCREAMING IN FEAR -// 1f632 ASTONISHED FACE -// 1f633 FLUSHED FACE -// 1f634 SLEEPING FACE -// 1f635 DIZZY FACE -// 1f636 FACE WITHOUT MOUTH -// 1f637 FACE WITH MEDICAL MASK -// 1f638 GRINNING CAT FACE WITH SMILING EYES -// 1f639 CAT FACE WITH TEARS OF JOY -// 1f63a SMILING CAT FACE WITH OPEN MOUTH -// 1f63b SMILING CAT FACE WITH HEART-SHAPED EYES -// 1f63c CAT FACE WITH WRY SMILE -// 1f63d KISSING CAT FACE WITH CLOSED EYES -// 1f63e POUTING CAT FACE -// 1f63f CRYING CAT FACE -// 1f640 WEARY CAT FACE -// 1f641 SLIGHTLY FROWNING FACE -// 1f642 SLIGHTLY SMILING FACE - { 0x1F5A5, 0x9E, 0x8, 0, 0 }, -// 1f645 FACE WITH NO GOOD GESTURE -// 1f646 FACE WITH OK GESTURE -// 1f647 PERSON BOWING DEEPLY -// 1f648 SEE-NO-EVIL MONKEY -// 1f649 HEAR-NO-EVIL MONKEY -// 1f64a SPEAK-NO-EVIL MONKEY -// 1f64b HAPPY PERSON RAISING ONE HAND -// 1f64c PERSON RAISING BOTH HANDS IN CELEBRATION -// 1f64d PERSON FROWNING -// 1f64e PERSON WITH POUTING FACE -// 1f64f PERSON WITH FOLDED HANDS -// 1f650 NORTH WEST POINTING LEAF -// 1f651 SOUTH WEST POINTING LEAF -// 1f652 NORTH EAST POINTING LEAF -// 1f653 SOUTH EAST POINTING LEAF -// 1f654 TURNED NORTH WEST POINTING LEAF -// 1f655 TURNED SOUTH WEST POINTING LEAF -// 1f656 TURNED NORTH EAST POINTING LEAF -// 1f657 TURNED SOUTH EAST POINTING LEAF -// 1f658 NORTH WEST POINTING VINE LEAF -// 1f659 SOUTH WEST POINTING VINE LEAF -// 1f65a NORTH EAST POINTING VINE LEAF -// 1f65b SOUTH EAST POINTING VINE LEAF -// 1f65c HEAVY NORTH WEST POINTING VINE LEAF -// 1f65d HEAVY SOUTH WEST POINTING VINE LEAF -// 1f65e HEAVY NORTH EAST POINTING VINE LEAF -// 1f65f HEAVY SOUTH EAST POINTING VINE LEAF -// 1f660 NORTH WEST POINTING BUD -// 1f661 SOUTH WEST POINTING BUD -// 1f662 NORTH EAST POINTING BUD -// 1f663 SOUTH EAST POINTING BUD -// 1f664 HEAVY NORTH WEST POINTING BUD -// 1f665 HEAVY SOUTH WEST POINTING BUD -// 1f666 HEAVY NORTH EAST POINTING BUD -// 1f667 HEAVY SOUTH EAST POINTING BUD -// 1f668 HOLLOW QUILT SQUARE ORNAMENT -// 1f669 HOLLOW QUILT SQUARE ORNAMENT IN BLACK SQUARE -// 1f66a SOLID QUILT SQUARE ORNAMENT -// 1f66b SOLID QUILT SQUARE ORNAMENT IN BLACK SQUARE -// 1f66c LEFTWARDS ROCKET -// 1f66d UPWARDS ROCKET -// 1f66e RIGHTWARDS ROCKET -// 1f66f DOWNWARDS ROCKET -// 1f670 SCRIPT LIGATURE ET ORNAMENT -// 1f671 HEAVY SCRIPT LIGATURE ET ORNAMENT -// 1f672 LIGATURE OPEN ET ORNAMENT -// 1f673 HEAVY LIGATURE OPEN ET ORNAMENT -// 1f674 HEAVY AMPERSAND ORNAMENT -// 1f675 SWASH AMPERSAND ORNAMENT -// 1f676 SANS-SERIF HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT -// 1f677 SANS-SERIF HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT -// 1f678 SANS-SERIF HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT -// 1f679 HEAVY INTERROBANG ORNAMENT -// 1f67a SANS-SERIF INTERROBANG ORNAMENT -// 1f67b HEAVY SANS-SERIF INTERROBANG ORNAMENT -// 1f67c VERY HEAVY SOLIDUS -// 1f67d VERY HEAVY REVERSE SOLIDUS -// 1f67e CHECKER BOARD -// 1f67f REVERSE CHECKER BOARD -// 1f680 ROCKET -// 1f681 HELICOPTER -// 1f682 STEAM LOCOMOTIVE -// 1f683 RAILWAY CAR -// 1f684 HIGH-SPEED TRAIN -// 1f685 HIGH-SPEED TRAIN WITH BULLET NOSE -// 1f686 TRAIN -// 1f687 METRO -// 1f688 LIGHT RAIL -// 1f689 STATION -// 1f68a TRAM -// 1f68b TRAM CAR -// 1f68c BUS -// 1f68d ONCOMING BUS -// 1f68e TROLLEYBUS -// 1f68f BUS STOP -// 1f690 MINIBUS -// 1f691 AMBULANCE -// 1f692 FIRE ENGINE -// 1f693 POLICE CAR -// 1f694 ONCOMING POLICE CAR -// 1f695 TAXI -// 1f696 ONCOMING TAXI -// 1f697 AUTOMOBILE -// 1f698 ONCOMING AUTOMOBILE -// 1f699 RECREATIONAL VEHICLE -// 1f69a DELIVERY TRUCK -// 1f69b ARTICULATED LORRY -// 1f69c TRACTOR -// 1f69d MONORAIL -// 1f69e MOUNTAIN RAILWAY -// 1f69f SUSPENSION RAILWAY -// 1f6a0 MOUNTAIN CABLEWAY -// 1f6a1 AERIAL TRAMWAY -// 1f6a2 SHIP -// 1f6a3 ROWBOAT -// 1f6a4 SPEEDBOAT -// 1f6a5 HORIZONTAL TRAFFIC LIGHT -// 1f6a6 VERTICAL TRAFFIC LIGHT -// 1f6a7 CONSTRUCTION SIGN -// 1f6a8 POLICE CARS REVOLVING LIGHT -// 1f6a9 TRIANGULAR FLAG ON POST -// 1f6aa DOOR -// 1f6ab NO ENTRY SIGN -// 1f6ac SMOKING SYMBOL -// 1f6ad NO SMOKING SYMBOL -// 1f6ae PUT LITTER IN ITS PLACE SYMBOL -// 1f6af DO NOT LITTER SYMBOL -// 1f6b0 POTABLE WATER SYMBOL -// 1f6b1 NON-POTABLE WATER SYMBOL -// 1f6b2 BICYCLE -// 1f6b3 NO BICYCLES -// 1f6b4 BICYCLIST -// 1f6b5 MOUNTAIN BICYCLIST -// 1f6b6 PEDESTRIAN -// 1f6b7 NO PEDESTRIANS -// 1f6b8 CHILDREN CROSSING -// 1f6b9 MENS SYMBOL -// 1f6ba WOMENS SYMBOL -// 1f6bb RESTROOM -// 1f6bc BABY SYMBOL -// 1f6bd TOILET -// 1f6be WATER CLOSET -// 1f6bf SHOWER -// 1f6c0 BATH -// 1f6c1 BATHTUB -// 1f6c2 PASSPORT CONTROL -// 1f6c3 CUSTOMS -// 1f6c4 BAGGAGE CLAIM -// 1f6c5 LEFT LUGGAGE -// 1f6c6 TRIANGLE WITH ROUNDED CORNERS -// 1f6c7 PROHIBITED SIGN -// 1f6c8 CIRCLED INFORMATION SOURCE -// 1f6c9 BOYS SYMBOL -// 1f6ca GIRLS SYMBOL -// 1f6cb COUCH AND LAMP -// 1f6cc SLEEPING ACCOMMODATION -// 1f6cd SHOPPING BAGS -// 1f6ce BELLHOP BELL -// 1f6cf BED - { 0x1F645, 0x8B, 0x8, 0, 0 }, -// 1f6e0 HAMMER AND WRENCH -// 1f6e1 SHIELD -// 1f6e2 OIL DRUM -// 1f6e3 MOTORWAY -// 1f6e4 RAILWAY TRACK -// 1f6e5 MOTOR BOAT -// 1f6e6 UP-POINTING MILITARY AIRPLANE -// 1f6e7 UP-POINTING AIRPLANE -// 1f6e8 UP-POINTING SMALL AIRPLANE -// 1f6e9 SMALL AIRPLANE -// 1f6ea NORTHEAST-POINTING AIRPLANE -// 1f6eb AIRPLANE DEPARTURE -// 1f6ec AIRPLANE ARRIVING - { 0x1F6E0, 0xD, 0x8, 0, 0 }, -// 1f6f0 SATELLITE -// 1f6f1 ONCOMING FIRE ENGINE -// 1f6f2 DIESEL LOCOMOTIVE -// 1f6f3 PASSENGER SHIP - { 0x1F6F0, 0x4, 0x8, 0, 0 }, -// 1f700 ALCHEMICAL SYMBOL FOR QUINTESSENCE -// 1f701 ALCHEMICAL SYMBOL FOR AIR -// 1f702 ALCHEMICAL SYMBOL FOR FIRE -// 1f703 ALCHEMICAL SYMBOL FOR EARTH -// 1f704 ALCHEMICAL SYMBOL FOR WATER -// 1f705 ALCHEMICAL SYMBOL FOR AQUAFORTIS -// 1f706 ALCHEMICAL SYMBOL FOR AQUA REGIA -// 1f707 ALCHEMICAL SYMBOL FOR AQUA REGIA-2 -// 1f708 ALCHEMICAL SYMBOL FOR AQUA VITAE -// 1f709 ALCHEMICAL SYMBOL FOR AQUA VITAE-2 -// 1f70a ALCHEMICAL SYMBOL FOR VINEGAR -// 1f70b ALCHEMICAL SYMBOL FOR VINEGAR-2 -// 1f70c ALCHEMICAL SYMBOL FOR VINEGAR-3 -// 1f70d ALCHEMICAL SYMBOL FOR SULFUR -// 1f70e ALCHEMICAL SYMBOL FOR PHILOSOPHERS SULFUR -// 1f70f ALCHEMICAL SYMBOL FOR BLACK SULFUR -// 1f710 ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE -// 1f711 ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE-2 -// 1f712 ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE-3 -// 1f713 ALCHEMICAL SYMBOL FOR CINNABAR -// 1f714 ALCHEMICAL SYMBOL FOR SALT -// 1f715 ALCHEMICAL SYMBOL FOR NITRE -// 1f716 ALCHEMICAL SYMBOL FOR VITRIOL -// 1f717 ALCHEMICAL SYMBOL FOR VITRIOL-2 -// 1f718 ALCHEMICAL SYMBOL FOR ROCK SALT -// 1f719 ALCHEMICAL SYMBOL FOR ROCK SALT-2 -// 1f71a ALCHEMICAL SYMBOL FOR GOLD -// 1f71b ALCHEMICAL SYMBOL FOR SILVER -// 1f71c ALCHEMICAL SYMBOL FOR IRON ORE -// 1f71d ALCHEMICAL SYMBOL FOR IRON ORE-2 -// 1f71e ALCHEMICAL SYMBOL FOR CROCUS OF IRON -// 1f71f ALCHEMICAL SYMBOL FOR REGULUS OF IRON -// 1f720 ALCHEMICAL SYMBOL FOR COPPER ORE -// 1f721 ALCHEMICAL SYMBOL FOR IRON-COPPER ORE -// 1f722 ALCHEMICAL SYMBOL FOR SUBLIMATE OF COPPER -// 1f723 ALCHEMICAL SYMBOL FOR CROCUS OF COPPER -// 1f724 ALCHEMICAL SYMBOL FOR CROCUS OF COPPER-2 -// 1f725 ALCHEMICAL SYMBOL FOR COPPER ANTIMONIATE -// 1f726 ALCHEMICAL SYMBOL FOR SALT OF COPPER ANTIMONIATE -// 1f727 ALCHEMICAL SYMBOL FOR SUBLIMATE OF SALT OF COPPER -// 1f728 ALCHEMICAL SYMBOL FOR VERDIGRIS -// 1f729 ALCHEMICAL SYMBOL FOR TIN ORE -// 1f72a ALCHEMICAL SYMBOL FOR LEAD ORE -// 1f72b ALCHEMICAL SYMBOL FOR ANTIMONY ORE -// 1f72c ALCHEMICAL SYMBOL FOR SUBLIMATE OF ANTIMONY -// 1f72d ALCHEMICAL SYMBOL FOR SALT OF ANTIMONY -// 1f72e ALCHEMICAL SYMBOL FOR SUBLIMATE OF SALT OF ANTIMONY -// 1f72f ALCHEMICAL SYMBOL FOR VINEGAR OF ANTIMONY -// 1f730 ALCHEMICAL SYMBOL FOR REGULUS OF ANTIMONY -// 1f731 ALCHEMICAL SYMBOL FOR REGULUS OF ANTIMONY-2 -// 1f732 ALCHEMICAL SYMBOL FOR REGULUS -// 1f733 ALCHEMICAL SYMBOL FOR REGULUS-2 -// 1f734 ALCHEMICAL SYMBOL FOR REGULUS-3 -// 1f735 ALCHEMICAL SYMBOL FOR REGULUS-4 -// 1f736 ALCHEMICAL SYMBOL FOR ALKALI -// 1f737 ALCHEMICAL SYMBOL FOR ALKALI-2 -// 1f738 ALCHEMICAL SYMBOL FOR MARCASITE -// 1f739 ALCHEMICAL SYMBOL FOR SAL-AMMONIAC -// 1f73a ALCHEMICAL SYMBOL FOR ARSENIC -// 1f73b ALCHEMICAL SYMBOL FOR REALGAR -// 1f73c ALCHEMICAL SYMBOL FOR REALGAR-2 -// 1f73d ALCHEMICAL SYMBOL FOR AURIPIGMENT -// 1f73e ALCHEMICAL SYMBOL FOR BISMUTH ORE -// 1f73f ALCHEMICAL SYMBOL FOR TARTAR -// 1f740 ALCHEMICAL SYMBOL FOR TARTAR-2 -// 1f741 ALCHEMICAL SYMBOL FOR QUICK LIME -// 1f742 ALCHEMICAL SYMBOL FOR BORAX -// 1f743 ALCHEMICAL SYMBOL FOR BORAX-2 -// 1f744 ALCHEMICAL SYMBOL FOR BORAX-3 -// 1f745 ALCHEMICAL SYMBOL FOR ALUM -// 1f746 ALCHEMICAL SYMBOL FOR OIL -// 1f747 ALCHEMICAL SYMBOL FOR SPIRIT -// 1f748 ALCHEMICAL SYMBOL FOR TINCTURE -// 1f749 ALCHEMICAL SYMBOL FOR GUM -// 1f74a ALCHEMICAL SYMBOL FOR WAX -// 1f74b ALCHEMICAL SYMBOL FOR POWDER -// 1f74c ALCHEMICAL SYMBOL FOR CALX -// 1f74d ALCHEMICAL SYMBOL FOR TUTTY -// 1f74e ALCHEMICAL SYMBOL FOR CAPUT MORTUUM -// 1f74f ALCHEMICAL SYMBOL FOR SCEPTER OF JOVE -// 1f750 ALCHEMICAL SYMBOL FOR CADUCEUS -// 1f751 ALCHEMICAL SYMBOL FOR TRIDENT -// 1f752 ALCHEMICAL SYMBOL FOR STARRED TRIDENT -// 1f753 ALCHEMICAL SYMBOL FOR LODESTONE -// 1f754 ALCHEMICAL SYMBOL FOR SOAP -// 1f755 ALCHEMICAL SYMBOL FOR URINE -// 1f756 ALCHEMICAL SYMBOL FOR HORSE DUNG -// 1f757 ALCHEMICAL SYMBOL FOR ASHES -// 1f758 ALCHEMICAL SYMBOL FOR POT ASHES -// 1f759 ALCHEMICAL SYMBOL FOR BRICK -// 1f75a ALCHEMICAL SYMBOL FOR POWDERED BRICK -// 1f75b ALCHEMICAL SYMBOL FOR AMALGAM -// 1f75c ALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM -// 1f75d ALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM-2 -// 1f75e ALCHEMICAL SYMBOL FOR SUBLIMATION -// 1f75f ALCHEMICAL SYMBOL FOR PRECIPITATE -// 1f760 ALCHEMICAL SYMBOL FOR DISTILL -// 1f761 ALCHEMICAL SYMBOL FOR DISSOLVE -// 1f762 ALCHEMICAL SYMBOL FOR DISSOLVE-2 -// 1f763 ALCHEMICAL SYMBOL FOR PURIFY -// 1f764 ALCHEMICAL SYMBOL FOR PUTREFACTION -// 1f765 ALCHEMICAL SYMBOL FOR CRUCIBLE -// 1f766 ALCHEMICAL SYMBOL FOR CRUCIBLE-2 -// 1f767 ALCHEMICAL SYMBOL FOR CRUCIBLE-3 -// 1f768 ALCHEMICAL SYMBOL FOR CRUCIBLE-4 -// 1f769 ALCHEMICAL SYMBOL FOR CRUCIBLE-5 -// 1f76a ALCHEMICAL SYMBOL FOR ALEMBIC -// 1f76b ALCHEMICAL SYMBOL FOR BATH OF MARY -// 1f76c ALCHEMICAL SYMBOL FOR BATH OF VAPOURS -// 1f76d ALCHEMICAL SYMBOL FOR RETORT -// 1f76e ALCHEMICAL SYMBOL FOR HOUR -// 1f76f ALCHEMICAL SYMBOL FOR NIGHT -// 1f770 ALCHEMICAL SYMBOL FOR DAY-NIGHT -// 1f771 ALCHEMICAL SYMBOL FOR MONTH -// 1f772 ALCHEMICAL SYMBOL FOR HALF DRAM -// 1f773 ALCHEMICAL SYMBOL FOR HALF OUNCE - { 0x1F700, 0x74, 0x8, 0, 0 }, -// 1f780 BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE -// 1f781 BLACK UP-POINTING ISOSCELES RIGHT TRIANGLE -// 1f782 BLACK RIGHT-POINTING ISOSCELES RIGHT TRIANGLE -// 1f783 BLACK DOWN-POINTING ISOSCELES RIGHT TRIANGLE -// 1f784 BLACK SLIGHTLY SMALL CIRCLE -// 1f785 MEDIUM BOLD WHITE CIRCLE -// 1f786 BOLD WHITE CIRCLE -// 1f787 HEAVY WHITE CIRCLE -// 1f788 VERY HEAVY WHITE CIRCLE -// 1f789 EXTREMELY HEAVY WHITE CIRCLE -// 1f78a WHITE CIRCLE CONTAINING BLACK SMALL CIRCLE -// 1f78b ROUND TARGET -// 1f78c BLACK TINY SQUARE -// 1f78d BLACK SLIGHTLY SMALL SQUARE -// 1f78e LIGHT WHITE SQUARE -// 1f78f MEDIUM WHITE SQUARE -// 1f790 BOLD WHITE SQUARE -// 1f791 HEAVY WHITE SQUARE -// 1f792 VERY HEAVY WHITE SQUARE -// 1f793 EXTREMELY HEAVY WHITE SQUARE -// 1f794 WHITE SQUARE CONTAINING BLACK VERY SMALL SQUARE -// 1f795 WHITE SQUARE CONTAINING BLACK MEDIUM SQUARE -// 1f796 SQUARE TARGET -// 1f797 BLACK TINY DIAMOND -// 1f798 BLACK VERY SMALL DIAMOND -// 1f799 BLACK MEDIUM SMALL DIAMOND -// 1f79a WHITE DIAMOND CONTAINING BLACK VERY SMALL DIAMOND -// 1f79b WHITE DIAMOND CONTAINING BLACK MEDIUM DIAMOND -// 1f79c DIAMOND TARGET -// 1f79d BLACK TINY LOZENGE -// 1f79e BLACK VERY SMALL LOZENGE -// 1f79f BLACK MEDIUM SMALL LOZENGE -// 1f7a0 WHITE LOZENGE CONTAINING BLACK SMALL LOZENGE -// 1f7a1 THIN GREEK CROSS -// 1f7a2 LIGHT GREEK CROSS -// 1f7a3 MEDIUM GREEK CROSS -// 1f7a4 BOLD GREEK CROSS -// 1f7a5 VERY BOLD GREEK CROSS -// 1f7a6 VERY HEAVY GREEK CROSS -// 1f7a7 EXTREMELY HEAVY GREEK CROSS -// 1f7a8 THIN SALTIRE -// 1f7a9 LIGHT SALTIRE -// 1f7aa MEDIUM SALTIRE -// 1f7ab BOLD SALTIRE -// 1f7ac HEAVY SALTIRE -// 1f7ad VERY HEAVY SALTIRE -// 1f7ae EXTREMELY HEAVY SALTIRE -// 1f7af LIGHT FIVE SPOKED ASTERISK -// 1f7b0 MEDIUM FIVE SPOKED ASTERISK -// 1f7b1 BOLD FIVE SPOKED ASTERISK -// 1f7b2 HEAVY FIVE SPOKED ASTERISK -// 1f7b3 VERY HEAVY FIVE SPOKED ASTERISK -// 1f7b4 EXTREMELY HEAVY FIVE SPOKED ASTERISK -// 1f7b5 LIGHT SIX SPOKED ASTERISK -// 1f7b6 MEDIUM SIX SPOKED ASTERISK -// 1f7b7 BOLD SIX SPOKED ASTERISK -// 1f7b8 HEAVY SIX SPOKED ASTERISK -// 1f7b9 VERY HEAVY SIX SPOKED ASTERISK -// 1f7ba EXTREMELY HEAVY SIX SPOKED ASTERISK -// 1f7bb LIGHT EIGHT SPOKED ASTERISK -// 1f7bc MEDIUM EIGHT SPOKED ASTERISK -// 1f7bd BOLD EIGHT SPOKED ASTERISK -// 1f7be HEAVY EIGHT SPOKED ASTERISK -// 1f7bf VERY HEAVY EIGHT SPOKED ASTERISK -// 1f7c0 LIGHT THREE POINTED BLACK STAR -// 1f7c1 MEDIUM THREE POINTED BLACK STAR -// 1f7c2 THREE POINTED BLACK STAR -// 1f7c3 MEDIUM THREE POINTED PINWHEEL STAR -// 1f7c4 LIGHT FOUR POINTED BLACK STAR -// 1f7c5 MEDIUM FOUR POINTED BLACK STAR -// 1f7c6 FOUR POINTED BLACK STAR -// 1f7c7 MEDIUM FOUR POINTED PINWHEEL STAR -// 1f7c8 REVERSE LIGHT FOUR POINTED PINWHEEL STAR -// 1f7c9 LIGHT FIVE POINTED BLACK STAR -// 1f7ca HEAVY FIVE POINTED BLACK STAR -// 1f7cb MEDIUM SIX POINTED BLACK STAR -// 1f7cc HEAVY SIX POINTED BLACK STAR -// 1f7cd SIX POINTED PINWHEEL STAR -// 1f7ce MEDIUM EIGHT POINTED BLACK STAR -// 1f7cf HEAVY EIGHT POINTED BLACK STAR -// 1f7d0 VERY HEAVY EIGHT POINTED BLACK STAR -// 1f7d1 HEAVY EIGHT POINTED PINWHEEL STAR -// 1f7d2 LIGHT TWELVE POINTED BLACK STAR -// 1f7d3 HEAVY TWELVE POINTED BLACK STAR -// 1f7d4 HEAVY TWELVE POINTED PINWHEEL STAR - { 0x1F780, 0x55, 0x8, 0, 0 }, -// 1f800 LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD -// 1f801 UPWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD -// 1f802 RIGHTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD -// 1f803 DOWNWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD -// 1f804 LEFTWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD -// 1f805 UPWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD -// 1f806 RIGHTWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD -// 1f807 DOWNWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD -// 1f808 LEFTWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD -// 1f809 UPWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD -// 1f80a RIGHTWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD -// 1f80b DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD - { 0x1F800, 0xC, 0x8, 0, 0 }, -// 1f810 LEFTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD -// 1f811 UPWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD -// 1f812 RIGHTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD -// 1f813 DOWNWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD -// 1f814 LEFTWARDS ARROW WITH EQUILATERAL ARROWHEAD -// 1f815 UPWARDS ARROW WITH EQUILATERAL ARROWHEAD -// 1f816 RIGHTWARDS ARROW WITH EQUILATERAL ARROWHEAD -// 1f817 DOWNWARDS ARROW WITH EQUILATERAL ARROWHEAD -// 1f818 HEAVY LEFTWARDS ARROW WITH EQUILATERAL ARROWHEAD -// 1f819 HEAVY UPWARDS ARROW WITH EQUILATERAL ARROWHEAD -// 1f81a HEAVY RIGHTWARDS ARROW WITH EQUILATERAL ARROWHEAD -// 1f81b HEAVY DOWNWARDS ARROW WITH EQUILATERAL ARROWHEAD -// 1f81c HEAVY LEFTWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD -// 1f81d HEAVY UPWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD -// 1f81e HEAVY RIGHTWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD -// 1f81f HEAVY DOWNWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD -// 1f820 LEFTWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT -// 1f821 UPWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT -// 1f822 RIGHTWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT -// 1f823 DOWNWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT -// 1f824 LEFTWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT -// 1f825 UPWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT -// 1f826 RIGHTWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT -// 1f827 DOWNWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT -// 1f828 LEFTWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT -// 1f829 UPWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT -// 1f82a RIGHTWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT -// 1f82b DOWNWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT -// 1f82c LEFTWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT -// 1f82d UPWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT -// 1f82e RIGHTWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT -// 1f82f DOWNWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT -// 1f830 LEFTWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT -// 1f831 UPWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT -// 1f832 RIGHTWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT -// 1f833 DOWNWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT -// 1f834 LEFTWARDS FINGER-POST ARROW -// 1f835 UPWARDS FINGER-POST ARROW -// 1f836 RIGHTWARDS FINGER-POST ARROW -// 1f837 DOWNWARDS FINGER-POST ARROW -// 1f838 LEFTWARDS SQUARED ARROW -// 1f839 UPWARDS SQUARED ARROW -// 1f83a RIGHTWARDS SQUARED ARROW -// 1f83b DOWNWARDS SQUARED ARROW -// 1f83c LEFTWARDS COMPRESSED ARROW -// 1f83d UPWARDS COMPRESSED ARROW -// 1f83e RIGHTWARDS COMPRESSED ARROW -// 1f83f DOWNWARDS COMPRESSED ARROW -// 1f840 LEFTWARDS HEAVY COMPRESSED ARROW -// 1f841 UPWARDS HEAVY COMPRESSED ARROW -// 1f842 RIGHTWARDS HEAVY COMPRESSED ARROW -// 1f843 DOWNWARDS HEAVY COMPRESSED ARROW -// 1f844 LEFTWARDS HEAVY ARROW -// 1f845 UPWARDS HEAVY ARROW -// 1f846 RIGHTWARDS HEAVY ARROW -// 1f847 DOWNWARDS HEAVY ARROW - { 0x1F810, 0x38, 0x8, 0, 0 }, -// 1f850 LEFTWARDS SANS-SERIF ARROW -// 1f851 UPWARDS SANS-SERIF ARROW -// 1f852 RIGHTWARDS SANS-SERIF ARROW -// 1f853 DOWNWARDS SANS-SERIF ARROW -// 1f854 NORTH WEST SANS-SERIF ARROW -// 1f855 NORTH EAST SANS-SERIF ARROW -// 1f856 SOUTH EAST SANS-SERIF ARROW -// 1f857 SOUTH WEST SANS-SERIF ARROW -// 1f858 LEFT RIGHT SANS-SERIF ARROW -// 1f859 UP DOWN SANS-SERIF ARROW - { 0x1F850, 0xA, 0x8, 0, 0 }, -// 1f860 WIDE-HEADED LEFTWARDS LIGHT BARB ARROW -// 1f861 WIDE-HEADED UPWARDS LIGHT BARB ARROW -// 1f862 WIDE-HEADED RIGHTWARDS LIGHT BARB ARROW -// 1f863 WIDE-HEADED DOWNWARDS LIGHT BARB ARROW -// 1f864 WIDE-HEADED NORTH WEST LIGHT BARB ARROW -// 1f865 WIDE-HEADED NORTH EAST LIGHT BARB ARROW -// 1f866 WIDE-HEADED SOUTH EAST LIGHT BARB ARROW -// 1f867 WIDE-HEADED SOUTH WEST LIGHT BARB ARROW -// 1f868 WIDE-HEADED LEFTWARDS BARB ARROW -// 1f869 WIDE-HEADED UPWARDS BARB ARROW -// 1f86a WIDE-HEADED RIGHTWARDS BARB ARROW -// 1f86b WIDE-HEADED DOWNWARDS BARB ARROW -// 1f86c WIDE-HEADED NORTH WEST BARB ARROW -// 1f86d WIDE-HEADED NORTH EAST BARB ARROW -// 1f86e WIDE-HEADED SOUTH EAST BARB ARROW -// 1f86f WIDE-HEADED SOUTH WEST BARB ARROW -// 1f870 WIDE-HEADED LEFTWARDS MEDIUM BARB ARROW -// 1f871 WIDE-HEADED UPWARDS MEDIUM BARB ARROW -// 1f872 WIDE-HEADED RIGHTWARDS MEDIUM BARB ARROW -// 1f873 WIDE-HEADED DOWNWARDS MEDIUM BARB ARROW -// 1f874 WIDE-HEADED NORTH WEST MEDIUM BARB ARROW -// 1f875 WIDE-HEADED NORTH EAST MEDIUM BARB ARROW -// 1f876 WIDE-HEADED SOUTH EAST MEDIUM BARB ARROW -// 1f877 WIDE-HEADED SOUTH WEST MEDIUM BARB ARROW -// 1f878 WIDE-HEADED LEFTWARDS HEAVY BARB ARROW -// 1f879 WIDE-HEADED UPWARDS HEAVY BARB ARROW -// 1f87a WIDE-HEADED RIGHTWARDS HEAVY BARB ARROW -// 1f87b WIDE-HEADED DOWNWARDS HEAVY BARB ARROW -// 1f87c WIDE-HEADED NORTH WEST HEAVY BARB ARROW -// 1f87d WIDE-HEADED NORTH EAST HEAVY BARB ARROW -// 1f87e WIDE-HEADED SOUTH EAST HEAVY BARB ARROW -// 1f87f WIDE-HEADED SOUTH WEST HEAVY BARB ARROW -// 1f880 WIDE-HEADED LEFTWARDS VERY HEAVY BARB ARROW -// 1f881 WIDE-HEADED UPWARDS VERY HEAVY BARB ARROW -// 1f882 WIDE-HEADED RIGHTWARDS VERY HEAVY BARB ARROW -// 1f883 WIDE-HEADED DOWNWARDS VERY HEAVY BARB ARROW -// 1f884 WIDE-HEADED NORTH WEST VERY HEAVY BARB ARROW -// 1f885 WIDE-HEADED NORTH EAST VERY HEAVY BARB ARROW -// 1f886 WIDE-HEADED SOUTH EAST VERY HEAVY BARB ARROW -// 1f887 WIDE-HEADED SOUTH WEST VERY HEAVY BARB ARROW - { 0x1F860, 0x28, 0x8, 0, 0 }, -// 1f890 LEFTWARDS TRIANGLE ARROWHEAD -// 1f891 UPWARDS TRIANGLE ARROWHEAD -// 1f892 RIGHTWARDS TRIANGLE ARROWHEAD -// 1f893 DOWNWARDS TRIANGLE ARROWHEAD -// 1f894 LEFTWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD -// 1f895 UPWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD -// 1f896 RIGHTWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD -// 1f897 DOWNWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD -// 1f898 LEFTWARDS ARROW WITH NOTCHED TAIL -// 1f899 UPWARDS ARROW WITH NOTCHED TAIL -// 1f89a RIGHTWARDS ARROW WITH NOTCHED TAIL -// 1f89b DOWNWARDS ARROW WITH NOTCHED TAIL -// 1f89c HEAVY ARROW SHAFT WIDTH ONE -// 1f89d HEAVY ARROW SHAFT WIDTH TWO THIRDS -// 1f89e HEAVY ARROW SHAFT WIDTH ONE HALF -// 1f89f HEAVY ARROW SHAFT WIDTH ONE THIRD -// 1f8a0 LEFTWARDS BOTTOM-SHADED WHITE ARROW -// 1f8a1 RIGHTWARDS BOTTOM SHADED WHITE ARROW -// 1f8a2 LEFTWARDS TOP SHADED WHITE ARROW -// 1f8a3 RIGHTWARDS TOP SHADED WHITE ARROW -// 1f8a4 LEFTWARDS LEFT-SHADED WHITE ARROW -// 1f8a5 RIGHTWARDS RIGHT-SHADED WHITE ARROW -// 1f8a6 LEFTWARDS RIGHT-SHADED WHITE ARROW -// 1f8a7 RIGHTWARDS LEFT-SHADED WHITE ARROW -// 1f8a8 LEFTWARDS BACK-TILTED SHADOWED WHITE ARROW -// 1f8a9 RIGHTWARDS BACK-TILTED SHADOWED WHITE ARROW -// 1f8aa LEFTWARDS FRONT-TILTED SHADOWED WHITE ARROW -// 1f8ab RIGHTWARDS FRONT-TILTED SHADOWED WHITE ARROW -// 1f8ac WHITE ARROW SHAFT WIDTH ONE -// 1f8ad WHITE ARROW SHAFT WIDTH TWO THIRDS - { 0x1F890, 0x1E, 0x8, 0, 0 }, -// 20000 - { 0x20000, 0x1, 0x9, 0, 0 }, -// 2a6d6 - { 0x2A6D6, 0x1, 0x9, 0, 0 }, -// 2a700 - { 0x2A700, 0x1, 0x9, 0, 0 }, -// 2b734 - { 0x2B734, 0x1, 0x9, 0, 0 }, -// 2b740 - { 0x2B740, 0x1, 0x9, 0, 0 }, -// 2b81d - { 0x2B81D, 0x1, 0x9, 0, 0 }, -// 2f800 CJK COMPATIBILITY IDEOGRAPH-2F800 -// 2f801 CJK COMPATIBILITY IDEOGRAPH-2F801 -// 2f802 CJK COMPATIBILITY IDEOGRAPH-2F802 -// 2f803 CJK COMPATIBILITY IDEOGRAPH-2F803 -// 2f804 CJK COMPATIBILITY IDEOGRAPH-2F804 -// 2f805 CJK COMPATIBILITY IDEOGRAPH-2F805 -// 2f806 CJK COMPATIBILITY IDEOGRAPH-2F806 -// 2f807 CJK COMPATIBILITY IDEOGRAPH-2F807 -// 2f808 CJK COMPATIBILITY IDEOGRAPH-2F808 -// 2f809 CJK COMPATIBILITY IDEOGRAPH-2F809 -// 2f80a CJK COMPATIBILITY IDEOGRAPH-2F80A -// 2f80b CJK COMPATIBILITY IDEOGRAPH-2F80B -// 2f80c CJK COMPATIBILITY IDEOGRAPH-2F80C -// 2f80d CJK COMPATIBILITY IDEOGRAPH-2F80D -// 2f80e CJK COMPATIBILITY IDEOGRAPH-2F80E -// 2f80f CJK COMPATIBILITY IDEOGRAPH-2F80F -// 2f810 CJK COMPATIBILITY IDEOGRAPH-2F810 -// 2f811 CJK COMPATIBILITY IDEOGRAPH-2F811 -// 2f812 CJK COMPATIBILITY IDEOGRAPH-2F812 -// 2f813 CJK COMPATIBILITY IDEOGRAPH-2F813 -// 2f814 CJK COMPATIBILITY IDEOGRAPH-2F814 -// 2f815 CJK COMPATIBILITY IDEOGRAPH-2F815 -// 2f816 CJK COMPATIBILITY IDEOGRAPH-2F816 -// 2f817 CJK COMPATIBILITY IDEOGRAPH-2F817 -// 2f818 CJK COMPATIBILITY IDEOGRAPH-2F818 -// 2f819 CJK COMPATIBILITY IDEOGRAPH-2F819 -// 2f81a CJK COMPATIBILITY IDEOGRAPH-2F81A -// 2f81b CJK COMPATIBILITY IDEOGRAPH-2F81B -// 2f81c CJK COMPATIBILITY IDEOGRAPH-2F81C -// 2f81d CJK COMPATIBILITY IDEOGRAPH-2F81D -// 2f81e CJK COMPATIBILITY IDEOGRAPH-2F81E -// 2f81f CJK COMPATIBILITY IDEOGRAPH-2F81F -// 2f820 CJK COMPATIBILITY IDEOGRAPH-2F820 -// 2f821 CJK COMPATIBILITY IDEOGRAPH-2F821 -// 2f822 CJK COMPATIBILITY IDEOGRAPH-2F822 -// 2f823 CJK COMPATIBILITY IDEOGRAPH-2F823 -// 2f824 CJK COMPATIBILITY IDEOGRAPH-2F824 -// 2f825 CJK COMPATIBILITY IDEOGRAPH-2F825 -// 2f826 CJK COMPATIBILITY IDEOGRAPH-2F826 -// 2f827 CJK COMPATIBILITY IDEOGRAPH-2F827 -// 2f828 CJK COMPATIBILITY IDEOGRAPH-2F828 -// 2f829 CJK COMPATIBILITY IDEOGRAPH-2F829 -// 2f82a CJK COMPATIBILITY IDEOGRAPH-2F82A -// 2f82b CJK COMPATIBILITY IDEOGRAPH-2F82B -// 2f82c CJK COMPATIBILITY IDEOGRAPH-2F82C -// 2f82d CJK COMPATIBILITY IDEOGRAPH-2F82D -// 2f82e CJK COMPATIBILITY IDEOGRAPH-2F82E -// 2f82f CJK COMPATIBILITY IDEOGRAPH-2F82F -// 2f830 CJK COMPATIBILITY IDEOGRAPH-2F830 -// 2f831 CJK COMPATIBILITY IDEOGRAPH-2F831 -// 2f832 CJK COMPATIBILITY IDEOGRAPH-2F832 -// 2f833 CJK COMPATIBILITY IDEOGRAPH-2F833 -// 2f834 CJK COMPATIBILITY IDEOGRAPH-2F834 -// 2f835 CJK COMPATIBILITY IDEOGRAPH-2F835 -// 2f836 CJK COMPATIBILITY IDEOGRAPH-2F836 -// 2f837 CJK COMPATIBILITY IDEOGRAPH-2F837 -// 2f838 CJK COMPATIBILITY IDEOGRAPH-2F838 -// 2f839 CJK COMPATIBILITY IDEOGRAPH-2F839 -// 2f83a CJK COMPATIBILITY IDEOGRAPH-2F83A -// 2f83b CJK COMPATIBILITY IDEOGRAPH-2F83B -// 2f83c CJK COMPATIBILITY IDEOGRAPH-2F83C -// 2f83d CJK COMPATIBILITY IDEOGRAPH-2F83D -// 2f83e CJK COMPATIBILITY IDEOGRAPH-2F83E -// 2f83f CJK COMPATIBILITY IDEOGRAPH-2F83F -// 2f840 CJK COMPATIBILITY IDEOGRAPH-2F840 -// 2f841 CJK COMPATIBILITY IDEOGRAPH-2F841 -// 2f842 CJK COMPATIBILITY IDEOGRAPH-2F842 -// 2f843 CJK COMPATIBILITY IDEOGRAPH-2F843 -// 2f844 CJK COMPATIBILITY IDEOGRAPH-2F844 -// 2f845 CJK COMPATIBILITY IDEOGRAPH-2F845 -// 2f846 CJK COMPATIBILITY IDEOGRAPH-2F846 -// 2f847 CJK COMPATIBILITY IDEOGRAPH-2F847 -// 2f848 CJK COMPATIBILITY IDEOGRAPH-2F848 -// 2f849 CJK COMPATIBILITY IDEOGRAPH-2F849 -// 2f84a CJK COMPATIBILITY IDEOGRAPH-2F84A -// 2f84b CJK COMPATIBILITY IDEOGRAPH-2F84B -// 2f84c CJK COMPATIBILITY IDEOGRAPH-2F84C -// 2f84d CJK COMPATIBILITY IDEOGRAPH-2F84D -// 2f84e CJK COMPATIBILITY IDEOGRAPH-2F84E -// 2f84f CJK COMPATIBILITY IDEOGRAPH-2F84F -// 2f850 CJK COMPATIBILITY IDEOGRAPH-2F850 -// 2f851 CJK COMPATIBILITY IDEOGRAPH-2F851 -// 2f852 CJK COMPATIBILITY IDEOGRAPH-2F852 -// 2f853 CJK COMPATIBILITY IDEOGRAPH-2F853 -// 2f854 CJK COMPATIBILITY IDEOGRAPH-2F854 -// 2f855 CJK COMPATIBILITY IDEOGRAPH-2F855 -// 2f856 CJK COMPATIBILITY IDEOGRAPH-2F856 -// 2f857 CJK COMPATIBILITY IDEOGRAPH-2F857 -// 2f858 CJK COMPATIBILITY IDEOGRAPH-2F858 -// 2f859 CJK COMPATIBILITY IDEOGRAPH-2F859 -// 2f85a CJK COMPATIBILITY IDEOGRAPH-2F85A -// 2f85b CJK COMPATIBILITY IDEOGRAPH-2F85B -// 2f85c CJK COMPATIBILITY IDEOGRAPH-2F85C -// 2f85d CJK COMPATIBILITY IDEOGRAPH-2F85D -// 2f85e CJK COMPATIBILITY IDEOGRAPH-2F85E -// 2f85f CJK COMPATIBILITY IDEOGRAPH-2F85F -// 2f860 CJK COMPATIBILITY IDEOGRAPH-2F860 -// 2f861 CJK COMPATIBILITY IDEOGRAPH-2F861 -// 2f862 CJK COMPATIBILITY IDEOGRAPH-2F862 -// 2f863 CJK COMPATIBILITY IDEOGRAPH-2F863 -// 2f864 CJK COMPATIBILITY IDEOGRAPH-2F864 -// 2f865 CJK COMPATIBILITY IDEOGRAPH-2F865 -// 2f866 CJK COMPATIBILITY IDEOGRAPH-2F866 -// 2f867 CJK COMPATIBILITY IDEOGRAPH-2F867 -// 2f868 CJK COMPATIBILITY IDEOGRAPH-2F868 -// 2f869 CJK COMPATIBILITY IDEOGRAPH-2F869 -// 2f86a CJK COMPATIBILITY IDEOGRAPH-2F86A -// 2f86b CJK COMPATIBILITY IDEOGRAPH-2F86B -// 2f86c CJK COMPATIBILITY IDEOGRAPH-2F86C -// 2f86d CJK COMPATIBILITY IDEOGRAPH-2F86D -// 2f86e CJK COMPATIBILITY IDEOGRAPH-2F86E -// 2f86f CJK COMPATIBILITY IDEOGRAPH-2F86F -// 2f870 CJK COMPATIBILITY IDEOGRAPH-2F870 -// 2f871 CJK COMPATIBILITY IDEOGRAPH-2F871 -// 2f872 CJK COMPATIBILITY IDEOGRAPH-2F872 -// 2f873 CJK COMPATIBILITY IDEOGRAPH-2F873 -// 2f874 CJK COMPATIBILITY IDEOGRAPH-2F874 -// 2f875 CJK COMPATIBILITY IDEOGRAPH-2F875 -// 2f876 CJK COMPATIBILITY IDEOGRAPH-2F876 -// 2f877 CJK COMPATIBILITY IDEOGRAPH-2F877 -// 2f878 CJK COMPATIBILITY IDEOGRAPH-2F878 -// 2f879 CJK COMPATIBILITY IDEOGRAPH-2F879 -// 2f87a CJK COMPATIBILITY IDEOGRAPH-2F87A -// 2f87b CJK COMPATIBILITY IDEOGRAPH-2F87B -// 2f87c CJK COMPATIBILITY IDEOGRAPH-2F87C -// 2f87d CJK COMPATIBILITY IDEOGRAPH-2F87D -// 2f87e CJK COMPATIBILITY IDEOGRAPH-2F87E -// 2f87f CJK COMPATIBILITY IDEOGRAPH-2F87F -// 2f880 CJK COMPATIBILITY IDEOGRAPH-2F880 -// 2f881 CJK COMPATIBILITY IDEOGRAPH-2F881 -// 2f882 CJK COMPATIBILITY IDEOGRAPH-2F882 -// 2f883 CJK COMPATIBILITY IDEOGRAPH-2F883 -// 2f884 CJK COMPATIBILITY IDEOGRAPH-2F884 -// 2f885 CJK COMPATIBILITY IDEOGRAPH-2F885 -// 2f886 CJK COMPATIBILITY IDEOGRAPH-2F886 -// 2f887 CJK COMPATIBILITY IDEOGRAPH-2F887 -// 2f888 CJK COMPATIBILITY IDEOGRAPH-2F888 -// 2f889 CJK COMPATIBILITY IDEOGRAPH-2F889 -// 2f88a CJK COMPATIBILITY IDEOGRAPH-2F88A -// 2f88b CJK COMPATIBILITY IDEOGRAPH-2F88B -// 2f88c CJK COMPATIBILITY IDEOGRAPH-2F88C -// 2f88d CJK COMPATIBILITY IDEOGRAPH-2F88D -// 2f88e CJK COMPATIBILITY IDEOGRAPH-2F88E -// 2f88f CJK COMPATIBILITY IDEOGRAPH-2F88F -// 2f890 CJK COMPATIBILITY IDEOGRAPH-2F890 -// 2f891 CJK COMPATIBILITY IDEOGRAPH-2F891 -// 2f892 CJK COMPATIBILITY IDEOGRAPH-2F892 -// 2f893 CJK COMPATIBILITY IDEOGRAPH-2F893 -// 2f894 CJK COMPATIBILITY IDEOGRAPH-2F894 -// 2f895 CJK COMPATIBILITY IDEOGRAPH-2F895 -// 2f896 CJK COMPATIBILITY IDEOGRAPH-2F896 -// 2f897 CJK COMPATIBILITY IDEOGRAPH-2F897 -// 2f898 CJK COMPATIBILITY IDEOGRAPH-2F898 -// 2f899 CJK COMPATIBILITY IDEOGRAPH-2F899 -// 2f89a CJK COMPATIBILITY IDEOGRAPH-2F89A -// 2f89b CJK COMPATIBILITY IDEOGRAPH-2F89B -// 2f89c CJK COMPATIBILITY IDEOGRAPH-2F89C -// 2f89d CJK COMPATIBILITY IDEOGRAPH-2F89D -// 2f89e CJK COMPATIBILITY IDEOGRAPH-2F89E -// 2f89f CJK COMPATIBILITY IDEOGRAPH-2F89F -// 2f8a0 CJK COMPATIBILITY IDEOGRAPH-2F8A0 -// 2f8a1 CJK COMPATIBILITY IDEOGRAPH-2F8A1 -// 2f8a2 CJK COMPATIBILITY IDEOGRAPH-2F8A2 -// 2f8a3 CJK COMPATIBILITY IDEOGRAPH-2F8A3 -// 2f8a4 CJK COMPATIBILITY IDEOGRAPH-2F8A4 -// 2f8a5 CJK COMPATIBILITY IDEOGRAPH-2F8A5 -// 2f8a6 CJK COMPATIBILITY IDEOGRAPH-2F8A6 -// 2f8a7 CJK COMPATIBILITY IDEOGRAPH-2F8A7 -// 2f8a8 CJK COMPATIBILITY IDEOGRAPH-2F8A8 -// 2f8a9 CJK COMPATIBILITY IDEOGRAPH-2F8A9 -// 2f8aa CJK COMPATIBILITY IDEOGRAPH-2F8AA -// 2f8ab CJK COMPATIBILITY IDEOGRAPH-2F8AB -// 2f8ac CJK COMPATIBILITY IDEOGRAPH-2F8AC -// 2f8ad CJK COMPATIBILITY IDEOGRAPH-2F8AD -// 2f8ae CJK COMPATIBILITY IDEOGRAPH-2F8AE -// 2f8af CJK COMPATIBILITY IDEOGRAPH-2F8AF -// 2f8b0 CJK COMPATIBILITY IDEOGRAPH-2F8B0 -// 2f8b1 CJK COMPATIBILITY IDEOGRAPH-2F8B1 -// 2f8b2 CJK COMPATIBILITY IDEOGRAPH-2F8B2 -// 2f8b3 CJK COMPATIBILITY IDEOGRAPH-2F8B3 -// 2f8b4 CJK COMPATIBILITY IDEOGRAPH-2F8B4 -// 2f8b5 CJK COMPATIBILITY IDEOGRAPH-2F8B5 -// 2f8b6 CJK COMPATIBILITY IDEOGRAPH-2F8B6 -// 2f8b7 CJK COMPATIBILITY IDEOGRAPH-2F8B7 -// 2f8b8 CJK COMPATIBILITY IDEOGRAPH-2F8B8 -// 2f8b9 CJK COMPATIBILITY IDEOGRAPH-2F8B9 -// 2f8ba CJK COMPATIBILITY IDEOGRAPH-2F8BA -// 2f8bb CJK COMPATIBILITY IDEOGRAPH-2F8BB -// 2f8bc CJK COMPATIBILITY IDEOGRAPH-2F8BC -// 2f8bd CJK COMPATIBILITY IDEOGRAPH-2F8BD -// 2f8be CJK COMPATIBILITY IDEOGRAPH-2F8BE -// 2f8bf CJK COMPATIBILITY IDEOGRAPH-2F8BF -// 2f8c0 CJK COMPATIBILITY IDEOGRAPH-2F8C0 -// 2f8c1 CJK COMPATIBILITY IDEOGRAPH-2F8C1 -// 2f8c2 CJK COMPATIBILITY IDEOGRAPH-2F8C2 -// 2f8c3 CJK COMPATIBILITY IDEOGRAPH-2F8C3 -// 2f8c4 CJK COMPATIBILITY IDEOGRAPH-2F8C4 -// 2f8c5 CJK COMPATIBILITY IDEOGRAPH-2F8C5 -// 2f8c6 CJK COMPATIBILITY IDEOGRAPH-2F8C6 -// 2f8c7 CJK COMPATIBILITY IDEOGRAPH-2F8C7 -// 2f8c8 CJK COMPATIBILITY IDEOGRAPH-2F8C8 -// 2f8c9 CJK COMPATIBILITY IDEOGRAPH-2F8C9 -// 2f8ca CJK COMPATIBILITY IDEOGRAPH-2F8CA -// 2f8cb CJK COMPATIBILITY IDEOGRAPH-2F8CB -// 2f8cc CJK COMPATIBILITY IDEOGRAPH-2F8CC -// 2f8cd CJK COMPATIBILITY IDEOGRAPH-2F8CD -// 2f8ce CJK COMPATIBILITY IDEOGRAPH-2F8CE -// 2f8cf CJK COMPATIBILITY IDEOGRAPH-2F8CF -// 2f8d0 CJK COMPATIBILITY IDEOGRAPH-2F8D0 -// 2f8d1 CJK COMPATIBILITY IDEOGRAPH-2F8D1 -// 2f8d2 CJK COMPATIBILITY IDEOGRAPH-2F8D2 -// 2f8d3 CJK COMPATIBILITY IDEOGRAPH-2F8D3 -// 2f8d4 CJK COMPATIBILITY IDEOGRAPH-2F8D4 -// 2f8d5 CJK COMPATIBILITY IDEOGRAPH-2F8D5 -// 2f8d6 CJK COMPATIBILITY IDEOGRAPH-2F8D6 -// 2f8d7 CJK COMPATIBILITY IDEOGRAPH-2F8D7 -// 2f8d8 CJK COMPATIBILITY IDEOGRAPH-2F8D8 -// 2f8d9 CJK COMPATIBILITY IDEOGRAPH-2F8D9 -// 2f8da CJK COMPATIBILITY IDEOGRAPH-2F8DA -// 2f8db CJK COMPATIBILITY IDEOGRAPH-2F8DB -// 2f8dc CJK COMPATIBILITY IDEOGRAPH-2F8DC -// 2f8dd CJK COMPATIBILITY IDEOGRAPH-2F8DD -// 2f8de CJK COMPATIBILITY IDEOGRAPH-2F8DE -// 2f8df CJK COMPATIBILITY IDEOGRAPH-2F8DF -// 2f8e0 CJK COMPATIBILITY IDEOGRAPH-2F8E0 -// 2f8e1 CJK COMPATIBILITY IDEOGRAPH-2F8E1 -// 2f8e2 CJK COMPATIBILITY IDEOGRAPH-2F8E2 -// 2f8e3 CJK COMPATIBILITY IDEOGRAPH-2F8E3 -// 2f8e4 CJK COMPATIBILITY IDEOGRAPH-2F8E4 -// 2f8e5 CJK COMPATIBILITY IDEOGRAPH-2F8E5 -// 2f8e6 CJK COMPATIBILITY IDEOGRAPH-2F8E6 -// 2f8e7 CJK COMPATIBILITY IDEOGRAPH-2F8E7 -// 2f8e8 CJK COMPATIBILITY IDEOGRAPH-2F8E8 -// 2f8e9 CJK COMPATIBILITY IDEOGRAPH-2F8E9 -// 2f8ea CJK COMPATIBILITY IDEOGRAPH-2F8EA -// 2f8eb CJK COMPATIBILITY IDEOGRAPH-2F8EB -// 2f8ec CJK COMPATIBILITY IDEOGRAPH-2F8EC -// 2f8ed CJK COMPATIBILITY IDEOGRAPH-2F8ED -// 2f8ee CJK COMPATIBILITY IDEOGRAPH-2F8EE -// 2f8ef CJK COMPATIBILITY IDEOGRAPH-2F8EF -// 2f8f0 CJK COMPATIBILITY IDEOGRAPH-2F8F0 -// 2f8f1 CJK COMPATIBILITY IDEOGRAPH-2F8F1 -// 2f8f2 CJK COMPATIBILITY IDEOGRAPH-2F8F2 -// 2f8f3 CJK COMPATIBILITY IDEOGRAPH-2F8F3 -// 2f8f4 CJK COMPATIBILITY IDEOGRAPH-2F8F4 -// 2f8f5 CJK COMPATIBILITY IDEOGRAPH-2F8F5 -// 2f8f6 CJK COMPATIBILITY IDEOGRAPH-2F8F6 -// 2f8f7 CJK COMPATIBILITY IDEOGRAPH-2F8F7 -// 2f8f8 CJK COMPATIBILITY IDEOGRAPH-2F8F8 -// 2f8f9 CJK COMPATIBILITY IDEOGRAPH-2F8F9 -// 2f8fa CJK COMPATIBILITY IDEOGRAPH-2F8FA -// 2f8fb CJK COMPATIBILITY IDEOGRAPH-2F8FB -// 2f8fc CJK COMPATIBILITY IDEOGRAPH-2F8FC -// 2f8fd CJK COMPATIBILITY IDEOGRAPH-2F8FD -// 2f8fe CJK COMPATIBILITY IDEOGRAPH-2F8FE -// 2f8ff CJK COMPATIBILITY IDEOGRAPH-2F8FF -// 2f900 CJK COMPATIBILITY IDEOGRAPH-2F900 -// 2f901 CJK COMPATIBILITY IDEOGRAPH-2F901 -// 2f902 CJK COMPATIBILITY IDEOGRAPH-2F902 -// 2f903 CJK COMPATIBILITY IDEOGRAPH-2F903 -// 2f904 CJK COMPATIBILITY IDEOGRAPH-2F904 -// 2f905 CJK COMPATIBILITY IDEOGRAPH-2F905 -// 2f906 CJK COMPATIBILITY IDEOGRAPH-2F906 -// 2f907 CJK COMPATIBILITY IDEOGRAPH-2F907 -// 2f908 CJK COMPATIBILITY IDEOGRAPH-2F908 -// 2f909 CJK COMPATIBILITY IDEOGRAPH-2F909 -// 2f90a CJK COMPATIBILITY IDEOGRAPH-2F90A -// 2f90b CJK COMPATIBILITY IDEOGRAPH-2F90B -// 2f90c CJK COMPATIBILITY IDEOGRAPH-2F90C -// 2f90d CJK COMPATIBILITY IDEOGRAPH-2F90D -// 2f90e CJK COMPATIBILITY IDEOGRAPH-2F90E -// 2f90f CJK COMPATIBILITY IDEOGRAPH-2F90F -// 2f910 CJK COMPATIBILITY IDEOGRAPH-2F910 -// 2f911 CJK COMPATIBILITY IDEOGRAPH-2F911 -// 2f912 CJK COMPATIBILITY IDEOGRAPH-2F912 -// 2f913 CJK COMPATIBILITY IDEOGRAPH-2F913 -// 2f914 CJK COMPATIBILITY IDEOGRAPH-2F914 -// 2f915 CJK COMPATIBILITY IDEOGRAPH-2F915 -// 2f916 CJK COMPATIBILITY IDEOGRAPH-2F916 -// 2f917 CJK COMPATIBILITY IDEOGRAPH-2F917 -// 2f918 CJK COMPATIBILITY IDEOGRAPH-2F918 -// 2f919 CJK COMPATIBILITY IDEOGRAPH-2F919 -// 2f91a CJK COMPATIBILITY IDEOGRAPH-2F91A -// 2f91b CJK COMPATIBILITY IDEOGRAPH-2F91B -// 2f91c CJK COMPATIBILITY IDEOGRAPH-2F91C -// 2f91d CJK COMPATIBILITY IDEOGRAPH-2F91D -// 2f91e CJK COMPATIBILITY IDEOGRAPH-2F91E -// 2f91f CJK COMPATIBILITY IDEOGRAPH-2F91F -// 2f920 CJK COMPATIBILITY IDEOGRAPH-2F920 -// 2f921 CJK COMPATIBILITY IDEOGRAPH-2F921 -// 2f922 CJK COMPATIBILITY IDEOGRAPH-2F922 -// 2f923 CJK COMPATIBILITY IDEOGRAPH-2F923 -// 2f924 CJK COMPATIBILITY IDEOGRAPH-2F924 -// 2f925 CJK COMPATIBILITY IDEOGRAPH-2F925 -// 2f926 CJK COMPATIBILITY IDEOGRAPH-2F926 -// 2f927 CJK COMPATIBILITY IDEOGRAPH-2F927 -// 2f928 CJK COMPATIBILITY IDEOGRAPH-2F928 -// 2f929 CJK COMPATIBILITY IDEOGRAPH-2F929 -// 2f92a CJK COMPATIBILITY IDEOGRAPH-2F92A -// 2f92b CJK COMPATIBILITY IDEOGRAPH-2F92B -// 2f92c CJK COMPATIBILITY IDEOGRAPH-2F92C -// 2f92d CJK COMPATIBILITY IDEOGRAPH-2F92D -// 2f92e CJK COMPATIBILITY IDEOGRAPH-2F92E -// 2f92f CJK COMPATIBILITY IDEOGRAPH-2F92F -// 2f930 CJK COMPATIBILITY IDEOGRAPH-2F930 -// 2f931 CJK COMPATIBILITY IDEOGRAPH-2F931 -// 2f932 CJK COMPATIBILITY IDEOGRAPH-2F932 -// 2f933 CJK COMPATIBILITY IDEOGRAPH-2F933 -// 2f934 CJK COMPATIBILITY IDEOGRAPH-2F934 -// 2f935 CJK COMPATIBILITY IDEOGRAPH-2F935 -// 2f936 CJK COMPATIBILITY IDEOGRAPH-2F936 -// 2f937 CJK COMPATIBILITY IDEOGRAPH-2F937 -// 2f938 CJK COMPATIBILITY IDEOGRAPH-2F938 -// 2f939 CJK COMPATIBILITY IDEOGRAPH-2F939 -// 2f93a CJK COMPATIBILITY IDEOGRAPH-2F93A -// 2f93b CJK COMPATIBILITY IDEOGRAPH-2F93B -// 2f93c CJK COMPATIBILITY IDEOGRAPH-2F93C -// 2f93d CJK COMPATIBILITY IDEOGRAPH-2F93D -// 2f93e CJK COMPATIBILITY IDEOGRAPH-2F93E -// 2f93f CJK COMPATIBILITY IDEOGRAPH-2F93F -// 2f940 CJK COMPATIBILITY IDEOGRAPH-2F940 -// 2f941 CJK COMPATIBILITY IDEOGRAPH-2F941 -// 2f942 CJK COMPATIBILITY IDEOGRAPH-2F942 -// 2f943 CJK COMPATIBILITY IDEOGRAPH-2F943 -// 2f944 CJK COMPATIBILITY IDEOGRAPH-2F944 -// 2f945 CJK COMPATIBILITY IDEOGRAPH-2F945 -// 2f946 CJK COMPATIBILITY IDEOGRAPH-2F946 -// 2f947 CJK COMPATIBILITY IDEOGRAPH-2F947 -// 2f948 CJK COMPATIBILITY IDEOGRAPH-2F948 -// 2f949 CJK COMPATIBILITY IDEOGRAPH-2F949 -// 2f94a CJK COMPATIBILITY IDEOGRAPH-2F94A -// 2f94b CJK COMPATIBILITY IDEOGRAPH-2F94B -// 2f94c CJK COMPATIBILITY IDEOGRAPH-2F94C -// 2f94d CJK COMPATIBILITY IDEOGRAPH-2F94D -// 2f94e CJK COMPATIBILITY IDEOGRAPH-2F94E -// 2f94f CJK COMPATIBILITY IDEOGRAPH-2F94F -// 2f950 CJK COMPATIBILITY IDEOGRAPH-2F950 -// 2f951 CJK COMPATIBILITY IDEOGRAPH-2F951 -// 2f952 CJK COMPATIBILITY IDEOGRAPH-2F952 -// 2f953 CJK COMPATIBILITY IDEOGRAPH-2F953 -// 2f954 CJK COMPATIBILITY IDEOGRAPH-2F954 -// 2f955 CJK COMPATIBILITY IDEOGRAPH-2F955 -// 2f956 CJK COMPATIBILITY IDEOGRAPH-2F956 -// 2f957 CJK COMPATIBILITY IDEOGRAPH-2F957 -// 2f958 CJK COMPATIBILITY IDEOGRAPH-2F958 -// 2f959 CJK COMPATIBILITY IDEOGRAPH-2F959 -// 2f95a CJK COMPATIBILITY IDEOGRAPH-2F95A -// 2f95b CJK COMPATIBILITY IDEOGRAPH-2F95B -// 2f95c CJK COMPATIBILITY IDEOGRAPH-2F95C -// 2f95d CJK COMPATIBILITY IDEOGRAPH-2F95D -// 2f95e CJK COMPATIBILITY IDEOGRAPH-2F95E -// 2f95f CJK COMPATIBILITY IDEOGRAPH-2F95F -// 2f960 CJK COMPATIBILITY IDEOGRAPH-2F960 -// 2f961 CJK COMPATIBILITY IDEOGRAPH-2F961 -// 2f962 CJK COMPATIBILITY IDEOGRAPH-2F962 -// 2f963 CJK COMPATIBILITY IDEOGRAPH-2F963 -// 2f964 CJK COMPATIBILITY IDEOGRAPH-2F964 -// 2f965 CJK COMPATIBILITY IDEOGRAPH-2F965 -// 2f966 CJK COMPATIBILITY IDEOGRAPH-2F966 -// 2f967 CJK COMPATIBILITY IDEOGRAPH-2F967 -// 2f968 CJK COMPATIBILITY IDEOGRAPH-2F968 -// 2f969 CJK COMPATIBILITY IDEOGRAPH-2F969 -// 2f96a CJK COMPATIBILITY IDEOGRAPH-2F96A -// 2f96b CJK COMPATIBILITY IDEOGRAPH-2F96B -// 2f96c CJK COMPATIBILITY IDEOGRAPH-2F96C -// 2f96d CJK COMPATIBILITY IDEOGRAPH-2F96D -// 2f96e CJK COMPATIBILITY IDEOGRAPH-2F96E -// 2f96f CJK COMPATIBILITY IDEOGRAPH-2F96F -// 2f970 CJK COMPATIBILITY IDEOGRAPH-2F970 -// 2f971 CJK COMPATIBILITY IDEOGRAPH-2F971 -// 2f972 CJK COMPATIBILITY IDEOGRAPH-2F972 -// 2f973 CJK COMPATIBILITY IDEOGRAPH-2F973 -// 2f974 CJK COMPATIBILITY IDEOGRAPH-2F974 -// 2f975 CJK COMPATIBILITY IDEOGRAPH-2F975 -// 2f976 CJK COMPATIBILITY IDEOGRAPH-2F976 -// 2f977 CJK COMPATIBILITY IDEOGRAPH-2F977 -// 2f978 CJK COMPATIBILITY IDEOGRAPH-2F978 -// 2f979 CJK COMPATIBILITY IDEOGRAPH-2F979 -// 2f97a CJK COMPATIBILITY IDEOGRAPH-2F97A -// 2f97b CJK COMPATIBILITY IDEOGRAPH-2F97B -// 2f97c CJK COMPATIBILITY IDEOGRAPH-2F97C -// 2f97d CJK COMPATIBILITY IDEOGRAPH-2F97D -// 2f97e CJK COMPATIBILITY IDEOGRAPH-2F97E -// 2f97f CJK COMPATIBILITY IDEOGRAPH-2F97F -// 2f980 CJK COMPATIBILITY IDEOGRAPH-2F980 -// 2f981 CJK COMPATIBILITY IDEOGRAPH-2F981 -// 2f982 CJK COMPATIBILITY IDEOGRAPH-2F982 -// 2f983 CJK COMPATIBILITY IDEOGRAPH-2F983 -// 2f984 CJK COMPATIBILITY IDEOGRAPH-2F984 -// 2f985 CJK COMPATIBILITY IDEOGRAPH-2F985 -// 2f986 CJK COMPATIBILITY IDEOGRAPH-2F986 -// 2f987 CJK COMPATIBILITY IDEOGRAPH-2F987 -// 2f988 CJK COMPATIBILITY IDEOGRAPH-2F988 -// 2f989 CJK COMPATIBILITY IDEOGRAPH-2F989 -// 2f98a CJK COMPATIBILITY IDEOGRAPH-2F98A -// 2f98b CJK COMPATIBILITY IDEOGRAPH-2F98B -// 2f98c CJK COMPATIBILITY IDEOGRAPH-2F98C -// 2f98d CJK COMPATIBILITY IDEOGRAPH-2F98D -// 2f98e CJK COMPATIBILITY IDEOGRAPH-2F98E -// 2f98f CJK COMPATIBILITY IDEOGRAPH-2F98F -// 2f990 CJK COMPATIBILITY IDEOGRAPH-2F990 -// 2f991 CJK COMPATIBILITY IDEOGRAPH-2F991 -// 2f992 CJK COMPATIBILITY IDEOGRAPH-2F992 -// 2f993 CJK COMPATIBILITY IDEOGRAPH-2F993 -// 2f994 CJK COMPATIBILITY IDEOGRAPH-2F994 -// 2f995 CJK COMPATIBILITY IDEOGRAPH-2F995 -// 2f996 CJK COMPATIBILITY IDEOGRAPH-2F996 -// 2f997 CJK COMPATIBILITY IDEOGRAPH-2F997 -// 2f998 CJK COMPATIBILITY IDEOGRAPH-2F998 -// 2f999 CJK COMPATIBILITY IDEOGRAPH-2F999 -// 2f99a CJK COMPATIBILITY IDEOGRAPH-2F99A -// 2f99b CJK COMPATIBILITY IDEOGRAPH-2F99B -// 2f99c CJK COMPATIBILITY IDEOGRAPH-2F99C -// 2f99d CJK COMPATIBILITY IDEOGRAPH-2F99D -// 2f99e CJK COMPATIBILITY IDEOGRAPH-2F99E -// 2f99f CJK COMPATIBILITY IDEOGRAPH-2F99F -// 2f9a0 CJK COMPATIBILITY IDEOGRAPH-2F9A0 -// 2f9a1 CJK COMPATIBILITY IDEOGRAPH-2F9A1 -// 2f9a2 CJK COMPATIBILITY IDEOGRAPH-2F9A2 -// 2f9a3 CJK COMPATIBILITY IDEOGRAPH-2F9A3 -// 2f9a4 CJK COMPATIBILITY IDEOGRAPH-2F9A4 -// 2f9a5 CJK COMPATIBILITY IDEOGRAPH-2F9A5 -// 2f9a6 CJK COMPATIBILITY IDEOGRAPH-2F9A6 -// 2f9a7 CJK COMPATIBILITY IDEOGRAPH-2F9A7 -// 2f9a8 CJK COMPATIBILITY IDEOGRAPH-2F9A8 -// 2f9a9 CJK COMPATIBILITY IDEOGRAPH-2F9A9 -// 2f9aa CJK COMPATIBILITY IDEOGRAPH-2F9AA -// 2f9ab CJK COMPATIBILITY IDEOGRAPH-2F9AB -// 2f9ac CJK COMPATIBILITY IDEOGRAPH-2F9AC -// 2f9ad CJK COMPATIBILITY IDEOGRAPH-2F9AD -// 2f9ae CJK COMPATIBILITY IDEOGRAPH-2F9AE -// 2f9af CJK COMPATIBILITY IDEOGRAPH-2F9AF -// 2f9b0 CJK COMPATIBILITY IDEOGRAPH-2F9B0 -// 2f9b1 CJK COMPATIBILITY IDEOGRAPH-2F9B1 -// 2f9b2 CJK COMPATIBILITY IDEOGRAPH-2F9B2 -// 2f9b3 CJK COMPATIBILITY IDEOGRAPH-2F9B3 -// 2f9b4 CJK COMPATIBILITY IDEOGRAPH-2F9B4 -// 2f9b5 CJK COMPATIBILITY IDEOGRAPH-2F9B5 -// 2f9b6 CJK COMPATIBILITY IDEOGRAPH-2F9B6 -// 2f9b7 CJK COMPATIBILITY IDEOGRAPH-2F9B7 -// 2f9b8 CJK COMPATIBILITY IDEOGRAPH-2F9B8 -// 2f9b9 CJK COMPATIBILITY IDEOGRAPH-2F9B9 -// 2f9ba CJK COMPATIBILITY IDEOGRAPH-2F9BA -// 2f9bb CJK COMPATIBILITY IDEOGRAPH-2F9BB -// 2f9bc CJK COMPATIBILITY IDEOGRAPH-2F9BC -// 2f9bd CJK COMPATIBILITY IDEOGRAPH-2F9BD -// 2f9be CJK COMPATIBILITY IDEOGRAPH-2F9BE -// 2f9bf CJK COMPATIBILITY IDEOGRAPH-2F9BF -// 2f9c0 CJK COMPATIBILITY IDEOGRAPH-2F9C0 -// 2f9c1 CJK COMPATIBILITY IDEOGRAPH-2F9C1 -// 2f9c2 CJK COMPATIBILITY IDEOGRAPH-2F9C2 -// 2f9c3 CJK COMPATIBILITY IDEOGRAPH-2F9C3 -// 2f9c4 CJK COMPATIBILITY IDEOGRAPH-2F9C4 -// 2f9c5 CJK COMPATIBILITY IDEOGRAPH-2F9C5 -// 2f9c6 CJK COMPATIBILITY IDEOGRAPH-2F9C6 -// 2f9c7 CJK COMPATIBILITY IDEOGRAPH-2F9C7 -// 2f9c8 CJK COMPATIBILITY IDEOGRAPH-2F9C8 -// 2f9c9 CJK COMPATIBILITY IDEOGRAPH-2F9C9 -// 2f9ca CJK COMPATIBILITY IDEOGRAPH-2F9CA -// 2f9cb CJK COMPATIBILITY IDEOGRAPH-2F9CB -// 2f9cc CJK COMPATIBILITY IDEOGRAPH-2F9CC -// 2f9cd CJK COMPATIBILITY IDEOGRAPH-2F9CD -// 2f9ce CJK COMPATIBILITY IDEOGRAPH-2F9CE -// 2f9cf CJK COMPATIBILITY IDEOGRAPH-2F9CF -// 2f9d0 CJK COMPATIBILITY IDEOGRAPH-2F9D0 -// 2f9d1 CJK COMPATIBILITY IDEOGRAPH-2F9D1 -// 2f9d2 CJK COMPATIBILITY IDEOGRAPH-2F9D2 -// 2f9d3 CJK COMPATIBILITY IDEOGRAPH-2F9D3 -// 2f9d4 CJK COMPATIBILITY IDEOGRAPH-2F9D4 -// 2f9d5 CJK COMPATIBILITY IDEOGRAPH-2F9D5 -// 2f9d6 CJK COMPATIBILITY IDEOGRAPH-2F9D6 -// 2f9d7 CJK COMPATIBILITY IDEOGRAPH-2F9D7 -// 2f9d8 CJK COMPATIBILITY IDEOGRAPH-2F9D8 -// 2f9d9 CJK COMPATIBILITY IDEOGRAPH-2F9D9 -// 2f9da CJK COMPATIBILITY IDEOGRAPH-2F9DA -// 2f9db CJK COMPATIBILITY IDEOGRAPH-2F9DB -// 2f9dc CJK COMPATIBILITY IDEOGRAPH-2F9DC -// 2f9dd CJK COMPATIBILITY IDEOGRAPH-2F9DD -// 2f9de CJK COMPATIBILITY IDEOGRAPH-2F9DE -// 2f9df CJK COMPATIBILITY IDEOGRAPH-2F9DF -// 2f9e0 CJK COMPATIBILITY IDEOGRAPH-2F9E0 -// 2f9e1 CJK COMPATIBILITY IDEOGRAPH-2F9E1 -// 2f9e2 CJK COMPATIBILITY IDEOGRAPH-2F9E2 -// 2f9e3 CJK COMPATIBILITY IDEOGRAPH-2F9E3 -// 2f9e4 CJK COMPATIBILITY IDEOGRAPH-2F9E4 -// 2f9e5 CJK COMPATIBILITY IDEOGRAPH-2F9E5 -// 2f9e6 CJK COMPATIBILITY IDEOGRAPH-2F9E6 -// 2f9e7 CJK COMPATIBILITY IDEOGRAPH-2F9E7 -// 2f9e8 CJK COMPATIBILITY IDEOGRAPH-2F9E8 -// 2f9e9 CJK COMPATIBILITY IDEOGRAPH-2F9E9 -// 2f9ea CJK COMPATIBILITY IDEOGRAPH-2F9EA -// 2f9eb CJK COMPATIBILITY IDEOGRAPH-2F9EB -// 2f9ec CJK COMPATIBILITY IDEOGRAPH-2F9EC -// 2f9ed CJK COMPATIBILITY IDEOGRAPH-2F9ED -// 2f9ee CJK COMPATIBILITY IDEOGRAPH-2F9EE -// 2f9ef CJK COMPATIBILITY IDEOGRAPH-2F9EF -// 2f9f0 CJK COMPATIBILITY IDEOGRAPH-2F9F0 -// 2f9f1 CJK COMPATIBILITY IDEOGRAPH-2F9F1 -// 2f9f2 CJK COMPATIBILITY IDEOGRAPH-2F9F2 -// 2f9f3 CJK COMPATIBILITY IDEOGRAPH-2F9F3 -// 2f9f4 CJK COMPATIBILITY IDEOGRAPH-2F9F4 -// 2f9f5 CJK COMPATIBILITY IDEOGRAPH-2F9F5 -// 2f9f6 CJK COMPATIBILITY IDEOGRAPH-2F9F6 -// 2f9f7 CJK COMPATIBILITY IDEOGRAPH-2F9F7 -// 2f9f8 CJK COMPATIBILITY IDEOGRAPH-2F9F8 -// 2f9f9 CJK COMPATIBILITY IDEOGRAPH-2F9F9 -// 2f9fa CJK COMPATIBILITY IDEOGRAPH-2F9FA -// 2f9fb CJK COMPATIBILITY IDEOGRAPH-2F9FB -// 2f9fc CJK COMPATIBILITY IDEOGRAPH-2F9FC -// 2f9fd CJK COMPATIBILITY IDEOGRAPH-2F9FD -// 2f9fe CJK COMPATIBILITY IDEOGRAPH-2F9FE -// 2f9ff CJK COMPATIBILITY IDEOGRAPH-2F9FF -// 2fa00 CJK COMPATIBILITY IDEOGRAPH-2FA00 -// 2fa01 CJK COMPATIBILITY IDEOGRAPH-2FA01 -// 2fa02 CJK COMPATIBILITY IDEOGRAPH-2FA02 -// 2fa03 CJK COMPATIBILITY IDEOGRAPH-2FA03 -// 2fa04 CJK COMPATIBILITY IDEOGRAPH-2FA04 -// 2fa05 CJK COMPATIBILITY IDEOGRAPH-2FA05 -// 2fa06 CJK COMPATIBILITY IDEOGRAPH-2FA06 -// 2fa07 CJK COMPATIBILITY IDEOGRAPH-2FA07 -// 2fa08 CJK COMPATIBILITY IDEOGRAPH-2FA08 -// 2fa09 CJK COMPATIBILITY IDEOGRAPH-2FA09 -// 2fa0a CJK COMPATIBILITY IDEOGRAPH-2FA0A -// 2fa0b CJK COMPATIBILITY IDEOGRAPH-2FA0B -// 2fa0c CJK COMPATIBILITY IDEOGRAPH-2FA0C -// 2fa0d CJK COMPATIBILITY IDEOGRAPH-2FA0D -// 2fa0e CJK COMPATIBILITY IDEOGRAPH-2FA0E -// 2fa0f CJK COMPATIBILITY IDEOGRAPH-2FA0F -// 2fa10 CJK COMPATIBILITY IDEOGRAPH-2FA10 -// 2fa11 CJK COMPATIBILITY IDEOGRAPH-2FA11 -// 2fa12 CJK COMPATIBILITY IDEOGRAPH-2FA12 -// 2fa13 CJK COMPATIBILITY IDEOGRAPH-2FA13 -// 2fa14 CJK COMPATIBILITY IDEOGRAPH-2FA14 -// 2fa15 CJK COMPATIBILITY IDEOGRAPH-2FA15 -// 2fa16 CJK COMPATIBILITY IDEOGRAPH-2FA16 -// 2fa17 CJK COMPATIBILITY IDEOGRAPH-2FA17 -// 2fa18 CJK COMPATIBILITY IDEOGRAPH-2FA18 -// 2fa19 CJK COMPATIBILITY IDEOGRAPH-2FA19 -// 2fa1a CJK COMPATIBILITY IDEOGRAPH-2FA1A -// 2fa1b CJK COMPATIBILITY IDEOGRAPH-2FA1B -// 2fa1c CJK COMPATIBILITY IDEOGRAPH-2FA1C -// 2fa1d CJK COMPATIBILITY IDEOGRAPH-2FA1D - { 0x2F800, 0x21E, 0x9, 0, 0 }, -// e0001 LANGUAGE TAG - { 0xE0001, 0x1, 0x0, 0, 0 }, -// e0020 TAG SPACE -// e0021 TAG EXCLAMATION MARK -// e0022 TAG QUOTATION MARK -// e0023 TAG NUMBER SIGN -// e0024 TAG DOLLAR SIGN -// e0025 TAG PERCENT SIGN -// e0026 TAG AMPERSAND -// e0027 TAG APOSTROPHE -// e0028 TAG LEFT PARENTHESIS -// e0029 TAG RIGHT PARENTHESIS -// e002a TAG ASTERISK -// e002b TAG PLUS SIGN -// e002c TAG COMMA -// e002d TAG HYPHEN-MINUS -// e002e TAG FULL STOP -// e002f TAG SOLIDUS -// e0030 TAG DIGIT ZERO -// e0031 TAG DIGIT ONE -// e0032 TAG DIGIT TWO -// e0033 TAG DIGIT THREE -// e0034 TAG DIGIT FOUR -// e0035 TAG DIGIT FIVE -// e0036 TAG DIGIT SIX -// e0037 TAG DIGIT SEVEN -// e0038 TAG DIGIT EIGHT -// e0039 TAG DIGIT NINE -// e003a TAG COLON -// e003b TAG SEMICOLON -// e003c TAG LESS-THAN SIGN -// e003d TAG EQUALS SIGN -// e003e TAG GREATER-THAN SIGN -// e003f TAG QUESTION MARK -// e0040 TAG COMMERCIAL AT -// e0041 TAG LATIN CAPITAL LETTER A -// e0042 TAG LATIN CAPITAL LETTER B -// e0043 TAG LATIN CAPITAL LETTER C -// e0044 TAG LATIN CAPITAL LETTER D -// e0045 TAG LATIN CAPITAL LETTER E -// e0046 TAG LATIN CAPITAL LETTER F -// e0047 TAG LATIN CAPITAL LETTER G -// e0048 TAG LATIN CAPITAL LETTER H -// e0049 TAG LATIN CAPITAL LETTER I -// e004a TAG LATIN CAPITAL LETTER J -// e004b TAG LATIN CAPITAL LETTER K -// e004c TAG LATIN CAPITAL LETTER L -// e004d TAG LATIN CAPITAL LETTER M -// e004e TAG LATIN CAPITAL LETTER N -// e004f TAG LATIN CAPITAL LETTER O -// e0050 TAG LATIN CAPITAL LETTER P -// e0051 TAG LATIN CAPITAL LETTER Q -// e0052 TAG LATIN CAPITAL LETTER R -// e0053 TAG LATIN CAPITAL LETTER S -// e0054 TAG LATIN CAPITAL LETTER T -// e0055 TAG LATIN CAPITAL LETTER U -// e0056 TAG LATIN CAPITAL LETTER V -// e0057 TAG LATIN CAPITAL LETTER W -// e0058 TAG LATIN CAPITAL LETTER X -// e0059 TAG LATIN CAPITAL LETTER Y -// e005a TAG LATIN CAPITAL LETTER Z -// e005b TAG LEFT SQUARE BRACKET -// e005c TAG REVERSE SOLIDUS -// e005d TAG RIGHT SQUARE BRACKET -// e005e TAG CIRCUMFLEX ACCENT -// e005f TAG LOW LINE -// e0060 TAG GRAVE ACCENT -// e0061 TAG LATIN SMALL LETTER A -// e0062 TAG LATIN SMALL LETTER B -// e0063 TAG LATIN SMALL LETTER C -// e0064 TAG LATIN SMALL LETTER D -// e0065 TAG LATIN SMALL LETTER E -// e0066 TAG LATIN SMALL LETTER F -// e0067 TAG LATIN SMALL LETTER G -// e0068 TAG LATIN SMALL LETTER H -// e0069 TAG LATIN SMALL LETTER I -// e006a TAG LATIN SMALL LETTER J -// e006b TAG LATIN SMALL LETTER K -// e006c TAG LATIN SMALL LETTER L -// e006d TAG LATIN SMALL LETTER M -// e006e TAG LATIN SMALL LETTER N -// e006f TAG LATIN SMALL LETTER O -// e0070 TAG LATIN SMALL LETTER P -// e0071 TAG LATIN SMALL LETTER Q -// e0072 TAG LATIN SMALL LETTER R -// e0073 TAG LATIN SMALL LETTER S -// e0074 TAG LATIN SMALL LETTER T -// e0075 TAG LATIN SMALL LETTER U -// e0076 TAG LATIN SMALL LETTER V -// e0077 TAG LATIN SMALL LETTER W -// e0078 TAG LATIN SMALL LETTER X -// e0079 TAG LATIN SMALL LETTER Y -// e007a TAG LATIN SMALL LETTER Z -// e007b TAG LEFT CURLY BRACKET -// e007c TAG VERTICAL LINE -// e007d TAG RIGHT CURLY BRACKET -// e007e TAG TILDE -// e007f CANCEL TAG - { 0xE0020, 0x60, 0x0, 0, 0 }, -// e0100 VARIATION SELECTOR-17 -// e0101 VARIATION SELECTOR-18 -// e0102 VARIATION SELECTOR-19 -// e0103 VARIATION SELECTOR-20 -// e0104 VARIATION SELECTOR-21 -// e0105 VARIATION SELECTOR-22 -// e0106 VARIATION SELECTOR-23 -// e0107 VARIATION SELECTOR-24 -// e0108 VARIATION SELECTOR-25 -// e0109 VARIATION SELECTOR-26 -// e010a VARIATION SELECTOR-27 -// e010b VARIATION SELECTOR-28 -// e010c VARIATION SELECTOR-29 -// e010d VARIATION SELECTOR-30 -// e010e VARIATION SELECTOR-31 -// e010f VARIATION SELECTOR-32 -// e0110 VARIATION SELECTOR-33 -// e0111 VARIATION SELECTOR-34 -// e0112 VARIATION SELECTOR-35 -// e0113 VARIATION SELECTOR-36 -// e0114 VARIATION SELECTOR-37 -// e0115 VARIATION SELECTOR-38 -// e0116 VARIATION SELECTOR-39 -// e0117 VARIATION SELECTOR-40 -// e0118 VARIATION SELECTOR-41 -// e0119 VARIATION SELECTOR-42 -// e011a VARIATION SELECTOR-43 -// e011b VARIATION SELECTOR-44 -// e011c VARIATION SELECTOR-45 -// e011d VARIATION SELECTOR-46 -// e011e VARIATION SELECTOR-47 -// e011f VARIATION SELECTOR-48 -// e0120 VARIATION SELECTOR-49 -// e0121 VARIATION SELECTOR-50 -// e0122 VARIATION SELECTOR-51 -// e0123 VARIATION SELECTOR-52 -// e0124 VARIATION SELECTOR-53 -// e0125 VARIATION SELECTOR-54 -// e0126 VARIATION SELECTOR-55 -// e0127 VARIATION SELECTOR-56 -// e0128 VARIATION SELECTOR-57 -// e0129 VARIATION SELECTOR-58 -// e012a VARIATION SELECTOR-59 -// e012b VARIATION SELECTOR-60 -// e012c VARIATION SELECTOR-61 -// e012d VARIATION SELECTOR-62 -// e012e VARIATION SELECTOR-63 -// e012f VARIATION SELECTOR-64 -// e0130 VARIATION SELECTOR-65 -// e0131 VARIATION SELECTOR-66 -// e0132 VARIATION SELECTOR-67 -// e0133 VARIATION SELECTOR-68 -// e0134 VARIATION SELECTOR-69 -// e0135 VARIATION SELECTOR-70 -// e0136 VARIATION SELECTOR-71 -// e0137 VARIATION SELECTOR-72 -// e0138 VARIATION SELECTOR-73 -// e0139 VARIATION SELECTOR-74 -// e013a VARIATION SELECTOR-75 -// e013b VARIATION SELECTOR-76 -// e013c VARIATION SELECTOR-77 -// e013d VARIATION SELECTOR-78 -// e013e VARIATION SELECTOR-79 -// e013f VARIATION SELECTOR-80 -// e0140 VARIATION SELECTOR-81 -// e0141 VARIATION SELECTOR-82 -// e0142 VARIATION SELECTOR-83 -// e0143 VARIATION SELECTOR-84 -// e0144 VARIATION SELECTOR-85 -// e0145 VARIATION SELECTOR-86 -// e0146 VARIATION SELECTOR-87 -// e0147 VARIATION SELECTOR-88 -// e0148 VARIATION SELECTOR-89 -// e0149 VARIATION SELECTOR-90 -// e014a VARIATION SELECTOR-91 -// e014b VARIATION SELECTOR-92 -// e014c VARIATION SELECTOR-93 -// e014d VARIATION SELECTOR-94 -// e014e VARIATION SELECTOR-95 -// e014f VARIATION SELECTOR-96 -// e0150 VARIATION SELECTOR-97 -// e0151 VARIATION SELECTOR-98 -// e0152 VARIATION SELECTOR-99 -// e0153 VARIATION SELECTOR-100 -// e0154 VARIATION SELECTOR-101 -// e0155 VARIATION SELECTOR-102 -// e0156 VARIATION SELECTOR-103 -// e0157 VARIATION SELECTOR-104 -// e0158 VARIATION SELECTOR-105 -// e0159 VARIATION SELECTOR-106 -// e015a VARIATION SELECTOR-107 -// e015b VARIATION SELECTOR-108 -// e015c VARIATION SELECTOR-109 -// e015d VARIATION SELECTOR-110 -// e015e VARIATION SELECTOR-111 -// e015f VARIATION SELECTOR-112 -// e0160 VARIATION SELECTOR-113 -// e0161 VARIATION SELECTOR-114 -// e0162 VARIATION SELECTOR-115 -// e0163 VARIATION SELECTOR-116 -// e0164 VARIATION SELECTOR-117 -// e0165 VARIATION SELECTOR-118 -// e0166 VARIATION SELECTOR-119 -// e0167 VARIATION SELECTOR-120 -// e0168 VARIATION SELECTOR-121 -// e0169 VARIATION SELECTOR-122 -// e016a VARIATION SELECTOR-123 -// e016b VARIATION SELECTOR-124 -// e016c VARIATION SELECTOR-125 -// e016d VARIATION SELECTOR-126 -// e016e VARIATION SELECTOR-127 -// e016f VARIATION SELECTOR-128 -// e0170 VARIATION SELECTOR-129 -// e0171 VARIATION SELECTOR-130 -// e0172 VARIATION SELECTOR-131 -// e0173 VARIATION SELECTOR-132 -// e0174 VARIATION SELECTOR-133 -// e0175 VARIATION SELECTOR-134 -// e0176 VARIATION SELECTOR-135 -// e0177 VARIATION SELECTOR-136 -// e0178 VARIATION SELECTOR-137 -// e0179 VARIATION SELECTOR-138 -// e017a VARIATION SELECTOR-139 -// e017b VARIATION SELECTOR-140 -// e017c VARIATION SELECTOR-141 -// e017d VARIATION SELECTOR-142 -// e017e VARIATION SELECTOR-143 -// e017f VARIATION SELECTOR-144 -// e0180 VARIATION SELECTOR-145 -// e0181 VARIATION SELECTOR-146 -// e0182 VARIATION SELECTOR-147 -// e0183 VARIATION SELECTOR-148 -// e0184 VARIATION SELECTOR-149 -// e0185 VARIATION SELECTOR-150 -// e0186 VARIATION SELECTOR-151 -// e0187 VARIATION SELECTOR-152 -// e0188 VARIATION SELECTOR-153 -// e0189 VARIATION SELECTOR-154 -// e018a VARIATION SELECTOR-155 -// e018b VARIATION SELECTOR-156 -// e018c VARIATION SELECTOR-157 -// e018d VARIATION SELECTOR-158 -// e018e VARIATION SELECTOR-159 -// e018f VARIATION SELECTOR-160 -// e0190 VARIATION SELECTOR-161 -// e0191 VARIATION SELECTOR-162 -// e0192 VARIATION SELECTOR-163 -// e0193 VARIATION SELECTOR-164 -// e0194 VARIATION SELECTOR-165 -// e0195 VARIATION SELECTOR-166 -// e0196 VARIATION SELECTOR-167 -// e0197 VARIATION SELECTOR-168 -// e0198 VARIATION SELECTOR-169 -// e0199 VARIATION SELECTOR-170 -// e019a VARIATION SELECTOR-171 -// e019b VARIATION SELECTOR-172 -// e019c VARIATION SELECTOR-173 -// e019d VARIATION SELECTOR-174 -// e019e VARIATION SELECTOR-175 -// e019f VARIATION SELECTOR-176 -// e01a0 VARIATION SELECTOR-177 -// e01a1 VARIATION SELECTOR-178 -// e01a2 VARIATION SELECTOR-179 -// e01a3 VARIATION SELECTOR-180 -// e01a4 VARIATION SELECTOR-181 -// e01a5 VARIATION SELECTOR-182 -// e01a6 VARIATION SELECTOR-183 -// e01a7 VARIATION SELECTOR-184 -// e01a8 VARIATION SELECTOR-185 -// e01a9 VARIATION SELECTOR-186 -// e01aa VARIATION SELECTOR-187 -// e01ab VARIATION SELECTOR-188 -// e01ac VARIATION SELECTOR-189 -// e01ad VARIATION SELECTOR-190 -// e01ae VARIATION SELECTOR-191 -// e01af VARIATION SELECTOR-192 -// e01b0 VARIATION SELECTOR-193 -// e01b1 VARIATION SELECTOR-194 -// e01b2 VARIATION SELECTOR-195 -// e01b3 VARIATION SELECTOR-196 -// e01b4 VARIATION SELECTOR-197 -// e01b5 VARIATION SELECTOR-198 -// e01b6 VARIATION SELECTOR-199 -// e01b7 VARIATION SELECTOR-200 -// e01b8 VARIATION SELECTOR-201 -// e01b9 VARIATION SELECTOR-202 -// e01ba VARIATION SELECTOR-203 -// e01bb VARIATION SELECTOR-204 -// e01bc VARIATION SELECTOR-205 -// e01bd VARIATION SELECTOR-206 -// e01be VARIATION SELECTOR-207 -// e01bf VARIATION SELECTOR-208 -// e01c0 VARIATION SELECTOR-209 -// e01c1 VARIATION SELECTOR-210 -// e01c2 VARIATION SELECTOR-211 -// e01c3 VARIATION SELECTOR-212 -// e01c4 VARIATION SELECTOR-213 -// e01c5 VARIATION SELECTOR-214 -// e01c6 VARIATION SELECTOR-215 -// e01c7 VARIATION SELECTOR-216 -// e01c8 VARIATION SELECTOR-217 -// e01c9 VARIATION SELECTOR-218 -// e01ca VARIATION SELECTOR-219 -// e01cb VARIATION SELECTOR-220 -// e01cc VARIATION SELECTOR-221 -// e01cd VARIATION SELECTOR-222 -// e01ce VARIATION SELECTOR-223 -// e01cf VARIATION SELECTOR-224 -// e01d0 VARIATION SELECTOR-225 -// e01d1 VARIATION SELECTOR-226 -// e01d2 VARIATION SELECTOR-227 -// e01d3 VARIATION SELECTOR-228 -// e01d4 VARIATION SELECTOR-229 -// e01d5 VARIATION SELECTOR-230 -// e01d6 VARIATION SELECTOR-231 -// e01d7 VARIATION SELECTOR-232 -// e01d8 VARIATION SELECTOR-233 -// e01d9 VARIATION SELECTOR-234 -// e01da VARIATION SELECTOR-235 -// e01db VARIATION SELECTOR-236 -// e01dc VARIATION SELECTOR-237 -// e01dd VARIATION SELECTOR-238 -// e01de VARIATION SELECTOR-239 -// e01df VARIATION SELECTOR-240 -// e01e0 VARIATION SELECTOR-241 -// e01e1 VARIATION SELECTOR-242 -// e01e2 VARIATION SELECTOR-243 -// e01e3 VARIATION SELECTOR-244 -// e01e4 VARIATION SELECTOR-245 -// e01e5 VARIATION SELECTOR-246 -// e01e6 VARIATION SELECTOR-247 -// e01e7 VARIATION SELECTOR-248 -// e01e8 VARIATION SELECTOR-249 -// e01e9 VARIATION SELECTOR-250 -// e01ea VARIATION SELECTOR-251 -// e01eb VARIATION SELECTOR-252 -// e01ec VARIATION SELECTOR-253 -// e01ed VARIATION SELECTOR-254 -// e01ee VARIATION SELECTOR-255 -// e01ef VARIATION SELECTOR-256 - { 0xE0100, 0xF0, 0x0, 0, 0 }, -// f0000 - { 0xF0000, 0x1, 0x0, 0, 0 }, -// ffffd - { 0xFFFFD, 0x1, 0x0, 0, 0 }, -// 100000 - { 0x100000, 0x1, 0x0, 0, 0 }, -// 10fffd - { 0x10FFFD, 0x1, 0x0, 0, 0 }, -}; - - -const size_t _PDCLIB_wcinfo_size = sizeof(_PDCLIB_wcinfo) / sizeof(_PDCLIB_wcinfo[0]); -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" -int main( void ) -{ - return TEST_RESULTS; -} -#endif - diff --git a/waterbox/libc/functions/locale/fakelocale.c b/waterbox/libc/functions/locale/fakelocale.c deleted file mode 100644 index 2e6e68244c..0000000000 --- a/waterbox/libc/functions/locale/fakelocale.c +++ /dev/null @@ -1,3 +0,0 @@ -#include <_PDCLIB_locale.h> - -locale_t _PDCLIB_locale_fake; diff --git a/waterbox/libc/functions/locale/freelocale.c b/waterbox/libc/functions/locale/freelocale.c deleted file mode 100644 index 6ab34e9f0b..0000000000 --- a/waterbox/libc/functions/locale/freelocale.c +++ /dev/null @@ -1,29 +0,0 @@ -/* freelocale( locale_t ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#ifndef REGTEST -#include "_PDCLIB_locale.h" -#include - -void freelocale( locale_t newloc ) -{ - if( newloc != NULL ) { - assert( ! "Not implemented" ); - } -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE( NO_TESTDRIVER ); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/locale/localeconv.c b/waterbox/libc/functions/locale/localeconv.c deleted file mode 100644 index c6ffcf3a41..0000000000 --- a/waterbox/libc/functions/locale/localeconv.c +++ /dev/null @@ -1,26 +0,0 @@ -/* localeconv( void ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#ifndef REGTEST -#include "_PDCLIB_locale.h" - -struct lconv * localeconv( void ) -{ - return &_PDCLIB_threadlocale()->_Conv; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE( NO_TESTDRIVER ); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/locale/setlocale.c b/waterbox/libc/functions/locale/setlocale.c deleted file mode 100644 index 64cf6cd58e..0000000000 --- a/waterbox/libc/functions/locale/setlocale.c +++ /dev/null @@ -1,26 +0,0 @@ -/* setlocale( int, const char * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#ifndef REGTEST -#include "_PDCLIB_locale.h" - -char * setlocale( int category, const char * locale ) -{ - return NULL; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE( NO_TESTDRIVER ); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/locale/uselocale.c b/waterbox/libc/functions/locale/uselocale.c deleted file mode 100644 index 8fded5ed62..0000000000 --- a/waterbox/libc/functions/locale/uselocale.c +++ /dev/null @@ -1,36 +0,0 @@ -/* uselocale( locale_t ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#ifndef REGTEST -#include "_PDCLIB_locale.h" - -#ifdef _PDCLIB_LOCALE_METHOD -locale_t uselocale( locale_t newloc ) -{ - locale_t oldloc = _PDCLIB_threadlocale(); - - if(newloc == LC_GLOBAL_LOCALE) { - _PDCLIB_setthreadlocale(NULL); - } else if(newloc != NULL) { - _PDCLIB_setthreadlocale(newloc); - } - - return oldloc; -} -#endif - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE( NO_TESTDRIVER ); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/math/__cos.c b/waterbox/libc/functions/math/__cos.c deleted file mode 100644 index 46cefb3813..0000000000 --- a/waterbox/libc/functions/math/__cos.c +++ /dev/null @@ -1,71 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/k_cos.c */ -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * - * Developed at SunSoft, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ -/* - * __cos( x, y ) - * kernel cos function on [-pi/4, pi/4], pi/4 ~ 0.785398164 - * Input x is assumed to be bounded by ~pi/4 in magnitude. - * Input y is the tail of x. - * - * Algorithm - * 1. Since cos(-x) = cos(x), we need only to consider positive x. - * 2. if x < 2^-27 (hx<0x3e400000 0), return 1 with inexact if x!=0. - * 3. cos(x) is approximated by a polynomial of degree 14 on - * [0,pi/4] - * 4 14 - * cos(x) ~ 1 - x*x/2 + C1*x + ... + C6*x - * where the remez error is - * - * | 2 4 6 8 10 12 14 | -58 - * |cos(x)-(1-.5*x +C1*x +C2*x +C3*x +C4*x +C5*x +C6*x )| <= 2 - * | | - * - * 4 6 8 10 12 14 - * 4. let r = C1*x +C2*x +C3*x +C4*x +C5*x +C6*x , then - * cos(x) ~ 1 - x*x/2 + r - * since cos(x+y) ~ cos(x) - sin(x)*y - * ~ cos(x) - x*y, - * a correction term is necessary in cos(x) and hence - * cos(x+y) = 1 - (x*x/2 - (r - x*y)) - * For better accuracy, rearrange to - * cos(x+y) ~ w + (tmp + (r-x*y)) - * where w = 1 - x*x/2 and tmp is a tiny correction term - * (1 - x*x/2 == w + tmp exactly in infinite precision). - * The exactness of w + tmp in infinite precision depends on w - * and tmp having the same precision as x. If they have extra - * precision due to compiler bugs, then the extra precision is - * only good provided it is retained in all terms of the final - * expression for cos(). Retention happens in all cases tested - * under FreeBSD, so don't pessimize things by forcibly clipping - * any extra precision in w. - */ - -#include "libm.h" - -static const double -C1 = 4.16666666666666019037e-02, /* 0x3FA55555, 0x5555554C */ -C2 = -1.38888888888741095749e-03, /* 0xBF56C16C, 0x16C15177 */ -C3 = 2.48015872894767294178e-05, /* 0x3EFA01A0, 0x19CB1590 */ -C4 = -2.75573143513906633035e-07, /* 0xBE927E4F, 0x809C52AD */ -C5 = 2.08757232129817482790e-09, /* 0x3E21EE9E, 0xBDB4B1C4 */ -C6 = -1.13596475577881948265e-11; /* 0xBDA8FAE9, 0xBE8838D4 */ - -double __cos(double x, double y) -{ - double_t hz,z,r,w; - - z = x*x; - w = z*z; - r = z*(C1+z*(C2+z*C3)) + w*w*(C4+z*(C5+z*C6)); - hz = 0.5*z; - w = 1.0-hz; - return w + (((1.0-w)-hz) + (z*r-x*y)); -} diff --git a/waterbox/libc/functions/math/__cosdf.c b/waterbox/libc/functions/math/__cosdf.c deleted file mode 100644 index 2124989b32..0000000000 --- a/waterbox/libc/functions/math/__cosdf.c +++ /dev/null @@ -1,35 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/k_cosf.c */ -/* - * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. - * Debugged and optimized by Bruce D. Evans. - */ -/* - * ==================================================== - * 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 "libm.h" - -/* |cos(x) - c(x)| < 2**-34.1 (~[-5.37e-11, 5.295e-11]). */ -static const double -C0 = -0x1ffffffd0c5e81.0p-54, /* -0.499999997251031003120 */ -C1 = 0x155553e1053a42.0p-57, /* 0.0416666233237390631894 */ -C2 = -0x16c087e80f1e27.0p-62, /* -0.00138867637746099294692 */ -C3 = 0x199342e0ee5069.0p-68; /* 0.0000243904487962774090654 */ - -float __cosdf(double x) -{ - double_t r, w, z; - - /* Try to optimize for parallel evaluation as in __tandf.c. */ - z = x*x; - w = z*z; - r = C2+z*C3; - return ((1.0+z*C0) + w*C1) + (w*z)*r; -} diff --git a/waterbox/libc/functions/math/__cosl.c b/waterbox/libc/functions/math/__cosl.c deleted file mode 100644 index fa522ddd7a..0000000000 --- a/waterbox/libc/functions/math/__cosl.c +++ /dev/null @@ -1,96 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/ld80/k_cosl.c */ -/* origin: FreeBSD /usr/src/lib/msun/ld128/k_cosl.c */ -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * Copyright (c) 2008 Steven G. Kargl, David Schultz, Bruce D. Evans. - * - * Developed at SunSoft, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ - - -#include "libm.h" - -#if (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384 -#if LDBL_MANT_DIG == 64 -/* - * ld80 version of __cos.c. See __cos.c for most comments. - */ -/* - * Domain [-0.7854, 0.7854], range ~[-2.43e-23, 2.425e-23]: - * |cos(x) - c(x)| < 2**-75.1 - * - * The coefficients of c(x) were generated by a pari-gp script using - * a Remez algorithm that searches for the best higher coefficients - * after rounding leading coefficients to a specified precision. - * - * Simpler methods like Chebyshev or basic Remez barely suffice for - * cos() in 64-bit precision, because we want the coefficient of x^2 - * to be precisely -0.5 so that multiplying by it is exact, and plain - * rounding of the coefficients of a good polynomial approximation only - * gives this up to about 64-bit precision. Plain rounding also gives - * a mediocre approximation for the coefficient of x^4, but a rounding - * error of 0.5 ulps for this coefficient would only contribute ~0.01 - * ulps to the final error, so this is unimportant. Rounding errors in - * higher coefficients are even less important. - * - * In fact, coefficients above the x^4 one only need to have 53-bit - * precision, and this is more efficient. We get this optimization - * almost for free from the complications needed to search for the best - * higher coefficients. - */ -static const long double -C1 = 0.0416666666666666666136L; /* 0xaaaaaaaaaaaaaa9b.0p-68 */ -static const double -C2 = -0.0013888888888888874, /* -0x16c16c16c16c10.0p-62 */ -C3 = 0.000024801587301571716, /* 0x1a01a01a018e22.0p-68 */ -C4 = -0.00000027557319215507120, /* -0x127e4fb7602f22.0p-74 */ -C5 = 0.0000000020876754400407278, /* 0x11eed8caaeccf1.0p-81 */ -C6 = -1.1470297442401303e-11, /* -0x19393412bd1529.0p-89 */ -C7 = 4.7383039476436467e-14; /* 0x1aac9d9af5c43e.0p-97 */ -#define POLY(z) (z*(C1+z*(C2+z*(C3+z*(C4+z*(C5+z*(C6+z*C7))))))) -#elif LDBL_MANT_DIG == 113 -/* - * ld128 version of __cos.c. See __cos.c for most comments. - */ -/* - * Domain [-0.7854, 0.7854], range ~[-1.80e-37, 1.79e-37]: - * |cos(x) - c(x))| < 2**-122.0 - * - * 113-bit precision requires more care than 64-bit precision, since - * simple methods give a minimax polynomial with coefficient for x^2 - * that is 1 ulp below 0.5, but we want it to be precisely 0.5. See - * above for more details. - */ -static const long double -C1 = 0.04166666666666666666666666666666658424671L, -C2 = -0.001388888888888888888888888888863490893732L, -C3 = 0.00002480158730158730158730158600795304914210L, -C4 = -0.2755731922398589065255474947078934284324e-6L, -C5 = 0.2087675698786809897659225313136400793948e-8L, -C6 = -0.1147074559772972315817149986812031204775e-10L, -C7 = 0.4779477332386808976875457937252120293400e-13L; -static const double -C8 = -0.1561920696721507929516718307820958119868e-15, -C9 = 0.4110317413744594971475941557607804508039e-18, -C10 = -0.8896592467191938803288521958313920156409e-21, -C11 = 0.1601061435794535138244346256065192782581e-23; -#define POLY(z) (z*(C1+z*(C2+z*(C3+z*(C4+z*(C5+z*(C6+z*(C7+ \ - z*(C8+z*(C9+z*(C10+z*C11))))))))))) -#endif - -long double __cosl(long double x, long double y) -{ - long double hz,z,r,w; - - z = x*x; - r = POLY(z); - hz = 0.5*z; - w = 1.0-hz; - return w + (((1.0-w)-hz) + (z*r-x*y)); -} -#endif diff --git a/waterbox/libc/functions/math/__expo2.c b/waterbox/libc/functions/math/__expo2.c deleted file mode 100644 index 740ac680e8..0000000000 --- a/waterbox/libc/functions/math/__expo2.c +++ /dev/null @@ -1,16 +0,0 @@ -#include "libm.h" - -/* k is such that k*ln2 has minimal relative error and x - kln2 > log(DBL_MIN) */ -static const int k = 2043; -static const double kln2 = 0x1.62066151add8bp+10; - -/* exp(x)/2 for x >= log(DBL_MAX), slightly better than 0.5*exp(x/2)*exp(x/2) */ -double __expo2(double x) -{ - double scale; - - /* note that k is odd and scale*scale overflows */ - INSERT_WORDS(scale, (uint32_t)(0x3ff + k/2) << 20, 0); - /* exp(x - k ln2) * 2**(k-1) */ - return exp(x - kln2) * scale * scale; -} diff --git a/waterbox/libc/functions/math/__expo2f.c b/waterbox/libc/functions/math/__expo2f.c deleted file mode 100644 index 5163e41800..0000000000 --- a/waterbox/libc/functions/math/__expo2f.c +++ /dev/null @@ -1,16 +0,0 @@ -#include "libm.h" - -/* k is such that k*ln2 has minimal relative error and x - kln2 > log(FLT_MIN) */ -static const int k = 235; -static const float kln2 = 0x1.45c778p+7f; - -/* expf(x)/2 for x >= log(FLT_MAX), slightly better than 0.5f*expf(x/2)*expf(x/2) */ -float __expo2f(float x) -{ - float scale; - - /* note that k is odd and scale*scale overflows */ - SET_FLOAT_WORD(scale, (uint32_t)(0x7f + k/2) << 23); - /* exp(x - k ln2) * 2**(k-1) */ - return expf(x - kln2) * scale * scale; -} diff --git a/waterbox/libc/functions/math/__fpclassify.c b/waterbox/libc/functions/math/__fpclassify.c deleted file mode 100644 index f7c0e2dfac..0000000000 --- a/waterbox/libc/functions/math/__fpclassify.c +++ /dev/null @@ -1,11 +0,0 @@ -#include -#include - -int __fpclassify(double x) -{ - union {double f; uint64_t i;} u = {x}; - int e = u.i>>52 & 0x7ff; - if (!e) return u.i<<1 ? FP_SUBNORMAL : FP_ZERO; - if (e==0x7ff) return u.i<<12 ? FP_NAN : FP_INFINITE; - return FP_NORMAL; -} diff --git a/waterbox/libc/functions/math/__fpclassifyf.c b/waterbox/libc/functions/math/__fpclassifyf.c deleted file mode 100644 index fd00eb1bcd..0000000000 --- a/waterbox/libc/functions/math/__fpclassifyf.c +++ /dev/null @@ -1,11 +0,0 @@ -#include -#include - -int __fpclassifyf(float x) -{ - union {float f; uint32_t i;} u = {x}; - int e = u.i>>23 & 0xff; - if (!e) return u.i<<1 ? FP_SUBNORMAL : FP_ZERO; - if (e==0xff) return u.i<<9 ? FP_NAN : FP_INFINITE; - return FP_NORMAL; -} diff --git a/waterbox/libc/functions/math/__fpclassifyl.c b/waterbox/libc/functions/math/__fpclassifyl.c deleted file mode 100644 index 481c0b9499..0000000000 --- a/waterbox/libc/functions/math/__fpclassifyl.c +++ /dev/null @@ -1,34 +0,0 @@ -#include "libm.h" - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -int __fpclassifyl(long double x) -{ - return __fpclassify(x); -} -#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384 -int __fpclassifyl(long double x) -{ - union ldshape u = {x}; - int e = u.i.se & 0x7fff; - int msb = u.i.m>>63; - if (!e && !msb) - return u.i.m ? FP_SUBNORMAL : FP_ZERO; - if (!msb) - return FP_NAN; - if (e == 0x7fff) - return u.i.m << 1 ? FP_NAN : FP_INFINITE; - return FP_NORMAL; -} -#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384 -int __fpclassifyl(long double x) -{ - union ldshape u = {x}; - int e = u.i.se & 0x7fff; - u.i.se = 0; - if (!e) - return u.i2.lo | u.i2.hi ? FP_SUBNORMAL : FP_ZERO; - if (e == 0x7fff) - return u.i2.lo | u.i2.hi ? FP_NAN : FP_INFINITE; - return FP_NORMAL; -} -#endif diff --git a/waterbox/libc/functions/math/__invtrigl.c b/waterbox/libc/functions/math/__invtrigl.c deleted file mode 100644 index ef7f4e1b79..0000000000 --- a/waterbox/libc/functions/math/__invtrigl.c +++ /dev/null @@ -1,63 +0,0 @@ -#include -#include "__invtrigl.h" - -#if LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384 -static const long double -pS0 = 1.66666666666666666631e-01L, -pS1 = -4.16313987993683104320e-01L, -pS2 = 3.69068046323246813704e-01L, -pS3 = -1.36213932016738603108e-01L, -pS4 = 1.78324189708471965733e-02L, -pS5 = -2.19216428382605211588e-04L, -pS6 = -7.10526623669075243183e-06L, -qS1 = -2.94788392796209867269e+00L, -qS2 = 3.27309890266528636716e+00L, -qS3 = -1.68285799854822427013e+00L, -qS4 = 3.90699412641738801874e-01L, -qS5 = -3.14365703596053263322e-02L; - -const long double pio2_hi = 1.57079632679489661926L; -const long double pio2_lo = -2.50827880633416601173e-20L; - -/* used in asinl() and acosl() */ -/* R(x^2) is a rational approximation of (asin(x)-x)/x^3 with Remez algorithm */ -long double __invtrigl_R(long double z) -{ - long double p, q; - p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*(pS5+z*pS6)))))); - q = 1.0+z*(qS1+z*(qS2+z*(qS3+z*(qS4+z*qS5)))); - return p/q; -} -#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384 -static const long double -pS0 = 1.66666666666666666666666666666700314e-01L, -pS1 = -7.32816946414566252574527475428622708e-01L, -pS2 = 1.34215708714992334609030036562143589e+00L, -pS3 = -1.32483151677116409805070261790752040e+00L, -pS4 = 7.61206183613632558824485341162121989e-01L, -pS5 = -2.56165783329023486777386833928147375e-01L, -pS6 = 4.80718586374448793411019434585413855e-02L, -pS7 = -4.42523267167024279410230886239774718e-03L, -pS8 = 1.44551535183911458253205638280410064e-04L, -pS9 = -2.10558957916600254061591040482706179e-07L, -qS1 = -4.84690167848739751544716485245697428e+00L, -qS2 = 9.96619113536172610135016921140206980e+00L, -qS3 = -1.13177895428973036660836798461641458e+01L, -qS4 = 7.74004374389488266169304117714658761e+00L, -qS5 = -3.25871986053534084709023539900339905e+00L, -qS6 = 8.27830318881232209752469022352928864e-01L, -qS7 = -1.18768052702942805423330715206348004e-01L, -qS8 = 8.32600764660522313269101537926539470e-03L, -qS9 = -1.99407384882605586705979504567947007e-04L; - -const long double pio2_hi = 1.57079632679489661923132169163975140L; -const long double pio2_lo = 4.33590506506189051239852201302167613e-35L; - -long double __invtrigl_R(long double z) -{ - long double p, q; - p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*(pS5+z*(pS6+z*(pS7+z*(pS8+z*pS9))))))))); - q = 1.0+z*(qS1+z*(qS2+z*(qS3+z*(qS4+z*(qS5+z*(pS6+z*(pS7+z*(pS8+z*pS9)))))))); - return p/q; -} -#endif diff --git a/waterbox/libc/functions/math/__invtrigl.h b/waterbox/libc/functions/math/__invtrigl.h deleted file mode 100644 index 91a8a3b61f..0000000000 --- a/waterbox/libc/functions/math/__invtrigl.h +++ /dev/null @@ -1,6 +0,0 @@ -/* shared by acosl, asinl and atan2l */ -#define pio2_hi __pio2_hi -#define pio2_lo __pio2_lo -extern const long double pio2_hi, pio2_lo; - -long double __invtrigl_R(long double z); diff --git a/waterbox/libc/functions/math/__polevll.c b/waterbox/libc/functions/math/__polevll.c deleted file mode 100644 index ce1a84046b..0000000000 --- a/waterbox/libc/functions/math/__polevll.c +++ /dev/null @@ -1,93 +0,0 @@ -/* origin: OpenBSD /usr/src/lib/libm/src/polevll.c */ -/* - * Copyright (c) 2008 Stephen L. Moshier - * - * 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 THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR 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. - */ -/* - * Evaluate polynomial - * - * - * SYNOPSIS: - * - * int N; - * long double x, y, coef[N+1], polevl[]; - * - * y = polevll( x, coef, N ); - * - * - * DESCRIPTION: - * - * Evaluates polynomial of degree N: - * - * 2 N - * y = C + C x + C x +...+ C x - * 0 1 2 N - * - * Coefficients are stored in reverse order: - * - * coef[0] = C , ..., coef[N] = C . - * N 0 - * - * The function p1evll() assumes that coef[N] = 1.0 and is - * omitted from the array. Its calling arguments are - * otherwise the same as polevll(). - * - * - * SPEED: - * - * In the interest of speed, there are no checks for out - * of bounds arithmetic. This routine is used by most of - * the functions in the library. Depending on available - * equipment features, the user may wish to rewrite the - * program in microcode or assembly language. - * - */ - -#include "libm.h" - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -#else -/* - * Polynomial evaluator: - * P[0] x^n + P[1] x^(n-1) + ... + P[n] - */ -long double __polevll(long double x, const long double *P, int n) -{ - long double y; - - y = *P++; - do { - y = y * x + *P++; - } while (--n); - - return y; -} - -/* - * Polynomial evaluator: - * x^n + P[0] x^(n-1) + P[1] x^(n-2) + ... + P[n] - */ -long double __p1evll(long double x, const long double *P, int n) -{ - long double y; - - n -= 1; - y = x + *P++; - do { - y = y * x + *P++; - } while (--n); - - return y; -} -#endif diff --git a/waterbox/libc/functions/math/__rem_pio2.c b/waterbox/libc/functions/math/__rem_pio2.c deleted file mode 100644 index d403f81c79..0000000000 --- a/waterbox/libc/functions/math/__rem_pio2.c +++ /dev/null @@ -1,177 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/e_rem_pio2.c */ -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * - * Developed at SunSoft, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - * - * Optimized by Bruce D. Evans. - */ -/* __rem_pio2(x,y) - * - * return the remainder of x rem pi/2 in y[0]+y[1] - * use __rem_pio2_large() for large x - */ - -#include "libm.h" - -#if FLT_EVAL_METHOD==0 || FLT_EVAL_METHOD==1 -#define EPS DBL_EPSILON -#elif FLT_EVAL_METHOD==2 -#define EPS LDBL_EPSILON -#endif - -/* - * invpio2: 53 bits of 2/pi - * pio2_1: first 33 bit of pi/2 - * pio2_1t: pi/2 - pio2_1 - * pio2_2: second 33 bit of pi/2 - * pio2_2t: pi/2 - (pio2_1+pio2_2) - * pio2_3: third 33 bit of pi/2 - * pio2_3t: pi/2 - (pio2_1+pio2_2+pio2_3) - */ -static const double -toint = 1.5/EPS, -invpio2 = 6.36619772367581382433e-01, /* 0x3FE45F30, 0x6DC9C883 */ -pio2_1 = 1.57079632673412561417e+00, /* 0x3FF921FB, 0x54400000 */ -pio2_1t = 6.07710050650619224932e-11, /* 0x3DD0B461, 0x1A626331 */ -pio2_2 = 6.07710050630396597660e-11, /* 0x3DD0B461, 0x1A600000 */ -pio2_2t = 2.02226624879595063154e-21, /* 0x3BA3198A, 0x2E037073 */ -pio2_3 = 2.02226624871116645580e-21, /* 0x3BA3198A, 0x2E000000 */ -pio2_3t = 8.47842766036889956997e-32; /* 0x397B839A, 0x252049C1 */ - -/* caller must handle the case when reduction is not needed: |x| ~<= pi/4 */ -int __rem_pio2(double x, double *y) -{ - union {double f; uint64_t i;} u = {x}; - double_t z,w,t,r,fn; - double tx[3],ty[2]; - uint32_t ix; - int sign, n, ex, ey, i; - - sign = u.i>>63; - ix = u.i>>32 & 0x7fffffff; - if (ix <= 0x400f6a7a) { /* |x| ~<= 5pi/4 */ - if ((ix & 0xfffff) == 0x921fb) /* |x| ~= pi/2 or 2pi/2 */ - goto medium; /* cancellation -- use medium case */ - if (ix <= 0x4002d97c) { /* |x| ~<= 3pi/4 */ - if (!sign) { - z = x - pio2_1; /* one round good to 85 bits */ - y[0] = z - pio2_1t; - y[1] = (z-y[0]) - pio2_1t; - return 1; - } else { - z = x + pio2_1; - y[0] = z + pio2_1t; - y[1] = (z-y[0]) + pio2_1t; - return -1; - } - } else { - if (!sign) { - z = x - 2*pio2_1; - y[0] = z - 2*pio2_1t; - y[1] = (z-y[0]) - 2*pio2_1t; - return 2; - } else { - z = x + 2*pio2_1; - y[0] = z + 2*pio2_1t; - y[1] = (z-y[0]) + 2*pio2_1t; - return -2; - } - } - } - if (ix <= 0x401c463b) { /* |x| ~<= 9pi/4 */ - if (ix <= 0x4015fdbc) { /* |x| ~<= 7pi/4 */ - if (ix == 0x4012d97c) /* |x| ~= 3pi/2 */ - goto medium; - if (!sign) { - z = x - 3*pio2_1; - y[0] = z - 3*pio2_1t; - y[1] = (z-y[0]) - 3*pio2_1t; - return 3; - } else { - z = x + 3*pio2_1; - y[0] = z + 3*pio2_1t; - y[1] = (z-y[0]) + 3*pio2_1t; - return -3; - } - } else { - if (ix == 0x401921fb) /* |x| ~= 4pi/2 */ - goto medium; - if (!sign) { - z = x - 4*pio2_1; - y[0] = z - 4*pio2_1t; - y[1] = (z-y[0]) - 4*pio2_1t; - return 4; - } else { - z = x + 4*pio2_1; - y[0] = z + 4*pio2_1t; - y[1] = (z-y[0]) + 4*pio2_1t; - return -4; - } - } - } - if (ix < 0x413921fb) { /* |x| ~< 2^20*(pi/2), medium size */ -medium: - /* rint(x/(pi/2)), Assume round-to-nearest. */ - fn = (double_t)x*invpio2 + toint - toint; - n = (int32_t)fn; - r = x - fn*pio2_1; - w = fn*pio2_1t; /* 1st round, good to 85 bits */ - y[0] = r - w; - u.f = y[0]; - ey = u.i>>52 & 0x7ff; - ex = ix>>20; - if (ex - ey > 16) { /* 2nd round, good to 118 bits */ - t = r; - w = fn*pio2_2; - r = t - w; - w = fn*pio2_2t - ((t-r)-w); - y[0] = r - w; - u.f = y[0]; - ey = u.i>>52 & 0x7ff; - if (ex - ey > 49) { /* 3rd round, good to 151 bits, covers all cases */ - t = r; - w = fn*pio2_3; - r = t - w; - w = fn*pio2_3t - ((t-r)-w); - y[0] = r - w; - } - } - y[1] = (r - y[0]) - w; - return n; - } - /* - * all other (large) arguments - */ - if (ix >= 0x7ff00000) { /* x is inf or NaN */ - y[0] = y[1] = x - x; - return 0; - } - /* set z = scalbn(|x|,-ilogb(x)+23) */ - u.f = x; - u.i &= (uint64_t)-1>>12; - u.i |= (uint64_t)(0x3ff + 23)<<52; - z = u.f; - for (i=0; i < 2; i++) { - tx[i] = (double)(int32_t)z; - z = (z-tx[i])*0x1p24; - } - tx[i] = z; - /* skip zero terms, first term is non-zero */ - while (tx[i] == 0.0) - i--; - n = __rem_pio2_large(tx,ty,(int)(ix>>20)-(0x3ff+23),i+1,1); - if (sign) { - y[0] = -ty[0]; - y[1] = -ty[1]; - return -n; - } - y[0] = ty[0]; - y[1] = ty[1]; - return n; -} diff --git a/waterbox/libc/functions/math/__rem_pio2_large.c b/waterbox/libc/functions/math/__rem_pio2_large.c deleted file mode 100644 index 958f28c255..0000000000 --- a/waterbox/libc/functions/math/__rem_pio2_large.c +++ /dev/null @@ -1,442 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/k_rem_pio2.c */ -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * - * Developed at SunSoft, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ -/* - * __rem_pio2_large(x,y,e0,nx,prec) - * double x[],y[]; int e0,nx,prec; - * - * __rem_pio2_large 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 - * precison, 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]. Must be <= 16360 or you need to - * expand the ipio2 table. - * - * 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) - * - * 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 minimum and recommended value - * for jk is 3,4,4,6 for single, double, extended, and quad. - * jk+1 must be 2 larger than you might expect so that our - * recomputation test works. (Up to 24 bits in the integer - * part (the 24 bits of it that we compute) and 23 bits in - * the fraction part may be lost to cancelation before we - * recompute.) - * - * 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. - */ - -#include "libm.h" - -static const int init_jk[] = {3,4,4,6}; /* initial value for jk */ - -/* - * Table of constants for 2/pi, 396 Hex digits (476 decimal) of 2/pi - * - * 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)). - * - * NB: This table must have at least (e0-3)/24 + jk terms. - * For quad precision (e0 <= 16360, jk = 6), this is 686. - */ -static const int32_t ipio2[] = { -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, - -#if LDBL_MAX_EXP > 1024 -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, -#endif -}; - -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 */ -}; - -int __rem_pio2_large(double *x, double *y, int e0, int nx, int prec) -{ - int32_t 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 ? 0.0 : (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)(int32_t)(0x1p-24*z); - iq[i] = (int32_t)(z - 0x1p24*fw); - z = q[j-1]+fw; - } - - /* compute n */ - z = scalbn(z,q0); /* actual value of z */ - z -= 8.0*floor(z*0.125); /* trim off integer >= 8 */ - n = (int32_t)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 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 = 1.0 - z; - if (carry != 0) - z -= scalbn(1.0,q0); - } - } - - /* check if recomputation is needed */ - if (z == 0.0) { - 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 = scalbn(z,-q0); - if (z >= 0x1p24) { - fw = (double)(int32_t)(0x1p-24*z); - iq[jz] = (int32_t)(z - 0x1p24*fw); - jz += 1; - q0 += 24; - iq[jz] = (int32_t)fw; - } else - iq[jz] = (int32_t)z; - } - - /* convert integer "bit" chunk to floating-point value */ - fw = scalbn(1.0,q0); - for (i=jz; i>=0; i--) { - q[i] = fw*(double)iq[i]; - fw *= 0x1p-24; - } - - /* 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]; - // TODO: drop excess precision here once double_t is used - fw = (double)fw; - 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/waterbox/libc/functions/math/__rem_pio2f.c b/waterbox/libc/functions/math/__rem_pio2f.c deleted file mode 100644 index 4473c1c420..0000000000 --- a/waterbox/libc/functions/math/__rem_pio2f.c +++ /dev/null @@ -1,75 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/e_rem_pio2f.c */ -/* - * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. - * Debugged and optimized by Bruce D. Evans. - */ -/* - * ==================================================== - * 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. - * ==================================================== - */ -/* __rem_pio2f(x,y) - * - * return the remainder of x rem pi/2 in *y - * use double precision for everything except passing x - * use __rem_pio2_large() for large x - */ - -#include "libm.h" - -#if FLT_EVAL_METHOD==0 || FLT_EVAL_METHOD==1 -#define EPS DBL_EPSILON -#elif FLT_EVAL_METHOD==2 -#define EPS LDBL_EPSILON -#endif - -/* - * invpio2: 53 bits of 2/pi - * pio2_1: first 25 bits of pi/2 - * pio2_1t: pi/2 - pio2_1 - */ -static const double -toint = 1.5/EPS, -invpio2 = 6.36619772367581382433e-01, /* 0x3FE45F30, 0x6DC9C883 */ -pio2_1 = 1.57079631090164184570e+00, /* 0x3FF921FB, 0x50000000 */ -pio2_1t = 1.58932547735281966916e-08; /* 0x3E5110b4, 0x611A6263 */ - -int __rem_pio2f(float x, double *y) -{ - union {float f; uint32_t i;} u = {x}; - double tx[1],ty[1]; - double_t fn; - uint32_t ix; - int n, sign, e0; - - ix = u.i & 0x7fffffff; - /* 25+53 bit pi is good enough for medium size */ - if (ix < 0x4dc90fdb) { /* |x| ~< 2^28*(pi/2), medium size */ - /* Use a specialized rint() to get fn. Assume round-to-nearest. */ - fn = (double_t)x*invpio2 + toint - toint; - n = (int32_t)fn; - *y = x - fn*pio2_1 - fn*pio2_1t; - return n; - } - if(ix>=0x7f800000) { /* x is inf or NaN */ - *y = x-x; - return 0; - } - /* scale x into [2^23, 2^24-1] */ - sign = u.i>>31; - e0 = (ix>>23) - (0x7f+23); /* e0 = ilogb(|x|)-23, positive */ - u.i = ix - (e0<<23); - tx[0] = u.f; - n = __rem_pio2_large(tx,ty,e0,1,0); - if (sign) { - *y = -ty[0]; - return -n; - } - *y = ty[0]; - return n; -} diff --git a/waterbox/libc/functions/math/__rem_pio2l.c b/waterbox/libc/functions/math/__rem_pio2l.c deleted file mode 100644 index 77255bd80a..0000000000 --- a/waterbox/libc/functions/math/__rem_pio2l.c +++ /dev/null @@ -1,141 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/ld80/e_rem_pio2.c */ -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * Copyright (c) 2008 Steven G. Kargl, David Schultz, Bruce D. Evans. - * - * Developed at SunSoft, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - * - * Optimized by Bruce D. Evans. - */ -#include "libm.h" -#if (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384 -/* ld80 and ld128 version of __rem_pio2(x,y) - * - * return the remainder of x rem pi/2 in y[0]+y[1] - * use __rem_pio2_large() for large x - */ - -static const long double toint = 1.5/LDBL_EPSILON; - -#if LDBL_MANT_DIG == 64 -/* u ~< 0x1p25*pi/2 */ -#define SMALL(u) (((u.i.se & 0x7fffU)<<16 | u.i.m>>48) < ((0x3fff + 25)<<16 | 0x921f>>1 | 0x8000)) -#define QUOBITS(x) ((uint32_t)(int32_t)x & 0x7fffffff) -#define ROUND1 22 -#define ROUND2 61 -#define NX 3 -#define NY 2 -/* - * invpio2: 64 bits of 2/pi - * pio2_1: first 39 bits of pi/2 - * pio2_1t: pi/2 - pio2_1 - * pio2_2: second 39 bits of pi/2 - * pio2_2t: pi/2 - (pio2_1+pio2_2) - * pio2_3: third 39 bits of pi/2 - * pio2_3t: pi/2 - (pio2_1+pio2_2+pio2_3) - */ -static const double -pio2_1 = 1.57079632679597125389e+00, /* 0x3FF921FB, 0x54444000 */ -pio2_2 = -1.07463465549783099519e-12, /* -0x12e7b967674000.0p-92 */ -pio2_3 = 6.36831716351370313614e-25; /* 0x18a2e037074000.0p-133 */ -static const long double -invpio2 = 6.36619772367581343076e-01L, /* 0xa2f9836e4e44152a.0p-64 */ -pio2_1t = -1.07463465549719416346e-12L, /* -0x973dcb3b399d747f.0p-103 */ -pio2_2t = 6.36831716351095013979e-25L, /* 0xc51701b839a25205.0p-144 */ -pio2_3t = -2.75299651904407171810e-37L; /* -0xbb5bf6c7ddd660ce.0p-185 */ -#elif LDBL_MANT_DIG == 113 -/* u ~< 0x1p45*pi/2 */ -#define SMALL(u) (((u.i.se & 0x7fffU)<<16 | u.i.top) < ((0x3fff + 45)<<16 | 0x921f)) -#define QUOBITS(x) ((uint32_t)(int64_t)x & 0x7fffffff) -#define ROUND1 51 -#define ROUND2 119 -#define NX 5 -#define NY 3 -static const long double -invpio2 = 6.3661977236758134307553505349005747e-01L, /* 0x145f306dc9c882a53f84eafa3ea6a.0p-113 */ -pio2_1 = 1.5707963267948966192292994253909555e+00L, /* 0x1921fb54442d18469800000000000.0p-112 */ -pio2_1t = 2.0222662487959507323996846200947577e-21L, /* 0x13198a2e03707344a4093822299f3.0p-181 */ -pio2_2 = 2.0222662487959507323994779168837751e-21L, /* 0x13198a2e03707344a400000000000.0p-181 */ -pio2_2t = 2.0670321098263988236496903051604844e-43L, /* 0x127044533e63a0105df531d89cd91.0p-254 */ -pio2_3 = 2.0670321098263988236499468110329591e-43L, /* 0x127044533e63a0105e00000000000.0p-254 */ -pio2_3t = -2.5650587247459238361625433492959285e-65L; /* -0x159c4ec64ddaeb5f78671cbfb2210.0p-327 */ -#endif - -int __rem_pio2l(long double x, long double *y) -{ - union ldshape u,uz; - long double z,w,t,r,fn; - double tx[NX],ty[NY]; - int ex,ey,n,i; - - u.f = x; - ex = u.i.se & 0x7fff; - if (SMALL(u)) { - /* rint(x/(pi/2)), Assume round-to-nearest. */ - fn = x*invpio2 + toint - toint; - n = QUOBITS(fn); - r = x-fn*pio2_1; - w = fn*pio2_1t; /* 1st round good to 102/180 bits (ld80/ld128) */ - y[0] = r-w; - u.f = y[0]; - ey = u.i.se & 0x7fff; - if (ex - ey > ROUND1) { /* 2nd iteration needed, good to 141/248 (ld80/ld128) */ - t = r; - w = fn*pio2_2; - r = t-w; - w = fn*pio2_2t-((t-r)-w); - y[0] = r-w; - u.f = y[0]; - ey = u.i.se & 0x7fff; - if (ex - ey > ROUND2) { /* 3rd iteration, good to 180/316 bits */ - t = r; /* will cover all possible cases (not verified for ld128) */ - w = fn*pio2_3; - r = t-w; - w = fn*pio2_3t-((t-r)-w); - y[0] = r-w; - } - } - y[1] = (r - y[0]) - w; - return n; - } - /* - * all other (large) arguments - */ - if (ex == 0x7fff) { /* x is inf or NaN */ - y[0] = y[1] = x - x; - return 0; - } - /* set z = scalbn(|x|,-ilogb(x)+23) */ - uz.f = x; - uz.i.se = 0x3fff + 23; - z = uz.f; - for (i=0; i < NX - 1; i++) { - tx[i] = (double)(int32_t)z; - z = (z-tx[i])*0x1p24; - } - tx[i] = z; - while (tx[i] == 0) - i--; - n = __rem_pio2_large(tx, ty, ex-0x3fff-23, i+1, NY); - w = ty[1]; - if (NY == 3) - w += ty[2]; - r = ty[0] + w; - /* TODO: for ld128 this does not follow the recommendation of the - comments of __rem_pio2_large which seem wrong if |ty[0]| > |ty[1]+ty[2]| */ - w -= r - ty[0]; - if (u.i.se >> 15) { - y[0] = -r; - y[1] = -w; - return -n; - } - y[0] = r; - y[1] = w; - return n; -} -#endif diff --git a/waterbox/libc/functions/math/__signbit.c b/waterbox/libc/functions/math/__signbit.c deleted file mode 100644 index e700b6b75f..0000000000 --- a/waterbox/libc/functions/math/__signbit.c +++ /dev/null @@ -1,13 +0,0 @@ -#include "libm.h" - -// FIXME: macro in math.h -int __signbit(double x) -{ - union { - double d; - uint64_t i; - } y = { x }; - return y.i>>63; -} - - diff --git a/waterbox/libc/functions/math/__signbitf.c b/waterbox/libc/functions/math/__signbitf.c deleted file mode 100644 index 40ad3cfd0c..0000000000 --- a/waterbox/libc/functions/math/__signbitf.c +++ /dev/null @@ -1,11 +0,0 @@ -#include "libm.h" - -// FIXME: macro in math.h -int __signbitf(float x) -{ - union { - float f; - uint32_t i; - } y = { x }; - return y.i>>31; -} diff --git a/waterbox/libc/functions/math/__signbitl.c b/waterbox/libc/functions/math/__signbitl.c deleted file mode 100644 index 63b3dc5a08..0000000000 --- a/waterbox/libc/functions/math/__signbitl.c +++ /dev/null @@ -1,14 +0,0 @@ -#include "libm.h" - -#if (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384 -int __signbitl(long double x) -{ - union ldshape u = {x}; - return u.i.se >> 15; -} -#elif LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -int __signbitl(long double x) -{ - return __signbit(x); -} -#endif diff --git a/waterbox/libc/functions/math/__sin.c b/waterbox/libc/functions/math/__sin.c deleted file mode 100644 index 4030949664..0000000000 --- a/waterbox/libc/functions/math/__sin.c +++ /dev/null @@ -1,64 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/k_sin.c */ -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * - * Developed at SunSoft, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ -/* __sin( x, y, iy) - * kernel sin function on ~[-pi/4, pi/4] (except on -0), pi/4 ~ 0.7854 - * Input x is assumed to be bounded by ~pi/4 in magnitude. - * Input y is the tail of x. - * Input iy indicates whether y is 0. (if iy=0, y assume to be 0). - * - * Algorithm - * 1. Since sin(-x) = -sin(x), we need only to consider positive x. - * 2. Callers must return sin(-0) = -0 without calling here since our - * odd polynomial is not evaluated in a way that preserves -0. - * Callers may do the optimization sin(x) ~ x for tiny x. - * 3. sin(x) is approximated by a polynomial of degree 13 on - * [0,pi/4] - * 3 13 - * sin(x) ~ x + S1*x + ... + S6*x - * where - * - * |sin(x) 2 4 6 8 10 12 | -58 - * |----- - (1+S1*x +S2*x +S3*x +S4*x +S5*x +S6*x )| <= 2 - * | x | - * - * 4. sin(x+y) = sin(x) + sin'(x')*y - * ~ sin(x) + (1-x*x/2)*y - * For better accuracy, let - * 3 2 2 2 2 - * r = x *(S2+x *(S3+x *(S4+x *(S5+x *S6)))) - * then 3 2 - * sin(x) = x + (S1*x + (x *(r-y/2)+y)) - */ - -#include "libm.h" - -static const double -S1 = -1.66666666666666324348e-01, /* 0xBFC55555, 0x55555549 */ -S2 = 8.33333333332248946124e-03, /* 0x3F811111, 0x1110F8A6 */ -S3 = -1.98412698298579493134e-04, /* 0xBF2A01A0, 0x19C161D5 */ -S4 = 2.75573137070700676789e-06, /* 0x3EC71DE3, 0x57B1FE7D */ -S5 = -2.50507602534068634195e-08, /* 0xBE5AE5E6, 0x8A2B9CEB */ -S6 = 1.58969099521155010221e-10; /* 0x3DE5D93A, 0x5ACFD57C */ - -double __sin(double x, double y, int iy) -{ - double_t z,r,v,w; - - z = x*x; - w = z*z; - r = S2 + z*(S3 + z*S4) + z*w*(S5 + z*S6); - v = z*x; - if (iy == 0) - return x + v*(S1 + z*r); - else - return x - ((z*(0.5*y - v*r) - y) - v*S1); -} diff --git a/waterbox/libc/functions/math/__sindf.c b/waterbox/libc/functions/math/__sindf.c deleted file mode 100644 index 8fec2a3f66..0000000000 --- a/waterbox/libc/functions/math/__sindf.c +++ /dev/null @@ -1,36 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/k_sinf.c */ -/* - * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. - * Optimized by Bruce D. Evans. - */ -/* - * ==================================================== - * 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 "libm.h" - -/* |sin(x)/x - s(x)| < 2**-37.5 (~[-4.89e-12, 4.824e-12]). */ -static const double -S1 = -0x15555554cbac77.0p-55, /* -0.166666666416265235595 */ -S2 = 0x111110896efbb2.0p-59, /* 0.0083333293858894631756 */ -S3 = -0x1a00f9e2cae774.0p-65, /* -0.000198393348360966317347 */ -S4 = 0x16cd878c3b46a7.0p-71; /* 0.0000027183114939898219064 */ - -float __sindf(double x) -{ - double_t r, s, w, z; - - /* Try to optimize for parallel evaluation as in __tandf.c. */ - z = x*x; - w = z*z; - r = S3 + z*S4; - s = z*x; - return (x + s*(S1 + z*S2)) + s*w*r; -} diff --git a/waterbox/libc/functions/math/__sinl.c b/waterbox/libc/functions/math/__sinl.c deleted file mode 100644 index 2525bbe866..0000000000 --- a/waterbox/libc/functions/math/__sinl.c +++ /dev/null @@ -1,78 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/ld80/k_sinl.c */ -/* origin: FreeBSD /usr/src/lib/msun/ld128/k_sinl.c */ -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * Copyright (c) 2008 Steven G. Kargl, David Schultz, Bruce D. Evans. - * - * Developed at SunSoft, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ - -#include "libm.h" - -#if (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384 -#if LDBL_MANT_DIG == 64 -/* - * ld80 version of __sin.c. See __sin.c for most comments. - */ -/* - * Domain [-0.7854, 0.7854], range ~[-1.89e-22, 1.915e-22] - * |sin(x)/x - s(x)| < 2**-72.1 - * - * See __cosl.c for more details about the polynomial. - */ -static const long double -S1 = -0.166666666666666666671L; /* -0xaaaaaaaaaaaaaaab.0p-66 */ -static const double -S2 = 0.0083333333333333332, /* 0x11111111111111.0p-59 */ -S3 = -0.00019841269841269427, /* -0x1a01a01a019f81.0p-65 */ -S4 = 0.0000027557319223597490, /* 0x171de3a55560f7.0p-71 */ -S5 = -0.000000025052108218074604, /* -0x1ae64564f16cad.0p-78 */ -S6 = 1.6059006598854211e-10, /* 0x161242b90243b5.0p-85 */ -S7 = -7.6429779983024564e-13, /* -0x1ae42ebd1b2e00.0p-93 */ -S8 = 2.6174587166648325e-15; /* 0x179372ea0b3f64.0p-101 */ -#define POLY(z) (S2+z*(S3+z*(S4+z*(S5+z*(S6+z*(S7+z*S8)))))) -#elif LDBL_MANT_DIG == 113 -/* - * ld128 version of __sin.c. See __sin.c for most comments. - */ -/* - * Domain [-0.7854, 0.7854], range ~[-1.53e-37, 1.659e-37] - * |sin(x)/x - s(x)| < 2**-122.1 - * - * See __cosl.c for more details about the polynomial. - */ -static const long double -S1 = -0.16666666666666666666666666666666666606732416116558L, -S2 = 0.0083333333333333333333333333333331135404851288270047L, -S3 = -0.00019841269841269841269841269839935785325638310428717L, -S4 = 0.27557319223985890652557316053039946268333231205686e-5L, -S5 = -0.25052108385441718775048214826384312253862930064745e-7L, -S6 = 0.16059043836821614596571832194524392581082444805729e-9L, -S7 = -0.76471637318198151807063387954939213287488216303768e-12L, -S8 = 0.28114572543451292625024967174638477283187397621303e-14L; -static const double -S9 = -0.82206352458348947812512122163446202498005154296863e-17, -S10 = 0.19572940011906109418080609928334380560135358385256e-19, -S11 = -0.38680813379701966970673724299207480965452616911420e-22, -S12 = 0.64038150078671872796678569586315881020659912139412e-25; -#define POLY(z) (S2+z*(S3+z*(S4+z*(S5+z*(S6+z*(S7+z*(S8+ \ - z*(S9+z*(S10+z*(S11+z*S12)))))))))) -#endif - -long double __sinl(long double x, long double y, int iy) -{ - long double z,r,v; - - z = x*x; - v = z*x; - r = POLY(z); - if (iy == 0) - return x+v*(S1+z*r); - return x-((z*(0.5*y-v*r)-y)-v*S1); -} -#endif diff --git a/waterbox/libc/functions/math/__tan.c b/waterbox/libc/functions/math/__tan.c deleted file mode 100644 index 8019844d3b..0000000000 --- a/waterbox/libc/functions/math/__tan.c +++ /dev/null @@ -1,110 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/k_tan.c */ -/* - * ==================================================== - * Copyright 2004 Sun Microsystems, Inc. All Rights Reserved. - * - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ -/* __tan( x, y, k ) - * kernel tan function on ~[-pi/4, pi/4] (except on -0), pi/4 ~ 0.7854 - * Input x is assumed to be bounded by ~pi/4 in magnitude. - * Input y is the tail of x. - * Input odd indicates whether tan (if odd = 0) or -1/tan (if odd = 1) is returned. - * - * Algorithm - * 1. Since tan(-x) = -tan(x), we need only to consider positive x. - * 2. Callers must return tan(-0) = -0 without calling here since our - * odd polynomial is not evaluated in a way that preserves -0. - * Callers may do the optimization tan(x) ~ x for tiny x. - * 3. tan(x) is approximated by a odd polynomial of degree 27 on - * [0,0.67434] - * 3 27 - * tan(x) ~ x + T1*x + ... + T13*x - * where - * - * |tan(x) 2 4 26 | -59.2 - * |----- - (1+T1*x +T2*x +.... +T13*x )| <= 2 - * | x | - * - * 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 - * 3 2 2 2 2 - * r = x *(T2+x *(T3+x *(...+x *(T12+x *T13)))) - * then - * 3 2 - * tan(x+y) = x + (T1*x + (x *(r+y)+y)) - * - * 4. For x in [0.67434,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))) - */ - -#include "libm.h" - -static const double T[] = { - 3.33333333333334091986e-01, /* 3FD55555, 55555563 */ - 1.33333333333201242699e-01, /* 3FC11111, 1110FE7A */ - 5.39682539762260521377e-02, /* 3FABA1BA, 1BB341FE */ - 2.18694882948595424599e-02, /* 3F9664F4, 8406D637 */ - 8.86323982359930005737e-03, /* 3F8226E3, E96E8493 */ - 3.59207910759131235356e-03, /* 3F6D6D22, C9560328 */ - 1.45620945432529025516e-03, /* 3F57DBC8, FEE08315 */ - 5.88041240820264096874e-04, /* 3F4344D8, F2F26501 */ - 2.46463134818469906812e-04, /* 3F3026F7, 1A8D1068 */ - 7.81794442939557092300e-05, /* 3F147E88, A03792A6 */ - 7.14072491382608190305e-05, /* 3F12B80F, 32F0A7E9 */ - -1.85586374855275456654e-05, /* BEF375CB, DB605373 */ - 2.59073051863633712884e-05, /* 3EFB2A70, 74BF7AD4 */ -}, -pio4 = 7.85398163397448278999e-01, /* 3FE921FB, 54442D18 */ -pio4lo = 3.06161699786838301793e-17; /* 3C81A626, 33145C07 */ - -double __tan(double x, double y, int odd) -{ - double_t z, r, v, w, s, a; - double w0, a0; - uint32_t hx; - int big, sign; - - GET_HIGH_WORD(hx,x); - big = (hx&0x7fffffff) >= 0x3FE59428; /* |x| >= 0.6744 */ - if (big) { - sign = hx>>31; - if (sign) { - x = -x; - y = -y; - } - x = (pio4 - x) + (pio4lo - y); - y = 0.0; - } - z = x * x; - w = z * z; - /* - * Break x^5*(T[1]+x^2*T[2]+...) into - * x^5(T[1]+x^4*T[3]+...+x^20*T[11]) + - * x^5(x^2*(T[2]+x^4*T[4]+...+x^22*[T12])) - */ - r = T[1] + w*(T[3] + w*(T[5] + w*(T[7] + w*(T[9] + w*T[11])))); - v = z*(T[2] + w*(T[4] + w*(T[6] + w*(T[8] + w*(T[10] + w*T[12]))))); - s = z * x; - r = y + z*(s*(r + v) + y) + s*T[0]; - w = x + r; - if (big) { - s = 1 - 2*odd; - v = s - 2.0 * (x + (r - w*w/(w + s))); - return sign ? -v : v; - } - if (!odd) - return w; - /* -1.0/(x+r) has up to 2ulp error, so compute it accurately */ - w0 = w; - SET_LOW_WORD(w0, 0); - v = r - (w0 - x); /* w0+v = r+x */ - a0 = a = -1.0 / w; - SET_LOW_WORD(a0, 0); - return a0 + a*(1.0 + a0*w0 + a0*v); -} diff --git a/waterbox/libc/functions/math/__tandf.c b/waterbox/libc/functions/math/__tandf.c deleted file mode 100644 index 25047eeee9..0000000000 --- a/waterbox/libc/functions/math/__tandf.c +++ /dev/null @@ -1,54 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/k_tanf.c */ -/* - * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. - * Optimized by Bruce D. Evans. - */ -/* - * ==================================================== - * Copyright 2004 Sun Microsystems, Inc. All Rights Reserved. - * - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ - -#include "libm.h" - -/* |tan(x)/x - t(x)| < 2**-25.5 (~[-2e-08, 2e-08]). */ -static const double T[] = { - 0x15554d3418c99f.0p-54, /* 0.333331395030791399758 */ - 0x1112fd38999f72.0p-55, /* 0.133392002712976742718 */ - 0x1b54c91d865afe.0p-57, /* 0.0533812378445670393523 */ - 0x191df3908c33ce.0p-58, /* 0.0245283181166547278873 */ - 0x185dadfcecf44e.0p-61, /* 0.00297435743359967304927 */ - 0x1362b9bf971bcd.0p-59, /* 0.00946564784943673166728 */ -}; - -float __tandf(double x, int odd) -{ - double_t z,r,w,s,t,u; - - z = x*x; - /* - * Split up the polynomial into small independent terms to give - * opportunities for parallel evaluation. The chosen splitting is - * micro-optimized for Athlons (XP, X64). It costs 2 multiplications - * relative to Horner's method on sequential machines. - * - * We add the small terms from lowest degree up for efficiency on - * non-sequential machines (the lowest degree terms tend to be ready - * earlier). Apart from this, we don't care about order of - * operations, and don't need to to care since we have precision to - * spare. However, the chosen splitting is good for accuracy too, - * and would give results as accurate as Horner's method if the - * small terms were added from highest degree down. - */ - r = T[4] + z*T[5]; - t = T[2] + z*T[3]; - w = z*z; - s = z*x; - u = T[0] + z*T[1]; - r = (x + s*u) + (s*w)*(t + w*r); - return odd ? -1.0/r : r; -} diff --git a/waterbox/libc/functions/math/__tanl.c b/waterbox/libc/functions/math/__tanl.c deleted file mode 100644 index 54abc3daf1..0000000000 --- a/waterbox/libc/functions/math/__tanl.c +++ /dev/null @@ -1,143 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/ld80/k_tanl.c */ -/* origin: FreeBSD /usr/src/lib/msun/ld128/k_tanl.c */ -/* - * ==================================================== - * Copyright 2004 Sun Microsystems, Inc. All Rights Reserved. - * Copyright (c) 2008 Steven G. Kargl, David Schultz, Bruce D. Evans. - * - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ - -#include "libm.h" - -#if (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384 -#if LDBL_MANT_DIG == 64 -/* - * ld80 version of __tan.c. See __tan.c for most comments. - */ -/* - * Domain [-0.67434, 0.67434], range ~[-2.25e-22, 1.921e-22] - * |tan(x)/x - t(x)| < 2**-71.9 - * - * See __cosl.c for more details about the polynomial. - */ -static const long double -T3 = 0.333333333333333333180L, /* 0xaaaaaaaaaaaaaaa5.0p-65 */ -T5 = 0.133333333333333372290L, /* 0x88888888888893c3.0p-66 */ -T7 = 0.0539682539682504975744L, /* 0xdd0dd0dd0dc13ba2.0p-68 */ -pio4 = 0.785398163397448309628L, /* 0xc90fdaa22168c235.0p-64 */ -pio4lo = -1.25413940316708300586e-20L; /* -0xece675d1fc8f8cbb.0p-130 */ -static const double -T9 = 0.021869488536312216, /* 0x1664f4882cc1c2.0p-58 */ -T11 = 0.0088632355256619590, /* 0x1226e355c17612.0p-59 */ -T13 = 0.0035921281113786528, /* 0x1d6d3d185d7ff8.0p-61 */ -T15 = 0.0014558334756312418, /* 0x17da354aa3f96b.0p-62 */ -T17 = 0.00059003538700862256, /* 0x13559358685b83.0p-63 */ -T19 = 0.00023907843576635544, /* 0x1f56242026b5be.0p-65 */ -T21 = 0.000097154625656538905, /* 0x1977efc26806f4.0p-66 */ -T23 = 0.000038440165747303162, /* 0x14275a09b3ceac.0p-67 */ -T25 = 0.000018082171885432524, /* 0x12f5e563e5487e.0p-68 */ -T27 = 0.0000024196006108814377, /* 0x144c0d80cc6896.0p-71 */ -T29 = 0.0000078293456938132840, /* 0x106b59141a6cb3.0p-69 */ -T31 = -0.0000032609076735050182, /* -0x1b5abef3ba4b59.0p-71 */ -T33 = 0.0000023261313142559411; /* 0x13835436c0c87f.0p-71 */ -#define RPOLY(w) (T5 + w * (T9 + w * (T13 + w * (T17 + w * (T21 + \ - w * (T25 + w * (T29 + w * T33))))))) -#define VPOLY(w) (T7 + w * (T11 + w * (T15 + w * (T19 + w * (T23 + \ - w * (T27 + w * T31)))))) -#elif LDBL_MANT_DIG == 113 -/* - * ld128 version of __tan.c. See __tan.c for most comments. - */ -/* - * Domain [-0.67434, 0.67434], range ~[-3.37e-36, 1.982e-37] - * |tan(x)/x - t(x)| < 2**-117.8 (XXX should be ~1e-37) - * - * See __cosl.c for more details about the polynomial. - */ -static const long double -T3 = 0x1.5555555555555555555555555553p-2L, -T5 = 0x1.1111111111111111111111111eb5p-3L, -T7 = 0x1.ba1ba1ba1ba1ba1ba1ba1b694cd6p-5L, -T9 = 0x1.664f4882c10f9f32d6bbe09d8bcdp-6L, -T11 = 0x1.226e355e6c23c8f5b4f5762322eep-7L, -T13 = 0x1.d6d3d0e157ddfb5fed8e84e27b37p-9L, -T15 = 0x1.7da36452b75e2b5fce9ee7c2c92ep-10L, -T17 = 0x1.355824803674477dfcf726649efep-11L, -T19 = 0x1.f57d7734d1656e0aceb716f614c2p-13L, -T21 = 0x1.967e18afcb180ed942dfdc518d6cp-14L, -T23 = 0x1.497d8eea21e95bc7e2aa79b9f2cdp-15L, -T25 = 0x1.0b132d39f055c81be49eff7afd50p-16L, -T27 = 0x1.b0f72d33eff7bfa2fbc1059d90b6p-18L, -T29 = 0x1.5ef2daf21d1113df38d0fbc00267p-19L, -T31 = 0x1.1c77d6eac0234988cdaa04c96626p-20L, -T33 = 0x1.cd2a5a292b180e0bdd701057dfe3p-22L, -T35 = 0x1.75c7357d0298c01a31d0a6f7d518p-23L, -T37 = 0x1.2f3190f4718a9a520f98f50081fcp-24L, -pio4 = 0x1.921fb54442d18469898cc51701b8p-1L, -pio4lo = 0x1.cd129024e088a67cc74020bbea60p-116L; -static const double -T39 = 0.000000028443389121318352, /* 0x1e8a7592977938.0p-78 */ -T41 = 0.000000011981013102001973, /* 0x19baa1b1223219.0p-79 */ -T43 = 0.0000000038303578044958070, /* 0x107385dfb24529.0p-80 */ -T45 = 0.0000000034664378216909893, /* 0x1dc6c702a05262.0p-81 */ -T47 = -0.0000000015090641701997785, /* -0x19ecef3569ebb6.0p-82 */ -T49 = 0.0000000029449552300483952, /* 0x194c0668da786a.0p-81 */ -T51 = -0.0000000022006995706097711, /* -0x12e763b8845268.0p-81 */ -T53 = 0.0000000015468200913196612, /* 0x1a92fc98c29554.0p-82 */ -T55 = -0.00000000061311613386849674, /* -0x151106cbc779a9.0p-83 */ -T57 = 1.4912469681508012e-10; /* 0x147edbdba6f43a.0p-85 */ -#define RPOLY(w) (T5 + w * (T9 + w * (T13 + w * (T17 + w * (T21 + \ - w * (T25 + w * (T29 + w * (T33 + w * (T37 + w * (T41 + \ - w * (T45 + w * (T49 + w * (T53 + w * T57))))))))))))) -#define VPOLY(w) (T7 + w * (T11 + w * (T15 + w * (T19 + w * (T23 + \ - w * (T27 + w * (T31 + w * (T35 + w * (T39 + w * (T43 + \ - w * (T47 + w * (T51 + w * T55)))))))))))) -#endif - -long double __tanl(long double x, long double y, int odd) { - long double z, r, v, w, s, a, t; - int big, sign; - - big = fabsl(x) >= 0.67434; - if (big) { - sign = 0; - if (x < 0) { - sign = 1; - x = -x; - y = -y; - } - x = (pio4 - x) + (pio4lo - y); - y = 0.0; - } - z = x * x; - w = z * z; - r = RPOLY(w); - v = z * VPOLY(w); - s = z * x; - r = y + z * (s * (r + v) + y) + T3 * s; - w = x + r; - if (big) { - s = 1 - 2*odd; - v = s - 2.0 * (x + (r - w * w / (w + s))); - return sign ? -v : v; - } - if (!odd) - return w; - /* - * if allow error up to 2 ulp, simply return - * -1.0 / (x+r) here - */ - /* compute -1.0 / (x+r) accurately */ - z = w; - z = z + 0x1p32 - 0x1p32; - v = r - (z - x); /* z+v = r+x */ - t = a = -1.0 / w; /* a = -1.0/w */ - t = t + 0x1p32 - 0x1p32; - s = 1.0 + t * z; - return t + a * (s + t * v); -} -#endif diff --git a/waterbox/libc/functions/math/acos.c b/waterbox/libc/functions/math/acos.c deleted file mode 100644 index ea9c87bf08..0000000000 --- a/waterbox/libc/functions/math/acos.c +++ /dev/null @@ -1,101 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/e_acos.c */ -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * - * Developed at SunSoft, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ -/* acos(x) - * Method : - * acos(x) = pi/2 - asin(x) - * acos(-x) = pi/2 + asin(x) - * For |x|<=0.5 - * acos(x) = pi/2 - (x + x*x^2*R(x^2)) (see asin.c) - * For x>0.5 - * acos(x) = pi/2 - (pi/2 - 2asin(sqrt((1-x)/2))) - * = 2asin(sqrt((1-x)/2)) - * = 2s + 2s*z*R(z) ...z=(1-x)/2, s=sqrt(z) - * = 2f + (2c + 2s*z*R(z)) - * where f=hi part of s, and c = (z-f*f)/(s+f) is the correction term - * for f so that f+c ~ sqrt(z). - * For x<-0.5 - * acos(x) = pi - 2asin(sqrt((1-|x|)/2)) - * = pi - 0.5*(s+s*z*R(z)), where z=(1-|x|)/2,s=sqrt(z) - * - * Special cases: - * if x is NaN, return x itself; - * if |x|>1, return NaN with invalid signal. - * - * Function needed: sqrt - */ - -#include "libm.h" - -static const double -pio2_hi = 1.57079632679489655800e+00, /* 0x3FF921FB, 0x54442D18 */ -pio2_lo = 6.12323399573676603587e-17, /* 0x3C91A626, 0x33145C07 */ -pS0 = 1.66666666666666657415e-01, /* 0x3FC55555, 0x55555555 */ -pS1 = -3.25565818622400915405e-01, /* 0xBFD4D612, 0x03EB6F7D */ -pS2 = 2.01212532134862925881e-01, /* 0x3FC9C155, 0x0E884455 */ -pS3 = -4.00555345006794114027e-02, /* 0xBFA48228, 0xB5688F3B */ -pS4 = 7.91534994289814532176e-04, /* 0x3F49EFE0, 0x7501B288 */ -pS5 = 3.47933107596021167570e-05, /* 0x3F023DE1, 0x0DFDF709 */ -qS1 = -2.40339491173441421878e+00, /* 0xC0033A27, 0x1C8A2D4B */ -qS2 = 2.02094576023350569471e+00, /* 0x40002AE5, 0x9C598AC8 */ -qS3 = -6.88283971605453293030e-01, /* 0xBFE6066C, 0x1B8D0159 */ -qS4 = 7.70381505559019352791e-02; /* 0x3FB3B8C5, 0xB12E9282 */ - -static double R(double z) -{ - double_t p, q; - p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*pS5))))); - q = 1.0+z*(qS1+z*(qS2+z*(qS3+z*qS4))); - return p/q; -} - -double acos(double x) -{ - double z,w,s,c,df; - uint32_t hx,ix; - - GET_HIGH_WORD(hx, x); - ix = hx & 0x7fffffff; - /* |x| >= 1 or nan */ - if (ix >= 0x3ff00000) { - uint32_t lx; - - GET_LOW_WORD(lx,x); - if ((ix-0x3ff00000 | lx) == 0) { - /* acos(1)=0, acos(-1)=pi */ - if (hx >> 31) - return 2*pio2_hi + 0x1p-120f; - return 0; - } - return 0/(x-x); - } - /* |x| < 0.5 */ - if (ix < 0x3fe00000) { - if (ix <= 0x3c600000) /* |x| < 2**-57 */ - return pio2_hi + 0x1p-120f; - return pio2_hi - (x - (pio2_lo-x*R(x*x))); - } - /* x < -0.5 */ - if (hx >> 31) { - z = (1.0+x)*0.5; - s = sqrt(z); - w = R(z)*s-pio2_lo; - return 2*(pio2_hi - (s+w)); - } - /* x > 0.5 */ - z = (1.0-x)*0.5; - s = sqrt(z); - df = s; - SET_LOW_WORD(df,0); - c = (z-df*df)/(s+df); - w = R(z)*s+c; - return 2*(df+w); -} diff --git a/waterbox/libc/functions/math/acosf.c b/waterbox/libc/functions/math/acosf.c deleted file mode 100644 index 8ee1a71d0c..0000000000 --- a/waterbox/libc/functions/math/acosf.c +++ /dev/null @@ -1,71 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/e_acosf.c */ -/* - * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. - */ -/* - * ==================================================== - * 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 "libm.h" - -static const float -pio2_hi = 1.5707962513e+00, /* 0x3fc90fda */ -pio2_lo = 7.5497894159e-08, /* 0x33a22168 */ -pS0 = 1.6666586697e-01, -pS1 = -4.2743422091e-02, -pS2 = -8.6563630030e-03, -qS1 = -7.0662963390e-01; - -static float R(float z) -{ - float_t p, q; - p = z*(pS0+z*(pS1+z*pS2)); - q = 1.0f+z*qS1; - return p/q; -} - -float acosf(float x) -{ - float z,w,s,c,df; - uint32_t hx,ix; - - GET_FLOAT_WORD(hx, x); - ix = hx & 0x7fffffff; - /* |x| >= 1 or nan */ - if (ix >= 0x3f800000) { - if (ix == 0x3f800000) { - if (hx >> 31) - return 2*pio2_hi + 0x1p-120f; - return 0; - } - return 0/(x-x); - } - /* |x| < 0.5 */ - if (ix < 0x3f000000) { - if (ix <= 0x32800000) /* |x| < 2**-26 */ - return pio2_hi + 0x1p-120f; - return pio2_hi - (x - (pio2_lo-x*R(x*x))); - } - /* x < -0.5 */ - if (hx >> 31) { - z = (1+x)*0.5f; - s = sqrtf(z); - w = R(z)*s-pio2_lo; - return 2*(pio2_hi - (s+w)); - } - /* x > 0.5 */ - z = (1-x)*0.5f; - s = sqrtf(z); - GET_FLOAT_WORD(hx,s); - SET_FLOAT_WORD(df,hx&0xfffff000); - c = (z-df*df)/(s+df); - w = R(z)*s+c; - return 2*(df+w); -} diff --git a/waterbox/libc/functions/math/acosh.c b/waterbox/libc/functions/math/acosh.c deleted file mode 100644 index badbf9081e..0000000000 --- a/waterbox/libc/functions/math/acosh.c +++ /dev/null @@ -1,24 +0,0 @@ -#include "libm.h" - -#if FLT_EVAL_METHOD==2 -#undef sqrt -#define sqrt sqrtl -#endif - -/* acosh(x) = log(x + sqrt(x*x-1)) */ -double acosh(double x) -{ - union {double f; uint64_t i;} u = {.f = x}; - unsigned e = u.i >> 52 & 0x7ff; - - /* x < 1 domain error is handled in the called functions */ - - if (e < 0x3ff + 1) - /* |x| < 2, up to 2ulp error in [1,1.125] */ - return log1p(x-1 + sqrt((x-1)*(x-1)+2*(x-1))); - if (e < 0x3ff + 26) - /* |x| < 0x1p26 */ - return log(2*x - 1/(x+sqrt(x*x-1))); - /* |x| >= 0x1p26 or nan */ - return log(x) + 0.693147180559945309417232121458176568; -} diff --git a/waterbox/libc/functions/math/acoshf.c b/waterbox/libc/functions/math/acoshf.c deleted file mode 100644 index 8a4ec4d57e..0000000000 --- a/waterbox/libc/functions/math/acoshf.c +++ /dev/null @@ -1,26 +0,0 @@ -#include "libm.h" - -#if FLT_EVAL_METHOD==2 -#undef sqrtf -#define sqrtf sqrtl -#elif FLT_EVAL_METHOD==1 -#undef sqrtf -#define sqrtf sqrt -#endif - -/* acosh(x) = log(x + sqrt(x*x-1)) */ -float acoshf(float x) -{ - union {float f; uint32_t i;} u = {x}; - uint32_t a = u.i & 0x7fffffff; - - if (a < 0x3f800000+(1<<23)) - /* |x| < 2, invalid if x < 1 or nan */ - /* up to 2ulp error in [1,1.125] */ - return log1pf(x-1 + sqrtf((x-1)*(x-1)+2*(x-1))); - if (a < 0x3f800000+(12<<23)) - /* |x| < 0x1p12 */ - return logf(2*x - 1/(x+sqrtf(x*x-1))); - /* x >= 0x1p12 */ - return logf(x) + 0.693147180559945309417232121458176568f; -} diff --git a/waterbox/libc/functions/math/acoshl.c b/waterbox/libc/functions/math/acoshl.c deleted file mode 100644 index 8d4b43f64c..0000000000 --- a/waterbox/libc/functions/math/acoshl.c +++ /dev/null @@ -1,29 +0,0 @@ -#include "libm.h" - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long double acoshl(long double x) -{ - return acosh(x); -} -#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384 -/* acosh(x) = log(x + sqrt(x*x-1)) */ -long double acoshl(long double x) -{ - union ldshape u = {x}; - int e = u.i.se & 0x7fff; - - if (e < 0x3fff + 1) - /* |x| < 2, invalid if x < 1 or nan */ - return log1pl(x-1 + sqrtl((x-1)*(x-1)+2*(x-1))); - if (e < 0x3fff + 32) - /* |x| < 0x1p32 */ - return logl(2*x - 1/(x+sqrtl(x*x-1))); - return logl(x) + 0.693147180559945309417232121458176568L; -} -#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384 -// TODO: broken implementation to make things compile -long double acoshl(long double x) -{ - return acosh(x); -} -#endif diff --git a/waterbox/libc/functions/math/acosl.c b/waterbox/libc/functions/math/acosl.c deleted file mode 100644 index c03bdf0235..0000000000 --- a/waterbox/libc/functions/math/acosl.c +++ /dev/null @@ -1,67 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/e_acosl.c */ -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * - * Developed at SunSoft, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ -/* - * See comments in acos.c. - * Converted to long double by David Schultz . - */ - -#include "libm.h" - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long double acosl(long double x) -{ - return acos(x); -} -#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384 -#include "__invtrigl.h" -#if LDBL_MANT_DIG == 64 -#define CLEARBOTTOM(u) (u.i.m &= -1ULL << 32) -#elif LDBL_MANT_DIG == 113 -#define CLEARBOTTOM(u) (u.i.lo = 0) -#endif - -long double acosl(long double x) -{ - union ldshape u = {x}; - long double z, s, c, f; - uint16_t e = u.i.se & 0x7fff; - - /* |x| >= 1 or nan */ - if (e >= 0x3fff) { - if (x == 1) - return 0; - if (x == -1) - return 2*pio2_hi + 0x1p-120f; - return 0/(x-x); - } - /* |x| < 0.5 */ - if (e < 0x3fff - 1) { - if (e < 0x3fff - LDBL_MANT_DIG - 1) - return pio2_hi + 0x1p-120f; - return pio2_hi - (__invtrigl_R(x*x)*x - pio2_lo + x); - } - /* x < -0.5 */ - if (u.i.se >> 15) { - z = (1 + x)*0.5; - s = sqrtl(z); - return 2*(pio2_hi - (__invtrigl_R(z)*s - pio2_lo + s)); - } - /* x > 0.5 */ - z = (1 - x)*0.5; - s = sqrtl(z); - u.f = s; - CLEARBOTTOM(u); - f = u.f; - c = (z - f*f)/(s + f); - return 2*(__invtrigl_R(z)*s + c + f); -} -#endif diff --git a/waterbox/libc/functions/math/asin.c b/waterbox/libc/functions/math/asin.c deleted file mode 100644 index c926b18855..0000000000 --- a/waterbox/libc/functions/math/asin.c +++ /dev/null @@ -1,107 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/e_asin.c */ -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * - * Developed at SunSoft, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ -/* 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) - * where - * R(x^2) is a rational approximation of (asin(x)-x)/x^3 - * and its remez error is bounded by - * |(asin(x)-x)/x^3 - R(x^2)| < 2^(-58.75) - * - * For x in [0.5,1] - * asin(x) = pi/2-2*asin(sqrt((1-x)/2)) - * Let y = (1-x), z = y/2, s := sqrt(z), and pio2_hi+pio2_lo=pi/2; - * then for x>0.98 - * asin(x) = pi/2 - 2*(s+s*z*R(z)) - * = pio2_hi - (2*(s+s*z*R(z)) - pio2_lo) - * For x<=0.98, let pio4_hi = pio2_hi/2, then - * f = hi part of s; - * c = sqrt(z) - f = (z-f*f)/(s+f) ...f+c=sqrt(z) - * and - * asin(x) = pi/2 - 2*(s+s*z*R(z)) - * = pio4_hi+(pio4-2s)-(2s*z*R(z)-pio2_lo) - * = pio4_hi+(pio4-2f)-(2s*z*R(z)-(pio2_lo+2c)) - * - * Special cases: - * if x is NaN, return x itself; - * if |x|>1, return NaN with invalid signal. - * - */ - -#include "libm.h" - -static const double -pio2_hi = 1.57079632679489655800e+00, /* 0x3FF921FB, 0x54442D18 */ -pio2_lo = 6.12323399573676603587e-17, /* 0x3C91A626, 0x33145C07 */ -/* coefficients for R(x^2) */ -pS0 = 1.66666666666666657415e-01, /* 0x3FC55555, 0x55555555 */ -pS1 = -3.25565818622400915405e-01, /* 0xBFD4D612, 0x03EB6F7D */ -pS2 = 2.01212532134862925881e-01, /* 0x3FC9C155, 0x0E884455 */ -pS3 = -4.00555345006794114027e-02, /* 0xBFA48228, 0xB5688F3B */ -pS4 = 7.91534994289814532176e-04, /* 0x3F49EFE0, 0x7501B288 */ -pS5 = 3.47933107596021167570e-05, /* 0x3F023DE1, 0x0DFDF709 */ -qS1 = -2.40339491173441421878e+00, /* 0xC0033A27, 0x1C8A2D4B */ -qS2 = 2.02094576023350569471e+00, /* 0x40002AE5, 0x9C598AC8 */ -qS3 = -6.88283971605453293030e-01, /* 0xBFE6066C, 0x1B8D0159 */ -qS4 = 7.70381505559019352791e-02; /* 0x3FB3B8C5, 0xB12E9282 */ - -static double R(double z) -{ - double_t p, q; - p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*pS5))))); - q = 1.0+z*(qS1+z*(qS2+z*(qS3+z*qS4))); - return p/q; -} - -double asin(double x) -{ - double z,r,s; - uint32_t hx,ix; - - GET_HIGH_WORD(hx, x); - ix = hx & 0x7fffffff; - /* |x| >= 1 or nan */ - if (ix >= 0x3ff00000) { - uint32_t lx; - GET_LOW_WORD(lx, x); - if ((ix-0x3ff00000 | lx) == 0) - /* asin(1) = +-pi/2 with inexact */ - return x*pio2_hi + 0x1p-120f; - return 0/(x-x); - } - /* |x| < 0.5 */ - if (ix < 0x3fe00000) { - /* if 0x1p-1022 <= |x| < 0x1p-26, avoid raising underflow */ - if (ix < 0x3e500000 && ix >= 0x00100000) - return x; - return x + x*R(x*x); - } - /* 1 > |x| >= 0.5 */ - z = (1 - fabs(x))*0.5; - s = sqrt(z); - r = R(z); - if (ix >= 0x3fef3333) { /* if |x| > 0.975 */ - x = pio2_hi-(2*(s+s*r)-pio2_lo); - } else { - double f,c; - /* f+c = sqrt(z) */ - f = s; - SET_LOW_WORD(f,0); - c = (z-f*f)/(s+f); - x = 0.5*pio2_hi - (2*s*r - (pio2_lo-2*c) - (0.5*pio2_hi-2*f)); - } - if (hx >> 31) - return -x; - return x; -} diff --git a/waterbox/libc/functions/math/asinf.c b/waterbox/libc/functions/math/asinf.c deleted file mode 100644 index bcd304a342..0000000000 --- a/waterbox/libc/functions/math/asinf.c +++ /dev/null @@ -1,61 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/e_asinf.c */ -/* - * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. - */ -/* - * ==================================================== - * 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 "libm.h" - -static const double -pio2 = 1.570796326794896558e+00; - -static const float -/* coefficients for R(x^2) */ -pS0 = 1.6666586697e-01, -pS1 = -4.2743422091e-02, -pS2 = -8.6563630030e-03, -qS1 = -7.0662963390e-01; - -static float R(float z) -{ - float_t p, q; - p = z*(pS0+z*(pS1+z*pS2)); - q = 1.0f+z*qS1; - return p/q; -} - -float asinf(float x) -{ - double s; - float z; - uint32_t hx,ix; - - GET_FLOAT_WORD(hx, x); - ix = hx & 0x7fffffff; - if (ix >= 0x3f800000) { /* |x| >= 1 */ - if (ix == 0x3f800000) /* |x| == 1 */ - return x*pio2 + 0x1p-120f; /* asin(+-1) = +-pi/2 with inexact */ - return 0/(x-x); /* asin(|x|>1) is NaN */ - } - if (ix < 0x3f000000) { /* |x| < 0.5 */ - /* if 0x1p-126 <= |x| < 0x1p-12, avoid raising underflow */ - if (ix < 0x39800000 && ix >= 0x00800000) - return x; - return x + x*R(x*x); - } - /* 1 > |x| >= 0.5 */ - z = (1 - fabsf(x))*0.5f; - s = sqrt(z); - x = pio2 - 2*(s+s*R(z)); - if (hx >> 31) - return -x; - return x; -} diff --git a/waterbox/libc/functions/math/asinh.c b/waterbox/libc/functions/math/asinh.c deleted file mode 100644 index 0829f228ef..0000000000 --- a/waterbox/libc/functions/math/asinh.c +++ /dev/null @@ -1,28 +0,0 @@ -#include "libm.h" - -/* asinh(x) = sign(x)*log(|x|+sqrt(x*x+1)) ~= x - x^3/6 + o(x^5) */ -double asinh(double x) -{ - union {double f; uint64_t i;} u = {.f = x}; - unsigned e = u.i >> 52 & 0x7ff; - unsigned s = u.i >> 63; - - /* |x| */ - u.i &= (uint64_t)-1/2; - x = u.f; - - if (e >= 0x3ff + 26) { - /* |x| >= 0x1p26 or inf or nan */ - x = log(x) + 0.693147180559945309417232121458176568; - } else if (e >= 0x3ff + 1) { - /* |x| >= 2 */ - x = log(2*x + 1/(sqrt(x*x+1)+x)); - } else if (e >= 0x3ff - 26) { - /* |x| >= 0x1p-26, up to 1.6ulp error in [0.125,0.5] */ - x = log1p(x + x*x/(sqrt(x*x+1)+1)); - } else { - /* |x| < 0x1p-26, raise inexact if x != 0 */ - FORCE_EVAL(x + 0x1p120f); - } - return s ? -x : x; -} diff --git a/waterbox/libc/functions/math/asinhf.c b/waterbox/libc/functions/math/asinhf.c deleted file mode 100644 index fc9f0911bf..0000000000 --- a/waterbox/libc/functions/math/asinhf.c +++ /dev/null @@ -1,28 +0,0 @@ -#include "libm.h" - -/* asinh(x) = sign(x)*log(|x|+sqrt(x*x+1)) ~= x - x^3/6 + o(x^5) */ -float asinhf(float x) -{ - union {float f; uint32_t i;} u = {.f = x}; - uint32_t i = u.i & 0x7fffffff; - unsigned s = u.i >> 31; - - /* |x| */ - u.i = i; - x = u.f; - - if (i >= 0x3f800000 + (12<<23)) { - /* |x| >= 0x1p12 or inf or nan */ - x = logf(x) + 0.693147180559945309417232121458176568f; - } else if (i >= 0x3f800000 + (1<<23)) { - /* |x| >= 2 */ - x = logf(2*x + 1/(sqrtf(x*x+1)+x)); - } else if (i >= 0x3f800000 - (12<<23)) { - /* |x| >= 0x1p-12, up to 1.6ulp error in [0.125,0.5] */ - x = log1pf(x + x*x/(sqrtf(x*x+1)+1)); - } else { - /* |x| < 0x1p-12, raise inexact if x!=0 */ - FORCE_EVAL(x + 0x1p120f); - } - return s ? -x : x; -} diff --git a/waterbox/libc/functions/math/asinhl.c b/waterbox/libc/functions/math/asinhl.c deleted file mode 100644 index 8635f52e82..0000000000 --- a/waterbox/libc/functions/math/asinhl.c +++ /dev/null @@ -1,41 +0,0 @@ -#include "libm.h" - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long double asinhl(long double x) -{ - return asinh(x); -} -#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384 -/* asinh(x) = sign(x)*log(|x|+sqrt(x*x+1)) ~= x - x^3/6 + o(x^5) */ -long double asinhl(long double x) -{ - union ldshape u = {x}; - unsigned e = u.i.se & 0x7fff; - unsigned s = u.i.se >> 15; - - /* |x| */ - u.i.se = e; - x = u.f; - - if (e >= 0x3fff + 32) { - /* |x| >= 0x1p32 or inf or nan */ - x = logl(x) + 0.693147180559945309417232121458176568L; - } else if (e >= 0x3fff + 1) { - /* |x| >= 2 */ - x = logl(2*x + 1/(sqrtl(x*x+1)+x)); - } else if (e >= 0x3fff - 32) { - /* |x| >= 0x1p-32 */ - x = log1pl(x + x*x/(sqrtl(x*x+1)+1)); - } else { - /* |x| < 0x1p-32, raise inexact if x!=0 */ - FORCE_EVAL(x + 0x1p120f); - } - return s ? -x : x; -} -#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384 -// TODO: broken implementation to make things compile -long double asinhl(long double x) -{ - return asinh(x); -} -#endif diff --git a/waterbox/libc/functions/math/asinl.c b/waterbox/libc/functions/math/asinl.c deleted file mode 100644 index 347c53568c..0000000000 --- a/waterbox/libc/functions/math/asinl.c +++ /dev/null @@ -1,71 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/e_asinl.c */ -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * - * Developed at SunSoft, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ -/* - * See comments in asin.c. - * Converted to long double by David Schultz . - */ - -#include "libm.h" - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long double asinl(long double x) -{ - return asin(x); -} -#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384 -#include "__invtrigl.h" -#if LDBL_MANT_DIG == 64 -#define CLOSETO1(u) (u.i.m>>56 >= 0xf7) -#define CLEARBOTTOM(u) (u.i.m &= -1ULL << 32) -#elif LDBL_MANT_DIG == 113 -#define CLOSETO1(u) (u.i.top >= 0xee00) -#define CLEARBOTTOM(u) (u.i.lo = 0) -#endif - -long double asinl(long double x) -{ - union ldshape u = {x}; - long double z, r, s; - uint16_t e = u.i.se & 0x7fff; - int sign = u.i.se >> 15; - - if (e >= 0x3fff) { /* |x| >= 1 or nan */ - /* asin(+-1)=+-pi/2 with inexact */ - if (x == 1 || x == -1) - return x*pio2_hi + 0x1p-120f; - return 0/(x-x); - } - if (e < 0x3fff - 1) { /* |x| < 0.5 */ - if (e < 0x3fff - (LDBL_MANT_DIG+1)/2) { - /* return x with inexact if x!=0 */ - FORCE_EVAL(x + 0x1p120f); - return x; - } - return x + x*__invtrigl_R(x*x); - } - /* 1 > |x| >= 0.5 */ - z = (1.0 - fabsl(x))*0.5; - s = sqrtl(z); - r = __invtrigl_R(z); - if (CLOSETO1(u)) { - x = pio2_hi - (2*(s+s*r)-pio2_lo); - } else { - long double f, c; - u.f = s; - CLEARBOTTOM(u); - f = u.f; - c = (z - f*f)/(s + f); - x = 0.5*pio2_hi-(2*s*r - (pio2_lo-2*c) - (0.5*pio2_hi-2*f)); - } - return sign ? -x : x; -} -#endif diff --git a/waterbox/libc/functions/math/atan.c b/waterbox/libc/functions/math/atan.c deleted file mode 100644 index 63b0ab25e3..0000000000 --- a/waterbox/libc/functions/math/atan.c +++ /dev/null @@ -1,116 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/s_atan.c */ -/* - * ==================================================== - * 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. - * ==================================================== - */ -/* atan(x) - * Method - * 1. Reduce x to positive by atan(x) = -atan(-x). - * 2. According to the integer k=4t+0.25 chopped, t=x, the argument - * is further reduced to one of the following intervals and the - * arctangent of t is evaluated by the corresponding formula: - * - * [0,7/16] atan(x) = t-t^3*(a1+t^2*(a2+...(a10+t^2*a11)...) - * [7/16,11/16] atan(x) = atan(1/2) + atan( (t-0.5)/(1+t/2) ) - * [11/16.19/16] atan(x) = atan( 1 ) + atan( (t-1)/(1+t) ) - * [19/16,39/16] atan(x) = atan(3/2) + atan( (t-1.5)/(1+1.5t) ) - * [39/16,INF] atan(x) = atan(INF) + atan( -1/t ) - * - * 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. - */ - - -#include "libm.h" - -static const double atanhi[] = { - 4.63647609000806093515e-01, /* atan(0.5)hi 0x3FDDAC67, 0x0561BB4F */ - 7.85398163397448278999e-01, /* atan(1.0)hi 0x3FE921FB, 0x54442D18 */ - 9.82793723247329054082e-01, /* atan(1.5)hi 0x3FEF730B, 0xD281F69B */ - 1.57079632679489655800e+00, /* atan(inf)hi 0x3FF921FB, 0x54442D18 */ -}; - -static const double atanlo[] = { - 2.26987774529616870924e-17, /* atan(0.5)lo 0x3C7A2B7F, 0x222F65E2 */ - 3.06161699786838301793e-17, /* atan(1.0)lo 0x3C81A626, 0x33145C07 */ - 1.39033110312309984516e-17, /* atan(1.5)lo 0x3C700788, 0x7AF0CBBD */ - 6.12323399573676603587e-17, /* atan(inf)lo 0x3C91A626, 0x33145C07 */ -}; - -static const double aT[] = { - 3.33333333333329318027e-01, /* 0x3FD55555, 0x5555550D */ - -1.99999999998764832476e-01, /* 0xBFC99999, 0x9998EBC4 */ - 1.42857142725034663711e-01, /* 0x3FC24924, 0x920083FF */ - -1.11111104054623557880e-01, /* 0xBFBC71C6, 0xFE231671 */ - 9.09088713343650656196e-02, /* 0x3FB745CD, 0xC54C206E */ - -7.69187620504482999495e-02, /* 0xBFB3B0F2, 0xAF749A6D */ - 6.66107313738753120669e-02, /* 0x3FB10D66, 0xA0D03D51 */ - -5.83357013379057348645e-02, /* 0xBFADDE2D, 0x52DEFD9A */ - 4.97687799461593236017e-02, /* 0x3FA97B4B, 0x24760DEB */ - -3.65315727442169155270e-02, /* 0xBFA2B444, 0x2C6A6C2F */ - 1.62858201153657823623e-02, /* 0x3F90AD3A, 0xE322DA11 */ -}; - -double atan(double x) -{ - double_t w,s1,s2,z; - uint32_t ix,sign; - int id; - - GET_HIGH_WORD(ix, x); - sign = ix >> 31; - ix &= 0x7fffffff; - if (ix >= 0x44100000) { /* if |x| >= 2^66 */ - if (isnan(x)) - return x; - z = atanhi[3] + 0x1p-120f; - return sign ? -z : z; - } - if (ix < 0x3fdc0000) { /* |x| < 0.4375 */ - if (ix < 0x3e400000) { /* |x| < 2^-27 */ - if (ix < 0x00100000) - /* raise underflow for subnormal x */ - FORCE_EVAL((float)x); - return x; - } - id = -1; - } else { - x = fabs(x); - if (ix < 0x3ff30000) { /* |x| < 1.1875 */ - if (ix < 0x3fe60000) { /* 7/16 <= |x| < 11/16 */ - id = 0; - x = (2.0*x-1.0)/(2.0+x); - } else { /* 11/16 <= |x| < 19/16 */ - id = 1; - x = (x-1.0)/(x+1.0); - } - } else { - if (ix < 0x40038000) { /* |x| < 2.4375 */ - id = 2; - x = (x-1.5)/(1.0+1.5*x); - } else { /* 2.4375 <= |x| < 2^66 */ - id = 3; - x = -1.0/x; - } - } - } - /* end of argument reduction */ - z = x*x; - w = z*z; - /* break sum from i=0 to 10 aT[i]z**(i+1) into odd and even poly */ - s1 = z*(aT[0]+w*(aT[2]+w*(aT[4]+w*(aT[6]+w*(aT[8]+w*aT[10]))))); - s2 = w*(aT[1]+w*(aT[3]+w*(aT[5]+w*(aT[7]+w*aT[9])))); - if (id < 0) - return x - x*(s1+s2); - z = atanhi[id] - (x*(s1+s2) - atanlo[id] - x); - return sign ? -z : z; -} diff --git a/waterbox/libc/functions/math/atan2.c b/waterbox/libc/functions/math/atan2.c deleted file mode 100644 index 5a1903c624..0000000000 --- a/waterbox/libc/functions/math/atan2.c +++ /dev/null @@ -1,107 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/e_atan2.c */ -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * - * Developed at SunSoft, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - * - */ -/* atan2(y,x) - * Method : - * 1. Reduce y to positive by atan2(y,x)=-atan2(-y,x). - * 2. Reduce x to positive by (if x and y are unexceptional): - * ARG (x+iy) = arctan(y/x) ... if x > 0, - * ARG (x+iy) = pi - arctan[y/(-x)] ... if x < 0, - * - * Special cases: - * - * ATAN2((anything), NaN ) is NaN; - * ATAN2(NAN , (anything) ) is NaN; - * ATAN2(+-0, +(anything but NaN)) is +-0 ; - * ATAN2(+-0, -(anything but NaN)) is +-pi ; - * ATAN2(+-(anything but 0 and NaN), 0) is +-pi/2; - * ATAN2(+-(anything but INF and NaN), +INF) is +-0 ; - * ATAN2(+-(anything but INF and NaN), -INF) is +-pi; - * ATAN2(+-INF,+INF ) is +-pi/4 ; - * ATAN2(+-INF,-INF ) is +-3pi/4; - * ATAN2(+-INF, (anything but,0,NaN, and INF)) is +-pi/2; - * - * 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. - */ - -#include "libm.h" - -static const double -pi = 3.1415926535897931160E+00, /* 0x400921FB, 0x54442D18 */ -pi_lo = 1.2246467991473531772E-16; /* 0x3CA1A626, 0x33145C07 */ - -double atan2(double y, double x) -{ - double z; - uint32_t m,lx,ly,ix,iy; - - if (isnan(x) || isnan(y)) - return x+y; - EXTRACT_WORDS(ix, lx, x); - EXTRACT_WORDS(iy, ly, y); - if ((ix-0x3ff00000 | lx) == 0) /* x = 1.0 */ - return atan(y); - m = ((iy>>31)&1) | ((ix>>30)&2); /* 2*sign(x)+sign(y) */ - ix = ix & 0x7fffffff; - iy = iy & 0x7fffffff; - - /* when y = 0 */ - if ((iy|ly) == 0) { - switch(m) { - case 0: - case 1: return y; /* atan(+-0,+anything)=+-0 */ - case 2: return pi; /* atan(+0,-anything) = pi */ - case 3: return -pi; /* atan(-0,-anything) =-pi */ - } - } - /* when x = 0 */ - if ((ix|lx) == 0) - return m&1 ? -pi/2 : pi/2; - /* when x is INF */ - if (ix == 0x7ff00000) { - if (iy == 0x7ff00000) { - switch(m) { - case 0: return pi/4; /* atan(+INF,+INF) */ - case 1: return -pi/4; /* atan(-INF,+INF) */ - case 2: return 3*pi/4; /* atan(+INF,-INF) */ - case 3: return -3*pi/4; /* atan(-INF,-INF) */ - } - } else { - switch(m) { - case 0: return 0.0; /* atan(+...,+INF) */ - case 1: return -0.0; /* atan(-...,+INF) */ - case 2: return pi; /* atan(+...,-INF) */ - case 3: return -pi; /* atan(-...,-INF) */ - } - } - } - /* |y/x| > 0x1p64 */ - if (ix+(64<<20) < iy || iy == 0x7ff00000) - return m&1 ? -pi/2 : pi/2; - - /* z = atan(|y/x|) without spurious underflow */ - if ((m&2) && iy+(64<<20) < ix) /* |y/x| < 0x1p-64, x<0 */ - z = 0; - else - z = atan(fabs(y/x)); - switch (m) { - case 0: return z; /* atan(+,+) */ - case 1: return -z; /* atan(-,+) */ - case 2: return pi - (z-pi_lo); /* atan(+,-) */ - default: /* case 3 */ - return (z-pi_lo) - pi; /* atan(-,-) */ - } -} diff --git a/waterbox/libc/functions/math/atan2f.c b/waterbox/libc/functions/math/atan2f.c deleted file mode 100644 index c634d00fc9..0000000000 --- a/waterbox/libc/functions/math/atan2f.c +++ /dev/null @@ -1,83 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/e_atan2f.c */ -/* - * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. - */ -/* - * ==================================================== - * 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 "libm.h" - -static const float -pi = 3.1415927410e+00, /* 0x40490fdb */ -pi_lo = -8.7422776573e-08; /* 0xb3bbbd2e */ - -float atan2f(float y, float x) -{ - float z; - uint32_t m,ix,iy; - - if (isnan(x) || isnan(y)) - return x+y; - GET_FLOAT_WORD(ix, x); - GET_FLOAT_WORD(iy, y); - if (ix == 0x3f800000) /* x=1.0 */ - return atanf(y); - m = ((iy>>31)&1) | ((ix>>30)&2); /* 2*sign(x)+sign(y) */ - ix &= 0x7fffffff; - iy &= 0x7fffffff; - - /* when y = 0 */ - if (iy == 0) { - switch (m) { - case 0: - case 1: return y; /* atan(+-0,+anything)=+-0 */ - case 2: return pi; /* atan(+0,-anything) = pi */ - case 3: return -pi; /* atan(-0,-anything) =-pi */ - } - } - /* when x = 0 */ - if (ix == 0) - return m&1 ? -pi/2 : pi/2; - /* when x is INF */ - if (ix == 0x7f800000) { - if (iy == 0x7f800000) { - switch (m) { - case 0: return pi/4; /* atan(+INF,+INF) */ - case 1: return -pi/4; /* atan(-INF,+INF) */ - case 2: return 3*pi/4; /*atan(+INF,-INF)*/ - case 3: return -3*pi/4; /*atan(-INF,-INF)*/ - } - } else { - switch (m) { - case 0: return 0.0f; /* atan(+...,+INF) */ - case 1: return -0.0f; /* atan(-...,+INF) */ - case 2: return pi; /* atan(+...,-INF) */ - case 3: return -pi; /* atan(-...,-INF) */ - } - } - } - /* |y/x| > 0x1p26 */ - if (ix+(26<<23) < iy || iy == 0x7f800000) - return m&1 ? -pi/2 : pi/2; - - /* z = atan(|y/x|) with correct underflow */ - if ((m&2) && iy+(26<<23) < ix) /*|y/x| < 0x1p-26, x < 0 */ - z = 0.0; - else - z = atanf(fabsf(y/x)); - switch (m) { - case 0: return z; /* atan(+,+) */ - case 1: return -z; /* atan(-,+) */ - case 2: return pi - (z-pi_lo); /* atan(+,-) */ - default: /* case 3 */ - return (z-pi_lo) - pi; /* atan(-,-) */ - } -} diff --git a/waterbox/libc/functions/math/atan2l.c b/waterbox/libc/functions/math/atan2l.c deleted file mode 100644 index f0937a9794..0000000000 --- a/waterbox/libc/functions/math/atan2l.c +++ /dev/null @@ -1,85 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/e_atan2l.c */ -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * - * Developed at SunSoft, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - * - */ -/* - * See comments in atan2.c. - * Converted to long double by David Schultz . - */ - -#include "libm.h" - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long double atan2l(long double y, long double x) -{ - return atan2(y, x); -} -#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384 -#include "__invtrigl.h" - -long double atan2l(long double y, long double x) -{ - union ldshape ux, uy; - long double z; - int m, ex, ey; - - if (isnan(x) || isnan(y)) - return x+y; - if (x == 1) - return atanl(y); - ux.f = x; - uy.f = y; - ex = ux.i.se & 0x7fff; - ey = uy.i.se & 0x7fff; - m = 2*(ux.i.se>>15) | uy.i.se>>15; - if (y == 0) { - switch(m) { - case 0: - case 1: return y; /* atan(+-0,+anything)=+-0 */ - case 2: return 2*pio2_hi; /* atan(+0,-anything) = pi */ - case 3: return -2*pio2_hi; /* atan(-0,-anything) =-pi */ - } - } - if (x == 0) - return m&1 ? -pio2_hi : pio2_hi; - if (ex == 0x7fff) { - if (ey == 0x7fff) { - switch(m) { - case 0: return pio2_hi/2; /* atan(+INF,+INF) */ - case 1: return -pio2_hi/2; /* atan(-INF,+INF) */ - case 2: return 1.5*pio2_hi; /* atan(+INF,-INF) */ - case 3: return -1.5*pio2_hi; /* atan(-INF,-INF) */ - } - } else { - switch(m) { - case 0: return 0.0; /* atan(+...,+INF) */ - case 1: return -0.0; /* atan(-...,+INF) */ - case 2: return 2*pio2_hi; /* atan(+...,-INF) */ - case 3: return -2*pio2_hi; /* atan(-...,-INF) */ - } - } - } - if (ex+120 < ey || ey == 0x7fff) - return m&1 ? -pio2_hi : pio2_hi; - /* z = atan(|y/x|) without spurious underflow */ - if ((m&2) && ey+120 < ex) /* |y/x| < 0x1p-120, x<0 */ - z = 0.0; - else - z = atanl(fabsl(y/x)); - switch (m) { - case 0: return z; /* atan(+,+) */ - case 1: return -z; /* atan(-,+) */ - case 2: return 2*pio2_hi-(z-2*pio2_lo); /* atan(+,-) */ - default: /* case 3 */ - return (z-2*pio2_lo)-2*pio2_hi; /* atan(-,-) */ - } -} -#endif diff --git a/waterbox/libc/functions/math/atanf.c b/waterbox/libc/functions/math/atanf.c deleted file mode 100644 index 178341b670..0000000000 --- a/waterbox/libc/functions/math/atanf.c +++ /dev/null @@ -1,94 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/s_atanf.c */ -/* - * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. - */ -/* - * ==================================================== - * 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 "libm.h" - -static const float atanhi[] = { - 4.6364760399e-01, /* atan(0.5)hi 0x3eed6338 */ - 7.8539812565e-01, /* atan(1.0)hi 0x3f490fda */ - 9.8279368877e-01, /* atan(1.5)hi 0x3f7b985e */ - 1.5707962513e+00, /* atan(inf)hi 0x3fc90fda */ -}; - -static const float atanlo[] = { - 5.0121582440e-09, /* atan(0.5)lo 0x31ac3769 */ - 3.7748947079e-08, /* atan(1.0)lo 0x33222168 */ - 3.4473217170e-08, /* atan(1.5)lo 0x33140fb4 */ - 7.5497894159e-08, /* atan(inf)lo 0x33a22168 */ -}; - -static const float aT[] = { - 3.3333328366e-01, - -1.9999158382e-01, - 1.4253635705e-01, - -1.0648017377e-01, - 6.1687607318e-02, -}; - -float atanf(float x) -{ - float_t w,s1,s2,z; - uint32_t ix,sign; - int id; - - GET_FLOAT_WORD(ix, x); - sign = ix>>31; - ix &= 0x7fffffff; - if (ix >= 0x4c800000) { /* if |x| >= 2**26 */ - if (isnan(x)) - return x; - z = atanhi[3] + 0x1p-120f; - return sign ? -z : z; - } - if (ix < 0x3ee00000) { /* |x| < 0.4375 */ - if (ix < 0x39800000) { /* |x| < 2**-12 */ - if (ix < 0x00800000) - /* raise underflow for subnormal x */ - FORCE_EVAL(x*x); - return x; - } - id = -1; - } else { - x = fabsf(x); - if (ix < 0x3f980000) { /* |x| < 1.1875 */ - if (ix < 0x3f300000) { /* 7/16 <= |x| < 11/16 */ - id = 0; - x = (2.0f*x - 1.0f)/(2.0f + x); - } else { /* 11/16 <= |x| < 19/16 */ - id = 1; - x = (x - 1.0f)/(x + 1.0f); - } - } else { - if (ix < 0x401c0000) { /* |x| < 2.4375 */ - id = 2; - x = (x - 1.5f)/(1.0f + 1.5f*x); - } else { /* 2.4375 <= |x| < 2**26 */ - id = 3; - x = -1.0f/x; - } - } - } - /* end of argument reduction */ - z = x*x; - w = z*z; - /* break sum from i=0 to 10 aT[i]z**(i+1) into odd and even poly */ - s1 = z*(aT[0]+w*(aT[2]+w*aT[4])); - s2 = w*(aT[1]+w*aT[3]); - if (id < 0) - return x - x*(s1+s2); - z = atanhi[id] - ((x*(s1+s2) - atanlo[id]) - x); - return sign ? -z : z; -} diff --git a/waterbox/libc/functions/math/atanh.c b/waterbox/libc/functions/math/atanh.c deleted file mode 100644 index 63a035d706..0000000000 --- a/waterbox/libc/functions/math/atanh.c +++ /dev/null @@ -1,29 +0,0 @@ -#include "libm.h" - -/* atanh(x) = log((1+x)/(1-x))/2 = log1p(2x/(1-x))/2 ~= x + x^3/3 + o(x^5) */ -double atanh(double x) -{ - union {double f; uint64_t i;} u = {.f = x}; - unsigned e = u.i >> 52 & 0x7ff; - unsigned s = u.i >> 63; - double_t y; - - /* |x| */ - u.i &= (uint64_t)-1/2; - y = u.f; - - if (e < 0x3ff - 1) { - if (e < 0x3ff - 32) { - /* handle underflow */ - if (e == 0) - FORCE_EVAL((float)y); - } else { - /* |x| < 0.5, up to 1.7ulp error */ - y = 0.5*log1p(2*y + 2*y*y/(1-y)); - } - } else { - /* avoid overflow */ - y = 0.5*log1p(2*(y/(1-y))); - } - return s ? -y : y; -} diff --git a/waterbox/libc/functions/math/atanhf.c b/waterbox/libc/functions/math/atanhf.c deleted file mode 100644 index 65f07c0f4f..0000000000 --- a/waterbox/libc/functions/math/atanhf.c +++ /dev/null @@ -1,28 +0,0 @@ -#include "libm.h" - -/* atanh(x) = log((1+x)/(1-x))/2 = log1p(2x/(1-x))/2 ~= x + x^3/3 + o(x^5) */ -float atanhf(float x) -{ - union {float f; uint32_t i;} u = {.f = x}; - unsigned s = u.i >> 31; - float_t y; - - /* |x| */ - u.i &= 0x7fffffff; - y = u.f; - - if (u.i < 0x3f800000 - (1<<23)) { - if (u.i < 0x3f800000 - (32<<23)) { - /* handle underflow */ - if (u.i < (1<<23)) - FORCE_EVAL((float)(y*y)); - } else { - /* |x| < 0.5, up to 1.7ulp error */ - y = 0.5f*log1pf(2*y + 2*y*y/(1-y)); - } - } else { - /* avoid overflow */ - y = 0.5f*log1pf(2*(y/(1-y))); - } - return s ? -y : y; -} diff --git a/waterbox/libc/functions/math/atanhl.c b/waterbox/libc/functions/math/atanhl.c deleted file mode 100644 index 87cd1cdb5f..0000000000 --- a/waterbox/libc/functions/math/atanhl.c +++ /dev/null @@ -1,35 +0,0 @@ -#include "libm.h" - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long double atanhl(long double x) -{ - return atanh(x); -} -#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384 -/* atanh(x) = log((1+x)/(1-x))/2 = log1p(2x/(1-x))/2 ~= x + x^3/3 + o(x^5) */ -long double atanhl(long double x) -{ - union ldshape u = {x}; - unsigned e = u.i.se & 0x7fff; - unsigned s = u.i.se >> 15; - - /* |x| */ - u.i.se = e; - x = u.f; - - if (e < 0x3ff - 1) { - if (e < 0x3ff - LDBL_MANT_DIG/2) { - /* handle underflow */ - if (e == 0) - FORCE_EVAL((float)x); - } else { - /* |x| < 0.5, up to 1.7ulp error */ - x = 0.5*log1pl(2*x + 2*x*x/(1-x)); - } - } else { - /* avoid overflow */ - x = 0.5*log1pl(2*(x/(1-x))); - } - return s ? -x : x; -} -#endif diff --git a/waterbox/libc/functions/math/atanl.c b/waterbox/libc/functions/math/atanl.c deleted file mode 100644 index 79a3edb805..0000000000 --- a/waterbox/libc/functions/math/atanl.c +++ /dev/null @@ -1,184 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/s_atanl.c */ -/* - * ==================================================== - * 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. - * ==================================================== - */ -/* - * See comments in atan.c. - * Converted to long double by David Schultz . - */ - -#include "libm.h" - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long double atanl(long double x) -{ - return atan(x); -} -#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384 - -#if LDBL_MANT_DIG == 64 -#define EXPMAN(u) ((u.i.se & 0x7fff)<<8 | (u.i.m>>55 & 0xff)) - -static const long double atanhi[] = { - 4.63647609000806116202e-01L, - 7.85398163397448309628e-01L, - 9.82793723247329067960e-01L, - 1.57079632679489661926e+00L, -}; - -static const long double atanlo[] = { - 1.18469937025062860669e-20L, - -1.25413940316708300586e-20L, - 2.55232234165405176172e-20L, - -2.50827880633416601173e-20L, -}; - -static const long double aT[] = { - 3.33333333333333333017e-01L, - -1.99999999999999632011e-01L, - 1.42857142857046531280e-01L, - -1.11111111100562372733e-01L, - 9.09090902935647302252e-02L, - -7.69230552476207730353e-02L, - 6.66661718042406260546e-02L, - -5.88158892835030888692e-02L, - 5.25499891539726639379e-02L, - -4.70119845393155721494e-02L, - 4.03539201366454414072e-02L, - -2.91303858419364158725e-02L, - 1.24822046299269234080e-02L, -}; - -static long double T_even(long double x) -{ - return aT[0] + x * (aT[2] + x * (aT[4] + x * (aT[6] + - x * (aT[8] + x * (aT[10] + x * aT[12]))))); -} - -static long double T_odd(long double x) -{ - return aT[1] + x * (aT[3] + x * (aT[5] + x * (aT[7] + - x * (aT[9] + x * aT[11])))); -} -#elif LDBL_MANT_DIG == 113 -#define EXPMAN(u) ((u.i.se & 0x7fff)<<8 | u.i.top>>8) - -const long double atanhi[] = { - 4.63647609000806116214256231461214397e-01L, - 7.85398163397448309615660845819875699e-01L, - 9.82793723247329067985710611014666038e-01L, - 1.57079632679489661923132169163975140e+00L, -}; - -const long double atanlo[] = { - 4.89509642257333492668618435220297706e-36L, - 2.16795253253094525619926100651083806e-35L, - -2.31288434538183565909319952098066272e-35L, - 4.33590506506189051239852201302167613e-35L, -}; - -const long double aT[] = { - 3.33333333333333333333333333333333125e-01L, - -1.99999999999999999999999999999180430e-01L, - 1.42857142857142857142857142125269827e-01L, - -1.11111111111111111111110834490810169e-01L, - 9.09090909090909090908522355708623681e-02L, - -7.69230769230769230696553844935357021e-02L, - 6.66666666666666660390096773046256096e-02L, - -5.88235294117646671706582985209643694e-02L, - 5.26315789473666478515847092020327506e-02L, - -4.76190476189855517021024424991436144e-02L, - 4.34782608678695085948531993458097026e-02L, - -3.99999999632663469330634215991142368e-02L, - 3.70370363987423702891250829918659723e-02L, - -3.44827496515048090726669907612335954e-02L, - 3.22579620681420149871973710852268528e-02L, - -3.03020767654269261041647570626778067e-02L, - 2.85641979882534783223403715930946138e-02L, - -2.69824879726738568189929461383741323e-02L, - 2.54194698498808542954187110873675769e-02L, - -2.35083879708189059926183138130183215e-02L, - 2.04832358998165364349957325067131428e-02L, - -1.54489555488544397858507248612362957e-02L, - 8.64492360989278761493037861575248038e-03L, - -2.58521121597609872727919154569765469e-03L, -}; - -static long double T_even(long double x) -{ - return (aT[0] + x * (aT[2] + x * (aT[4] + x * (aT[6] + x * (aT[8] + - x * (aT[10] + x * (aT[12] + x * (aT[14] + x * (aT[16] + - x * (aT[18] + x * (aT[20] + x * aT[22]))))))))))); -} - -static long double T_odd(long double x) -{ - return (aT[1] + x * (aT[3] + x * (aT[5] + x * (aT[7] + x * (aT[9] + - x * (aT[11] + x * (aT[13] + x * (aT[15] + x * (aT[17] + - x * (aT[19] + x * (aT[21] + x * aT[23]))))))))))); -} -#endif - -long double atanl(long double x) -{ - union ldshape u = {x}; - long double w, s1, s2, z; - int id; - unsigned e = u.i.se & 0x7fff; - unsigned sign = u.i.se >> 15; - unsigned expman; - - if (e >= 0x3fff + LDBL_MANT_DIG + 1) { /* if |x| is large, atan(x)~=pi/2 */ - if (isnan(x)) - return x; - return sign ? -atanhi[3] : atanhi[3]; - } - /* Extract the exponent and the first few bits of the mantissa. */ - expman = EXPMAN(u); - if (expman < ((0x3fff - 2) << 8) + 0xc0) { /* |x| < 0.4375 */ - if (e < 0x3fff - (LDBL_MANT_DIG+1)/2) { /* if |x| is small, atanl(x)~=x */ - /* raise underflow if subnormal */ - if (e == 0) - FORCE_EVAL((float)x); - return x; - } - id = -1; - } else { - x = fabsl(x); - if (expman < (0x3fff << 8) + 0x30) { /* |x| < 1.1875 */ - if (expman < ((0x3fff - 1) << 8) + 0x60) { /* 7/16 <= |x| < 11/16 */ - id = 0; - x = (2.0*x-1.0)/(2.0+x); - } else { /* 11/16 <= |x| < 19/16 */ - id = 1; - x = (x-1.0)/(x+1.0); - } - } else { - if (expman < ((0x3fff + 1) << 8) + 0x38) { /* |x| < 2.4375 */ - id = 2; - x = (x-1.5)/(1.0+1.5*x); - } else { /* 2.4375 <= |x| */ - id = 3; - x = -1.0/x; - } - } - } - /* end of argument reduction */ - z = x*x; - w = z*z; - /* break sum aT[i]z**(i+1) into odd and even poly */ - s1 = z*T_even(w); - s2 = w*T_odd(w); - if (id < 0) - return x - x*(s1+s2); - z = atanhi[id] - ((x*(s1+s2) - atanlo[id]) - x); - return sign ? -z : z; -} -#endif diff --git a/waterbox/libc/functions/math/cbrt.c b/waterbox/libc/functions/math/cbrt.c deleted file mode 100644 index 7599d3e37d..0000000000 --- a/waterbox/libc/functions/math/cbrt.c +++ /dev/null @@ -1,103 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/s_cbrt.c */ -/* - * ==================================================== - * 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. - * ==================================================== - * - * Optimized by Bruce D. Evans. - */ -/* cbrt(x) - * Return cube root of x - */ - -#include -#include - -static const uint32_t -B1 = 715094163, /* B1 = (1023-1023/3-0.03306235651)*2**20 */ -B2 = 696219795; /* B2 = (1023-1023/3-54/3-0.03306235651)*2**20 */ - -/* |1/cbrt(x) - p(x)| < 2**-23.5 (~[-7.93e-8, 7.929e-8]). */ -static const double -P0 = 1.87595182427177009643, /* 0x3ffe03e6, 0x0f61e692 */ -P1 = -1.88497979543377169875, /* 0xbffe28e0, 0x92f02420 */ -P2 = 1.621429720105354466140, /* 0x3ff9f160, 0x4a49d6c2 */ -P3 = -0.758397934778766047437, /* 0xbfe844cb, 0xbee751d9 */ -P4 = 0.145996192886612446982; /* 0x3fc2b000, 0xd4e4edd7 */ - -double cbrt(double x) -{ - union {double f; uint64_t i;} u = {x}; - double_t r,s,t,w; - uint32_t hx = u.i>>32 & 0x7fffffff; - - if (hx >= 0x7ff00000) /* cbrt(NaN,INF) is itself */ - return x+x; - - /* - * Rough cbrt to 5 bits: - * cbrt(2**e*(1+m) ~= 2**(e/3)*(1+(e%3+m)/3) - * where e is integral and >= 0, m is real and in [0, 1), and "/" and - * "%" are integer division and modulus with rounding towards minus - * infinity. The RHS is always >= the LHS and has a maximum relative - * error of about 1 in 16. Adding a bias of -0.03306235651 to the - * (e%3+m)/3 term reduces the error to about 1 in 32. With the IEEE - * floating point representation, for finite positive normal values, - * ordinary integer divison of the value in bits magically gives - * almost exactly the RHS of the above provided we first subtract the - * exponent bias (1023 for doubles) and later add it back. We do the - * subtraction virtually to keep e >= 0 so that ordinary integer - * division rounds towards minus infinity; this is also efficient. - */ - if (hx < 0x00100000) { /* zero or subnormal? */ - u.f = x*0x1p54; - hx = u.i>>32 & 0x7fffffff; - if (hx == 0) - return x; /* cbrt(0) is itself */ - hx = hx/3 + B2; - } else - hx = hx/3 + B1; - u.i &= 1ULL<<63; - u.i |= (uint64_t)hx << 32; - t = u.f; - - /* - * New cbrt to 23 bits: - * cbrt(x) = t*cbrt(x/t**3) ~= t*P(t**3/x) - * where P(r) is a polynomial of degree 4 that approximates 1/cbrt(r) - * to within 2**-23.5 when |r - 1| < 1/10. The rough approximation - * has produced t such than |t/cbrt(x) - 1| ~< 1/32, and cubing this - * gives us bounds for r = t**3/x. - * - * Try to optimize for parallel evaluation as in __tanf.c. - */ - r = (t*t)*(t/x); - t = t*((P0+r*(P1+r*P2))+((r*r)*r)*(P3+r*P4)); - - /* - * Round t away from zero to 23 bits (sloppily except for ensuring that - * the result is larger in magnitude than cbrt(x) but not much more than - * 2 23-bit ulps larger). With rounding towards zero, the error bound - * would be ~5/6 instead of ~4/6. With a maximum error of 2 23-bit ulps - * in the rounded t, the infinite-precision error in the Newton - * approximation barely affects third digit in the final error - * 0.667; the error in the rounded t can be up to about 3 23-bit ulps - * before the final error is larger than 0.667 ulps. - */ - u.f = t; - u.i = (u.i + 0x80000000) & 0xffffffffc0000000ULL; - t = u.f; - - /* one step Newton iteration to 53 bits with error < 0.667 ulps */ - s = t*t; /* t*t is exact */ - r = x/s; /* error <= 0.5 ulps; |r| < |t| */ - w = t+t; /* t+t is exact */ - r = (r-t)/(w+r); /* r-t is exact; w+r ~= 3*t */ - t = t+t*r; /* error <= 0.5 + 0.5/3 + epsilon */ - return t; -} diff --git a/waterbox/libc/functions/math/cbrtf.c b/waterbox/libc/functions/math/cbrtf.c deleted file mode 100644 index 89c2c8655d..0000000000 --- a/waterbox/libc/functions/math/cbrtf.c +++ /dev/null @@ -1,66 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/s_cbrtf.c */ -/* - * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. - * Debugged and optimized by Bruce D. Evans. - */ -/* - * ==================================================== - * 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. - * ==================================================== - */ -/* cbrtf(x) - * Return cube root of x - */ - -#include -#include - -static const unsigned -B1 = 709958130, /* B1 = (127-127.0/3-0.03306235651)*2**23 */ -B2 = 642849266; /* B2 = (127-127.0/3-24/3-0.03306235651)*2**23 */ - -float cbrtf(float x) -{ - double_t r,T; - union {float f; uint32_t i;} u = {x}; - uint32_t hx = u.i & 0x7fffffff; - - if (hx >= 0x7f800000) /* cbrt(NaN,INF) is itself */ - return x + x; - - /* rough cbrt to 5 bits */ - if (hx < 0x00800000) { /* zero or subnormal? */ - if (hx == 0) - return x; /* cbrt(+-0) is itself */ - u.f = x*0x1p24f; - hx = u.i & 0x7fffffff; - hx = hx/3 + B2; - } else - hx = hx/3 + B1; - u.i &= 0x80000000; - u.i |= hx; - - /* - * First step Newton iteration (solving t*t-x/t == 0) to 16 bits. In - * double precision so that its terms can be arranged for efficiency - * without causing overflow or underflow. - */ - T = u.f; - r = T*T*T; - T = T*((double_t)x+x+r)/(x+r+r); - - /* - * Second step Newton iteration to 47 bits. In double precision for - * efficiency and accuracy. - */ - r = T*T*T; - T = T*((double_t)x+x+r)/(x+r+r); - - /* rounding to 24 bits is perfect in round-to-nearest mode */ - return T; -} diff --git a/waterbox/libc/functions/math/cbrtl.c b/waterbox/libc/functions/math/cbrtl.c deleted file mode 100644 index ceff9136eb..0000000000 --- a/waterbox/libc/functions/math/cbrtl.c +++ /dev/null @@ -1,124 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/s_cbrtl.c */ -/*- - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * Copyright (c) 2009-2011, Bruce D. Evans, Steven G. Kargl, David Schultz. - * - * 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. - * ==================================================== - * - * The argument reduction and testing for exceptional cases was - * written by Steven G. Kargl with input from Bruce D. Evans - * and David A. Schultz. - */ - -#include "libm.h" - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long double cbrtl(long double x) -{ - return cbrt(x); -} -#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384 -static const unsigned B1 = 709958130; /* B1 = (127-127.0/3-0.03306235651)*2**23 */ - -long double cbrtl(long double x) -{ - union ldshape u = {x}, v; - union {float f; uint32_t i;} uft; - long double r, s, t, w; - double_t dr, dt, dx; - float_t ft; - int e = u.i.se & 0x7fff; - int sign = u.i.se & 0x8000; - - /* - * If x = +-Inf, then cbrt(x) = +-Inf. - * If x = NaN, then cbrt(x) = NaN. - */ - if (e == 0x7fff) - return x + x; - if (e == 0) { - /* Adjust subnormal numbers. */ - u.f *= 0x1p120; - e = u.i.se & 0x7fff; - /* If x = +-0, then cbrt(x) = +-0. */ - if (e == 0) - return x; - e -= 120; - } - e -= 0x3fff; - u.i.se = 0x3fff; - x = u.f; - switch (e % 3) { - case 1: - case -2: - x *= 2; - e--; - break; - case 2: - case -1: - x *= 4; - e -= 2; - break; - } - v.f = 1.0; - v.i.se = sign | (0x3fff + e/3); - - /* - * The following is the guts of s_cbrtf, with the handling of - * special values removed and extra care for accuracy not taken, - * but with most of the extra accuracy not discarded. - */ - - /* ~5-bit estimate: */ - uft.f = x; - uft.i = (uft.i & 0x7fffffff)/3 + B1; - ft = uft.f; - - /* ~16-bit estimate: */ - dx = x; - dt = ft; - dr = dt * dt * dt; - dt = dt * (dx + dx + dr) / (dx + dr + dr); - - /* ~47-bit estimate: */ - dr = dt * dt * dt; - dt = dt * (dx + dx + dr) / (dx + dr + dr); - -#if LDBL_MANT_DIG == 64 - /* - * dt is cbrtl(x) to ~47 bits (after x has been reduced to 1 <= x < 8). - * Round it away from zero to 32 bits (32 so that t*t is exact, and - * away from zero for technical reasons). - */ - t = dt + (0x1.0p32L + 0x1.0p-31L) - 0x1.0p32; -#elif LDBL_MANT_DIG == 113 - /* - * Round dt away from zero to 47 bits. Since we don't trust the 47, - * add 2 47-bit ulps instead of 1 to round up. Rounding is slow and - * might be avoidable in this case, since on most machines dt will - * have been evaluated in 53-bit precision and the technical reasons - * for rounding up might not apply to either case in cbrtl() since - * dt is much more accurate than needed. - */ - t = dt + 0x2.0p-46 + 0x1.0p60L - 0x1.0p60; -#endif - - /* - * Final step Newton iteration to 64 or 113 bits with - * error < 0.667 ulps - */ - s = t*t; /* t*t is exact */ - r = x/s; /* error <= 0.5 ulps; |r| < |t| */ - w = t+t; /* t+t is exact */ - r = (r-t)/(w+r); /* r-t is exact; w+r ~= 3*t */ - t = t+t*r; /* error <= 0.5 + 0.5/3 + epsilon */ - - t *= v.f; - return t; -} -#endif diff --git a/waterbox/libc/functions/math/ceil.c b/waterbox/libc/functions/math/ceil.c deleted file mode 100644 index b13e6f2d63..0000000000 --- a/waterbox/libc/functions/math/ceil.c +++ /dev/null @@ -1,31 +0,0 @@ -#include "libm.h" - -#if FLT_EVAL_METHOD==0 || FLT_EVAL_METHOD==1 -#define EPS DBL_EPSILON -#elif FLT_EVAL_METHOD==2 -#define EPS LDBL_EPSILON -#endif -static const double_t toint = 1/EPS; - -double ceil(double x) -{ - union {double f; uint64_t i;} u = {x}; - int e = u.i >> 52 & 0x7ff; - double_t y; - - if (e >= 0x3ff+52 || x == 0) - return x; - /* y = int(x) - x, where int(x) is an integer neighbor of x */ - if (u.i >> 63) - y = x - toint + toint - x; - else - y = x + toint - toint - x; - /* special case because of non-nearest rounding modes */ - if (e <= 0x3ff-1) { - FORCE_EVAL(y); - return u.i >> 63 ? -0.0 : 1; - } - if (y < 0) - return x + y + 1; - return x + y; -} diff --git a/waterbox/libc/functions/math/ceilf.c b/waterbox/libc/functions/math/ceilf.c deleted file mode 100644 index 869835f397..0000000000 --- a/waterbox/libc/functions/math/ceilf.c +++ /dev/null @@ -1,27 +0,0 @@ -#include "libm.h" - -float ceilf(float x) -{ - union {float f; uint32_t i;} u = {x}; - int e = (int)(u.i >> 23 & 0xff) - 0x7f; - uint32_t m; - - if (e >= 23) - return x; - if (e >= 0) { - m = 0x007fffff >> e; - if ((u.i & m) == 0) - return x; - FORCE_EVAL(x + 0x1p120f); - if (u.i >> 31 == 0) - u.i += m; - u.i &= ~m; - } else { - FORCE_EVAL(x + 0x1p120f); - if (u.i >> 31) - u.f = -0.0; - else if (u.i << 1) - u.f = 1.0; - } - return u.f; -} diff --git a/waterbox/libc/functions/math/ceill.c b/waterbox/libc/functions/math/ceill.c deleted file mode 100644 index 60a83020dd..0000000000 --- a/waterbox/libc/functions/math/ceill.c +++ /dev/null @@ -1,34 +0,0 @@ -#include "libm.h" - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long double ceill(long double x) -{ - return ceil(x); -} -#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384 - -static const long double toint = 1/LDBL_EPSILON; - -long double ceill(long double x) -{ - union ldshape u = {x}; - int e = u.i.se & 0x7fff; - long double y; - - if (e >= 0x3fff+LDBL_MANT_DIG-1 || x == 0) - return x; - /* y = int(x) - x, where int(x) is an integer neighbor of x */ - if (u.i.se >> 15) - y = x - toint + toint - x; - else - y = x + toint - toint - x; - /* special case because of non-nearest rounding modes */ - if (e <= 0x3fff-1) { - FORCE_EVAL(y); - return u.i.se >> 15 ? -0.0 : 1; - } - if (y < 0) - return x + y + 1; - return x + y; -} -#endif diff --git a/waterbox/libc/functions/math/copysign.c b/waterbox/libc/functions/math/copysign.c deleted file mode 100644 index b09331b687..0000000000 --- a/waterbox/libc/functions/math/copysign.c +++ /dev/null @@ -1,8 +0,0 @@ -#include "libm.h" - -double copysign(double x, double y) { - union {double f; uint64_t i;} ux={x}, uy={y}; - ux.i &= -1ULL/2; - ux.i |= uy.i & 1ULL<<63; - return ux.f; -} diff --git a/waterbox/libc/functions/math/copysignf.c b/waterbox/libc/functions/math/copysignf.c deleted file mode 100644 index 0af6ae9b21..0000000000 --- a/waterbox/libc/functions/math/copysignf.c +++ /dev/null @@ -1,10 +0,0 @@ -#include -#include - -float copysignf(float x, float y) -{ - union {float f; uint32_t i;} ux={x}, uy={y}; - ux.i &= 0x7fffffff; - ux.i |= uy.i & 0x80000000; - return ux.f; -} diff --git a/waterbox/libc/functions/math/copysignl.c b/waterbox/libc/functions/math/copysignl.c deleted file mode 100644 index 9dd933cfa9..0000000000 --- a/waterbox/libc/functions/math/copysignl.c +++ /dev/null @@ -1,16 +0,0 @@ -#include "libm.h" - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long double copysignl(long double x, long double y) -{ - return copysign(x, y); -} -#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384 -long double copysignl(long double x, long double y) -{ - union ldshape ux = {x}, uy = {y}; - ux.i.se &= 0x7fff; - ux.i.se |= uy.i.se & 0x8000; - return ux.f; -} -#endif diff --git a/waterbox/libc/functions/math/cos.c b/waterbox/libc/functions/math/cos.c deleted file mode 100644 index ee97f68bbb..0000000000 --- a/waterbox/libc/functions/math/cos.c +++ /dev/null @@ -1,77 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/s_cos.c */ -/* - * ==================================================== - * 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. - * ==================================================== - */ -/* cos(x) - * Return cosine function of x. - * - * kernel function: - * __sin ... sine function on [-pi/4,pi/4] - * __cos ... cosine function on [-pi/4,pi/4] - * __rem_pio2 ... 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 "libm.h" - -double cos(double x) -{ - double y[2]; - uint32_t ix; - unsigned n; - - GET_HIGH_WORD(ix, x); - ix &= 0x7fffffff; - - /* |x| ~< pi/4 */ - if (ix <= 0x3fe921fb) { - if (ix < 0x3e46a09e) { /* |x| < 2**-27 * sqrt(2) */ - /* raise inexact if x!=0 */ - FORCE_EVAL(x + 0x1p120f); - return 1.0; - } - return __cos(x, 0); - } - - /* cos(Inf or NaN) is NaN */ - if (ix >= 0x7ff00000) - return x-x; - - /* argument reduction */ - n = __rem_pio2(x, y); - switch (n&3) { - case 0: return __cos(y[0], y[1]); - case 1: return -__sin(y[0], y[1], 1); - case 2: return -__cos(y[0], y[1]); - default: - return __sin(y[0], y[1], 1); - } -} diff --git a/waterbox/libc/functions/math/cosf.c b/waterbox/libc/functions/math/cosf.c deleted file mode 100644 index 23f3e5bf69..0000000000 --- a/waterbox/libc/functions/math/cosf.c +++ /dev/null @@ -1,78 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/s_cosf.c */ -/* - * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. - * Optimized by Bruce D. Evans. - */ -/* - * ==================================================== - * 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 "libm.h" - -/* Small multiples of pi/2 rounded to double precision. */ -static const double -c1pio2 = 1*M_PI_2, /* 0x3FF921FB, 0x54442D18 */ -c2pio2 = 2*M_PI_2, /* 0x400921FB, 0x54442D18 */ -c3pio2 = 3*M_PI_2, /* 0x4012D97C, 0x7F3321D2 */ -c4pio2 = 4*M_PI_2; /* 0x401921FB, 0x54442D18 */ - -float cosf(float x) -{ - double y; - uint32_t ix; - unsigned n, sign; - - GET_FLOAT_WORD(ix, x); - sign = ix >> 31; - ix &= 0x7fffffff; - - if (ix <= 0x3f490fda) { /* |x| ~<= pi/4 */ - if (ix < 0x39800000) { /* |x| < 2**-12 */ - /* raise inexact if x != 0 */ - FORCE_EVAL(x + 0x1p120f); - return 1.0f; - } - return __cosdf(x); - } - if (ix <= 0x407b53d1) { /* |x| ~<= 5*pi/4 */ - if (ix > 0x4016cbe3) /* |x| ~> 3*pi/4 */ - return -__cosdf(sign ? x+c2pio2 : x-c2pio2); - else { - if (sign) - return __sindf(x + c1pio2); - else - return __sindf(c1pio2 - x); - } - } - if (ix <= 0x40e231d5) { /* |x| ~<= 9*pi/4 */ - if (ix > 0x40afeddf) /* |x| ~> 7*pi/4 */ - return __cosdf(sign ? x+c4pio2 : x-c4pio2); - else { - if (sign) - return __sindf(-x - c3pio2); - else - return __sindf(x - c3pio2); - } - } - - /* cos(Inf or NaN) is NaN */ - if (ix >= 0x7f800000) - return x-x; - - /* general argument reduction needed */ - n = __rem_pio2f(x,&y); - switch (n&3) { - case 0: return __cosdf(y); - case 1: return __sindf(-y); - case 2: return -__cosdf(y); - default: - return __sindf(y); - } -} diff --git a/waterbox/libc/functions/math/cosh.c b/waterbox/libc/functions/math/cosh.c deleted file mode 100644 index 100f8231d8..0000000000 --- a/waterbox/libc/functions/math/cosh.c +++ /dev/null @@ -1,40 +0,0 @@ -#include "libm.h" - -/* cosh(x) = (exp(x) + 1/exp(x))/2 - * = 1 + 0.5*(exp(x)-1)*(exp(x)-1)/exp(x) - * = 1 + x*x/2 + o(x^4) - */ -double cosh(double x) -{ - union {double f; uint64_t i;} u = {.f = x}; - uint32_t w; - double t; - - /* |x| */ - u.i &= (uint64_t)-1/2; - x = u.f; - w = u.i >> 32; - - /* |x| < log(2) */ - if (w < 0x3fe62e42) { - if (w < 0x3ff00000 - (26<<20)) { - /* raise inexact if x!=0 */ - FORCE_EVAL(x + 0x1p120f); - return 1; - } - t = expm1(x); - return 1 + t*t/(2*(1+t)); - } - - /* |x| < log(DBL_MAX) */ - if (w < 0x40862e42) { - t = exp(x); - /* note: if x>log(0x1p26) then the 1/t is not needed */ - return 0.5*(t + 1/t); - } - - /* |x| > log(DBL_MAX) or nan */ - /* note: the result is stored to handle overflow */ - t = __expo2(x); - return t; -} diff --git a/waterbox/libc/functions/math/coshf.c b/waterbox/libc/functions/math/coshf.c deleted file mode 100644 index b09f2ee575..0000000000 --- a/waterbox/libc/functions/math/coshf.c +++ /dev/null @@ -1,33 +0,0 @@ -#include "libm.h" - -float coshf(float x) -{ - union {float f; uint32_t i;} u = {.f = x}; - uint32_t w; - float t; - - /* |x| */ - u.i &= 0x7fffffff; - x = u.f; - w = u.i; - - /* |x| < log(2) */ - if (w < 0x3f317217) { - if (w < 0x3f800000 - (12<<23)) { - FORCE_EVAL(x + 0x1p120f); - return 1; - } - t = expm1f(x); - return 1 + t*t/(2*(1+t)); - } - - /* |x| < log(FLT_MAX) */ - if (w < 0x42b17217) { - t = expf(x); - return 0.5f*(t + 1/t); - } - - /* |x| > log(FLT_MAX) or nan */ - t = __expo2f(x); - return t; -} diff --git a/waterbox/libc/functions/math/coshl.c b/waterbox/libc/functions/math/coshl.c deleted file mode 100644 index 06a56fe3be..0000000000 --- a/waterbox/libc/functions/math/coshl.c +++ /dev/null @@ -1,47 +0,0 @@ -#include "libm.h" - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long double coshl(long double x) -{ - return cosh(x); -} -#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384 -long double coshl(long double x) -{ - union ldshape u = {x}; - unsigned ex = u.i.se & 0x7fff; - uint32_t w; - long double t; - - /* |x| */ - u.i.se = ex; - x = u.f; - w = u.i.m >> 32; - - /* |x| < log(2) */ - if (ex < 0x3fff-1 || (ex == 0x3fff-1 && w < 0xb17217f7)) { - if (ex < 0x3fff-32) { - FORCE_EVAL(x + 0x1p120f); - return 1; - } - t = expm1l(x); - return 1 + t*t/(2*(1+t)); - } - - /* |x| < log(LDBL_MAX) */ - if (ex < 0x3fff+13 || (ex == 0x3fff+13 && w < 0xb17217f7)) { - t = expl(x); - return 0.5*(t + 1/t); - } - - /* |x| > log(LDBL_MAX) or nan */ - t = expl(0.5*x); - return 0.5*t*t; -} -#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384 -// TODO: broken implementation to make things compile -long double coshl(long double x) -{ - return cosh(x); -} -#endif diff --git a/waterbox/libc/functions/math/cosl.c b/waterbox/libc/functions/math/cosl.c deleted file mode 100644 index 79c41c77fa..0000000000 --- a/waterbox/libc/functions/math/cosl.c +++ /dev/null @@ -1,39 +0,0 @@ -#include "libm.h" - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long double cosl(long double x) { - return cos(x); -} -#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384 -long double cosl(long double x) -{ - union ldshape u = {x}; - unsigned n; - long double y[2], hi, lo; - - u.i.se &= 0x7fff; - if (u.i.se == 0x7fff) - return x - x; - x = u.f; - if (x < M_PI_4) { - if (u.i.se < 0x3fff - LDBL_MANT_DIG) - /* raise inexact if x!=0 */ - return 1.0 + x; - return __cosl(x, 0); - } - n = __rem_pio2l(x, y); - hi = y[0]; - lo = y[1]; - switch (n & 3) { - case 0: - return __cosl(hi, lo); - case 1: - return -__sinl(hi, lo, 1); - case 2: - return -__cosl(hi, lo); - case 3: - default: - return __sinl(hi, lo, 1); - } -} -#endif diff --git a/waterbox/libc/functions/math/erf.c b/waterbox/libc/functions/math/erf.c deleted file mode 100644 index 2f30a298f9..0000000000 --- a/waterbox/libc/functions/math/erf.c +++ /dev/null @@ -1,273 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/s_erf.c */ -/* - * ==================================================== - * 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. - * ==================================================== - */ -/* double erf(double x) - * double erfc(double x) - * x - * 2 |\ - * erf(x) = --------- | exp(-t*t)dt - * sqrt(pi) \| - * 0 - * - * erfc(x) = 1-erf(x) - * Note that - * erf(-x) = -erf(x) - * erfc(-x) = 2 - erfc(x) - * - * Method: - * 1. For |x| in [0, 0.84375] - * erf(x) = x + x*R(x^2) - * erfc(x) = 1 - erf(x) if x in [-.84375,0.25] - * = 0.5 + ((0.5-x)-x*R) if x in [0.25,0.84375] - * where R = P/Q where P is an odd poly of degree 8 and - * Q is an odd poly of degree 10. - * -57.90 - * | R - (erf(x)-x)/x | <= 2 - * - * - * Remark. The formula is derived by noting - * erf(x) = (2/sqrt(pi))*(x - x^3/3 + x^5/10 - x^7/42 + ....) - * and that - * 2/sqrt(pi) = 1.128379167095512573896158903121545171688 - * is close to one. The interval is chosen because the fix - * point of erf(x) is near 0.6174 (i.e., erf(x)=x when x is - * near 0.6174), and by some experiment, 0.84375 is chosen to - * guarantee the error is less than one ulp for erf. - * - * 2. For |x| in [0.84375,1.25], let s = |x| - 1, and - * c = 0.84506291151 rounded to single (24 bits) - * erf(x) = sign(x) * (c + P1(s)/Q1(s)) - * erfc(x) = (1-c) - P1(s)/Q1(s) if x > 0 - * 1+(c+P1(s)/Q1(s)) if x < 0 - * |P1/Q1 - (erf(|x|)-c)| <= 2**-59.06 - * Remark: here we use the taylor series expansion at x=1. - * erf(1+s) = erf(1) + s*Poly(s) - * = 0.845.. + P1(s)/Q1(s) - * That is, we use rational approximation to approximate - * erf(1+s) - (c = (single)0.84506291151) - * Note that |P1/Q1|< 0.078 for x in [0.84375,1.25] - * where - * P1(s) = degree 6 poly in s - * Q1(s) = degree 6 poly in s - * - * 3. For x in [1.25,1/0.35(~2.857143)], - * erfc(x) = (1/x)*exp(-x*x-0.5625+R1/S1) - * erf(x) = 1 - erfc(x) - * where - * R1(z) = degree 7 poly in z, (z=1/x^2) - * S1(z) = degree 8 poly in z - * - * 4. For x in [1/0.35,28] - * erfc(x) = (1/x)*exp(-x*x-0.5625+R2/S2) if x > 0 - * = 2.0 - (1/x)*exp(-x*x-0.5625+R2/S2) if -6 x >= 28 - * erf(x) = sign(x) *(1 - tiny) (raise inexact) - * erfc(x) = tiny*tiny (raise underflow) if x > 0 - * = 2 - tiny if x<0 - * - * 7. Special case: - * erf(0) = 0, erf(inf) = 1, erf(-inf) = -1, - * erfc(0) = 1, erfc(inf) = 0, erfc(-inf) = 2, - * erfc/erf(NaN) is NaN - */ - -#include "libm.h" - -static const double -erx = 8.45062911510467529297e-01, /* 0x3FEB0AC1, 0x60000000 */ -/* - * Coefficients for approximation to erf on [0,0.84375] - */ -efx8 = 1.02703333676410069053e+00, /* 0x3FF06EBA, 0x8214DB69 */ -pp0 = 1.28379167095512558561e-01, /* 0x3FC06EBA, 0x8214DB68 */ -pp1 = -3.25042107247001499370e-01, /* 0xBFD4CD7D, 0x691CB913 */ -pp2 = -2.84817495755985104766e-02, /* 0xBF9D2A51, 0xDBD7194F */ -pp3 = -5.77027029648944159157e-03, /* 0xBF77A291, 0x236668E4 */ -pp4 = -2.37630166566501626084e-05, /* 0xBEF8EAD6, 0x120016AC */ -qq1 = 3.97917223959155352819e-01, /* 0x3FD97779, 0xCDDADC09 */ -qq2 = 6.50222499887672944485e-02, /* 0x3FB0A54C, 0x5536CEBA */ -qq3 = 5.08130628187576562776e-03, /* 0x3F74D022, 0xC4D36B0F */ -qq4 = 1.32494738004321644526e-04, /* 0x3F215DC9, 0x221C1A10 */ -qq5 = -3.96022827877536812320e-06, /* 0xBED09C43, 0x42A26120 */ -/* - * Coefficients for approximation to erf in [0.84375,1.25] - */ -pa0 = -2.36211856075265944077e-03, /* 0xBF6359B8, 0xBEF77538 */ -pa1 = 4.14856118683748331666e-01, /* 0x3FDA8D00, 0xAD92B34D */ -pa2 = -3.72207876035701323847e-01, /* 0xBFD7D240, 0xFBB8C3F1 */ -pa3 = 3.18346619901161753674e-01, /* 0x3FD45FCA, 0x805120E4 */ -pa4 = -1.10894694282396677476e-01, /* 0xBFBC6398, 0x3D3E28EC */ -pa5 = 3.54783043256182359371e-02, /* 0x3FA22A36, 0x599795EB */ -pa6 = -2.16637559486879084300e-03, /* 0xBF61BF38, 0x0A96073F */ -qa1 = 1.06420880400844228286e-01, /* 0x3FBB3E66, 0x18EEE323 */ -qa2 = 5.40397917702171048937e-01, /* 0x3FE14AF0, 0x92EB6F33 */ -qa3 = 7.18286544141962662868e-02, /* 0x3FB2635C, 0xD99FE9A7 */ -qa4 = 1.26171219808761642112e-01, /* 0x3FC02660, 0xE763351F */ -qa5 = 1.36370839120290507362e-02, /* 0x3F8BEDC2, 0x6B51DD1C */ -qa6 = 1.19844998467991074170e-02, /* 0x3F888B54, 0x5735151D */ -/* - * Coefficients for approximation to erfc in [1.25,1/0.35] - */ -ra0 = -9.86494403484714822705e-03, /* 0xBF843412, 0x600D6435 */ -ra1 = -6.93858572707181764372e-01, /* 0xBFE63416, 0xE4BA7360 */ -ra2 = -1.05586262253232909814e+01, /* 0xC0251E04, 0x41B0E726 */ -ra3 = -6.23753324503260060396e+01, /* 0xC04F300A, 0xE4CBA38D */ -ra4 = -1.62396669462573470355e+02, /* 0xC0644CB1, 0x84282266 */ -ra5 = -1.84605092906711035994e+02, /* 0xC067135C, 0xEBCCABB2 */ -ra6 = -8.12874355063065934246e+01, /* 0xC0545265, 0x57E4D2F2 */ -ra7 = -9.81432934416914548592e+00, /* 0xC023A0EF, 0xC69AC25C */ -sa1 = 1.96512716674392571292e+01, /* 0x4033A6B9, 0xBD707687 */ -sa2 = 1.37657754143519042600e+02, /* 0x4061350C, 0x526AE721 */ -sa3 = 4.34565877475229228821e+02, /* 0x407B290D, 0xD58A1A71 */ -sa4 = 6.45387271733267880336e+02, /* 0x40842B19, 0x21EC2868 */ -sa5 = 4.29008140027567833386e+02, /* 0x407AD021, 0x57700314 */ -sa6 = 1.08635005541779435134e+02, /* 0x405B28A3, 0xEE48AE2C */ -sa7 = 6.57024977031928170135e+00, /* 0x401A47EF, 0x8E484A93 */ -sa8 = -6.04244152148580987438e-02, /* 0xBFAEEFF2, 0xEE749A62 */ -/* - * Coefficients for approximation to erfc in [1/.35,28] - */ -rb0 = -9.86494292470009928597e-03, /* 0xBF843412, 0x39E86F4A */ -rb1 = -7.99283237680523006574e-01, /* 0xBFE993BA, 0x70C285DE */ -rb2 = -1.77579549177547519889e+01, /* 0xC031C209, 0x555F995A */ -rb3 = -1.60636384855821916062e+02, /* 0xC064145D, 0x43C5ED98 */ -rb4 = -6.37566443368389627722e+02, /* 0xC083EC88, 0x1375F228 */ -rb5 = -1.02509513161107724954e+03, /* 0xC0900461, 0x6A2E5992 */ -rb6 = -4.83519191608651397019e+02, /* 0xC07E384E, 0x9BDC383F */ -sb1 = 3.03380607434824582924e+01, /* 0x403E568B, 0x261D5190 */ -sb2 = 3.25792512996573918826e+02, /* 0x40745CAE, 0x221B9F0A */ -sb3 = 1.53672958608443695994e+03, /* 0x409802EB, 0x189D5118 */ -sb4 = 3.19985821950859553908e+03, /* 0x40A8FFB7, 0x688C246A */ -sb5 = 2.55305040643316442583e+03, /* 0x40A3F219, 0xCEDF3BE6 */ -sb6 = 4.74528541206955367215e+02, /* 0x407DA874, 0xE79FE763 */ -sb7 = -2.24409524465858183362e+01; /* 0xC03670E2, 0x42712D62 */ - -static double erfc1(double x) -{ - double_t s,P,Q; - - s = fabs(x) - 1; - P = pa0+s*(pa1+s*(pa2+s*(pa3+s*(pa4+s*(pa5+s*pa6))))); - Q = 1+s*(qa1+s*(qa2+s*(qa3+s*(qa4+s*(qa5+s*qa6))))); - return 1 - erx - P/Q; -} - -static double erfc2(uint32_t ix, double x) -{ - double_t s,R,S; - double z; - - if (ix < 0x3ff40000) /* |x| < 1.25 */ - return erfc1(x); - - x = fabs(x); - s = 1/(x*x); - if (ix < 0x4006db6d) { /* |x| < 1/.35 ~ 2.85714 */ - R = ra0+s*(ra1+s*(ra2+s*(ra3+s*(ra4+s*( - ra5+s*(ra6+s*ra7)))))); - S = 1.0+s*(sa1+s*(sa2+s*(sa3+s*(sa4+s*( - sa5+s*(sa6+s*(sa7+s*sa8))))))); - } else { /* |x| > 1/.35 */ - R = rb0+s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*( - rb5+s*rb6))))); - S = 1.0+s*(sb1+s*(sb2+s*(sb3+s*(sb4+s*( - sb5+s*(sb6+s*sb7)))))); - } - z = x; - SET_LOW_WORD(z,0); - return exp(-z*z-0.5625)*exp((z-x)*(z+x)+R/S)/x; -} - -double erf(double x) -{ - double r,s,z,y; - uint32_t ix; - int sign; - - GET_HIGH_WORD(ix, x); - sign = ix>>31; - ix &= 0x7fffffff; - if (ix >= 0x7ff00000) { - /* erf(nan)=nan, erf(+-inf)=+-1 */ - return 1-2*sign + 1/x; - } - if (ix < 0x3feb0000) { /* |x| < 0.84375 */ - if (ix < 0x3e300000) { /* |x| < 2**-28 */ - /* avoid underflow */ - return 0.125*(8*x + efx8*x); - } - z = x*x; - r = pp0+z*(pp1+z*(pp2+z*(pp3+z*pp4))); - s = 1.0+z*(qq1+z*(qq2+z*(qq3+z*(qq4+z*qq5)))); - y = r/s; - return x + x*y; - } - if (ix < 0x40180000) /* 0.84375 <= |x| < 6 */ - y = 1 - erfc2(ix,x); - else - y = 1 - 0x1p-1022; - return sign ? -y : y; -} - -double erfc(double x) -{ - double r,s,z,y; - uint32_t ix; - int sign; - - GET_HIGH_WORD(ix, x); - sign = ix>>31; - ix &= 0x7fffffff; - if (ix >= 0x7ff00000) { - /* erfc(nan)=nan, erfc(+-inf)=0,2 */ - return 2*sign + 1/x; - } - if (ix < 0x3feb0000) { /* |x| < 0.84375 */ - if (ix < 0x3c700000) /* |x| < 2**-56 */ - return 1.0 - x; - z = x*x; - r = pp0+z*(pp1+z*(pp2+z*(pp3+z*pp4))); - s = 1.0+z*(qq1+z*(qq2+z*(qq3+z*(qq4+z*qq5)))); - y = r/s; - if (sign || ix < 0x3fd00000) { /* x < 1/4 */ - return 1.0 - (x+x*y); - } - return 0.5 - (x - 0.5 + x*y); - } - if (ix < 0x403c0000) { /* 0.84375 <= |x| < 28 */ - return sign ? 2 - erfc2(ix,x) : erfc2(ix,x); - } - return sign ? 2 - 0x1p-1022 : 0x1p-1022*0x1p-1022; -} diff --git a/waterbox/libc/functions/math/erff.c b/waterbox/libc/functions/math/erff.c deleted file mode 100644 index ed5f397574..0000000000 --- a/waterbox/libc/functions/math/erff.c +++ /dev/null @@ -1,183 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/s_erff.c */ -/* - * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. - */ -/* - * ==================================================== - * 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 "libm.h" - -static const float -erx = 8.4506291151e-01, /* 0x3f58560b */ -/* - * Coefficients for approximation to erf on [0,0.84375] - */ -efx8 = 1.0270333290e+00, /* 0x3f8375d4 */ -pp0 = 1.2837916613e-01, /* 0x3e0375d4 */ -pp1 = -3.2504209876e-01, /* 0xbea66beb */ -pp2 = -2.8481749818e-02, /* 0xbce9528f */ -pp3 = -5.7702702470e-03, /* 0xbbbd1489 */ -pp4 = -2.3763017452e-05, /* 0xb7c756b1 */ -qq1 = 3.9791721106e-01, /* 0x3ecbbbce */ -qq2 = 6.5022252500e-02, /* 0x3d852a63 */ -qq3 = 5.0813062117e-03, /* 0x3ba68116 */ -qq4 = 1.3249473704e-04, /* 0x390aee49 */ -qq5 = -3.9602282413e-06, /* 0xb684e21a */ -/* - * Coefficients for approximation to erf in [0.84375,1.25] - */ -pa0 = -2.3621185683e-03, /* 0xbb1acdc6 */ -pa1 = 4.1485610604e-01, /* 0x3ed46805 */ -pa2 = -3.7220788002e-01, /* 0xbebe9208 */ -pa3 = 3.1834661961e-01, /* 0x3ea2fe54 */ -pa4 = -1.1089469492e-01, /* 0xbde31cc2 */ -pa5 = 3.5478305072e-02, /* 0x3d1151b3 */ -pa6 = -2.1663755178e-03, /* 0xbb0df9c0 */ -qa1 = 1.0642088205e-01, /* 0x3dd9f331 */ -qa2 = 5.4039794207e-01, /* 0x3f0a5785 */ -qa3 = 7.1828655899e-02, /* 0x3d931ae7 */ -qa4 = 1.2617121637e-01, /* 0x3e013307 */ -qa5 = 1.3637083583e-02, /* 0x3c5f6e13 */ -qa6 = 1.1984500103e-02, /* 0x3c445aa3 */ -/* - * Coefficients for approximation to erfc in [1.25,1/0.35] - */ -ra0 = -9.8649440333e-03, /* 0xbc21a093 */ -ra1 = -6.9385856390e-01, /* 0xbf31a0b7 */ -ra2 = -1.0558626175e+01, /* 0xc128f022 */ -ra3 = -6.2375331879e+01, /* 0xc2798057 */ -ra4 = -1.6239666748e+02, /* 0xc322658c */ -ra5 = -1.8460508728e+02, /* 0xc3389ae7 */ -ra6 = -8.1287437439e+01, /* 0xc2a2932b */ -ra7 = -9.8143291473e+00, /* 0xc11d077e */ -sa1 = 1.9651271820e+01, /* 0x419d35ce */ -sa2 = 1.3765776062e+02, /* 0x4309a863 */ -sa3 = 4.3456588745e+02, /* 0x43d9486f */ -sa4 = 6.4538726807e+02, /* 0x442158c9 */ -sa5 = 4.2900814819e+02, /* 0x43d6810b */ -sa6 = 1.0863500214e+02, /* 0x42d9451f */ -sa7 = 6.5702495575e+00, /* 0x40d23f7c */ -sa8 = -6.0424413532e-02, /* 0xbd777f97 */ -/* - * Coefficients for approximation to erfc in [1/.35,28] - */ -rb0 = -9.8649431020e-03, /* 0xbc21a092 */ -rb1 = -7.9928326607e-01, /* 0xbf4c9dd4 */ -rb2 = -1.7757955551e+01, /* 0xc18e104b */ -rb3 = -1.6063638306e+02, /* 0xc320a2ea */ -rb4 = -6.3756646729e+02, /* 0xc41f6441 */ -rb5 = -1.0250950928e+03, /* 0xc480230b */ -rb6 = -4.8351919556e+02, /* 0xc3f1c275 */ -sb1 = 3.0338060379e+01, /* 0x41f2b459 */ -sb2 = 3.2579251099e+02, /* 0x43a2e571 */ -sb3 = 1.5367296143e+03, /* 0x44c01759 */ -sb4 = 3.1998581543e+03, /* 0x4547fdbb */ -sb5 = 2.5530502930e+03, /* 0x451f90ce */ -sb6 = 4.7452853394e+02, /* 0x43ed43a7 */ -sb7 = -2.2440952301e+01; /* 0xc1b38712 */ - -static float erfc1(float x) -{ - float_t s,P,Q; - - s = fabsf(x) - 1; - P = pa0+s*(pa1+s*(pa2+s*(pa3+s*(pa4+s*(pa5+s*pa6))))); - Q = 1+s*(qa1+s*(qa2+s*(qa3+s*(qa4+s*(qa5+s*qa6))))); - return 1 - erx - P/Q; -} - -static float erfc2(uint32_t ix, float x) -{ - float_t s,R,S; - float z; - - if (ix < 0x3fa00000) /* |x| < 1.25 */ - return erfc1(x); - - x = fabsf(x); - s = 1/(x*x); - if (ix < 0x4036db6d) { /* |x| < 1/0.35 */ - R = ra0+s*(ra1+s*(ra2+s*(ra3+s*(ra4+s*( - ra5+s*(ra6+s*ra7)))))); - S = 1.0f+s*(sa1+s*(sa2+s*(sa3+s*(sa4+s*( - sa5+s*(sa6+s*(sa7+s*sa8))))))); - } else { /* |x| >= 1/0.35 */ - R = rb0+s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*( - rb5+s*rb6))))); - S = 1.0f+s*(sb1+s*(sb2+s*(sb3+s*(sb4+s*( - sb5+s*(sb6+s*sb7)))))); - } - GET_FLOAT_WORD(ix, x); - SET_FLOAT_WORD(z, ix&0xffffe000); - return expf(-z*z - 0.5625f) * expf((z-x)*(z+x) + R/S)/x; -} - -float erff(float x) -{ - float r,s,z,y; - uint32_t ix; - int sign; - - GET_FLOAT_WORD(ix, x); - sign = ix>>31; - ix &= 0x7fffffff; - if (ix >= 0x7f800000) { - /* erf(nan)=nan, erf(+-inf)=+-1 */ - return 1-2*sign + 1/x; - } - if (ix < 0x3f580000) { /* |x| < 0.84375 */ - if (ix < 0x31800000) { /* |x| < 2**-28 */ - /*avoid underflow */ - return 0.125f*(8*x + efx8*x); - } - z = x*x; - r = pp0+z*(pp1+z*(pp2+z*(pp3+z*pp4))); - s = 1+z*(qq1+z*(qq2+z*(qq3+z*(qq4+z*qq5)))); - y = r/s; - return x + x*y; - } - if (ix < 0x40c00000) /* |x| < 6 */ - y = 1 - erfc2(ix,x); - else - y = 1 - 0x1p-120f; - return sign ? -y : y; -} - -float erfcf(float x) -{ - float r,s,z,y; - uint32_t ix; - int sign; - - GET_FLOAT_WORD(ix, x); - sign = ix>>31; - ix &= 0x7fffffff; - if (ix >= 0x7f800000) { - /* erfc(nan)=nan, erfc(+-inf)=0,2 */ - return 2*sign + 1/x; - } - - if (ix < 0x3f580000) { /* |x| < 0.84375 */ - if (ix < 0x23800000) /* |x| < 2**-56 */ - return 1.0f - x; - z = x*x; - r = pp0+z*(pp1+z*(pp2+z*(pp3+z*pp4))); - s = 1.0f+z*(qq1+z*(qq2+z*(qq3+z*(qq4+z*qq5)))); - y = r/s; - if (sign || ix < 0x3e800000) /* x < 1/4 */ - return 1.0f - (x+x*y); - return 0.5f - (x - 0.5f + x*y); - } - if (ix < 0x41e00000) { /* |x| < 28 */ - return sign ? 2 - erfc2(ix,x) : erfc2(ix,x); - } - return sign ? 2 - 0x1p-120f : 0x1p-120f*0x1p-120f; -} diff --git a/waterbox/libc/functions/math/erfl.c b/waterbox/libc/functions/math/erfl.c deleted file mode 100644 index e267c23105..0000000000 --- a/waterbox/libc/functions/math/erfl.c +++ /dev/null @@ -1,353 +0,0 @@ -/* origin: OpenBSD /usr/src/lib/libm/src/ld80/e_erfl.c */ -/* - * ==================================================== - * 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. - * ==================================================== - */ -/* - * Copyright (c) 2008 Stephen L. Moshier - * - * 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 THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR 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. - */ -/* double erf(double x) - * double erfc(double x) - * x - * 2 |\ - * erf(x) = --------- | exp(-t*t)dt - * sqrt(pi) \| - * 0 - * - * erfc(x) = 1-erf(x) - * Note that - * erf(-x) = -erf(x) - * erfc(-x) = 2 - erfc(x) - * - * Method: - * 1. For |x| in [0, 0.84375] - * erf(x) = x + x*R(x^2) - * erfc(x) = 1 - erf(x) if x in [-.84375,0.25] - * = 0.5 + ((0.5-x)-x*R) if x in [0.25,0.84375] - * Remark. The formula is derived by noting - * erf(x) = (2/sqrt(pi))*(x - x^3/3 + x^5/10 - x^7/42 + ....) - * and that - * 2/sqrt(pi) = 1.128379167095512573896158903121545171688 - * is close to one. The interval is chosen because the fix - * point of erf(x) is near 0.6174 (i.e., erf(x)=x when x is - * near 0.6174), and by some experiment, 0.84375 is chosen to - * guarantee the error is less than one ulp for erf. - * - * 2. For |x| in [0.84375,1.25], let s = |x| - 1, and - * c = 0.84506291151 rounded to single (24 bits) - * erf(x) = sign(x) * (c + P1(s)/Q1(s)) - * erfc(x) = (1-c) - P1(s)/Q1(s) if x > 0 - * 1+(c+P1(s)/Q1(s)) if x < 0 - * Remark: here we use the taylor series expansion at x=1. - * erf(1+s) = erf(1) + s*Poly(s) - * = 0.845.. + P1(s)/Q1(s) - * Note that |P1/Q1|< 0.078 for x in [0.84375,1.25] - * - * 3. For x in [1.25,1/0.35(~2.857143)], - * erfc(x) = (1/x)*exp(-x*x-0.5625+R1(z)/S1(z)) - * z=1/x^2 - * erf(x) = 1 - erfc(x) - * - * 4. For x in [1/0.35,107] - * erfc(x) = (1/x)*exp(-x*x-0.5625+R2/S2) if x > 0 - * = 2.0 - (1/x)*exp(-x*x-0.5625+R2(z)/S2(z)) - * if -6.666 x >= 107 - * erf(x) = sign(x) *(1 - tiny) (raise inexact) - * erfc(x) = tiny*tiny (raise underflow) if x > 0 - * = 2 - tiny if x<0 - * - * 7. Special case: - * erf(0) = 0, erf(inf) = 1, erf(-inf) = -1, - * erfc(0) = 1, erfc(inf) = 0, erfc(-inf) = 2, - * erfc/erf(NaN) is NaN - */ - - -#include "libm.h" - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long double erfl(long double x) -{ - return erf(x); -} -long double erfcl(long double x) -{ - return erfc(x); -} -#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384 -static const long double -erx = 0.845062911510467529296875L, - -/* - * Coefficients for approximation to erf on [0,0.84375] - */ -/* 8 * (2/sqrt(pi) - 1) */ -efx8 = 1.0270333367641005911692712249723613735048E0L, -pp[6] = { - 1.122751350964552113068262337278335028553E6L, - -2.808533301997696164408397079650699163276E6L, - -3.314325479115357458197119660818768924100E5L, - -6.848684465326256109712135497895525446398E4L, - -2.657817695110739185591505062971929859314E3L, - -1.655310302737837556654146291646499062882E2L, -}, -qq[6] = { - 8.745588372054466262548908189000448124232E6L, - 3.746038264792471129367533128637019611485E6L, - 7.066358783162407559861156173539693900031E5L, - 7.448928604824620999413120955705448117056E4L, - 4.511583986730994111992253980546131408924E3L, - 1.368902937933296323345610240009071254014E2L, - /* 1.000000000000000000000000000000000000000E0 */ -}, - -/* - * Coefficients for approximation to erf in [0.84375,1.25] - */ -/* erf(x+1) = 0.845062911510467529296875 + pa(x)/qa(x) - -0.15625 <= x <= +.25 - Peak relative error 8.5e-22 */ -pa[8] = { - -1.076952146179812072156734957705102256059E0L, - 1.884814957770385593365179835059971587220E2L, - -5.339153975012804282890066622962070115606E1L, - 4.435910679869176625928504532109635632618E1L, - 1.683219516032328828278557309642929135179E1L, - -2.360236618396952560064259585299045804293E0L, - 1.852230047861891953244413872297940938041E0L, - 9.394994446747752308256773044667843200719E-2L, -}, -qa[7] = { - 4.559263722294508998149925774781887811255E2L, - 3.289248982200800575749795055149780689738E2L, - 2.846070965875643009598627918383314457912E2L, - 1.398715859064535039433275722017479994465E2L, - 6.060190733759793706299079050985358190726E1L, - 2.078695677795422351040502569964299664233E1L, - 4.641271134150895940966798357442234498546E0L, - /* 1.000000000000000000000000000000000000000E0 */ -}, - -/* - * Coefficients for approximation to erfc in [1.25,1/0.35] - */ -/* erfc(1/x) = x exp (-1/x^2 - 0.5625 + ra(x^2)/sa(x^2)) - 1/2.85711669921875 < 1/x < 1/1.25 - Peak relative error 3.1e-21 */ -ra[] = { - 1.363566591833846324191000679620738857234E-1L, - 1.018203167219873573808450274314658434507E1L, - 1.862359362334248675526472871224778045594E2L, - 1.411622588180721285284945138667933330348E3L, - 5.088538459741511988784440103218342840478E3L, - 8.928251553922176506858267311750789273656E3L, - 7.264436000148052545243018622742770549982E3L, - 2.387492459664548651671894725748959751119E3L, - 2.220916652813908085449221282808458466556E2L, -}, -sa[] = { - -1.382234625202480685182526402169222331847E1L, - -3.315638835627950255832519203687435946482E2L, - -2.949124863912936259747237164260785326692E3L, - -1.246622099070875940506391433635999693661E4L, - -2.673079795851665428695842853070996219632E4L, - -2.880269786660559337358397106518918220991E4L, - -1.450600228493968044773354186390390823713E4L, - -2.874539731125893533960680525192064277816E3L, - -1.402241261419067750237395034116942296027E2L, - /* 1.000000000000000000000000000000000000000E0 */ -}, - -/* - * Coefficients for approximation to erfc in [1/.35,107] - */ -/* erfc(1/x) = x exp (-1/x^2 - 0.5625 + rb(x^2)/sb(x^2)) - 1/6.6666259765625 < 1/x < 1/2.85711669921875 - Peak relative error 4.2e-22 */ -rb[] = { - -4.869587348270494309550558460786501252369E-5L, - -4.030199390527997378549161722412466959403E-3L, - -9.434425866377037610206443566288917589122E-2L, - -9.319032754357658601200655161585539404155E-1L, - -4.273788174307459947350256581445442062291E0L, - -8.842289940696150508373541814064198259278E0L, - -7.069215249419887403187988144752613025255E0L, - -1.401228723639514787920274427443330704764E0L, -}, -sb[] = { - 4.936254964107175160157544545879293019085E-3L, - 1.583457624037795744377163924895349412015E-1L, - 1.850647991850328356622940552450636420484E0L, - 9.927611557279019463768050710008450625415E0L, - 2.531667257649436709617165336779212114570E1L, - 2.869752886406743386458304052862814690045E1L, - 1.182059497870819562441683560749192539345E1L, - /* 1.000000000000000000000000000000000000000E0 */ -}, -/* erfc(1/x) = x exp (-1/x^2 - 0.5625 + rc(x^2)/sc(x^2)) - 1/107 <= 1/x <= 1/6.6666259765625 - Peak relative error 1.1e-21 */ -rc[] = { - -8.299617545269701963973537248996670806850E-5L, - -6.243845685115818513578933902532056244108E-3L, - -1.141667210620380223113693474478394397230E-1L, - -7.521343797212024245375240432734425789409E-1L, - -1.765321928311155824664963633786967602934E0L, - -1.029403473103215800456761180695263439188E0L, -}, -sc[] = { - 8.413244363014929493035952542677768808601E-3L, - 2.065114333816877479753334599639158060979E-1L, - 1.639064941530797583766364412782135680148E0L, - 4.936788463787115555582319302981666347450E0L, - 5.005177727208955487404729933261347679090E0L, - /* 1.000000000000000000000000000000000000000E0 */ -}; - -static long double erfc1(long double x) -{ - long double s,P,Q; - - s = fabsl(x) - 1; - P = pa[0] + s * (pa[1] + s * (pa[2] + - s * (pa[3] + s * (pa[4] + s * (pa[5] + s * (pa[6] + s * pa[7])))))); - Q = qa[0] + s * (qa[1] + s * (qa[2] + - s * (qa[3] + s * (qa[4] + s * (qa[5] + s * (qa[6] + s)))))); - return 1 - erx - P / Q; -} - -static long double erfc2(uint32_t ix, long double x) -{ - union ldshape u; - long double s,z,R,S; - - if (ix < 0x3fffa000) /* 0.84375 <= |x| < 1.25 */ - return erfc1(x); - - x = fabsl(x); - s = 1 / (x * x); - if (ix < 0x4000b6db) { /* 1.25 <= |x| < 2.857 ~ 1/.35 */ - R = ra[0] + s * (ra[1] + s * (ra[2] + s * (ra[3] + s * (ra[4] + - s * (ra[5] + s * (ra[6] + s * (ra[7] + s * ra[8]))))))); - S = sa[0] + s * (sa[1] + s * (sa[2] + s * (sa[3] + s * (sa[4] + - s * (sa[5] + s * (sa[6] + s * (sa[7] + s * (sa[8] + s)))))))); - } else if (ix < 0x4001d555) { /* 2.857 <= |x| < 6.6666259765625 */ - R = rb[0] + s * (rb[1] + s * (rb[2] + s * (rb[3] + s * (rb[4] + - s * (rb[5] + s * (rb[6] + s * rb[7])))))); - S = sb[0] + s * (sb[1] + s * (sb[2] + s * (sb[3] + s * (sb[4] + - s * (sb[5] + s * (sb[6] + s)))))); - } else { /* 6.666 <= |x| < 107 (erfc only) */ - R = rc[0] + s * (rc[1] + s * (rc[2] + s * (rc[3] + - s * (rc[4] + s * rc[5])))); - S = sc[0] + s * (sc[1] + s * (sc[2] + s * (sc[3] + - s * (sc[4] + s)))); - } - u.f = x; - u.i.m &= -1ULL << 40; - z = u.f; - return expl(-z*z - 0.5625) * expl((z - x) * (z + x) + R / S) / x; -} - -long double erfl(long double x) -{ - long double r, s, z, y; - union ldshape u = {x}; - uint32_t ix = (u.i.se & 0x7fffU)<<16 | u.i.m>>48; - int sign = u.i.se >> 15; - - if (ix >= 0x7fff0000) - /* erf(nan)=nan, erf(+-inf)=+-1 */ - return 1 - 2*sign + 1/x; - if (ix < 0x3ffed800) { /* |x| < 0.84375 */ - if (ix < 0x3fde8000) { /* |x| < 2**-33 */ - return 0.125 * (8 * x + efx8 * x); /* avoid underflow */ - } - z = x * x; - r = pp[0] + z * (pp[1] + - z * (pp[2] + z * (pp[3] + z * (pp[4] + z * pp[5])))); - s = qq[0] + z * (qq[1] + - z * (qq[2] + z * (qq[3] + z * (qq[4] + z * (qq[5] + z))))); - y = r / s; - return x + x * y; - } - if (ix < 0x4001d555) /* |x| < 6.6666259765625 */ - y = 1 - erfc2(ix,x); - else - y = 1 - 0x1p-16382L; - return sign ? -y : y; -} - -long double erfcl(long double x) -{ - long double r, s, z, y; - union ldshape u = {x}; - uint32_t ix = (u.i.se & 0x7fffU)<<16 | u.i.m>>48; - int sign = u.i.se >> 15; - - if (ix >= 0x7fff0000) - /* erfc(nan) = nan, erfc(+-inf) = 0,2 */ - return 2*sign + 1/x; - if (ix < 0x3ffed800) { /* |x| < 0.84375 */ - if (ix < 0x3fbe0000) /* |x| < 2**-65 */ - return 1.0 - x; - z = x * x; - r = pp[0] + z * (pp[1] + - z * (pp[2] + z * (pp[3] + z * (pp[4] + z * pp[5])))); - s = qq[0] + z * (qq[1] + - z * (qq[2] + z * (qq[3] + z * (qq[4] + z * (qq[5] + z))))); - y = r / s; - if (ix < 0x3ffd8000) /* x < 1/4 */ - return 1.0 - (x + x * y); - return 0.5 - (x - 0.5 + x * y); - } - if (ix < 0x4005d600) /* |x| < 107 */ - return sign ? 2 - erfc2(ix,x) : erfc2(ix,x); - y = 0x1p-16382L; - return sign ? 2 - y : y*y; -} -#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384 -// TODO: broken implementation to make things compile -long double erfl(long double x) -{ - return erf(x); -} -long double erfcl(long double x) -{ - return erfc(x); -} -#endif diff --git a/waterbox/libc/functions/math/exp.c b/waterbox/libc/functions/math/exp.c deleted file mode 100644 index 9ea672fac6..0000000000 --- a/waterbox/libc/functions/math/exp.c +++ /dev/null @@ -1,134 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/e_exp.c */ -/* - * ==================================================== - * Copyright (C) 2004 by Sun Microsystems, Inc. All rights reserved. - * - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ -/* exp(x) - * Returns the exponential of x. - * - * Method - * 1. Argument reduction: - * Reduce x to an r so that |r| <= 0.5*ln2 ~ 0.34658. - * Given x, find r and integer k such that - * - * x = k*ln2 + r, |r| <= 0.5*ln2. - * - * Here r will be represented as r = hi-lo for better - * accuracy. - * - * 2. Approximation of exp(r) by a special rational function on - * the interval [0,0.34658]: - * Write - * R(r**2) = r*(exp(r)+1)/(exp(r)-1) = 2 + r*r/6 - r**4/360 + ... - * We use a special Remez algorithm on [0,0.34658] to generate - * a polynomial of degree 5 to approximate R. The maximum error - * of this polynomial approximation is bounded by 2**-59. In - * other words, - * R(z) ~ 2.0 + P1*z + P2*z**2 + P3*z**3 + P4*z**4 + P5*z**5 - * (where z=r*r, and the values of P1 to P5 are listed below) - * and - * | 5 | -59 - * | 2.0+P1*z+...+P5*z - R(z) | <= 2 - * | | - * The computation of exp(r) thus becomes - * 2*r - * exp(r) = 1 + ---------- - * R(r) - r - * r*c(r) - * = 1 + r + ----------- (for better accuracy) - * 2 - c(r) - * where - * 2 4 10 - * c(r) = r - (P1*r + P2*r + ... + P5*r ). - * - * 3. Scale back to obtain exp(x): - * From step 1, we have - * exp(x) = 2^k * exp(r) - * - * Special cases: - * exp(INF) is INF, exp(NaN) is NaN; - * exp(-INF) is 0, and - * for finite argument, only exp(0)=1 is exact. - * - * Accuracy: - * according to an error analysis, the error is always less than - * 1 ulp (unit in the last place). - * - * Misc. info. - * For IEEE double - * if x > 709.782712893383973096 then exp(x) overflows - * if x < -745.133219101941108420 then exp(x) underflows - */ - -#include "libm.h" - -static const double -half[2] = {0.5,-0.5}, -ln2hi = 6.93147180369123816490e-01, /* 0x3fe62e42, 0xfee00000 */ -ln2lo = 1.90821492927058770002e-10, /* 0x3dea39ef, 0x35793c76 */ -invln2 = 1.44269504088896338700e+00, /* 0x3ff71547, 0x652b82fe */ -P1 = 1.66666666666666019037e-01, /* 0x3FC55555, 0x5555553E */ -P2 = -2.77777777770155933842e-03, /* 0xBF66C16C, 0x16BEBD93 */ -P3 = 6.61375632143793436117e-05, /* 0x3F11566A, 0xAF25DE2C */ -P4 = -1.65339022054652515390e-06, /* 0xBEBBBD41, 0xC5D26BF1 */ -P5 = 4.13813679705723846039e-08; /* 0x3E663769, 0x72BEA4D0 */ - -double exp(double x) -{ - double_t hi, lo, c, xx, y; - int k, sign; - uint32_t hx; - - GET_HIGH_WORD(hx, x); - sign = hx>>31; - hx &= 0x7fffffff; /* high word of |x| */ - - /* special cases */ - if (hx >= 0x4086232b) { /* if |x| >= 708.39... */ - if (isnan(x)) - return x; - if (x > 709.782712893383973096) { - /* overflow if x!=inf */ - x *= 0x1p1023; - return x; - } - if (x < -708.39641853226410622) { - /* underflow if x!=-inf */ - FORCE_EVAL((float)(-0x1p-149/x)); - if (x < -745.13321910194110842) - return 0; - } - } - - /* argument reduction */ - if (hx > 0x3fd62e42) { /* if |x| > 0.5 ln2 */ - if (hx >= 0x3ff0a2b2) /* if |x| >= 1.5 ln2 */ - k = (int)(invln2*x + half[sign]); - else - k = 1 - sign - sign; - hi = x - k*ln2hi; /* k*ln2hi is exact here */ - lo = k*ln2lo; - x = hi - lo; - } else if (hx > 0x3e300000) { /* if |x| > 2**-28 */ - k = 0; - hi = x; - lo = 0; - } else { - /* inexact if x!=0 */ - FORCE_EVAL(0x1p1023 + x); - return 1 + x; - } - - /* x is now in primary range */ - xx = x*x; - c = x - xx*(P1+xx*(P2+xx*(P3+xx*(P4+xx*P5)))); - y = 1 + (x*c/(2-c) - lo + hi); - if (k == 0) - return y; - return scalbn(y, k); -} diff --git a/waterbox/libc/functions/math/exp10.c b/waterbox/libc/functions/math/exp10.c deleted file mode 100644 index 0634a75169..0000000000 --- a/waterbox/libc/functions/math/exp10.c +++ /dev/null @@ -1,25 +0,0 @@ -#define _GNU_SOURCE -#include -#include -#include "_alias.h" - -double exp10(double x) -{ - static const double p10[] = { - 1e-15, 1e-14, 1e-13, 1e-12, 1e-11, 1e-10, - 1e-9, 1e-8, 1e-7, 1e-6, 1e-5, 1e-4, 1e-3, 1e-2, 1e-1, - 1, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, - 1e10, 1e11, 1e12, 1e13, 1e14, 1e15 - }; - double n, y = modf(x, &n); - union {double f; uint64_t i;} u = {n}; - /* fabs(n) < 16 without raising invalid on nan */ - if ((u.i>>52 & 0x7ff) < 0x3ff+4) { - if (!y) return p10[(int)n+15]; - y = exp2(3.32192809488736234787031942948939 * y); - return y * p10[(int)n+15]; - } - return pow(10.0, x); -} - -weak_alias(exp10, pow10); diff --git a/waterbox/libc/functions/math/exp10f.c b/waterbox/libc/functions/math/exp10f.c deleted file mode 100644 index 23abd90599..0000000000 --- a/waterbox/libc/functions/math/exp10f.c +++ /dev/null @@ -1,23 +0,0 @@ -#define _GNU_SOURCE -#include -#include -#include "_alias.h" - -float exp10f(float x) -{ - static const float p10[] = { - 1e-7f, 1e-6f, 1e-5f, 1e-4f, 1e-3f, 1e-2f, 1e-1f, - 1, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7 - }; - float n, y = modff(x, &n); - union {float f; uint32_t i;} u = {n}; - /* fabsf(n) < 8 without raising invalid on nan */ - if ((u.i>>23 & 0xff) < 0x7f+3) { - if (!y) return p10[(int)n+7]; - y = exp2f(3.32192809488736234787031942948939f * y); - return y * p10[(int)n+7]; - } - return exp2(3.32192809488736234787031942948939 * x); -} - -weak_alias(exp10f, pow10f); diff --git a/waterbox/libc/functions/math/exp10l.c b/waterbox/libc/functions/math/exp10l.c deleted file mode 100644 index 125c5bb13b..0000000000 --- a/waterbox/libc/functions/math/exp10l.c +++ /dev/null @@ -1,33 +0,0 @@ -#define _GNU_SOURCE -#include -#include -#include "_alias.h" -#include "libm.h" - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long double exp10l(long double x) -{ - return exp10(x); -} -#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384 -long double exp10l(long double x) -{ - static const long double p10[] = { - 1e-15L, 1e-14L, 1e-13L, 1e-12L, 1e-11L, 1e-10L, - 1e-9L, 1e-8L, 1e-7L, 1e-6L, 1e-5L, 1e-4L, 1e-3L, 1e-2L, 1e-1L, - 1, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, - 1e10, 1e11, 1e12, 1e13, 1e14, 1e15 - }; - long double n, y = modfl(x, &n); - union ldshape u = {n}; - /* fabsl(n) < 16 without raising invalid on nan */ - if ((u.i.se & 0x7fff) < 0x3fff+4) { - if (!y) return p10[(int)n+15]; - y = exp2l(3.32192809488736234787031942948939L * y); - return y * p10[(int)n+15]; - } - return powl(10.0, x); -} -#endif - -weak_alias(exp10l, pow10l); diff --git a/waterbox/libc/functions/math/exp2.c b/waterbox/libc/functions/math/exp2.c deleted file mode 100644 index e14adba530..0000000000 --- a/waterbox/libc/functions/math/exp2.c +++ /dev/null @@ -1,375 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/s_exp2.c */ -/*- - * Copyright (c) 2005 David Schultz - * 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. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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 "libm.h" - -#define TBLSIZE 256 - -static const double -redux = 0x1.8p52 / TBLSIZE, -P1 = 0x1.62e42fefa39efp-1, -P2 = 0x1.ebfbdff82c575p-3, -P3 = 0x1.c6b08d704a0a6p-5, -P4 = 0x1.3b2ab88f70400p-7, -P5 = 0x1.5d88003875c74p-10; - -static const double tbl[TBLSIZE * 2] = { -/* exp2(z + eps) eps */ - 0x1.6a09e667f3d5dp-1, 0x1.9880p-44, - 0x1.6b052fa751744p-1, 0x1.8000p-50, - 0x1.6c012750bd9fep-1, -0x1.8780p-45, - 0x1.6cfdcddd476bfp-1, 0x1.ec00p-46, - 0x1.6dfb23c651a29p-1, -0x1.8000p-50, - 0x1.6ef9298593ae3p-1, -0x1.c000p-52, - 0x1.6ff7df9519386p-1, -0x1.fd80p-45, - 0x1.70f7466f42da3p-1, -0x1.c880p-45, - 0x1.71f75e8ec5fc3p-1, 0x1.3c00p-46, - 0x1.72f8286eacf05p-1, -0x1.8300p-44, - 0x1.73f9a48a58152p-1, -0x1.0c00p-47, - 0x1.74fbd35d7ccfcp-1, 0x1.f880p-45, - 0x1.75feb564267f1p-1, 0x1.3e00p-47, - 0x1.77024b1ab6d48p-1, -0x1.7d00p-45, - 0x1.780694fde5d38p-1, -0x1.d000p-50, - 0x1.790b938ac1d00p-1, 0x1.3000p-49, - 0x1.7a11473eb0178p-1, -0x1.d000p-49, - 0x1.7b17b0976d060p-1, 0x1.0400p-45, - 0x1.7c1ed0130c133p-1, 0x1.0000p-53, - 0x1.7d26a62ff8636p-1, -0x1.6900p-45, - 0x1.7e2f336cf4e3bp-1, -0x1.2e00p-47, - 0x1.7f3878491c3e8p-1, -0x1.4580p-45, - 0x1.80427543e1b4ep-1, 0x1.3000p-44, - 0x1.814d2add1071ap-1, 0x1.f000p-47, - 0x1.82589994ccd7ep-1, -0x1.1c00p-45, - 0x1.8364c1eb942d0p-1, 0x1.9d00p-45, - 0x1.8471a4623cab5p-1, 0x1.7100p-43, - 0x1.857f4179f5bbcp-1, 0x1.2600p-45, - 0x1.868d99b4491afp-1, -0x1.2c40p-44, - 0x1.879cad931a395p-1, -0x1.3000p-45, - 0x1.88ac7d98a65b8p-1, -0x1.a800p-45, - 0x1.89bd0a4785800p-1, -0x1.d000p-49, - 0x1.8ace5422aa223p-1, 0x1.3280p-44, - 0x1.8be05bad619fap-1, 0x1.2b40p-43, - 0x1.8cf3216b54383p-1, -0x1.ed00p-45, - 0x1.8e06a5e08664cp-1, -0x1.0500p-45, - 0x1.8f1ae99157807p-1, 0x1.8280p-45, - 0x1.902fed0282c0ep-1, -0x1.cb00p-46, - 0x1.9145b0b91ff96p-1, -0x1.5e00p-47, - 0x1.925c353aa2ff9p-1, 0x1.5400p-48, - 0x1.93737b0cdc64ap-1, 0x1.7200p-46, - 0x1.948b82b5f98aep-1, -0x1.9000p-47, - 0x1.95a44cbc852cbp-1, 0x1.5680p-45, - 0x1.96bdd9a766f21p-1, -0x1.6d00p-44, - 0x1.97d829fde4e2ap-1, -0x1.1000p-47, - 0x1.98f33e47a23a3p-1, 0x1.d000p-45, - 0x1.9a0f170ca0604p-1, -0x1.8a40p-44, - 0x1.9b2bb4d53ff89p-1, 0x1.55c0p-44, - 0x1.9c49182a3f15bp-1, 0x1.6b80p-45, - 0x1.9d674194bb8c5p-1, -0x1.c000p-49, - 0x1.9e86319e3238ep-1, 0x1.7d00p-46, - 0x1.9fa5e8d07f302p-1, 0x1.6400p-46, - 0x1.a0c667b5de54dp-1, -0x1.5000p-48, - 0x1.a1e7aed8eb8f6p-1, 0x1.9e00p-47, - 0x1.a309bec4a2e27p-1, 0x1.ad80p-45, - 0x1.a42c980460a5dp-1, -0x1.af00p-46, - 0x1.a5503b23e259bp-1, 0x1.b600p-47, - 0x1.a674a8af46213p-1, 0x1.8880p-44, - 0x1.a799e1330b3a7p-1, 0x1.1200p-46, - 0x1.a8bfe53c12e8dp-1, 0x1.6c00p-47, - 0x1.a9e6b5579fcd2p-1, -0x1.9b80p-45, - 0x1.ab0e521356fb8p-1, 0x1.b700p-45, - 0x1.ac36bbfd3f381p-1, 0x1.9000p-50, - 0x1.ad5ff3a3c2780p-1, 0x1.4000p-49, - 0x1.ae89f995ad2a3p-1, -0x1.c900p-45, - 0x1.afb4ce622f367p-1, 0x1.6500p-46, - 0x1.b0e07298db790p-1, 0x1.fd40p-45, - 0x1.b20ce6c9a89a9p-1, 0x1.2700p-46, - 0x1.b33a2b84f1a4bp-1, 0x1.d470p-43, - 0x1.b468415b747e7p-1, -0x1.8380p-44, - 0x1.b59728de5593ap-1, 0x1.8000p-54, - 0x1.b6c6e29f1c56ap-1, 0x1.ad00p-47, - 0x1.b7f76f2fb5e50p-1, 0x1.e800p-50, - 0x1.b928cf22749b2p-1, -0x1.4c00p-47, - 0x1.ba5b030a10603p-1, -0x1.d700p-47, - 0x1.bb8e0b79a6f66p-1, 0x1.d900p-47, - 0x1.bcc1e904bc1ffp-1, 0x1.2a00p-47, - 0x1.bdf69c3f3a16fp-1, -0x1.f780p-46, - 0x1.bf2c25bd71db8p-1, -0x1.0a00p-46, - 0x1.c06286141b2e9p-1, -0x1.1400p-46, - 0x1.c199bdd8552e0p-1, 0x1.be00p-47, - 0x1.c2d1cd9fa64eep-1, -0x1.9400p-47, - 0x1.c40ab5fffd02fp-1, -0x1.ed00p-47, - 0x1.c544778fafd15p-1, 0x1.9660p-44, - 0x1.c67f12e57d0cbp-1, -0x1.a100p-46, - 0x1.c7ba88988c1b6p-1, -0x1.8458p-42, - 0x1.c8f6d9406e733p-1, -0x1.a480p-46, - 0x1.ca3405751c4dfp-1, 0x1.b000p-51, - 0x1.cb720dcef9094p-1, 0x1.1400p-47, - 0x1.ccb0f2e6d1689p-1, 0x1.0200p-48, - 0x1.cdf0b555dc412p-1, 0x1.3600p-48, - 0x1.cf3155b5bab3bp-1, -0x1.6900p-47, - 0x1.d072d4a0789bcp-1, 0x1.9a00p-47, - 0x1.d1b532b08c8fap-1, -0x1.5e00p-46, - 0x1.d2f87080d8a85p-1, 0x1.d280p-46, - 0x1.d43c8eacaa203p-1, 0x1.1a00p-47, - 0x1.d5818dcfba491p-1, 0x1.f000p-50, - 0x1.d6c76e862e6a1p-1, -0x1.3a00p-47, - 0x1.d80e316c9834ep-1, -0x1.cd80p-47, - 0x1.d955d71ff6090p-1, 0x1.4c00p-48, - 0x1.da9e603db32aep-1, 0x1.f900p-48, - 0x1.dbe7cd63a8325p-1, 0x1.9800p-49, - 0x1.dd321f301b445p-1, -0x1.5200p-48, - 0x1.de7d5641c05bfp-1, -0x1.d700p-46, - 0x1.dfc97337b9aecp-1, -0x1.6140p-46, - 0x1.e11676b197d5ep-1, 0x1.b480p-47, - 0x1.e264614f5a3e7p-1, 0x1.0ce0p-43, - 0x1.e3b333b16ee5cp-1, 0x1.c680p-47, - 0x1.e502ee78b3fb4p-1, -0x1.9300p-47, - 0x1.e653924676d68p-1, -0x1.5000p-49, - 0x1.e7a51fbc74c44p-1, -0x1.7f80p-47, - 0x1.e8f7977cdb726p-1, -0x1.3700p-48, - 0x1.ea4afa2a490e8p-1, 0x1.5d00p-49, - 0x1.eb9f4867ccae4p-1, 0x1.61a0p-46, - 0x1.ecf482d8e680dp-1, 0x1.5500p-48, - 0x1.ee4aaa2188514p-1, 0x1.6400p-51, - 0x1.efa1bee615a13p-1, -0x1.e800p-49, - 0x1.f0f9c1cb64106p-1, -0x1.a880p-48, - 0x1.f252b376bb963p-1, -0x1.c900p-45, - 0x1.f3ac948dd7275p-1, 0x1.a000p-53, - 0x1.f50765b6e4524p-1, -0x1.4f00p-48, - 0x1.f6632798844fdp-1, 0x1.a800p-51, - 0x1.f7bfdad9cbe38p-1, 0x1.abc0p-48, - 0x1.f91d802243c82p-1, -0x1.4600p-50, - 0x1.fa7c1819e908ep-1, -0x1.b0c0p-47, - 0x1.fbdba3692d511p-1, -0x1.0e00p-51, - 0x1.fd3c22b8f7194p-1, -0x1.0de8p-46, - 0x1.fe9d96b2a23eep-1, 0x1.e430p-49, - 0x1.0000000000000p+0, 0x0.0000p+0, - 0x1.00b1afa5abcbep+0, -0x1.3400p-52, - 0x1.0163da9fb3303p+0, -0x1.2170p-46, - 0x1.02168143b0282p+0, 0x1.a400p-52, - 0x1.02c9a3e77806cp+0, 0x1.f980p-49, - 0x1.037d42e11bbcap+0, -0x1.7400p-51, - 0x1.04315e86e7f89p+0, 0x1.8300p-50, - 0x1.04e5f72f65467p+0, -0x1.a3f0p-46, - 0x1.059b0d315855ap+0, -0x1.2840p-47, - 0x1.0650a0e3c1f95p+0, 0x1.1600p-48, - 0x1.0706b29ddf71ap+0, 0x1.5240p-46, - 0x1.07bd42b72a82dp+0, -0x1.9a00p-49, - 0x1.0874518759bd0p+0, 0x1.6400p-49, - 0x1.092bdf66607c8p+0, -0x1.0780p-47, - 0x1.09e3ecac6f383p+0, -0x1.8000p-54, - 0x1.0a9c79b1f3930p+0, 0x1.fa00p-48, - 0x1.0b5586cf988fcp+0, -0x1.ac80p-48, - 0x1.0c0f145e46c8ap+0, 0x1.9c00p-50, - 0x1.0cc922b724816p+0, 0x1.5200p-47, - 0x1.0d83b23395dd8p+0, -0x1.ad00p-48, - 0x1.0e3ec32d3d1f3p+0, 0x1.bac0p-46, - 0x1.0efa55fdfa9a6p+0, -0x1.4e80p-47, - 0x1.0fb66affed2f0p+0, -0x1.d300p-47, - 0x1.1073028d7234bp+0, 0x1.1500p-48, - 0x1.11301d0125b5bp+0, 0x1.c000p-49, - 0x1.11edbab5e2af9p+0, 0x1.6bc0p-46, - 0x1.12abdc06c31d5p+0, 0x1.8400p-49, - 0x1.136a814f2047dp+0, -0x1.ed00p-47, - 0x1.1429aaea92de9p+0, 0x1.8e00p-49, - 0x1.14e95934f3138p+0, 0x1.b400p-49, - 0x1.15a98c8a58e71p+0, 0x1.5300p-47, - 0x1.166a45471c3dfp+0, 0x1.3380p-47, - 0x1.172b83c7d5211p+0, 0x1.8d40p-45, - 0x1.17ed48695bb9fp+0, -0x1.5d00p-47, - 0x1.18af9388c8d93p+0, -0x1.c880p-46, - 0x1.1972658375d66p+0, 0x1.1f00p-46, - 0x1.1a35beb6fcba7p+0, 0x1.0480p-46, - 0x1.1af99f81387e3p+0, -0x1.7390p-43, - 0x1.1bbe084045d54p+0, 0x1.4e40p-45, - 0x1.1c82f95281c43p+0, -0x1.a200p-47, - 0x1.1d4873168b9b2p+0, 0x1.3800p-49, - 0x1.1e0e75eb44031p+0, 0x1.ac00p-49, - 0x1.1ed5022fcd938p+0, 0x1.1900p-47, - 0x1.1f9c18438cdf7p+0, -0x1.b780p-46, - 0x1.2063b88628d8fp+0, 0x1.d940p-45, - 0x1.212be3578a81ep+0, 0x1.8000p-50, - 0x1.21f49917ddd41p+0, 0x1.b340p-45, - 0x1.22bdda2791323p+0, 0x1.9f80p-46, - 0x1.2387a6e7561e7p+0, -0x1.9c80p-46, - 0x1.2451ffb821427p+0, 0x1.2300p-47, - 0x1.251ce4fb2a602p+0, -0x1.3480p-46, - 0x1.25e85711eceb0p+0, 0x1.2700p-46, - 0x1.26b4565e27d16p+0, 0x1.1d00p-46, - 0x1.2780e341de00fp+0, 0x1.1ee0p-44, - 0x1.284dfe1f5633ep+0, -0x1.4c00p-46, - 0x1.291ba7591bb30p+0, -0x1.3d80p-46, - 0x1.29e9df51fdf09p+0, 0x1.8b00p-47, - 0x1.2ab8a66d10e9bp+0, -0x1.27c0p-45, - 0x1.2b87fd0dada3ap+0, 0x1.a340p-45, - 0x1.2c57e39771af9p+0, -0x1.0800p-46, - 0x1.2d285a6e402d9p+0, -0x1.ed00p-47, - 0x1.2df961f641579p+0, -0x1.4200p-48, - 0x1.2ecafa93e2ecfp+0, -0x1.4980p-45, - 0x1.2f9d24abd8822p+0, -0x1.6300p-46, - 0x1.306fe0a31b625p+0, -0x1.2360p-44, - 0x1.31432edeea50bp+0, -0x1.0df8p-40, - 0x1.32170fc4cd7b8p+0, -0x1.2480p-45, - 0x1.32eb83ba8e9a2p+0, -0x1.5980p-45, - 0x1.33c08b2641766p+0, 0x1.ed00p-46, - 0x1.3496266e3fa27p+0, -0x1.c000p-50, - 0x1.356c55f929f0fp+0, -0x1.0d80p-44, - 0x1.36431a2de88b9p+0, 0x1.2c80p-45, - 0x1.371a7373aaa39p+0, 0x1.0600p-45, - 0x1.37f26231e74fep+0, -0x1.6600p-46, - 0x1.38cae6d05d838p+0, -0x1.ae00p-47, - 0x1.39a401b713ec3p+0, -0x1.4720p-43, - 0x1.3a7db34e5a020p+0, 0x1.8200p-47, - 0x1.3b57fbfec6e95p+0, 0x1.e800p-44, - 0x1.3c32dc313a8f2p+0, 0x1.f800p-49, - 0x1.3d0e544ede122p+0, -0x1.7a00p-46, - 0x1.3dea64c1234bbp+0, 0x1.6300p-45, - 0x1.3ec70df1c4eccp+0, -0x1.8a60p-43, - 0x1.3fa4504ac7e8cp+0, -0x1.cdc0p-44, - 0x1.40822c367a0bbp+0, 0x1.5b80p-45, - 0x1.4160a21f72e95p+0, 0x1.ec00p-46, - 0x1.423fb27094646p+0, -0x1.3600p-46, - 0x1.431f5d950a920p+0, 0x1.3980p-45, - 0x1.43ffa3f84b9ebp+0, 0x1.a000p-48, - 0x1.44e0860618919p+0, -0x1.6c00p-48, - 0x1.45c2042a7d201p+0, -0x1.bc00p-47, - 0x1.46a41ed1d0016p+0, -0x1.2800p-46, - 0x1.4786d668b3326p+0, 0x1.0e00p-44, - 0x1.486a2b5c13c00p+0, -0x1.d400p-45, - 0x1.494e1e192af04p+0, 0x1.c200p-47, - 0x1.4a32af0d7d372p+0, -0x1.e500p-46, - 0x1.4b17dea6db801p+0, 0x1.7800p-47, - 0x1.4bfdad53629e1p+0, -0x1.3800p-46, - 0x1.4ce41b817c132p+0, 0x1.0800p-47, - 0x1.4dcb299fddddbp+0, 0x1.c700p-45, - 0x1.4eb2d81d8ab96p+0, -0x1.ce00p-46, - 0x1.4f9b2769d2d02p+0, 0x1.9200p-46, - 0x1.508417f4531c1p+0, -0x1.8c00p-47, - 0x1.516daa2cf662ap+0, -0x1.a000p-48, - 0x1.5257de83f51eap+0, 0x1.a080p-43, - 0x1.5342b569d4edap+0, -0x1.6d80p-45, - 0x1.542e2f4f6ac1ap+0, -0x1.2440p-44, - 0x1.551a4ca5d94dbp+0, 0x1.83c0p-43, - 0x1.56070dde9116bp+0, 0x1.4b00p-45, - 0x1.56f4736b529dep+0, 0x1.15a0p-43, - 0x1.57e27dbe2c40ep+0, -0x1.9e00p-45, - 0x1.58d12d497c76fp+0, -0x1.3080p-45, - 0x1.59c0827ff0b4cp+0, 0x1.dec0p-43, - 0x1.5ab07dd485427p+0, -0x1.4000p-51, - 0x1.5ba11fba87af4p+0, 0x1.0080p-44, - 0x1.5c9268a59460bp+0, -0x1.6c80p-45, - 0x1.5d84590998e3fp+0, 0x1.69a0p-43, - 0x1.5e76f15ad20e1p+0, -0x1.b400p-46, - 0x1.5f6a320dcebcap+0, 0x1.7700p-46, - 0x1.605e1b976dcb8p+0, 0x1.6f80p-45, - 0x1.6152ae6cdf715p+0, 0x1.1000p-47, - 0x1.6247eb03a5531p+0, -0x1.5d00p-46, - 0x1.633dd1d1929b5p+0, -0x1.2d00p-46, - 0x1.6434634ccc313p+0, -0x1.a800p-49, - 0x1.652b9febc8efap+0, -0x1.8600p-45, - 0x1.6623882553397p+0, 0x1.1fe0p-40, - 0x1.671c1c708328ep+0, -0x1.7200p-44, - 0x1.68155d44ca97ep+0, 0x1.6800p-49, - 0x1.690f4b19e9471p+0, -0x1.9780p-45, -}; - -/* - * exp2(x): compute the base 2 exponential of x - * - * Accuracy: Peak error < 0.503 ulp for normalized results. - * - * Method: (accurate tables) - * - * Reduce x: - * x = k + y, for integer k and |y| <= 1/2. - * Thus we have exp2(x) = 2**k * exp2(y). - * - * Reduce y: - * y = i/TBLSIZE + z - eps[i] for integer i near y * TBLSIZE. - * Thus we have exp2(y) = exp2(i/TBLSIZE) * exp2(z - eps[i]), - * with |z - eps[i]| <= 2**-9 + 2**-39 for the table used. - * - * We compute exp2(i/TBLSIZE) via table lookup and exp2(z - eps[i]) via - * a degree-5 minimax polynomial with maximum error under 1.3 * 2**-61. - * The values in exp2t[] and eps[] are chosen such that - * exp2t[i] = exp2(i/TBLSIZE + eps[i]), and eps[i] is a small offset such - * that exp2t[i] is accurate to 2**-64. - * - * Note that the range of i is +-TBLSIZE/2, so we actually index the tables - * by i0 = i + TBLSIZE/2. For cache efficiency, exp2t[] and eps[] are - * virtual tables, interleaved in the real table tbl[]. - * - * This method is due to Gal, with many details due to Gal and Bachelis: - * - * Gal, S. and Bachelis, B. An Accurate Elementary Mathematical Library - * for the IEEE Floating Point Standard. TOMS 17(1), 26-46 (1991). - */ -double exp2(double x) -{ - double_t r, t, z; - uint32_t ix, i0; - union {double f; uint64_t i;} u = {x}; - union {uint32_t u; int32_t i;} k; - - /* Filter out exceptional cases. */ - ix = u.i>>32 & 0x7fffffff; - if (ix >= 0x408ff000) { /* |x| >= 1022 or nan */ - if (ix >= 0x40900000 && u.i>>63 == 0) { /* x >= 1024 or nan */ - /* overflow */ - x *= 0x1p1023; - return x; - } - if (ix >= 0x7ff00000) /* -inf or -nan */ - return -1/x; - if (u.i>>63) { /* x <= -1022 */ - /* underflow */ - if (x <= -1075 || x - 0x1p52 + 0x1p52 != x) - FORCE_EVAL((float)(-0x1p-149/x)); - if (x <= -1075) - return 0; - } - } else if (ix < 0x3c900000) { /* |x| < 0x1p-54 */ - return 1.0 + x; - } - - /* Reduce x, computing z, i0, and k. */ - u.f = x + redux; - i0 = u.i; - i0 += TBLSIZE / 2; - k.u = i0 / TBLSIZE * TBLSIZE; - k.i /= TBLSIZE; - i0 %= TBLSIZE; - u.f -= redux; - z = x - u.f; - - /* Compute r = exp2(y) = exp2t[i0] * p(z - eps[i]). */ - t = tbl[2*i0]; /* exp2t[i0] */ - z -= tbl[2*i0 + 1]; /* eps[i0] */ - r = t + t * z * (P1 + z * (P2 + z * (P3 + z * (P4 + z * P5)))); - - return scalbn(r, k.i); -} diff --git a/waterbox/libc/functions/math/exp2f.c b/waterbox/libc/functions/math/exp2f.c deleted file mode 100644 index 296b63436f..0000000000 --- a/waterbox/libc/functions/math/exp2f.c +++ /dev/null @@ -1,126 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/s_exp2f.c */ -/*- - * Copyright (c) 2005 David Schultz - * 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. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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 "libm.h" - -#define TBLSIZE 16 - -static const float -redux = 0x1.8p23f / TBLSIZE, -P1 = 0x1.62e430p-1f, -P2 = 0x1.ebfbe0p-3f, -P3 = 0x1.c6b348p-5f, -P4 = 0x1.3b2c9cp-7f; - -static const double exp2ft[TBLSIZE] = { - 0x1.6a09e667f3bcdp-1, - 0x1.7a11473eb0187p-1, - 0x1.8ace5422aa0dbp-1, - 0x1.9c49182a3f090p-1, - 0x1.ae89f995ad3adp-1, - 0x1.c199bdd85529cp-1, - 0x1.d5818dcfba487p-1, - 0x1.ea4afa2a490dap-1, - 0x1.0000000000000p+0, - 0x1.0b5586cf9890fp+0, - 0x1.172b83c7d517bp+0, - 0x1.2387a6e756238p+0, - 0x1.306fe0a31b715p+0, - 0x1.3dea64c123422p+0, - 0x1.4bfdad5362a27p+0, - 0x1.5ab07dd485429p+0, -}; - -/* - * exp2f(x): compute the base 2 exponential of x - * - * Accuracy: Peak error < 0.501 ulp; location of peak: -0.030110927. - * - * Method: (equally-spaced tables) - * - * Reduce x: - * x = k + y, for integer k and |y| <= 1/2. - * Thus we have exp2f(x) = 2**k * exp2(y). - * - * Reduce y: - * y = i/TBLSIZE + z for integer i near y * TBLSIZE. - * Thus we have exp2(y) = exp2(i/TBLSIZE) * exp2(z), - * with |z| <= 2**-(TBLSIZE+1). - * - * We compute exp2(i/TBLSIZE) via table lookup and exp2(z) via a - * degree-4 minimax polynomial with maximum error under 1.4 * 2**-33. - * Using double precision for everything except the reduction makes - * roundoff error insignificant and simplifies the scaling step. - * - * This method is due to Tang, but I do not use his suggested parameters: - * - * Tang, P. Table-driven Implementation of the Exponential Function - * in IEEE Floating-Point Arithmetic. TOMS 15(2), 144-157 (1989). - */ -float exp2f(float x) -{ - double_t t, r, z; - union {float f; uint32_t i;} u = {x}; - union {double f; uint64_t i;} uk; - uint32_t ix, i0, k; - - /* Filter out exceptional cases. */ - ix = u.i & 0x7fffffff; - if (ix > 0x42fc0000) { /* |x| > 126 */ - if (ix > 0x7f800000) /* NaN */ - return x; - if (u.i >= 0x43000000 && u.i < 0x80000000) { /* x >= 128 */ - x *= 0x1p127f; - return x; - } - if (u.i >= 0x80000000) { /* x < -126 */ - if (u.i >= 0xc3160000 || (u.i & 0x0000ffff)) - FORCE_EVAL(-0x1p-149f/x); - if (u.i >= 0xc3160000) /* x <= -150 */ - return 0; - } - } else if (ix <= 0x33000000) { /* |x| <= 0x1p-25 */ - return 1.0f + x; - } - - /* Reduce x, computing z, i0, and k. */ - u.f = x + redux; - i0 = u.i; - i0 += TBLSIZE / 2; - k = i0 / TBLSIZE; - uk.i = (uint64_t)(0x3ff + k)<<52; - i0 &= TBLSIZE - 1; - u.f -= redux; - z = x - u.f; - /* Compute r = exp2(y) = exp2ft[i0] * p(z). */ - r = exp2ft[i0]; - t = r * z; - r = r + t * (P1 + z * P2) + t * (z * z) * (P3 + z * P4); - - /* Scale by 2**k */ - return r * uk.f; -} diff --git a/waterbox/libc/functions/math/exp2l.c b/waterbox/libc/functions/math/exp2l.c deleted file mode 100644 index 3565c1e67d..0000000000 --- a/waterbox/libc/functions/math/exp2l.c +++ /dev/null @@ -1,619 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/ld80/s_exp2l.c and /usr/src/lib/msun/ld128/s_exp2l.c */ -/*- - * Copyright (c) 2005-2008 David Schultz - * 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. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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 "libm.h" - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long double exp2l(long double x) -{ - return exp2(x); -} -#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384 -#define TBLBITS 7 -#define TBLSIZE (1 << TBLBITS) - -static const double -redux = 0x1.8p63 / TBLSIZE, -P1 = 0x1.62e42fefa39efp-1, -P2 = 0x1.ebfbdff82c58fp-3, -P3 = 0x1.c6b08d7049fap-5, -P4 = 0x1.3b2ab6fba4da5p-7, -P5 = 0x1.5d8804780a736p-10, -P6 = 0x1.430918835e33dp-13; - -static const double tbl[TBLSIZE * 2] = { - 0x1.6a09e667f3bcdp-1, -0x1.bdd3413b2648p-55, - 0x1.6c012750bdabfp-1, -0x1.2895667ff0cp-57, - 0x1.6dfb23c651a2fp-1, -0x1.bbe3a683c88p-58, - 0x1.6ff7df9519484p-1, -0x1.83c0f25860fp-56, - 0x1.71f75e8ec5f74p-1, -0x1.16e4786887bp-56, - 0x1.73f9a48a58174p-1, -0x1.0a8d96c65d5p-55, - 0x1.75feb564267c9p-1, -0x1.0245957316ep-55, - 0x1.780694fde5d3fp-1, 0x1.866b80a0216p-55, - 0x1.7a11473eb0187p-1, -0x1.41577ee0499p-56, - 0x1.7c1ed0130c132p-1, 0x1.f124cd1164ep-55, - 0x1.7e2f336cf4e62p-1, 0x1.05d02ba157ap-57, - 0x1.80427543e1a12p-1, -0x1.27c86626d97p-55, - 0x1.82589994cce13p-1, -0x1.d4c1dd41533p-55, - 0x1.8471a4623c7adp-1, -0x1.8d684a341cep-56, - 0x1.868d99b4492edp-1, -0x1.fc6f89bd4f68p-55, - 0x1.88ac7d98a6699p-1, 0x1.994c2f37cb5p-55, - 0x1.8ace5422aa0dbp-1, 0x1.6e9f156864bp-55, - 0x1.8cf3216b5448cp-1, -0x1.0d55e32e9e4p-57, - 0x1.8f1ae99157736p-1, 0x1.5cc13a2e397p-56, - 0x1.9145b0b91ffc6p-1, -0x1.dd6792e5825p-55, - 0x1.93737b0cdc5e5p-1, -0x1.75fc781b58p-58, - 0x1.95a44cbc8520fp-1, -0x1.64b7c96a5fp-57, - 0x1.97d829fde4e5p-1, -0x1.d185b7c1b86p-55, - 0x1.9a0f170ca07bap-1, -0x1.173bd91cee6p-55, - 0x1.9c49182a3f09p-1, 0x1.c7c46b071f2p-57, - 0x1.9e86319e32323p-1, 0x1.824ca78e64cp-57, - 0x1.a0c667b5de565p-1, -0x1.359495d1cd5p-55, - 0x1.a309bec4a2d33p-1, 0x1.6305c7ddc368p-55, - 0x1.a5503b23e255dp-1, -0x1.d2f6edb8d42p-55, - 0x1.a799e1330b358p-1, 0x1.bcb7ecac564p-55, - 0x1.a9e6b5579fdbfp-1, 0x1.0fac90ef7fdp-55, - 0x1.ac36bbfd3f37ap-1, -0x1.f9234cae76dp-56, - 0x1.ae89f995ad3adp-1, 0x1.7a1cd345dcc8p-55, - 0x1.b0e07298db666p-1, -0x1.bdef54c80e4p-55, - 0x1.b33a2b84f15fbp-1, -0x1.2805e3084d8p-58, - 0x1.b59728de5593ap-1, -0x1.c71dfbbba6ep-55, - 0x1.b7f76f2fb5e47p-1, -0x1.5584f7e54acp-57, - 0x1.ba5b030a1064ap-1, -0x1.efcd30e5429p-55, - 0x1.bcc1e904bc1d2p-1, 0x1.23dd07a2d9fp-56, - 0x1.bf2c25bd71e09p-1, -0x1.efdca3f6b9c8p-55, - 0x1.c199bdd85529cp-1, 0x1.11065895049p-56, - 0x1.c40ab5fffd07ap-1, 0x1.b4537e083c6p-55, - 0x1.c67f12e57d14bp-1, 0x1.2884dff483c8p-55, - 0x1.c8f6d9406e7b5p-1, 0x1.1acbc48805cp-57, - 0x1.cb720dcef9069p-1, 0x1.503cbd1e94ap-57, - 0x1.cdf0b555dc3fap-1, -0x1.dd83b53829dp-56, - 0x1.d072d4a07897cp-1, -0x1.cbc3743797a8p-55, - 0x1.d2f87080d89f2p-1, -0x1.d487b719d858p-55, - 0x1.d5818dcfba487p-1, 0x1.2ed02d75b37p-56, - 0x1.d80e316c98398p-1, -0x1.11ec18bedep-55, - 0x1.da9e603db3285p-1, 0x1.c2300696db5p-55, - 0x1.dd321f301b46p-1, 0x1.2da5778f019p-55, - 0x1.dfc97337b9b5fp-1, -0x1.1a5cd4f184b8p-55, - 0x1.e264614f5a129p-1, -0x1.7b627817a148p-55, - 0x1.e502ee78b3ff6p-1, 0x1.39e8980a9cdp-56, - 0x1.e7a51fbc74c83p-1, 0x1.2d522ca0c8ep-55, - 0x1.ea4afa2a490dap-1, -0x1.e9c23179c288p-55, - 0x1.ecf482d8e67f1p-1, -0x1.c93f3b411ad8p-55, - 0x1.efa1bee615a27p-1, 0x1.dc7f486a4b68p-55, - 0x1.f252b376bba97p-1, 0x1.3a1a5bf0d8e8p-55, - 0x1.f50765b6e454p-1, 0x1.9d3e12dd8a18p-55, - 0x1.f7bfdad9cbe14p-1, -0x1.dbb12d00635p-55, - 0x1.fa7c1819e90d8p-1, 0x1.74853f3a593p-56, - 0x1.fd3c22b8f71f1p-1, 0x1.2eb74966578p-58, - 0x1p+0, 0x0p+0, - 0x1.0163da9fb3335p+0, 0x1.b61299ab8cd8p-54, - 0x1.02c9a3e778061p+0, -0x1.19083535b08p-56, - 0x1.04315e86e7f85p+0, -0x1.0a31c1977c98p-54, - 0x1.059b0d3158574p+0, 0x1.d73e2a475b4p-55, - 0x1.0706b29ddf6dep+0, -0x1.c91dfe2b13cp-55, - 0x1.0874518759bc8p+0, 0x1.186be4bb284p-57, - 0x1.09e3ecac6f383p+0, 0x1.14878183161p-54, - 0x1.0b5586cf9890fp+0, 0x1.8a62e4adc61p-54, - 0x1.0cc922b7247f7p+0, 0x1.01edc16e24f8p-54, - 0x1.0e3ec32d3d1a2p+0, 0x1.03a1727c58p-59, - 0x1.0fb66affed31bp+0, -0x1.b9bedc44ebcp-57, - 0x1.11301d0125b51p+0, -0x1.6c51039449bp-54, - 0x1.12abdc06c31ccp+0, -0x1.1b514b36ca8p-58, - 0x1.1429aaea92dep+0, -0x1.32fbf9af1368p-54, - 0x1.15a98c8a58e51p+0, 0x1.2406ab9eeabp-55, - 0x1.172b83c7d517bp+0, -0x1.19041b9d78ap-55, - 0x1.18af9388c8deap+0, -0x1.11023d1970f8p-54, - 0x1.1a35beb6fcb75p+0, 0x1.e5b4c7b4969p-55, - 0x1.1bbe084045cd4p+0, -0x1.95386352ef6p-54, - 0x1.1d4873168b9aap+0, 0x1.e016e00a264p-54, - 0x1.1ed5022fcd91dp+0, -0x1.1df98027bb78p-54, - 0x1.2063b88628cd6p+0, 0x1.dc775814a85p-55, - 0x1.21f49917ddc96p+0, 0x1.2a97e9494a6p-55, - 0x1.2387a6e756238p+0, 0x1.9b07eb6c7058p-54, - 0x1.251ce4fb2a63fp+0, 0x1.ac155bef4f5p-55, - 0x1.26b4565e27cddp+0, 0x1.2bd339940eap-55, - 0x1.284dfe1f56381p+0, -0x1.a4c3a8c3f0d8p-54, - 0x1.29e9df51fdee1p+0, 0x1.612e8afad12p-55, - 0x1.2b87fd0dad99p+0, -0x1.10adcd6382p-59, - 0x1.2d285a6e4030bp+0, 0x1.0024754db42p-54, - 0x1.2ecafa93e2f56p+0, 0x1.1ca0f45d524p-56, - 0x1.306fe0a31b715p+0, 0x1.6f46ad23183p-55, - 0x1.32170fc4cd831p+0, 0x1.a9ce78e1804p-55, - 0x1.33c08b26416ffp+0, 0x1.327218436598p-54, - 0x1.356c55f929ff1p+0, -0x1.b5cee5c4e46p-55, - 0x1.371a7373aa9cbp+0, -0x1.63aeabf42ebp-54, - 0x1.38cae6d05d866p+0, -0x1.e958d3c99048p-54, - 0x1.3a7db34e59ff7p+0, -0x1.5e436d661f6p-56, - 0x1.3c32dc313a8e5p+0, -0x1.efff8375d2ap-54, - 0x1.3dea64c123422p+0, 0x1.ada0911f09fp-55, - 0x1.3fa4504ac801cp+0, -0x1.7d023f956fap-54, - 0x1.4160a21f72e2ap+0, -0x1.ef3691c309p-58, - 0x1.431f5d950a897p+0, -0x1.1c7dde35f7ap-55, - 0x1.44e086061892dp+0, 0x1.89b7a04ef8p-59, - 0x1.46a41ed1d0057p+0, 0x1.c944bd1648a8p-54, - 0x1.486a2b5c13cdp+0, 0x1.3c1a3b69062p-56, - 0x1.4a32af0d7d3dep+0, 0x1.9cb62f3d1be8p-54, - 0x1.4bfdad5362a27p+0, 0x1.d4397afec42p-56, - 0x1.4dcb299fddd0dp+0, 0x1.8ecdbbc6a78p-54, - 0x1.4f9b2769d2ca7p+0, -0x1.4b309d25958p-54, - 0x1.516daa2cf6642p+0, -0x1.f768569bd94p-55, - 0x1.5342b569d4f82p+0, -0x1.07abe1db13dp-55, - 0x1.551a4ca5d920fp+0, -0x1.d689cefede6p-55, - 0x1.56f4736b527dap+0, 0x1.9bb2c011d938p-54, - 0x1.58d12d497c7fdp+0, 0x1.295e15b9a1ep-55, - 0x1.5ab07dd485429p+0, 0x1.6324c0546478p-54, - 0x1.5c9268a5946b7p+0, 0x1.c4b1b81698p-60, - 0x1.5e76f15ad2148p+0, 0x1.ba6f93080e68p-54, - 0x1.605e1b976dc09p+0, -0x1.3e2429b56de8p-54, - 0x1.6247eb03a5585p+0, -0x1.383c17e40b48p-54, - 0x1.6434634ccc32p+0, -0x1.c483c759d89p-55, - 0x1.6623882552225p+0, -0x1.bb60987591cp-54, - 0x1.68155d44ca973p+0, 0x1.038ae44f74p-57, -}; - -/* - * exp2l(x): compute the base 2 exponential of x - * - * Accuracy: Peak error < 0.511 ulp. - * - * Method: (equally-spaced tables) - * - * Reduce x: - * x = 2**k + y, for integer k and |y| <= 1/2. - * Thus we have exp2l(x) = 2**k * exp2(y). - * - * Reduce y: - * y = i/TBLSIZE + z for integer i near y * TBLSIZE. - * Thus we have exp2(y) = exp2(i/TBLSIZE) * exp2(z), - * with |z| <= 2**-(TBLBITS+1). - * - * We compute exp2(i/TBLSIZE) via table lookup and exp2(z) via a - * degree-6 minimax polynomial with maximum error under 2**-69. - * The table entries each have 104 bits of accuracy, encoded as - * a pair of double precision values. - */ -long double exp2l(long double x) -{ - union ldshape u = {x}; - int e = u.i.se & 0x7fff; - long double r, z; - uint32_t i0; - union {uint32_t u; int32_t i;} k; - - /* Filter out exceptional cases. */ - if (e >= 0x3fff + 13) { /* |x| >= 8192 or x is NaN */ - if (u.i.se >= 0x3fff + 14 && u.i.se >> 15 == 0) - /* overflow */ - return x * 0x1p16383L; - if (e == 0x7fff) /* -inf or -nan */ - return -1/x; - if (x < -16382) { - if (x <= -16446 || x - 0x1p63 + 0x1p63 != x) - /* underflow */ - FORCE_EVAL((float)(-0x1p-149/x)); - if (x <= -16446) - return 0; - } - } else if (e < 0x3fff - 64) { - return 1 + x; - } - - /* - * Reduce x, computing z, i0, and k. The low bits of x + redux - * contain the 16-bit integer part of the exponent (k) followed by - * TBLBITS fractional bits (i0). We use bit tricks to extract these - * as integers, then set z to the remainder. - * - * Example: Suppose x is 0xabc.123456p0 and TBLBITS is 8. - * Then the low-order word of x + redux is 0x000abc12, - * We split this into k = 0xabc and i0 = 0x12 (adjusted to - * index into the table), then we compute z = 0x0.003456p0. - */ - u.f = x + redux; - i0 = u.i.m + TBLSIZE / 2; - k.u = i0 / TBLSIZE * TBLSIZE; - k.i /= TBLSIZE; - i0 %= TBLSIZE; - u.f -= redux; - z = x - u.f; - - /* Compute r = exp2l(y) = exp2lt[i0] * p(z). */ - long double t_hi = tbl[2*i0]; - long double t_lo = tbl[2*i0 + 1]; - /* XXX This gives > 1 ulp errors outside of FE_TONEAREST mode */ - r = t_lo + (t_hi + t_lo) * z * (P1 + z * (P2 + z * (P3 + z * (P4 - + z * (P5 + z * P6))))) + t_hi; - - return scalbnl(r, k.i); -} -#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384 -#define TBLBITS 7 -#define TBLSIZE (1 << TBLBITS) - -static const long double - P1 = 0x1.62e42fefa39ef35793c7673007e6p-1L, - P2 = 0x1.ebfbdff82c58ea86f16b06ec9736p-3L, - P3 = 0x1.c6b08d704a0bf8b33a762bad3459p-5L, - P4 = 0x1.3b2ab6fba4e7729ccbbe0b4f3fc2p-7L, - P5 = 0x1.5d87fe78a67311071dee13fd11d9p-10L, - P6 = 0x1.430912f86c7876f4b663b23c5fe5p-13L; - -static const double - P7 = 0x1.ffcbfc588b041p-17, - P8 = 0x1.62c0223a5c7c7p-20, - P9 = 0x1.b52541ff59713p-24, - P10 = 0x1.e4cf56a391e22p-28, - redux = 0x1.8p112 / TBLSIZE; - -static const long double tbl[TBLSIZE] = { - 0x1.6a09e667f3bcc908b2fb1366dfeap-1L, - 0x1.6c012750bdabeed76a99800f4edep-1L, - 0x1.6dfb23c651a2ef220e2cbe1bc0d4p-1L, - 0x1.6ff7df9519483cf87e1b4f3e1e98p-1L, - 0x1.71f75e8ec5f73dd2370f2ef0b148p-1L, - 0x1.73f9a48a58173bd5c9a4e68ab074p-1L, - 0x1.75feb564267c8bf6e9aa33a489a8p-1L, - 0x1.780694fde5d3f619ae02808592a4p-1L, - 0x1.7a11473eb0186d7d51023f6ccb1ap-1L, - 0x1.7c1ed0130c1327c49334459378dep-1L, - 0x1.7e2f336cf4e62105d02ba1579756p-1L, - 0x1.80427543e1a11b60de67649a3842p-1L, - 0x1.82589994cce128acf88afab34928p-1L, - 0x1.8471a4623c7acce52f6b97c6444cp-1L, - 0x1.868d99b4492ec80e41d90ac2556ap-1L, - 0x1.88ac7d98a669966530bcdf2d4cc0p-1L, - 0x1.8ace5422aa0db5ba7c55a192c648p-1L, - 0x1.8cf3216b5448bef2aa1cd161c57ap-1L, - 0x1.8f1ae991577362b982745c72eddap-1L, - 0x1.9145b0b91ffc588a61b469f6b6a0p-1L, - 0x1.93737b0cdc5e4f4501c3f2540ae8p-1L, - 0x1.95a44cbc8520ee9b483695a0e7fep-1L, - 0x1.97d829fde4e4f8b9e920f91e8eb6p-1L, - 0x1.9a0f170ca07b9ba3109b8c467844p-1L, - 0x1.9c49182a3f0901c7c46b071f28dep-1L, - 0x1.9e86319e323231824ca78e64c462p-1L, - 0x1.a0c667b5de564b29ada8b8cabbacp-1L, - 0x1.a309bec4a2d3358c171f770db1f4p-1L, - 0x1.a5503b23e255c8b424491caf88ccp-1L, - 0x1.a799e1330b3586f2dfb2b158f31ep-1L, - 0x1.a9e6b5579fdbf43eb243bdff53a2p-1L, - 0x1.ac36bbfd3f379c0db966a3126988p-1L, - 0x1.ae89f995ad3ad5e8734d17731c80p-1L, - 0x1.b0e07298db66590842acdfc6fb4ep-1L, - 0x1.b33a2b84f15faf6bfd0e7bd941b0p-1L, - 0x1.b59728de559398e3881111648738p-1L, - 0x1.b7f76f2fb5e46eaa7b081ab53ff6p-1L, - 0x1.ba5b030a10649840cb3c6af5b74cp-1L, - 0x1.bcc1e904bc1d2247ba0f45b3d06cp-1L, - 0x1.bf2c25bd71e088408d7025190cd0p-1L, - 0x1.c199bdd85529c2220cb12a0916bap-1L, - 0x1.c40ab5fffd07a6d14df820f17deap-1L, - 0x1.c67f12e57d14b4a2137fd20f2a26p-1L, - 0x1.c8f6d9406e7b511acbc48805c3f6p-1L, - 0x1.cb720dcef90691503cbd1e949d0ap-1L, - 0x1.cdf0b555dc3f9c44f8958fac4f12p-1L, - 0x1.d072d4a07897b8d0f22f21a13792p-1L, - 0x1.d2f87080d89f18ade123989ea50ep-1L, - 0x1.d5818dcfba48725da05aeb66dff8p-1L, - 0x1.d80e316c98397bb84f9d048807a0p-1L, - 0x1.da9e603db3285708c01a5b6d480cp-1L, - 0x1.dd321f301b4604b695de3c0630c0p-1L, - 0x1.dfc97337b9b5eb968cac39ed284cp-1L, - 0x1.e264614f5a128a12761fa17adc74p-1L, - 0x1.e502ee78b3ff6273d130153992d0p-1L, - 0x1.e7a51fbc74c834b548b2832378a4p-1L, - 0x1.ea4afa2a490d9858f73a18f5dab4p-1L, - 0x1.ecf482d8e67f08db0312fb949d50p-1L, - 0x1.efa1bee615a27771fd21a92dabb6p-1L, - 0x1.f252b376bba974e8696fc3638f24p-1L, - 0x1.f50765b6e4540674f84b762861a6p-1L, - 0x1.f7bfdad9cbe138913b4bfe72bd78p-1L, - 0x1.fa7c1819e90d82e90a7e74b26360p-1L, - 0x1.fd3c22b8f71f10975ba4b32bd006p-1L, - 0x1.0000000000000000000000000000p+0L, - 0x1.0163da9fb33356d84a66ae336e98p+0L, - 0x1.02c9a3e778060ee6f7caca4f7a18p+0L, - 0x1.04315e86e7f84bd738f9a20da442p+0L, - 0x1.059b0d31585743ae7c548eb68c6ap+0L, - 0x1.0706b29ddf6ddc6dc403a9d87b1ep+0L, - 0x1.0874518759bc808c35f25d942856p+0L, - 0x1.09e3ecac6f3834521e060c584d5cp+0L, - 0x1.0b5586cf9890f6298b92b7184200p+0L, - 0x1.0cc922b7247f7407b705b893dbdep+0L, - 0x1.0e3ec32d3d1a2020742e4f8af794p+0L, - 0x1.0fb66affed31af232091dd8a169ep+0L, - 0x1.11301d0125b50a4ebbf1aed9321cp+0L, - 0x1.12abdc06c31cbfb92bad324d6f84p+0L, - 0x1.1429aaea92ddfb34101943b2588ep+0L, - 0x1.15a98c8a58e512480d573dd562aep+0L, - 0x1.172b83c7d517adcdf7c8c50eb162p+0L, - 0x1.18af9388c8de9bbbf70b9a3c269cp+0L, - 0x1.1a35beb6fcb753cb698f692d2038p+0L, - 0x1.1bbe084045cd39ab1e72b442810ep+0L, - 0x1.1d4873168b9aa7805b8028990be8p+0L, - 0x1.1ed5022fcd91cb8819ff61121fbep+0L, - 0x1.2063b88628cd63b8eeb0295093f6p+0L, - 0x1.21f49917ddc962552fd29294bc20p+0L, - 0x1.2387a6e75623866c1fadb1c159c0p+0L, - 0x1.251ce4fb2a63f3582ab7de9e9562p+0L, - 0x1.26b4565e27cdd257a673281d3068p+0L, - 0x1.284dfe1f5638096cf15cf03c9fa0p+0L, - 0x1.29e9df51fdee12c25d15f5a25022p+0L, - 0x1.2b87fd0dad98ffddea46538fca24p+0L, - 0x1.2d285a6e4030b40091d536d0733ep+0L, - 0x1.2ecafa93e2f5611ca0f45d5239a4p+0L, - 0x1.306fe0a31b7152de8d5a463063bep+0L, - 0x1.32170fc4cd8313539cf1c3009330p+0L, - 0x1.33c08b26416ff4c9c8610d96680ep+0L, - 0x1.356c55f929ff0c94623476373be4p+0L, - 0x1.371a7373aa9caa7145502f45452ap+0L, - 0x1.38cae6d05d86585a9cb0d9bed530p+0L, - 0x1.3a7db34e59ff6ea1bc9299e0a1fep+0L, - 0x1.3c32dc313a8e484001f228b58cf0p+0L, - 0x1.3dea64c12342235b41223e13d7eep+0L, - 0x1.3fa4504ac801ba0bf701aa417b9cp+0L, - 0x1.4160a21f72e29f84325b8f3dbacap+0L, - 0x1.431f5d950a896dc704439410b628p+0L, - 0x1.44e086061892d03136f409df0724p+0L, - 0x1.46a41ed1d005772512f459229f0ap+0L, - 0x1.486a2b5c13cd013c1a3b69062f26p+0L, - 0x1.4a32af0d7d3de672d8bcf46f99b4p+0L, - 0x1.4bfdad5362a271d4397afec42e36p+0L, - 0x1.4dcb299fddd0d63b36ef1a9e19dep+0L, - 0x1.4f9b2769d2ca6ad33d8b69aa0b8cp+0L, - 0x1.516daa2cf6641c112f52c84d6066p+0L, - 0x1.5342b569d4f81df0a83c49d86bf4p+0L, - 0x1.551a4ca5d920ec52ec620243540cp+0L, - 0x1.56f4736b527da66ecb004764e61ep+0L, - 0x1.58d12d497c7fd252bc2b7343d554p+0L, - 0x1.5ab07dd48542958c93015191e9a8p+0L, - 0x1.5c9268a5946b701c4b1b81697ed4p+0L, - 0x1.5e76f15ad21486e9be4c20399d12p+0L, - 0x1.605e1b976dc08b076f592a487066p+0L, - 0x1.6247eb03a5584b1f0fa06fd2d9eap+0L, - 0x1.6434634ccc31fc76f8714c4ee122p+0L, - 0x1.66238825522249127d9e29b92ea2p+0L, - 0x1.68155d44ca973081c57227b9f69ep+0L, -}; - -static const float eps[TBLSIZE] = { - -0x1.5c50p-101, - -0x1.5d00p-106, - 0x1.8e90p-102, - -0x1.5340p-103, - 0x1.1bd0p-102, - -0x1.4600p-105, - -0x1.7a40p-104, - 0x1.d590p-102, - -0x1.d590p-101, - 0x1.b100p-103, - -0x1.0d80p-105, - 0x1.6b00p-103, - -0x1.9f00p-105, - 0x1.c400p-103, - 0x1.e120p-103, - -0x1.c100p-104, - -0x1.9d20p-103, - 0x1.a800p-108, - 0x1.4c00p-106, - -0x1.9500p-106, - 0x1.6900p-105, - -0x1.29d0p-100, - 0x1.4c60p-103, - 0x1.13a0p-102, - -0x1.5b60p-103, - -0x1.1c40p-103, - 0x1.db80p-102, - 0x1.91a0p-102, - 0x1.dc00p-105, - 0x1.44c0p-104, - 0x1.9710p-102, - 0x1.8760p-103, - -0x1.a720p-103, - 0x1.ed20p-103, - -0x1.49c0p-102, - -0x1.e000p-111, - 0x1.86a0p-103, - 0x1.2b40p-103, - -0x1.b400p-108, - 0x1.1280p-99, - -0x1.02d8p-102, - -0x1.e3d0p-103, - -0x1.b080p-105, - -0x1.f100p-107, - -0x1.16c0p-105, - -0x1.1190p-103, - -0x1.a7d2p-100, - 0x1.3450p-103, - -0x1.67c0p-105, - 0x1.4b80p-104, - -0x1.c4e0p-103, - 0x1.6000p-108, - -0x1.3f60p-105, - 0x1.93f0p-104, - 0x1.5fe0p-105, - 0x1.6f80p-107, - -0x1.7600p-106, - 0x1.21e0p-106, - -0x1.3a40p-106, - -0x1.40c0p-104, - -0x1.9860p-105, - -0x1.5d40p-108, - -0x1.1d70p-106, - 0x1.2760p-105, - 0x0.0000p+0, - 0x1.21e2p-104, - -0x1.9520p-108, - -0x1.5720p-106, - -0x1.4810p-106, - -0x1.be00p-109, - 0x1.0080p-105, - -0x1.5780p-108, - -0x1.d460p-105, - -0x1.6140p-105, - 0x1.4630p-104, - 0x1.ad50p-103, - 0x1.82e0p-105, - 0x1.1d3cp-101, - 0x1.6100p-107, - 0x1.ec30p-104, - 0x1.f200p-108, - 0x1.0b40p-103, - 0x1.3660p-102, - 0x1.d9d0p-103, - -0x1.02d0p-102, - 0x1.b070p-103, - 0x1.b9c0p-104, - -0x1.01c0p-103, - -0x1.dfe0p-103, - 0x1.1b60p-104, - -0x1.ae94p-101, - -0x1.3340p-104, - 0x1.b3d8p-102, - -0x1.6e40p-105, - -0x1.3670p-103, - 0x1.c140p-104, - 0x1.1840p-101, - 0x1.1ab0p-102, - -0x1.a400p-104, - 0x1.1f00p-104, - -0x1.7180p-103, - 0x1.4ce0p-102, - 0x1.9200p-107, - -0x1.54c0p-103, - 0x1.1b80p-105, - -0x1.1828p-101, - 0x1.5720p-102, - -0x1.a060p-100, - 0x1.9160p-102, - 0x1.a280p-104, - 0x1.3400p-107, - 0x1.2b20p-102, - 0x1.7800p-108, - 0x1.cfd0p-101, - 0x1.2ef0p-102, - -0x1.2760p-99, - 0x1.b380p-104, - 0x1.0048p-101, - -0x1.60b0p-102, - 0x1.a1ccp-100, - -0x1.a640p-104, - -0x1.08a0p-101, - 0x1.7e60p-102, - 0x1.22c0p-103, - -0x1.7200p-106, - 0x1.f0f0p-102, - 0x1.eb4ep-99, - 0x1.c6e0p-103, -}; - -/* - * exp2l(x): compute the base 2 exponential of x - * - * Accuracy: Peak error < 0.502 ulp. - * - * Method: (accurate tables) - * - * Reduce x: - * x = 2**k + y, for integer k and |y| <= 1/2. - * Thus we have exp2(x) = 2**k * exp2(y). - * - * Reduce y: - * y = i/TBLSIZE + z - eps[i] for integer i near y * TBLSIZE. - * Thus we have exp2(y) = exp2(i/TBLSIZE) * exp2(z - eps[i]), - * with |z - eps[i]| <= 2**-8 + 2**-98 for the table used. - * - * We compute exp2(i/TBLSIZE) via table lookup and exp2(z - eps[i]) via - * a degree-10 minimax polynomial with maximum error under 2**-120. - * The values in exp2t[] and eps[] are chosen such that - * exp2t[i] = exp2(i/TBLSIZE + eps[i]), and eps[i] is a small offset such - * that exp2t[i] is accurate to 2**-122. - * - * Note that the range of i is +-TBLSIZE/2, so we actually index the tables - * by i0 = i + TBLSIZE/2. - * - * This method is due to Gal, with many details due to Gal and Bachelis: - * - * Gal, S. and Bachelis, B. An Accurate Elementary Mathematical Library - * for the IEEE Floating Point Standard. TOMS 17(1), 26-46 (1991). - */ -long double -exp2l(long double x) -{ - union ldshape u = {x}; - int e = u.i.se & 0x7fff; - long double r, z, t; - uint32_t i0; - union {uint32_t u; int32_t i;} k; - - /* Filter out exceptional cases. */ - if (e >= 0x3fff + 14) { /* |x| >= 16384 or x is NaN */ - if (u.i.se >= 0x3fff + 15 && u.i.se >> 15 == 0) - /* overflow */ - return x * 0x1p16383L; - if (e == 0x7fff) /* -inf or -nan */ - return -1/x; - if (x < -16382) { - if (x <= -16495 || x - 0x1p112 + 0x1p112 != x) - /* underflow */ - FORCE_EVAL((float)(-0x1p-149/x)); - if (x <= -16446) - return 0; - } - } else if (e < 0x3fff - 114) { - return 1 + x; - } - - /* - * Reduce x, computing z, i0, and k. The low bits of x + redux - * contain the 16-bit integer part of the exponent (k) followed by - * TBLBITS fractional bits (i0). We use bit tricks to extract these - * as integers, then set z to the remainder. - * - * Example: Suppose x is 0xabc.123456p0 and TBLBITS is 8. - * Then the low-order word of x + redux is 0x000abc12, - * We split this into k = 0xabc and i0 = 0x12 (adjusted to - * index into the table), then we compute z = 0x0.003456p0. - */ - u.f = x + redux; - i0 = u.i2.lo + TBLSIZE / 2; - k.u = i0 / TBLSIZE * TBLSIZE; - k.i /= TBLSIZE; - i0 %= TBLSIZE; - u.f -= redux; - z = x - u.f; - - /* Compute r = exp2(y) = exp2t[i0] * p(z - eps[i]). */ - t = tbl[i0]; - z -= eps[i0]; - r = t + t * z * (P1 + z * (P2 + z * (P3 + z * (P4 + z * (P5 + z * (P6 - + z * (P7 + z * (P8 + z * (P9 + z * P10))))))))); - - return scalbnl(r, k.i); -} -#endif diff --git a/waterbox/libc/functions/math/expf.c b/waterbox/libc/functions/math/expf.c deleted file mode 100644 index feee2b0ed2..0000000000 --- a/waterbox/libc/functions/math/expf.c +++ /dev/null @@ -1,83 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/e_expf.c */ -/* - * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. - */ -/* - * ==================================================== - * 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 "libm.h" - -static const float -half[2] = {0.5,-0.5}, -ln2hi = 6.9314575195e-1f, /* 0x3f317200 */ -ln2lo = 1.4286067653e-6f, /* 0x35bfbe8e */ -invln2 = 1.4426950216e+0f, /* 0x3fb8aa3b */ -/* - * Domain [-0.34568, 0.34568], range ~[-4.278e-9, 4.447e-9]: - * |x*(exp(x)+1)/(exp(x)-1) - p(x)| < 2**-27.74 - */ -P1 = 1.6666625440e-1f, /* 0xaaaa8f.0p-26 */ -P2 = -2.7667332906e-3f; /* -0xb55215.0p-32 */ - -float expf(float x) -{ - float_t hi, lo, c, xx, y; - int k, sign; - uint32_t hx; - - GET_FLOAT_WORD(hx, x); - sign = hx >> 31; /* sign bit of x */ - hx &= 0x7fffffff; /* high word of |x| */ - - /* special cases */ - if (hx >= 0x42aeac50) { /* if |x| >= -87.33655f or NaN */ - if (hx > 0x7f800000) /* NaN */ - return x; - if (hx >= 0x42b17218 && !sign) { /* x >= 88.722839f */ - /* overflow */ - x *= 0x1p127f; - return x; - } - if (sign) { - /* underflow */ - FORCE_EVAL(-0x1p-149f/x); - if (hx >= 0x42cff1b5) /* x <= -103.972084f */ - return 0; - } - } - - /* argument reduction */ - if (hx > 0x3eb17218) { /* if |x| > 0.5 ln2 */ - if (hx > 0x3f851592) /* if |x| > 1.5 ln2 */ - k = invln2*x + half[sign]; - else - k = 1 - sign - sign; - hi = x - k*ln2hi; /* k*ln2hi is exact here */ - lo = k*ln2lo; - x = hi - lo; - } else if (hx > 0x39000000) { /* |x| > 2**-14 */ - k = 0; - hi = x; - lo = 0; - } else { - /* raise inexact */ - FORCE_EVAL(0x1p127f + x); - return 1 + x; - } - - /* x is now in primary range */ - xx = x*x; - c = x - xx*(P1+xx*P2); - y = 1 + (x*c/(2-c) - lo + hi); - if (k == 0) - return y; - return scalbnf(y, k); -} diff --git a/waterbox/libc/functions/math/expl.c b/waterbox/libc/functions/math/expl.c deleted file mode 100644 index 0a7f44f685..0000000000 --- a/waterbox/libc/functions/math/expl.c +++ /dev/null @@ -1,128 +0,0 @@ -/* origin: OpenBSD /usr/src/lib/libm/src/ld80/e_expl.c */ -/* - * Copyright (c) 2008 Stephen L. Moshier - * - * 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 THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR 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. - */ -/* - * Exponential function, long double precision - * - * - * SYNOPSIS: - * - * long double x, y, expl(); - * - * y = expl( x ); - * - * - * DESCRIPTION: - * - * Returns e (2.71828...) raised to the x power. - * - * Range reduction is accomplished by separating the argument - * into an integer k and fraction f such that - * - * x k f - * e = 2 e. - * - * A Pade' form of degree 5/6 is used to approximate exp(f) - 1 - * in the basic range [-0.5 ln 2, 0.5 ln 2]. - * - * - * ACCURACY: - * - * Relative error: - * arithmetic domain # trials peak rms - * IEEE +-10000 50000 1.12e-19 2.81e-20 - * - * - * Error amplification in the exponential function can be - * a serious matter. The error propagation involves - * exp( X(1+delta) ) = exp(X) ( 1 + X*delta + ... ), - * which shows that a 1 lsb error in representing X produces - * a relative error of X times 1 lsb in the function. - * While the routine gives an accurate result for arguments - * that are exactly represented by a long double precision - * computer number, the result contains amplified roundoff - * error for large arguments not exactly represented. - * - * - * ERROR MESSAGES: - * - * message condition value returned - * exp underflow x < MINLOG 0.0 - * exp overflow x > MAXLOG MAXNUM - * - */ - -#include "libm.h" - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long double expl(long double x) -{ - return exp(x); -} -#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384 - -static const long double P[3] = { - 1.2617719307481059087798E-4L, - 3.0299440770744196129956E-2L, - 9.9999999999999999991025E-1L, -}; -static const long double Q[4] = { - 3.0019850513866445504159E-6L, - 2.5244834034968410419224E-3L, - 2.2726554820815502876593E-1L, - 2.0000000000000000000897E0L, -}; -static const long double -LN2HI = 6.9314575195312500000000E-1L, -LN2LO = 1.4286068203094172321215E-6L, -LOG2E = 1.4426950408889634073599E0L; - -long double expl(long double x) -{ - long double px, xx; - int k; - - if (isnan(x)) - return x; - if (x > 11356.5234062941439488L) /* x > ln(2^16384 - 0.5) */ - return x * 0x1p16383L; - if (x < -11399.4985314888605581L) /* x < ln(2^-16446) */ - return -0x1p-16445L/x; - - /* Express e**x = e**f 2**k - * = e**(f + k ln(2)) - */ - px = floorl(LOG2E * x + 0.5); - k = px; - x -= px * LN2HI; - x -= px * LN2LO; - - /* rational approximation of the fractional part: - * e**x = 1 + 2x P(x**2)/(Q(x**2) - x P(x**2)) - */ - xx = x * x; - px = x * __polevll(xx, P, 2); - x = px/(__polevll(xx, Q, 3) - px); - x = 1.0 + 2.0 * x; - return scalbnl(x, k); -} -#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384 -// TODO: broken implementation to make things compile -long double expl(long double x) -{ - return exp(x); -} -#endif diff --git a/waterbox/libc/functions/math/expm1.c b/waterbox/libc/functions/math/expm1.c deleted file mode 100644 index ac1e61e4f7..0000000000 --- a/waterbox/libc/functions/math/expm1.c +++ /dev/null @@ -1,201 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/s_expm1.c */ -/* - * ==================================================== - * 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. - * ==================================================== - */ -/* expm1(x) - * Returns exp(x)-1, the exponential of x minus 1. - * - * Method - * 1. Argument reduction: - * Given x, find r and integer k such that - * - * x = k*ln2 + r, |r| <= 0.5*ln2 ~ 0.34658 - * - * Here a correction term c will be computed to compensate - * the error in r when rounded to a floating-point number. - * - * 2. Approximating expm1(r) by a special rational function on - * the interval [0,0.34658]: - * Since - * r*(exp(r)+1)/(exp(r)-1) = 2+ r^2/6 - r^4/360 + ... - * we define R1(r*r) by - * r*(exp(r)+1)/(exp(r)-1) = 2+ r^2/6 * R1(r*r) - * That is, - * R1(r**2) = 6/r *((exp(r)+1)/(exp(r)-1) - 2/r) - * = 6/r * ( 1 + 2.0*(1/(exp(r)-1) - 1/r)) - * = 1 - r^2/60 + r^4/2520 - r^6/100800 + ... - * We use a special Remez algorithm on [0,0.347] to generate - * a polynomial of degree 5 in r*r to approximate R1. The - * maximum error of this polynomial approximation is bounded - * by 2**-61. In other words, - * R1(z) ~ 1.0 + Q1*z + Q2*z**2 + Q3*z**3 + Q4*z**4 + Q5*z**5 - * where Q1 = -1.6666666666666567384E-2, - * Q2 = 3.9682539681370365873E-4, - * Q3 = -9.9206344733435987357E-6, - * Q4 = 2.5051361420808517002E-7, - * Q5 = -6.2843505682382617102E-9; - * z = r*r, - * with error bounded by - * | 5 | -61 - * | 1.0+Q1*z+...+Q5*z - R1(z) | <= 2 - * | | - * - * expm1(r) = exp(r)-1 is then computed by the following - * specific way which minimize the accumulation rounding error: - * 2 3 - * r r [ 3 - (R1 + R1*r/2) ] - * expm1(r) = r + --- + --- * [--------------------] - * 2 2 [ 6 - r*(3 - R1*r/2) ] - * - * To compensate the error in the argument reduction, we use - * expm1(r+c) = expm1(r) + c + expm1(r)*c - * ~ expm1(r) + c + r*c - * Thus c+r*c will be added in as the correction terms for - * expm1(r+c). Now rearrange the term to avoid optimization - * screw up: - * ( 2 2 ) - * ({ ( r [ R1 - (3 - R1*r/2) ] ) } r ) - * expm1(r+c)~r - ({r*(--- * [--------------------]-c)-c} - --- ) - * ({ ( 2 [ 6 - r*(3 - R1*r/2) ] ) } 2 ) - * ( ) - * - * = r - E - * 3. Scale back to obtain expm1(x): - * From step 1, we have - * expm1(x) = either 2^k*[expm1(r)+1] - 1 - * = or 2^k*[expm1(r) + (1-2^-k)] - * 4. Implementation notes: - * (A). To save one multiplication, we scale the coefficient Qi - * to Qi*2^i, and replace z by (x^2)/2. - * (B). To achieve maximum accuracy, we compute expm1(x) by - * (i) if x < -56*ln2, return -1.0, (raise inexact if x!=inf) - * (ii) if k=0, return r-E - * (iii) if k=-1, return 0.5*(r-E)-0.5 - * (iv) if k=1 if r < -0.25, return 2*((r+0.5)- E) - * else return 1.0+2.0*(r-E); - * (v) if (k<-2||k>56) return 2^k(1-(E-r)) - 1 (or exp(x)-1) - * (vi) if k <= 20, return 2^k((1-2^-k)-(E-r)), else - * (vii) return 2^k(1-((E+2^-k)-r)) - * - * Special cases: - * expm1(INF) is INF, expm1(NaN) is NaN; - * expm1(-INF) is -1, and - * for finite argument, only expm1(0)=0 is exact. - * - * Accuracy: - * according to an error analysis, the error is always less than - * 1 ulp (unit in the last place). - * - * Misc. info. - * For IEEE double - * if x > 7.09782712893383973096e+02 then expm1(x) overflow - * - * 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. - */ - -#include "libm.h" - -static const double -o_threshold = 7.09782712893383973096e+02, /* 0x40862E42, 0xFEFA39EF */ -ln2_hi = 6.93147180369123816490e-01, /* 0x3fe62e42, 0xfee00000 */ -ln2_lo = 1.90821492927058770002e-10, /* 0x3dea39ef, 0x35793c76 */ -invln2 = 1.44269504088896338700e+00, /* 0x3ff71547, 0x652b82fe */ -/* Scaled Q's: Qn_here = 2**n * Qn_above, for R(2*z) where z = hxs = x*x/2: */ -Q1 = -3.33333333333331316428e-02, /* BFA11111 111110F4 */ -Q2 = 1.58730158725481460165e-03, /* 3F5A01A0 19FE5585 */ -Q3 = -7.93650757867487942473e-05, /* BF14CE19 9EAADBB7 */ -Q4 = 4.00821782732936239552e-06, /* 3ED0CFCA 86E65239 */ -Q5 = -2.01099218183624371326e-07; /* BE8AFDB7 6E09C32D */ - -double expm1(double x) -{ - double_t y,hi,lo,c,t,e,hxs,hfx,r1,twopk; - union {double f; uint64_t i;} u = {x}; - uint32_t hx = u.i>>32 & 0x7fffffff; - int k, sign = u.i>>63; - - /* filter out huge and non-finite argument */ - if (hx >= 0x4043687A) { /* if |x|>=56*ln2 */ - if (isnan(x)) - return x; - if (sign) - return -1; - if (x > o_threshold) { - x *= 0x1p1023; - return x; - } - } - - /* argument reduction */ - if (hx > 0x3fd62e42) { /* if |x| > 0.5 ln2 */ - if (hx < 0x3FF0A2B2) { /* and |x| < 1.5 ln2 */ - if (!sign) { - hi = x - ln2_hi; - lo = ln2_lo; - k = 1; - } else { - hi = x + ln2_hi; - lo = -ln2_lo; - k = -1; - } - } else { - k = invln2*x + (sign ? -0.5 : 0.5); - t = k; - hi = x - t*ln2_hi; /* t*ln2_hi is exact here */ - lo = t*ln2_lo; - } - x = hi-lo; - c = (hi-x)-lo; - } else if (hx < 0x3c900000) { /* |x| < 2**-54, return x */ - if (hx < 0x00100000) - FORCE_EVAL((float)x); - return x; - } else - k = 0; - - /* x is now in primary range */ - hfx = 0.5*x; - hxs = x*hfx; - r1 = 1.0+hxs*(Q1+hxs*(Q2+hxs*(Q3+hxs*(Q4+hxs*Q5)))); - t = 3.0-r1*hfx; - e = hxs*((r1-t)/(6.0 - x*t)); - if (k == 0) /* c is 0 */ - return x - (x*e-hxs); - e = x*(e-c) - c; - e -= hxs; - /* exp(x) ~ 2^k (x_reduced - e + 1) */ - if (k == -1) - return 0.5*(x-e) - 0.5; - if (k == 1) { - if (x < -0.25) - return -2.0*(e-(x+0.5)); - return 1.0+2.0*(x-e); - } - u.i = (uint64_t)(0x3ff + k)<<52; /* 2^k */ - twopk = u.f; - if (k < 0 || k > 56) { /* suffice to return exp(x)-1 */ - y = x - e + 1.0; - if (k == 1024) - y = y*2.0*0x1p1023; - else - y = y*twopk; - return y - 1.0; - } - u.i = (uint64_t)(0x3ff - k)<<52; /* 2^-k */ - if (k < 20) - y = (x-e+(1-u.f))*twopk; - else - y = (x-(e+u.f)+1)*twopk; - return y; -} diff --git a/waterbox/libc/functions/math/expm1f.c b/waterbox/libc/functions/math/expm1f.c deleted file mode 100644 index 297e0b44a2..0000000000 --- a/waterbox/libc/functions/math/expm1f.c +++ /dev/null @@ -1,111 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/s_expm1f.c */ -/* - * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. - */ -/* - * ==================================================== - * 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 "libm.h" - -static const float -o_threshold = 8.8721679688e+01, /* 0x42b17180 */ -ln2_hi = 6.9313812256e-01, /* 0x3f317180 */ -ln2_lo = 9.0580006145e-06, /* 0x3717f7d1 */ -invln2 = 1.4426950216e+00, /* 0x3fb8aa3b */ -/* - * Domain [-0.34568, 0.34568], range ~[-6.694e-10, 6.696e-10]: - * |6 / x * (1 + 2 * (1 / (exp(x) - 1) - 1 / x)) - q(x)| < 2**-30.04 - * Scaled coefficients: Qn_here = 2**n * Qn_for_q (see s_expm1.c): - */ -Q1 = -3.3333212137e-2, /* -0x888868.0p-28 */ -Q2 = 1.5807170421e-3; /* 0xcf3010.0p-33 */ - -float expm1f(float x) -{ - float_t y,hi,lo,c,t,e,hxs,hfx,r1,twopk; - union {float f; uint32_t i;} u = {x}; - uint32_t hx = u.i & 0x7fffffff; - int k, sign = u.i >> 31; - - /* filter out huge and non-finite argument */ - if (hx >= 0x4195b844) { /* if |x|>=27*ln2 */ - if (hx > 0x7f800000) /* NaN */ - return x; - if (sign) - return -1; - if (x > o_threshold) { - x *= 0x1p127f; - return x; - } - } - - /* argument reduction */ - if (hx > 0x3eb17218) { /* if |x| > 0.5 ln2 */ - if (hx < 0x3F851592) { /* and |x| < 1.5 ln2 */ - if (!sign) { - hi = x - ln2_hi; - lo = ln2_lo; - k = 1; - } else { - hi = x + ln2_hi; - lo = -ln2_lo; - k = -1; - } - } else { - k = invln2*x + (sign ? -0.5f : 0.5f); - t = k; - hi = x - t*ln2_hi; /* t*ln2_hi is exact here */ - lo = t*ln2_lo; - } - x = hi-lo; - c = (hi-x)-lo; - } else if (hx < 0x33000000) { /* when |x|<2**-25, return x */ - if (hx < 0x00800000) - FORCE_EVAL(x*x); - return x; - } else - k = 0; - - /* x is now in primary range */ - hfx = 0.5f*x; - hxs = x*hfx; - r1 = 1.0f+hxs*(Q1+hxs*Q2); - t = 3.0f - r1*hfx; - e = hxs*((r1-t)/(6.0f - x*t)); - if (k == 0) /* c is 0 */ - return x - (x*e-hxs); - e = x*(e-c) - c; - e -= hxs; - /* exp(x) ~ 2^k (x_reduced - e + 1) */ - if (k == -1) - return 0.5f*(x-e) - 0.5f; - if (k == 1) { - if (x < -0.25f) - return -2.0f*(e-(x+0.5f)); - return 1.0f + 2.0f*(x-e); - } - u.i = (0x7f+k)<<23; /* 2^k */ - twopk = u.f; - if (k < 0 || k > 56) { /* suffice to return exp(x)-1 */ - y = x - e + 1.0f; - if (k == 128) - y = y*2.0f*0x1p127f; - else - y = y*twopk; - return y - 1.0f; - } - u.i = (0x7f-k)<<23; /* 2^-k */ - if (k < 23) - y = (x-e+(1-u.f))*twopk; - else - y = (x-(e+u.f)+1)*twopk; - return y; -} diff --git a/waterbox/libc/functions/math/expm1l.c b/waterbox/libc/functions/math/expm1l.c deleted file mode 100644 index d171507852..0000000000 --- a/waterbox/libc/functions/math/expm1l.c +++ /dev/null @@ -1,123 +0,0 @@ -/* origin: OpenBSD /usr/src/lib/libm/src/ld80/e_expm1l.c */ -/* - * Copyright (c) 2008 Stephen L. Moshier - * - * 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 THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR 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. - */ -/* - * Exponential function, minus 1 - * Long double precision - * - * - * SYNOPSIS: - * - * long double x, y, expm1l(); - * - * y = expm1l( x ); - * - * - * DESCRIPTION: - * - * Returns e (2.71828...) raised to the x power, minus 1. - * - * Range reduction is accomplished by separating the argument - * into an integer k and fraction f such that - * - * x k f - * e = 2 e. - * - * An expansion x + .5 x^2 + x^3 R(x) approximates exp(f) - 1 - * in the basic range [-0.5 ln 2, 0.5 ln 2]. - * - * - * ACCURACY: - * - * Relative error: - * arithmetic domain # trials peak rms - * IEEE -45,+maxarg 200,000 1.2e-19 2.5e-20 - */ - -#include "libm.h" - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long double expm1l(long double x) -{ - return expm1(x); -} -#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384 - -/* exp(x) - 1 = x + 0.5 x^2 + x^3 P(x)/Q(x) - -.5 ln 2 < x < .5 ln 2 - Theoretical peak relative error = 3.4e-22 */ -static const long double -P0 = -1.586135578666346600772998894928250240826E4L, -P1 = 2.642771505685952966904660652518429479531E3L, -P2 = -3.423199068835684263987132888286791620673E2L, -P3 = 1.800826371455042224581246202420972737840E1L, -P4 = -5.238523121205561042771939008061958820811E-1L, -Q0 = -9.516813471998079611319047060563358064497E4L, -Q1 = 3.964866271411091674556850458227710004570E4L, -Q2 = -7.207678383830091850230366618190187434796E3L, -Q3 = 7.206038318724600171970199625081491823079E2L, -Q4 = -4.002027679107076077238836622982900945173E1L, -/* Q5 = 1.000000000000000000000000000000000000000E0 */ -/* C1 + C2 = ln 2 */ -C1 = 6.93145751953125E-1L, -C2 = 1.428606820309417232121458176568075500134E-6L, -/* ln 2^-65 */ -minarg = -4.5054566736396445112120088E1L, -/* ln 2^16384 */ -maxarg = 1.1356523406294143949492E4L; - -long double expm1l(long double x) -{ - long double px, qx, xx; - int k; - - if (isnan(x)) - return x; - if (x > maxarg) - return x*0x1p16383L; /* overflow, unless x==inf */ - if (x == 0.0) - return x; - if (x < minarg) - return -1.0; - - xx = C1 + C2; - /* Express x = ln 2 (k + remainder), remainder not exceeding 1/2. */ - px = floorl(0.5 + x / xx); - k = px; - /* remainder times ln 2 */ - x -= px * C1; - x -= px * C2; - - /* Approximate exp(remainder ln 2).*/ - px = (((( P4 * x + P3) * x + P2) * x + P1) * x + P0) * x; - qx = (((( x + Q4) * x + Q3) * x + Q2) * x + Q1) * x + Q0; - xx = x * x; - qx = x + (0.5 * xx + xx * px / qx); - - /* exp(x) = exp(k ln 2) exp(remainder ln 2) = 2^k exp(remainder ln 2). - We have qx = exp(remainder ln 2) - 1, so - exp(x) - 1 = 2^k (qx + 1) - 1 = 2^k qx + 2^k - 1. */ - px = scalbnl(1.0, k); - x = px * qx + (px - 1.0); - return x; -} -#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384 -// TODO: broken implementation to make things compile -long double expm1l(long double x) -{ - return expm1(x); -} -#endif diff --git a/waterbox/libc/functions/math/fabs.c b/waterbox/libc/functions/math/fabs.c deleted file mode 100644 index e8258cfdbc..0000000000 --- a/waterbox/libc/functions/math/fabs.c +++ /dev/null @@ -1,9 +0,0 @@ -#include -#include - -double fabs(double x) -{ - union {double f; uint64_t i;} u = {x}; - u.i &= -1ULL/2; - return u.f; -} diff --git a/waterbox/libc/functions/math/fabsf.c b/waterbox/libc/functions/math/fabsf.c deleted file mode 100644 index 4efc8d686d..0000000000 --- a/waterbox/libc/functions/math/fabsf.c +++ /dev/null @@ -1,9 +0,0 @@ -#include -#include - -float fabsf(float x) -{ - union {float f; uint32_t i;} u = {x}; - u.i &= 0x7fffffff; - return u.f; -} diff --git a/waterbox/libc/functions/math/fabsl.c b/waterbox/libc/functions/math/fabsl.c deleted file mode 100644 index c4f36ec281..0000000000 --- a/waterbox/libc/functions/math/fabsl.c +++ /dev/null @@ -1,15 +0,0 @@ -#include "libm.h" -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long double fabsl(long double x) -{ - return fabs(x); -} -#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384 -long double fabsl(long double x) -{ - union ldshape u = {x}; - - u.i.se &= 0x7fff; - return u.f; -} -#endif diff --git a/waterbox/libc/functions/math/fdim.c b/waterbox/libc/functions/math/fdim.c deleted file mode 100644 index 9585460643..0000000000 --- a/waterbox/libc/functions/math/fdim.c +++ /dev/null @@ -1,10 +0,0 @@ -#include - -double fdim(double x, double y) -{ - if (isnan(x)) - return x; - if (isnan(y)) - return y; - return x > y ? x - y : 0; -} diff --git a/waterbox/libc/functions/math/fdimf.c b/waterbox/libc/functions/math/fdimf.c deleted file mode 100644 index 543c3648e3..0000000000 --- a/waterbox/libc/functions/math/fdimf.c +++ /dev/null @@ -1,10 +0,0 @@ -#include - -float fdimf(float x, float y) -{ - if (isnan(x)) - return x; - if (isnan(y)) - return y; - return x > y ? x - y : 0; -} diff --git a/waterbox/libc/functions/math/fdiml.c b/waterbox/libc/functions/math/fdiml.c deleted file mode 100644 index 62e29b7df3..0000000000 --- a/waterbox/libc/functions/math/fdiml.c +++ /dev/null @@ -1,18 +0,0 @@ -#include -#include - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long double fdiml(long double x, long double y) -{ - return fdim(x, y); -} -#else -long double fdiml(long double x, long double y) -{ - if (isnan(x)) - return x; - if (isnan(y)) - return y; - return x > y ? x - y : 0; -} -#endif diff --git a/waterbox/libc/functions/math/finite.c b/waterbox/libc/functions/math/finite.c deleted file mode 100644 index 25a0575fb9..0000000000 --- a/waterbox/libc/functions/math/finite.c +++ /dev/null @@ -1,7 +0,0 @@ -#define _GNU_SOURCE -#include - -int finite(double x) -{ - return isfinite(x); -} diff --git a/waterbox/libc/functions/math/finitef.c b/waterbox/libc/functions/math/finitef.c deleted file mode 100644 index 2c4c771463..0000000000 --- a/waterbox/libc/functions/math/finitef.c +++ /dev/null @@ -1,7 +0,0 @@ -#define _GNU_SOURCE -#include - -int finitef(float x) -{ - return isfinite(x); -} diff --git a/waterbox/libc/functions/math/floor.c b/waterbox/libc/functions/math/floor.c deleted file mode 100644 index 14a31cd8c4..0000000000 --- a/waterbox/libc/functions/math/floor.c +++ /dev/null @@ -1,31 +0,0 @@ -#include "libm.h" - -#if FLT_EVAL_METHOD==0 || FLT_EVAL_METHOD==1 -#define EPS DBL_EPSILON -#elif FLT_EVAL_METHOD==2 -#define EPS LDBL_EPSILON -#endif -static const double_t toint = 1/EPS; - -double floor(double x) -{ - union {double f; uint64_t i;} u = {x}; - int e = u.i >> 52 & 0x7ff; - double_t y; - - if (e >= 0x3ff+52 || x == 0) - return x; - /* y = int(x) - x, where int(x) is an integer neighbor of x */ - if (u.i >> 63) - y = x - toint + toint - x; - else - y = x + toint - toint - x; - /* special case because of non-nearest rounding modes */ - if (e <= 0x3ff-1) { - FORCE_EVAL(y); - return u.i >> 63 ? -1 : 0; - } - if (y > 0) - return x + y - 1; - return x + y; -} diff --git a/waterbox/libc/functions/math/floorf.c b/waterbox/libc/functions/math/floorf.c deleted file mode 100644 index dceec739db..0000000000 --- a/waterbox/libc/functions/math/floorf.c +++ /dev/null @@ -1,27 +0,0 @@ -#include "libm.h" - -float floorf(float x) -{ - union {float f; uint32_t i;} u = {x}; - int e = (int)(u.i >> 23 & 0xff) - 0x7f; - uint32_t m; - - if (e >= 23) - return x; - if (e >= 0) { - m = 0x007fffff >> e; - if ((u.i & m) == 0) - return x; - FORCE_EVAL(x + 0x1p120f); - if (u.i >> 31) - u.i += m; - u.i &= ~m; - } else { - FORCE_EVAL(x + 0x1p120f); - if (u.i >> 31 == 0) - u.i = 0; - else if (u.i << 1) - u.f = -1.0; - } - return u.f; -} diff --git a/waterbox/libc/functions/math/floorl.c b/waterbox/libc/functions/math/floorl.c deleted file mode 100644 index 16aaec48ee..0000000000 --- a/waterbox/libc/functions/math/floorl.c +++ /dev/null @@ -1,34 +0,0 @@ -#include "libm.h" - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long double floorl(long double x) -{ - return floor(x); -} -#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384 - -static const long double toint = 1/LDBL_EPSILON; - -long double floorl(long double x) -{ - union ldshape u = {x}; - int e = u.i.se & 0x7fff; - long double y; - - if (e >= 0x3fff+LDBL_MANT_DIG-1 || x == 0) - return x; - /* y = int(x) - x, where int(x) is an integer neighbor of x */ - if (u.i.se >> 15) - y = x - toint + toint - x; - else - y = x + toint - toint - x; - /* special case because of non-nearest rounding modes */ - if (e <= 0x3fff-1) { - FORCE_EVAL(y); - return u.i.se >> 15 ? -1 : 0; - } - if (y > 0) - return x + y - 1; - return x + y; -} -#endif diff --git a/waterbox/libc/functions/math/fma.c b/waterbox/libc/functions/math/fma.c deleted file mode 100644 index 741ccd757a..0000000000 --- a/waterbox/libc/functions/math/fma.c +++ /dev/null @@ -1,460 +0,0 @@ -#include -#include "libm.h" - -#if LDBL_MANT_DIG==64 && LDBL_MAX_EXP==16384 -/* exact add, assumes exponent_x >= exponent_y */ -static void add(long double *hi, long double *lo, long double x, long double y) -{ - long double r; - - r = x + y; - *hi = r; - r -= x; - *lo = y - r; -} - -/* exact mul, assumes no over/underflow */ -static void mul(long double *hi, long double *lo, long double x, long double y) -{ - static const long double c = 1.0 + 0x1p32L; - long double cx, xh, xl, cy, yh, yl; - - cx = c*x; - xh = (x - cx) + cx; - xl = x - xh; - cy = c*y; - yh = (y - cy) + cy; - yl = y - yh; - *hi = x*y; - *lo = (xh*yh - *hi) + xh*yl + xl*yh + xl*yl; -} - -/* -assume (long double)(hi+lo) == hi -return an adjusted hi so that rounding it to double (or less) precision is correct -*/ -static long double adjust(long double hi, long double lo) -{ - union ldshape uhi, ulo; - - if (lo == 0) - return hi; - uhi.f = hi; - if (uhi.i.m & 0x3ff) - return hi; - ulo.f = lo; - if ((uhi.i.se & 0x8000) == (ulo.i.se & 0x8000)) - uhi.i.m++; - else { - /* handle underflow and take care of ld80 implicit msb */ - if (uhi.i.m << 1 == 0) { - uhi.i.m = 0; - uhi.i.se--; - } - uhi.i.m--; - } - return uhi.f; -} - -/* adjusted add so the result is correct when rounded to double (or less) precision */ -static long double dadd(long double x, long double y) -{ - add(&x, &y, x, y); - return adjust(x, y); -} - -/* adjusted mul so the result is correct when rounded to double (or less) precision */ -static long double dmul(long double x, long double y) -{ - mul(&x, &y, x, y); - return adjust(x, y); -} - -static int getexp(long double x) -{ - union ldshape u; - u.f = x; - return u.i.se & 0x7fff; -} - -double fma(double x, double y, double z) -{ - #pragma STDC FENV_ACCESS ON - long double hi, lo1, lo2, xy; - int round, ez, exy; - - /* handle +-inf,nan */ - if (!isfinite(x) || !isfinite(y)) - return x*y + z; - if (!isfinite(z)) - return z; - /* handle +-0 */ - if (x == 0.0 || y == 0.0) - return x*y + z; - round = fegetround(); - if (z == 0.0) { - if (round == FE_TONEAREST) - return dmul(x, y); - return x*y; - } - - /* exact mul and add require nearest rounding */ - /* spurious inexact exceptions may be raised */ - fesetround(FE_TONEAREST); - mul(&xy, &lo1, x, y); - exy = getexp(xy); - ez = getexp(z); - if (ez > exy) { - add(&hi, &lo2, z, xy); - } else if (ez > exy - 12) { - add(&hi, &lo2, xy, z); - if (hi == 0) { - /* - xy + z is 0, but it should be calculated with the - original rounding mode so the sign is correct, if the - compiler does not support FENV_ACCESS ON it does not - know about the changed rounding mode and eliminates - the xy + z below without the volatile memory access - */ - volatile double z_; - fesetround(round); - z_ = z; - return (xy + z_) + lo1; - } - } else { - /* - ez <= exy - 12 - the 12 extra bits (1guard, 11round+sticky) are needed so with - lo = dadd(lo1, lo2) - elo <= ehi - 11, and we use the last 10 bits in adjust so - dadd(hi, lo) - gives correct result when rounded to double - */ - hi = xy; - lo2 = z; - } - /* - the result is stored before return for correct precision and exceptions - - one corner case is when the underflow flag should be raised because - the precise result is an inexact subnormal double, but the calculated - long double result is an exact subnormal double - (so rounding to double does not raise exceptions) - - in nearest rounding mode dadd takes care of this: the last bit of the - result is adjusted so rounding sees an inexact value when it should - - in non-nearest rounding mode fenv is used for the workaround - */ - fesetround(round); - if (round == FE_TONEAREST) - z = dadd(hi, dadd(lo1, lo2)); - else { -#if defined(FE_INEXACT) && defined(FE_UNDERFLOW) - int e = fetestexcept(FE_INEXACT); - feclearexcept(FE_INEXACT); -#endif - z = hi + (lo1 + lo2); -#if defined(FE_INEXACT) && defined(FE_UNDERFLOW) - if (getexp(z) < 0x3fff-1022 && fetestexcept(FE_INEXACT)) - feraiseexcept(FE_UNDERFLOW); - else if (e) - feraiseexcept(FE_INEXACT); -#endif - } - return z; -} -#else -/* origin: FreeBSD /usr/src/lib/msun/src/s_fma.c */ -/*- - * Copyright (c) 2005-2011 David Schultz - * 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. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. - */ - -/* - * A struct dd represents a floating-point number with twice the precision - * of a double. We maintain the invariant that "hi" stores the 53 high-order - * bits of the result. - */ -struct dd { - double hi; - double lo; -}; - -/* - * Compute a+b exactly, returning the exact result in a struct dd. We assume - * that both a and b are finite, but make no assumptions about their relative - * magnitudes. - */ -static inline struct dd dd_add(double a, double b) -{ - struct dd ret; - double s; - - ret.hi = a + b; - s = ret.hi - a; - ret.lo = (a - (ret.hi - s)) + (b - s); - return (ret); -} - -/* - * Compute a+b, with a small tweak: The least significant bit of the - * result is adjusted into a sticky bit summarizing all the bits that - * were lost to rounding. This adjustment negates the effects of double - * rounding when the result is added to another number with a higher - * exponent. For an explanation of round and sticky bits, see any reference - * on FPU design, e.g., - * - * J. Coonen. An Implementation Guide to a Proposed Standard for - * Floating-Point Arithmetic. Computer, vol. 13, no. 1, Jan 1980. - */ -static inline double add_adjusted(double a, double b) -{ - struct dd sum; - union {double f; uint64_t i;} uhi, ulo; - - sum = dd_add(a, b); - if (sum.lo != 0) { - uhi.f = sum.hi; - if ((uhi.i & 1) == 0) { - /* hibits += (int)copysign(1.0, sum.hi * sum.lo) */ - ulo.f = sum.lo; - uhi.i += 1 - ((uhi.i ^ ulo.i) >> 62); - sum.hi = uhi.f; - } - } - return (sum.hi); -} - -/* - * Compute ldexp(a+b, scale) with a single rounding error. It is assumed - * that the result will be subnormal, and care is taken to ensure that - * double rounding does not occur. - */ -static inline double add_and_denormalize(double a, double b, int scale) -{ - struct dd sum; - union {double f; uint64_t i;} uhi, ulo; - int bits_lost; - - sum = dd_add(a, b); - - /* - * If we are losing at least two bits of accuracy to denormalization, - * then the first lost bit becomes a round bit, and we adjust the - * lowest bit of sum.hi to make it a sticky bit summarizing all the - * bits in sum.lo. With the sticky bit adjusted, the hardware will - * break any ties in the correct direction. - * - * If we are losing only one bit to denormalization, however, we must - * break the ties manually. - */ - if (sum.lo != 0) { - uhi.f = sum.hi; - bits_lost = -((int)(uhi.i >> 52) & 0x7ff) - scale + 1; - if ((bits_lost != 1) ^ (int)(uhi.i & 1)) { - /* hibits += (int)copysign(1.0, sum.hi * sum.lo) */ - ulo.f = sum.lo; - uhi.i += 1 - (((uhi.i ^ ulo.i) >> 62) & 2); - sum.hi = uhi.f; - } - } - return scalbn(sum.hi, scale); -} - -/* - * Compute a*b exactly, returning the exact result in a struct dd. We assume - * that both a and b are normalized, so no underflow or overflow will occur. - * The current rounding mode must be round-to-nearest. - */ -static inline struct dd dd_mul(double a, double b) -{ - static const double split = 0x1p27 + 1.0; - struct dd ret; - double ha, hb, la, lb, p, q; - - p = a * split; - ha = a - p; - ha += p; - la = a - ha; - - p = b * split; - hb = b - p; - hb += p; - lb = b - hb; - - p = ha * hb; - q = ha * lb + la * hb; - - ret.hi = p + q; - ret.lo = p - ret.hi + q + la * lb; - return (ret); -} - -/* - * Fused multiply-add: Compute x * y + z with a single rounding error. - * - * We use scaling to avoid overflow/underflow, along with the - * canonical precision-doubling technique adapted from: - * - * Dekker, T. A Floating-Point Technique for Extending the - * Available Precision. Numer. Math. 18, 224-242 (1971). - * - * This algorithm is sensitive to the rounding precision. FPUs such - * as the i387 must be set in double-precision mode if variables are - * to be stored in FP registers in order to avoid incorrect results. - * This is the default on FreeBSD, but not on many other systems. - * - * Hardware instructions should be used on architectures that support it, - * since this implementation will likely be several times slower. - */ -double fma(double x, double y, double z) -{ - #pragma STDC FENV_ACCESS ON - double xs, ys, zs, adj; - struct dd xy, r; - int oround; - int ex, ey, ez; - int spread; - - /* - * Handle special cases. The order of operations and the particular - * return values here are crucial in handling special cases involving - * infinities, NaNs, overflows, and signed zeroes correctly. - */ - if (!isfinite(x) || !isfinite(y)) - return (x * y + z); - if (!isfinite(z)) - return (z); - if (x == 0.0 || y == 0.0) - return (x * y + z); - if (z == 0.0) - return (x * y); - - xs = frexp(x, &ex); - ys = frexp(y, &ey); - zs = frexp(z, &ez); - oround = fegetround(); - spread = ex + ey - ez; - - /* - * If x * y and z are many orders of magnitude apart, the scaling - * will overflow, so we handle these cases specially. Rounding - * modes other than FE_TONEAREST are painful. - */ - if (spread < -DBL_MANT_DIG) { -#ifdef FE_INEXACT - feraiseexcept(FE_INEXACT); -#endif -#ifdef FE_UNDERFLOW - if (!isnormal(z)) - feraiseexcept(FE_UNDERFLOW); -#endif - switch (oround) { - default: /* FE_TONEAREST */ - return (z); -#ifdef FE_TOWARDZERO - case FE_TOWARDZERO: - if (x > 0.0 ^ y < 0.0 ^ z < 0.0) - return (z); - else - return (nextafter(z, 0)); -#endif -#ifdef FE_DOWNWARD - case FE_DOWNWARD: - if (x > 0.0 ^ y < 0.0) - return (z); - else - return (nextafter(z, -INFINITY)); -#endif -#ifdef FE_UPWARD - case FE_UPWARD: - if (x > 0.0 ^ y < 0.0) - return (nextafter(z, INFINITY)); - else - return (z); -#endif - } - } - if (spread <= DBL_MANT_DIG * 2) - zs = scalbn(zs, -spread); - else - zs = copysign(DBL_MIN, zs); - - fesetround(FE_TONEAREST); - - /* - * Basic approach for round-to-nearest: - * - * (xy.hi, xy.lo) = x * y (exact) - * (r.hi, r.lo) = xy.hi + z (exact) - * adj = xy.lo + r.lo (inexact; low bit is sticky) - * result = r.hi + adj (correctly rounded) - */ - xy = dd_mul(xs, ys); - r = dd_add(xy.hi, zs); - - spread = ex + ey; - - if (r.hi == 0.0) { - /* - * When the addends cancel to 0, ensure that the result has - * the correct sign. - */ - fesetround(oround); - volatile double vzs = zs; /* XXX gcc CSE bug workaround */ - return xy.hi + vzs + scalbn(xy.lo, spread); - } - - if (oround != FE_TONEAREST) { - /* - * There is no need to worry about double rounding in directed - * rounding modes. - * But underflow may not be raised properly, example in downward rounding: - * fma(0x1.000000001p-1000, 0x1.000000001p-30, -0x1p-1066) - */ - double ret; -#if defined(FE_INEXACT) && defined(FE_UNDERFLOW) - int e = fetestexcept(FE_INEXACT); - feclearexcept(FE_INEXACT); -#endif - fesetround(oround); - adj = r.lo + xy.lo; - ret = scalbn(r.hi + adj, spread); -#if defined(FE_INEXACT) && defined(FE_UNDERFLOW) - if (ilogb(ret) < -1022 && fetestexcept(FE_INEXACT)) - feraiseexcept(FE_UNDERFLOW); - else if (e) - feraiseexcept(FE_INEXACT); -#endif - return ret; - } - - adj = add_adjusted(r.lo, xy.lo); - if (spread + ilogb(r.hi) > -1023) - return scalbn(r.hi + adj, spread); - else - return add_and_denormalize(r.hi, adj, spread); -} -#endif diff --git a/waterbox/libc/functions/math/fmaf.c b/waterbox/libc/functions/math/fmaf.c deleted file mode 100644 index aa57feb695..0000000000 --- a/waterbox/libc/functions/math/fmaf.c +++ /dev/null @@ -1,93 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/s_fmaf.c */ -/*- - * Copyright (c) 2005-2011 David Schultz - * 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. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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 -#include -#include - -/* - * Fused multiply-add: Compute x * y + z with a single rounding error. - * - * A double has more than twice as much precision than a float, so - * direct double-precision arithmetic suffices, except where double - * rounding occurs. - */ -float fmaf(float x, float y, float z) -{ - #pragma STDC FENV_ACCESS ON - double xy, result; - union {double f; uint64_t i;} u; - int e; - - xy = (double)x * y; - result = xy + z; - u.f = result; - e = u.i>>52 & 0x7ff; - /* Common case: The double precision result is fine. */ - if ((u.i & 0x1fffffff) != 0x10000000 || /* not a halfway case */ - e == 0x7ff || /* NaN */ - result - xy == z || /* exact */ - fegetround() != FE_TONEAREST) /* not round-to-nearest */ - { - /* - underflow may not be raised correctly, example: - fmaf(0x1p-120f, 0x1p-120f, 0x1p-149f) - */ -#if defined(FE_INEXACT) && defined(FE_UNDERFLOW) - if (e < 0x3ff-126 && e >= 0x3ff-149 && fetestexcept(FE_INEXACT)) { - feclearexcept(FE_INEXACT); - /* TODO: gcc and clang bug workaround */ - volatile float vz = z; - result = xy + vz; - if (fetestexcept(FE_INEXACT)) - feraiseexcept(FE_UNDERFLOW); - else - feraiseexcept(FE_INEXACT); - } -#endif - z = result; - return z; - } - - /* - * If result is inexact, and exactly halfway between two float values, - * we need to adjust the low-order bit in the direction of the error. - */ -#ifdef FE_TOWARDZERO - fesetround(FE_TOWARDZERO); -#endif - volatile double vxy = xy; /* XXX work around gcc CSE bug */ - double adjusted_result = vxy + z; - fesetround(FE_TONEAREST); - if (result == adjusted_result) { - u.f = adjusted_result; - u.i++; - adjusted_result = u.f; - } - z = adjusted_result; - return z; -} diff --git a/waterbox/libc/functions/math/fmal.c b/waterbox/libc/functions/math/fmal.c deleted file mode 100644 index 4506aac6f6..0000000000 --- a/waterbox/libc/functions/math/fmal.c +++ /dev/null @@ -1,293 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/s_fmal.c */ -/*- - * Copyright (c) 2005-2011 David Schultz - * 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. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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 "libm.h" -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long double fmal(long double x, long double y, long double z) -{ - return fma(x, y, z); -} -#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384 -#include -#if LDBL_MANT_DIG == 64 -#define LASTBIT(u) (u.i.m & 1) -#define SPLIT (0x1p32L + 1) -#elif LDBL_MANT_DIG == 113 -#define LASTBIT(u) (u.i.lo & 1) -#define SPLIT (0x1p57L + 1) -#endif - -/* - * A struct dd represents a floating-point number with twice the precision - * of a long double. We maintain the invariant that "hi" stores the high-order - * bits of the result. - */ -struct dd { - long double hi; - long double lo; -}; - -/* - * Compute a+b exactly, returning the exact result in a struct dd. We assume - * that both a and b are finite, but make no assumptions about their relative - * magnitudes. - */ -static inline struct dd dd_add(long double a, long double b) -{ - struct dd ret; - long double s; - - ret.hi = a + b; - s = ret.hi - a; - ret.lo = (a - (ret.hi - s)) + (b - s); - return (ret); -} - -/* - * Compute a+b, with a small tweak: The least significant bit of the - * result is adjusted into a sticky bit summarizing all the bits that - * were lost to rounding. This adjustment negates the effects of double - * rounding when the result is added to another number with a higher - * exponent. For an explanation of round and sticky bits, see any reference - * on FPU design, e.g., - * - * J. Coonen. An Implementation Guide to a Proposed Standard for - * Floating-Point Arithmetic. Computer, vol. 13, no. 1, Jan 1980. - */ -static inline long double add_adjusted(long double a, long double b) -{ - struct dd sum; - union ldshape u; - - sum = dd_add(a, b); - if (sum.lo != 0) { - u.f = sum.hi; - if (!LASTBIT(u)) - sum.hi = nextafterl(sum.hi, INFINITY * sum.lo); - } - return (sum.hi); -} - -/* - * Compute ldexp(a+b, scale) with a single rounding error. It is assumed - * that the result will be subnormal, and care is taken to ensure that - * double rounding does not occur. - */ -static inline long double add_and_denormalize(long double a, long double b, int scale) -{ - struct dd sum; - int bits_lost; - union ldshape u; - - sum = dd_add(a, b); - - /* - * If we are losing at least two bits of accuracy to denormalization, - * then the first lost bit becomes a round bit, and we adjust the - * lowest bit of sum.hi to make it a sticky bit summarizing all the - * bits in sum.lo. With the sticky bit adjusted, the hardware will - * break any ties in the correct direction. - * - * If we are losing only one bit to denormalization, however, we must - * break the ties manually. - */ - if (sum.lo != 0) { - u.f = sum.hi; - bits_lost = -u.i.se - scale + 1; - if ((bits_lost != 1) ^ LASTBIT(u)) - sum.hi = nextafterl(sum.hi, INFINITY * sum.lo); - } - return scalbnl(sum.hi, scale); -} - -/* - * Compute a*b exactly, returning the exact result in a struct dd. We assume - * that both a and b are normalized, so no underflow or overflow will occur. - * The current rounding mode must be round-to-nearest. - */ -static inline struct dd dd_mul(long double a, long double b) -{ - struct dd ret; - long double ha, hb, la, lb, p, q; - - p = a * SPLIT; - ha = a - p; - ha += p; - la = a - ha; - - p = b * SPLIT; - hb = b - p; - hb += p; - lb = b - hb; - - p = ha * hb; - q = ha * lb + la * hb; - - ret.hi = p + q; - ret.lo = p - ret.hi + q + la * lb; - return (ret); -} - -/* - * Fused multiply-add: Compute x * y + z with a single rounding error. - * - * We use scaling to avoid overflow/underflow, along with the - * canonical precision-doubling technique adapted from: - * - * Dekker, T. A Floating-Point Technique for Extending the - * Available Precision. Numer. Math. 18, 224-242 (1971). - */ -long double fmal(long double x, long double y, long double z) -{ - #pragma STDC FENV_ACCESS ON - long double xs, ys, zs, adj; - struct dd xy, r; - int oround; - int ex, ey, ez; - int spread; - - /* - * Handle special cases. The order of operations and the particular - * return values here are crucial in handling special cases involving - * infinities, NaNs, overflows, and signed zeroes correctly. - */ - if (!isfinite(x) || !isfinite(y)) - return (x * y + z); - if (!isfinite(z)) - return (z); - if (x == 0.0 || y == 0.0) - return (x * y + z); - if (z == 0.0) - return (x * y); - - xs = frexpl(x, &ex); - ys = frexpl(y, &ey); - zs = frexpl(z, &ez); - oround = fegetround(); - spread = ex + ey - ez; - - /* - * If x * y and z are many orders of magnitude apart, the scaling - * will overflow, so we handle these cases specially. Rounding - * modes other than FE_TONEAREST are painful. - */ - if (spread < -LDBL_MANT_DIG) { -#ifdef FE_INEXACT - feraiseexcept(FE_INEXACT); -#endif -#ifdef FE_UNDERFLOW - if (!isnormal(z)) - feraiseexcept(FE_UNDERFLOW); -#endif - switch (oround) { - default: /* FE_TONEAREST */ - return (z); -#ifdef FE_TOWARDZERO - case FE_TOWARDZERO: - if (x > 0.0 ^ y < 0.0 ^ z < 0.0) - return (z); - else - return (nextafterl(z, 0)); -#endif -#ifdef FE_DOWNWARD - case FE_DOWNWARD: - if (x > 0.0 ^ y < 0.0) - return (z); - else - return (nextafterl(z, -INFINITY)); -#endif -#ifdef FE_UPWARD - case FE_UPWARD: - if (x > 0.0 ^ y < 0.0) - return (nextafterl(z, INFINITY)); - else - return (z); -#endif - } - } - if (spread <= LDBL_MANT_DIG * 2) - zs = scalbnl(zs, -spread); - else - zs = copysignl(LDBL_MIN, zs); - - fesetround(FE_TONEAREST); - - /* - * Basic approach for round-to-nearest: - * - * (xy.hi, xy.lo) = x * y (exact) - * (r.hi, r.lo) = xy.hi + z (exact) - * adj = xy.lo + r.lo (inexact; low bit is sticky) - * result = r.hi + adj (correctly rounded) - */ - xy = dd_mul(xs, ys); - r = dd_add(xy.hi, zs); - - spread = ex + ey; - - if (r.hi == 0.0) { - /* - * When the addends cancel to 0, ensure that the result has - * the correct sign. - */ - fesetround(oround); - volatile long double vzs = zs; /* XXX gcc CSE bug workaround */ - return xy.hi + vzs + scalbnl(xy.lo, spread); - } - - if (oround != FE_TONEAREST) { - /* - * There is no need to worry about double rounding in directed - * rounding modes. - * But underflow may not be raised correctly, example in downward rounding: - * fmal(0x1.0000000001p-16000L, 0x1.0000000001p-400L, -0x1p-16440L) - */ - long double ret; -#if defined(FE_INEXACT) && defined(FE_UNDERFLOW) - int e = fetestexcept(FE_INEXACT); - feclearexcept(FE_INEXACT); -#endif - fesetround(oround); - adj = r.lo + xy.lo; - ret = scalbnl(r.hi + adj, spread); -#if defined(FE_INEXACT) && defined(FE_UNDERFLOW) - if (ilogbl(ret) < -16382 && fetestexcept(FE_INEXACT)) - feraiseexcept(FE_UNDERFLOW); - else if (e) - feraiseexcept(FE_INEXACT); -#endif - return ret; - } - - adj = add_adjusted(r.lo, xy.lo); - if (spread + ilogbl(r.hi) > -16383) - return scalbnl(r.hi + adj, spread); - else - return add_and_denormalize(r.hi, adj, spread); -} -#endif diff --git a/waterbox/libc/functions/math/fmax.c b/waterbox/libc/functions/math/fmax.c deleted file mode 100644 index 94f0caa177..0000000000 --- a/waterbox/libc/functions/math/fmax.c +++ /dev/null @@ -1,13 +0,0 @@ -#include - -double fmax(double x, double y) -{ - if (isnan(x)) - return y; - if (isnan(y)) - return x; - /* handle signed zeros, see C99 Annex F.9.9.2 */ - if (signbit(x) != signbit(y)) - return signbit(x) ? y : x; - return x < y ? y : x; -} diff --git a/waterbox/libc/functions/math/fmaxf.c b/waterbox/libc/functions/math/fmaxf.c deleted file mode 100644 index 695d8179c6..0000000000 --- a/waterbox/libc/functions/math/fmaxf.c +++ /dev/null @@ -1,13 +0,0 @@ -#include - -float fmaxf(float x, float y) -{ - if (isnan(x)) - return y; - if (isnan(y)) - return x; - /* handle signed zeroes, see C99 Annex F.9.9.2 */ - if (signbit(x) != signbit(y)) - return signbit(x) ? y : x; - return x < y ? y : x; -} diff --git a/waterbox/libc/functions/math/fmaxl.c b/waterbox/libc/functions/math/fmaxl.c deleted file mode 100644 index 4b03158e06..0000000000 --- a/waterbox/libc/functions/math/fmaxl.c +++ /dev/null @@ -1,21 +0,0 @@ -#include -#include - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long double fmaxl(long double x, long double y) -{ - return fmax(x, y); -} -#else -long double fmaxl(long double x, long double y) -{ - if (isnan(x)) - return y; - if (isnan(y)) - return x; - /* handle signed zeros, see C99 Annex F.9.9.2 */ - if (signbit(x) != signbit(y)) - return signbit(x) ? y : x; - return x < y ? y : x; -} -#endif diff --git a/waterbox/libc/functions/math/fmin.c b/waterbox/libc/functions/math/fmin.c deleted file mode 100644 index 08a8fd17f2..0000000000 --- a/waterbox/libc/functions/math/fmin.c +++ /dev/null @@ -1,13 +0,0 @@ -#include - -double fmin(double x, double y) -{ - if (isnan(x)) - return y; - if (isnan(y)) - return x; - /* handle signed zeros, see C99 Annex F.9.9.2 */ - if (signbit(x) != signbit(y)) - return signbit(x) ? x : y; - return x < y ? x : y; -} diff --git a/waterbox/libc/functions/math/fminf.c b/waterbox/libc/functions/math/fminf.c deleted file mode 100644 index 3573c7de74..0000000000 --- a/waterbox/libc/functions/math/fminf.c +++ /dev/null @@ -1,13 +0,0 @@ -#include - -float fminf(float x, float y) -{ - if (isnan(x)) - return y; - if (isnan(y)) - return x; - /* handle signed zeros, see C99 Annex F.9.9.2 */ - if (signbit(x) != signbit(y)) - return signbit(x) ? x : y; - return x < y ? x : y; -} diff --git a/waterbox/libc/functions/math/fminl.c b/waterbox/libc/functions/math/fminl.c deleted file mode 100644 index 69bc24a79b..0000000000 --- a/waterbox/libc/functions/math/fminl.c +++ /dev/null @@ -1,21 +0,0 @@ -#include -#include - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long double fminl(long double x, long double y) -{ - return fmin(x, y); -} -#else -long double fminl(long double x, long double y) -{ - if (isnan(x)) - return y; - if (isnan(y)) - return x; - /* handle signed zeros, see C99 Annex F.9.9.2 */ - if (signbit(x) != signbit(y)) - return signbit(x) ? x : y; - return x < y ? x : y; -} -#endif diff --git a/waterbox/libc/functions/math/fmod.c b/waterbox/libc/functions/math/fmod.c deleted file mode 100644 index 6849722bac..0000000000 --- a/waterbox/libc/functions/math/fmod.c +++ /dev/null @@ -1,68 +0,0 @@ -#include -#include - -double fmod(double x, double y) -{ - union {double f; uint64_t i;} ux = {x}, uy = {y}; - int ex = ux.i>>52 & 0x7ff; - int ey = uy.i>>52 & 0x7ff; - int sx = ux.i>>63; - uint64_t i; - - /* in the followings uxi should be ux.i, but then gcc wrongly adds */ - /* float load/store to inner loops ruining performance and code size */ - uint64_t uxi = ux.i; - - if (uy.i<<1 == 0 || isnan(y) || ex == 0x7ff) - return (x*y)/(x*y); - if (uxi<<1 <= uy.i<<1) { - if (uxi<<1 == uy.i<<1) - return 0*x; - return x; - } - - /* normalize x and y */ - if (!ex) { - for (i = uxi<<12; i>>63 == 0; ex--, i <<= 1); - uxi <<= -ex + 1; - } else { - uxi &= -1ULL >> 12; - uxi |= 1ULL << 52; - } - if (!ey) { - for (i = uy.i<<12; i>>63 == 0; ey--, i <<= 1); - uy.i <<= -ey + 1; - } else { - uy.i &= -1ULL >> 12; - uy.i |= 1ULL << 52; - } - - /* x mod y */ - for (; ex > ey; ex--) { - i = uxi - uy.i; - if (i >> 63 == 0) { - if (i == 0) - return 0*x; - uxi = i; - } - uxi <<= 1; - } - i = uxi - uy.i; - if (i >> 63 == 0) { - if (i == 0) - return 0*x; - uxi = i; - } - for (; uxi>>52 == 0; uxi <<= 1, ex--); - - /* scale result */ - if (ex > 0) { - uxi -= 1ULL << 52; - uxi |= (uint64_t)ex << 52; - } else { - uxi >>= -ex + 1; - } - uxi |= (uint64_t)sx << 63; - ux.i = uxi; - return ux.f; -} diff --git a/waterbox/libc/functions/math/fmodf.c b/waterbox/libc/functions/math/fmodf.c deleted file mode 100644 index ff58f93365..0000000000 --- a/waterbox/libc/functions/math/fmodf.c +++ /dev/null @@ -1,65 +0,0 @@ -#include -#include - -float fmodf(float x, float y) -{ - union {float f; uint32_t i;} ux = {x}, uy = {y}; - int ex = ux.i>>23 & 0xff; - int ey = uy.i>>23 & 0xff; - uint32_t sx = ux.i & 0x80000000; - uint32_t i; - uint32_t uxi = ux.i; - - if (uy.i<<1 == 0 || isnan(y) || ex == 0xff) - return (x*y)/(x*y); - if (uxi<<1 <= uy.i<<1) { - if (uxi<<1 == uy.i<<1) - return 0*x; - return x; - } - - /* normalize x and y */ - if (!ex) { - for (i = uxi<<9; i>>31 == 0; ex--, i <<= 1); - uxi <<= -ex + 1; - } else { - uxi &= -1U >> 9; - uxi |= 1U << 23; - } - if (!ey) { - for (i = uy.i<<9; i>>31 == 0; ey--, i <<= 1); - uy.i <<= -ey + 1; - } else { - uy.i &= -1U >> 9; - uy.i |= 1U << 23; - } - - /* x mod y */ - for (; ex > ey; ex--) { - i = uxi - uy.i; - if (i >> 31 == 0) { - if (i == 0) - return 0*x; - uxi = i; - } - uxi <<= 1; - } - i = uxi - uy.i; - if (i >> 31 == 0) { - if (i == 0) - return 0*x; - uxi = i; - } - for (; uxi>>23 == 0; uxi <<= 1, ex--); - - /* scale result up */ - if (ex > 0) { - uxi -= 1U << 23; - uxi |= (uint32_t)ex << 23; - } else { - uxi >>= -ex + 1; - } - uxi |= sx; - ux.i = uxi; - return ux.f; -} diff --git a/waterbox/libc/functions/math/fmodl.c b/waterbox/libc/functions/math/fmodl.c deleted file mode 100644 index 9f5b87393d..0000000000 --- a/waterbox/libc/functions/math/fmodl.c +++ /dev/null @@ -1,105 +0,0 @@ -#include "libm.h" - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long double fmodl(long double x, long double y) -{ - return fmod(x, y); -} -#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384 -long double fmodl(long double x, long double y) -{ - union ldshape ux = {x}, uy = {y}; - int ex = ux.i.se & 0x7fff; - int ey = uy.i.se & 0x7fff; - int sx = ux.i.se & 0x8000; - - if (y == 0 || isnan(y) || ex == 0x7fff) - return (x*y)/(x*y); - ux.i.se = ex; - uy.i.se = ey; - if (ux.f <= uy.f) { - if (ux.f == uy.f) - return 0*x; - return x; - } - - /* normalize x and y */ - if (!ex) { - ux.f *= 0x1p120f; - ex = ux.i.se - 120; - } - if (!ey) { - uy.f *= 0x1p120f; - ey = uy.i.se - 120; - } - - /* x mod y */ -#if LDBL_MANT_DIG == 64 - uint64_t i, mx, my; - mx = ux.i.m; - my = uy.i.m; - for (; ex > ey; ex--) { - i = mx - my; - if (mx >= my) { - if (i == 0) - return 0*x; - mx = 2*i; - } else if (2*mx < mx) { - mx = 2*mx - my; - } else { - mx = 2*mx; - } - } - i = mx - my; - if (mx >= my) { - if (i == 0) - return 0*x; - mx = i; - } - for (; mx >> 63 == 0; mx *= 2, ex--); - ux.i.m = mx; -#elif LDBL_MANT_DIG == 113 - uint64_t hi, lo, xhi, xlo, yhi, ylo; - xhi = (ux.i2.hi & -1ULL>>16) | 1ULL<<48; - yhi = (uy.i2.hi & -1ULL>>16) | 1ULL<<48; - xlo = ux.i2.lo; - ylo = uy.i2.lo; - for (; ex > ey; ex--) { - hi = xhi - yhi; - lo = xlo - ylo; - if (xlo < ylo) - hi -= 1; - if (hi >> 63 == 0) { - if ((hi|lo) == 0) - return 0*x; - xhi = 2*hi + (lo>>63); - xlo = 2*lo; - } else { - xhi = 2*xhi + (xlo>>63); - xlo = 2*xlo; - } - } - hi = xhi - yhi; - lo = xlo - ylo; - if (xlo < ylo) - hi -= 1; - if (hi >> 63 == 0) { - if ((hi|lo) == 0) - return 0*x; - xhi = hi; - xlo = lo; - } - for (; xhi >> 48 == 0; xhi = 2*xhi + (xlo>>63), xlo = 2*xlo, ex--); - ux.i2.hi = xhi; - ux.i2.lo = xlo; -#endif - - /* scale result */ - if (ex <= 0) { - ux.i.se = (ex+120)|sx; - ux.f *= 0x1p-120f; - } else - ux.i.se = ex|sx; - return ux.f; -} -#endif diff --git a/waterbox/libc/functions/math/frexp.c b/waterbox/libc/functions/math/frexp.c deleted file mode 100644 index 27b6266ed0..0000000000 --- a/waterbox/libc/functions/math/frexp.c +++ /dev/null @@ -1,23 +0,0 @@ -#include -#include - -double frexp(double x, int *e) -{ - union { double d; uint64_t i; } y = { x }; - int ee = y.i>>52 & 0x7ff; - - if (!ee) { - if (x) { - x = frexp(x*0x1p64, e); - *e -= 64; - } else *e = 0; - return x; - } else if (ee == 0x7ff) { - return x; - } - - *e = ee - 0x3fe; - y.i &= 0x800fffffffffffffull; - y.i |= 0x3fe0000000000000ull; - return y.d; -} diff --git a/waterbox/libc/functions/math/frexpf.c b/waterbox/libc/functions/math/frexpf.c deleted file mode 100644 index 0787097527..0000000000 --- a/waterbox/libc/functions/math/frexpf.c +++ /dev/null @@ -1,23 +0,0 @@ -#include -#include - -float frexpf(float x, int *e) -{ - union { float f; uint32_t i; } y = { x }; - int ee = y.i>>23 & 0xff; - - if (!ee) { - if (x) { - x = frexpf(x*0x1p64, e); - *e -= 64; - } else *e = 0; - return x; - } else if (ee == 0xff) { - return x; - } - - *e = ee - 0x7e; - y.i &= 0x807ffffful; - y.i |= 0x3f000000ul; - return y.f; -} diff --git a/waterbox/libc/functions/math/frexpl.c b/waterbox/libc/functions/math/frexpl.c deleted file mode 100644 index 3c1b553748..0000000000 --- a/waterbox/libc/functions/math/frexpl.c +++ /dev/null @@ -1,29 +0,0 @@ -#include "libm.h" - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long double frexpl(long double x, int *e) -{ - return frexp(x, e); -} -#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384 -long double frexpl(long double x, int *e) -{ - union ldshape u = {x}; - int ee = u.i.se & 0x7fff; - - if (!ee) { - if (x) { - x = frexpl(x*0x1p120, e); - *e -= 120; - } else *e = 0; - return x; - } else if (ee == 0x7fff) { - return x; - } - - *e = ee - 0x3ffe; - u.i.se &= 0x8000; - u.i.se |= 0x3ffe; - return u.f; -} -#endif diff --git a/waterbox/libc/functions/math/hypot.c b/waterbox/libc/functions/math/hypot.c deleted file mode 100644 index 6071bf1e28..0000000000 --- a/waterbox/libc/functions/math/hypot.c +++ /dev/null @@ -1,67 +0,0 @@ -#include -#include -#include - -#if FLT_EVAL_METHOD > 1U && LDBL_MANT_DIG == 64 -#define SPLIT (0x1p32 + 1) -#else -#define SPLIT (0x1p27 + 1) -#endif - -static void sq(double_t *hi, double_t *lo, double x) -{ - double_t xh, xl, xc; - - xc = (double_t)x*SPLIT; - xh = x - xc + xc; - xl = x - xh; - *hi = (double_t)x*x; - *lo = xh*xh - *hi + 2*xh*xl + xl*xl; -} - -double hypot(double x, double y) -{ - union {double f; uint64_t i;} ux = {x}, uy = {y}, ut; - int ex, ey; - double_t hx, lx, hy, ly, z; - - /* arrange |x| >= |y| */ - ux.i &= -1ULL>>1; - uy.i &= -1ULL>>1; - if (ux.i < uy.i) { - ut = ux; - ux = uy; - uy = ut; - } - - /* special cases */ - ex = ux.i>>52; - ey = uy.i>>52; - x = ux.f; - y = uy.f; - /* note: hypot(inf,nan) == inf */ - if (ey == 0x7ff) - return y; - if (ex == 0x7ff || uy.i == 0) - return x; - /* note: hypot(x,y) ~= x + y*y/x/2 with inexact for small y/x */ - /* 64 difference is enough for ld80 double_t */ - if (ex - ey > 64) - return x + y; - - /* precise sqrt argument in nearest rounding mode without overflow */ - /* xh*xh must not overflow and xl*xl must not underflow in sq */ - z = 1; - if (ex > 0x3ff+510) { - z = 0x1p700; - x *= 0x1p-700; - y *= 0x1p-700; - } else if (ey < 0x3ff-450) { - z = 0x1p-700; - x *= 0x1p700; - y *= 0x1p700; - } - sq(&hx, &lx, x); - sq(&hy, &ly, y); - return z*sqrt(ly+lx+hy+hx); -} diff --git a/waterbox/libc/functions/math/hypotf.c b/waterbox/libc/functions/math/hypotf.c deleted file mode 100644 index 2fc214b723..0000000000 --- a/waterbox/libc/functions/math/hypotf.c +++ /dev/null @@ -1,35 +0,0 @@ -#include -#include - -float hypotf(float x, float y) -{ - union {float f; uint32_t i;} ux = {x}, uy = {y}, ut; - float_t z; - - ux.i &= -1U>>1; - uy.i &= -1U>>1; - if (ux.i < uy.i) { - ut = ux; - ux = uy; - uy = ut; - } - - x = ux.f; - y = uy.f; - if (uy.i == 0xff<<23) - return y; - if (ux.i >= 0xff<<23 || uy.i == 0 || ux.i - uy.i >= 25<<23) - return x + y; - - z = 1; - if (ux.i >= (0x7f+60)<<23) { - z = 0x1p90f; - x *= 0x1p-90f; - y *= 0x1p-90f; - } else if (uy.i < (0x7f-60)<<23) { - z = 0x1p-90f; - x *= 0x1p90f; - y *= 0x1p90f; - } - return z*sqrtf((double)x*x + (double)y*y); -} diff --git a/waterbox/libc/functions/math/hypotl.c b/waterbox/libc/functions/math/hypotl.c deleted file mode 100644 index 479aa92c3d..0000000000 --- a/waterbox/libc/functions/math/hypotl.c +++ /dev/null @@ -1,66 +0,0 @@ -#include "libm.h" - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long double hypotl(long double x, long double y) -{ - return hypot(x, y); -} -#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384 -#if LDBL_MANT_DIG == 64 -#define SPLIT (0x1p32L+1) -#elif LDBL_MANT_DIG == 113 -#define SPLIT (0x1p57L+1) -#endif - -static void sq(long double *hi, long double *lo, long double x) -{ - long double xh, xl, xc; - xc = x*SPLIT; - xh = x - xc + xc; - xl = x - xh; - *hi = x*x; - *lo = xh*xh - *hi + 2*xh*xl + xl*xl; -} - -long double hypotl(long double x, long double y) -{ - union ldshape ux = {x}, uy = {y}; - int ex, ey; - long double hx, lx, hy, ly, z; - - ux.i.se &= 0x7fff; - uy.i.se &= 0x7fff; - if (ux.i.se < uy.i.se) { - ex = uy.i.se; - ey = ux.i.se; - x = uy.f; - y = ux.f; - } else { - ex = ux.i.se; - ey = uy.i.se; - x = ux.f; - y = uy.f; - } - - if (ex == 0x7fff && isinf(y)) - return y; - if (ex == 0x7fff || y == 0) - return x; - if (ex - ey > LDBL_MANT_DIG) - return x + y; - - z = 1; - if (ex > 0x3fff+8000) { - z = 0x1p10000L; - x *= 0x1p-10000L; - y *= 0x1p-10000L; - } else if (ey < 0x3fff-8000) { - z = 0x1p-10000L; - x *= 0x1p10000L; - y *= 0x1p10000L; - } - sq(&hx, &lx, x); - sq(&hy, &ly, y); - return z*sqrtl(ly+lx+hy+hx); -} -#endif diff --git a/waterbox/libc/functions/math/ilogb.c b/waterbox/libc/functions/math/ilogb.c deleted file mode 100644 index 64d40154d6..0000000000 --- a/waterbox/libc/functions/math/ilogb.c +++ /dev/null @@ -1,26 +0,0 @@ -#include -#include "libm.h" - -int ilogb(double x) -{ - #pragma STDC FENV_ACCESS ON - union {double f; uint64_t i;} u = {x}; - uint64_t i = u.i; - int e = i>>52 & 0x7ff; - - if (!e) { - i <<= 12; - if (i == 0) { - FORCE_EVAL(0/0.0f); - return FP_ILOGB0; - } - /* subnormal x */ - for (e = -0x3ff; i>>63 == 0; e--, i<<=1); - return e; - } - if (e == 0x7ff) { - FORCE_EVAL(0/0.0f); - return i<<12 ? FP_ILOGBNAN : INT_MAX; - } - return e - 0x3ff; -} diff --git a/waterbox/libc/functions/math/ilogbf.c b/waterbox/libc/functions/math/ilogbf.c deleted file mode 100644 index e23ba209ec..0000000000 --- a/waterbox/libc/functions/math/ilogbf.c +++ /dev/null @@ -1,26 +0,0 @@ -#include -#include "libm.h" - -int ilogbf(float x) -{ - #pragma STDC FENV_ACCESS ON - union {float f; uint32_t i;} u = {x}; - uint32_t i = u.i; - int e = i>>23 & 0xff; - - if (!e) { - i <<= 9; - if (i == 0) { - FORCE_EVAL(0/0.0f); - return FP_ILOGB0; - } - /* subnormal x */ - for (e = -0x7f; i>>31 == 0; e--, i<<=1); - return e; - } - if (e == 0xff) { - FORCE_EVAL(0/0.0f); - return i<<9 ? FP_ILOGBNAN : INT_MAX; - } - return e - 0x7f; -} diff --git a/waterbox/libc/functions/math/ilogbl.c b/waterbox/libc/functions/math/ilogbl.c deleted file mode 100644 index 7b1a9cf8d0..0000000000 --- a/waterbox/libc/functions/math/ilogbl.c +++ /dev/null @@ -1,55 +0,0 @@ -#include -#include "libm.h" - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -int ilogbl(long double x) -{ - return ilogb(x); -} -#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384 -int ilogbl(long double x) -{ - #pragma STDC FENV_ACCESS ON - union ldshape u = {x}; - uint64_t m = u.i.m; - int e = u.i.se & 0x7fff; - - if (!e) { - if (m == 0) { - FORCE_EVAL(0/0.0f); - return FP_ILOGB0; - } - /* subnormal x */ - for (e = -0x3fff+1; m>>63 == 0; e--, m<<=1); - return e; - } - if (e == 0x7fff) { - FORCE_EVAL(0/0.0f); - return m<<1 ? FP_ILOGBNAN : INT_MAX; - } - return e - 0x3fff; -} -#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384 -int ilogbl(long double x) -{ - #pragma STDC FENV_ACCESS ON - union ldshape u = {x}; - int e = u.i.se & 0x7fff; - - if (!e) { - if (x == 0) { - FORCE_EVAL(0/0.0f); - return FP_ILOGB0; - } - /* subnormal x */ - x *= 0x1p120; - return ilogbl(x) - 120; - } - if (e == 0x7fff) { - FORCE_EVAL(0/0.0f); - u.i.se = 0; - return u.f ? FP_ILOGBNAN : INT_MAX; - } - return e - 0x3fff; -} -#endif diff --git a/waterbox/libc/functions/math/j0.c b/waterbox/libc/functions/math/j0.c deleted file mode 100644 index d722d94280..0000000000 --- a/waterbox/libc/functions/math/j0.c +++ /dev/null @@ -1,375 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/e_j0.c */ -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * - * Developed at SunSoft, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ -/* j0(x), y0(x) - * Bessel function of the first and second kinds of order zero. - * Method -- j0(x): - * 1. For tiny x, we use j0(x) = 1 - x^2/4 + x^4/64 - ... - * 2. Reduce x to |x| since j0(x)=j0(-x), and - * for x in (0,2) - * j0(x) = 1-z/4+ z^2*R0/S0, where z = x*x; - * (precision: |j0-1+z/4-z^2R0/S0 |<2**-63.67 ) - * for x in (2,inf) - * j0(x) = sqrt(2/(pi*x))*(p0(x)*cos(x0)-q0(x)*sin(x0)) - * where x0 = x-pi/4. It is better to compute sin(x0),cos(x0) - * as follow: - * cos(x0) = cos(x)cos(pi/4)+sin(x)sin(pi/4) - * = 1/sqrt(2) * (cos(x) + sin(x)) - * sin(x0) = sin(x)cos(pi/4)-cos(x)sin(pi/4) - * = 1/sqrt(2) * (sin(x) - cos(x)) - * (To avoid cancellation, use - * sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x)) - * to compute the worse one.) - * - * 3 Special cases - * j0(nan)= nan - * j0(0) = 1 - * j0(inf) = 0 - * - * Method -- y0(x): - * 1. For x<2. - * Since - * y0(x) = 2/pi*(j0(x)*(ln(x/2)+Euler) + x^2/4 - ...) - * therefore y0(x)-2/pi*j0(x)*ln(x) is an even function. - * We use the following function to approximate y0, - * y0(x) = U(z)/V(z) + (2/pi)*(j0(x)*ln(x)), z= x^2 - * where - * U(z) = u00 + u01*z + ... + u06*z^6 - * V(z) = 1 + v01*z + ... + v04*z^4 - * with absolute approximation error bounded by 2**-72. - * Note: For tiny x, U/V = u0 and j0(x)~1, hence - * y0(tiny) = u0 + (2/pi)*ln(tiny), (choose tiny<2**-27) - * 2. For x>=2. - * y0(x) = sqrt(2/(pi*x))*(p0(x)*cos(x0)+q0(x)*sin(x0)) - * where x0 = x-pi/4. It is better to compute sin(x0),cos(x0) - * by the method mentioned above. - * 3. Special cases: y0(0)=-inf, y0(x<0)=NaN, y0(inf)=0. - */ - -#include "libm.h" - -static double pzero(double), qzero(double); - -static const double -invsqrtpi = 5.64189583547756279280e-01, /* 0x3FE20DD7, 0x50429B6D */ -tpi = 6.36619772367581382433e-01; /* 0x3FE45F30, 0x6DC9C883 */ - -/* common method when |x|>=2 */ -static double common(uint32_t ix, double x, int y0) -{ - double s,c,ss,cc,z; - - /* - * j0(x) = sqrt(2/(pi*x))*(p0(x)*cos(x-pi/4)-q0(x)*sin(x-pi/4)) - * y0(x) = sqrt(2/(pi*x))*(p0(x)*sin(x-pi/4)+q0(x)*cos(x-pi/4)) - * - * sin(x-pi/4) = (sin(x) - cos(x))/sqrt(2) - * cos(x-pi/4) = (sin(x) + cos(x))/sqrt(2) - * sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x)) - */ - s = sin(x); - c = cos(x); - if (y0) - c = -c; - cc = s+c; - /* avoid overflow in 2*x, big ulp error when x>=0x1p1023 */ - if (ix < 0x7fe00000) { - ss = s-c; - z = -cos(2*x); - if (s*c < 0) - cc = z/ss; - else - ss = z/cc; - if (ix < 0x48000000) { - if (y0) - ss = -ss; - cc = pzero(x)*cc-qzero(x)*ss; - } - } - return invsqrtpi*cc/sqrt(x); -} - -/* R0/S0 on [0, 2.00] */ -static const double -R02 = 1.56249999999999947958e-02, /* 0x3F8FFFFF, 0xFFFFFFFD */ -R03 = -1.89979294238854721751e-04, /* 0xBF28E6A5, 0xB61AC6E9 */ -R04 = 1.82954049532700665670e-06, /* 0x3EBEB1D1, 0x0C503919 */ -R05 = -4.61832688532103189199e-09, /* 0xBE33D5E7, 0x73D63FCE */ -S01 = 1.56191029464890010492e-02, /* 0x3F8FFCE8, 0x82C8C2A4 */ -S02 = 1.16926784663337450260e-04, /* 0x3F1EA6D2, 0xDD57DBF4 */ -S03 = 5.13546550207318111446e-07, /* 0x3EA13B54, 0xCE84D5A9 */ -S04 = 1.16614003333790000205e-09; /* 0x3E1408BC, 0xF4745D8F */ - -double j0(double x) -{ - double z,r,s; - uint32_t ix; - - GET_HIGH_WORD(ix, x); - ix &= 0x7fffffff; - - /* j0(+-inf)=0, j0(nan)=nan */ - if (ix >= 0x7ff00000) - return 1/(x*x); - x = fabs(x); - - if (ix >= 0x40000000) { /* |x| >= 2 */ - /* large ulp error near zeros: 2.4, 5.52, 8.6537,.. */ - return common(ix,x,0); - } - - /* 1 - x*x/4 + x*x*R(x^2)/S(x^2) */ - if (ix >= 0x3f200000) { /* |x| >= 2**-13 */ - /* up to 4ulp error close to 2 */ - z = x*x; - r = z*(R02+z*(R03+z*(R04+z*R05))); - s = 1+z*(S01+z*(S02+z*(S03+z*S04))); - return (1+x/2)*(1-x/2) + z*(r/s); - } - - /* 1 - x*x/4 */ - /* prevent underflow */ - /* inexact should be raised when x!=0, this is not done correctly */ - if (ix >= 0x38000000) /* |x| >= 2**-127 */ - x = 0.25*x*x; - return 1 - x; -} - -static const double -u00 = -7.38042951086872317523e-02, /* 0xBFB2E4D6, 0x99CBD01F */ -u01 = 1.76666452509181115538e-01, /* 0x3FC69D01, 0x9DE9E3FC */ -u02 = -1.38185671945596898896e-02, /* 0xBF8C4CE8, 0xB16CFA97 */ -u03 = 3.47453432093683650238e-04, /* 0x3F36C54D, 0x20B29B6B */ -u04 = -3.81407053724364161125e-06, /* 0xBECFFEA7, 0x73D25CAD */ -u05 = 1.95590137035022920206e-08, /* 0x3E550057, 0x3B4EABD4 */ -u06 = -3.98205194132103398453e-11, /* 0xBDC5E43D, 0x693FB3C8 */ -v01 = 1.27304834834123699328e-02, /* 0x3F8A1270, 0x91C9C71A */ -v02 = 7.60068627350353253702e-05, /* 0x3F13ECBB, 0xF578C6C1 */ -v03 = 2.59150851840457805467e-07, /* 0x3E91642D, 0x7FF202FD */ -v04 = 4.41110311332675467403e-10; /* 0x3DFE5018, 0x3BD6D9EF */ - -double y0(double x) -{ - double z,u,v; - uint32_t ix,lx; - - EXTRACT_WORDS(ix, lx, x); - - /* y0(nan)=nan, y0(<0)=nan, y0(0)=-inf, y0(inf)=0 */ - if ((ix<<1 | lx) == 0) - return -1/0.0; - if (ix>>31) - return 0/0.0; - if (ix >= 0x7ff00000) - return 1/x; - - if (ix >= 0x40000000) { /* x >= 2 */ - /* large ulp errors near zeros: 3.958, 7.086,.. */ - return common(ix,x,1); - } - - /* U(x^2)/V(x^2) + (2/pi)*j0(x)*log(x) */ - if (ix >= 0x3e400000) { /* x >= 2**-27 */ - /* large ulp error near the first zero, x ~= 0.89 */ - z = x*x; - u = u00+z*(u01+z*(u02+z*(u03+z*(u04+z*(u05+z*u06))))); - v = 1.0+z*(v01+z*(v02+z*(v03+z*v04))); - return u/v + tpi*(j0(x)*log(x)); - } - return u00 + tpi*log(x); -} - -/* The asymptotic expansions of pzero is - * 1 - 9/128 s^2 + 11025/98304 s^4 - ..., where s = 1/x. - * For x >= 2, We approximate pzero by - * pzero(x) = 1 + (R/S) - * where R = pR0 + pR1*s^2 + pR2*s^4 + ... + pR5*s^10 - * S = 1 + pS0*s^2 + ... + pS4*s^10 - * and - * | pzero(x)-1-R/S | <= 2 ** ( -60.26) - */ -static const double pR8[6] = { /* for x in [inf, 8]=1/[0,0.125] */ - 0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */ - -7.03124999999900357484e-02, /* 0xBFB1FFFF, 0xFFFFFD32 */ - -8.08167041275349795626e+00, /* 0xC02029D0, 0xB44FA779 */ - -2.57063105679704847262e+02, /* 0xC0701102, 0x7B19E863 */ - -2.48521641009428822144e+03, /* 0xC0A36A6E, 0xCD4DCAFC */ - -5.25304380490729545272e+03, /* 0xC0B4850B, 0x36CC643D */ -}; -static const double pS8[5] = { - 1.16534364619668181717e+02, /* 0x405D2233, 0x07A96751 */ - 3.83374475364121826715e+03, /* 0x40ADF37D, 0x50596938 */ - 4.05978572648472545552e+04, /* 0x40E3D2BB, 0x6EB6B05F */ - 1.16752972564375915681e+05, /* 0x40FC810F, 0x8F9FA9BD */ - 4.76277284146730962675e+04, /* 0x40E74177, 0x4F2C49DC */ -}; - -static const double pR5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */ - -1.14125464691894502584e-11, /* 0xBDA918B1, 0x47E495CC */ - -7.03124940873599280078e-02, /* 0xBFB1FFFF, 0xE69AFBC6 */ - -4.15961064470587782438e+00, /* 0xC010A370, 0xF90C6BBF */ - -6.76747652265167261021e+01, /* 0xC050EB2F, 0x5A7D1783 */ - -3.31231299649172967747e+02, /* 0xC074B3B3, 0x6742CC63 */ - -3.46433388365604912451e+02, /* 0xC075A6EF, 0x28A38BD7 */ -}; -static const double pS5[5] = { - 6.07539382692300335975e+01, /* 0x404E6081, 0x0C98C5DE */ - 1.05125230595704579173e+03, /* 0x40906D02, 0x5C7E2864 */ - 5.97897094333855784498e+03, /* 0x40B75AF8, 0x8FBE1D60 */ - 9.62544514357774460223e+03, /* 0x40C2CCB8, 0xFA76FA38 */ - 2.40605815922939109441e+03, /* 0x40A2CC1D, 0xC70BE864 */ -}; - -static const double pR3[6] = {/* for x in [4.547,2.8571]=1/[0.2199,0.35001] */ - -2.54704601771951915620e-09, /* 0xBE25E103, 0x6FE1AA86 */ - -7.03119616381481654654e-02, /* 0xBFB1FFF6, 0xF7C0E24B */ - -2.40903221549529611423e+00, /* 0xC00345B2, 0xAEA48074 */ - -2.19659774734883086467e+01, /* 0xC035F74A, 0x4CB94E14 */ - -5.80791704701737572236e+01, /* 0xC04D0A22, 0x420A1A45 */ - -3.14479470594888503854e+01, /* 0xC03F72AC, 0xA892D80F */ -}; -static const double pS3[5] = { - 3.58560338055209726349e+01, /* 0x4041ED92, 0x84077DD3 */ - 3.61513983050303863820e+02, /* 0x40769839, 0x464A7C0E */ - 1.19360783792111533330e+03, /* 0x4092A66E, 0x6D1061D6 */ - 1.12799679856907414432e+03, /* 0x40919FFC, 0xB8C39B7E */ - 1.73580930813335754692e+02, /* 0x4065B296, 0xFC379081 */ -}; - -static const double pR2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */ - -8.87534333032526411254e-08, /* 0xBE77D316, 0xE927026D */ - -7.03030995483624743247e-02, /* 0xBFB1FF62, 0x495E1E42 */ - -1.45073846780952986357e+00, /* 0xBFF73639, 0x8A24A843 */ - -7.63569613823527770791e+00, /* 0xC01E8AF3, 0xEDAFA7F3 */ - -1.11931668860356747786e+01, /* 0xC02662E6, 0xC5246303 */ - -3.23364579351335335033e+00, /* 0xC009DE81, 0xAF8FE70F */ -}; -static const double pS2[5] = { - 2.22202997532088808441e+01, /* 0x40363865, 0x908B5959 */ - 1.36206794218215208048e+02, /* 0x4061069E, 0x0EE8878F */ - 2.70470278658083486789e+02, /* 0x4070E786, 0x42EA079B */ - 1.53875394208320329881e+02, /* 0x40633C03, 0x3AB6FAFF */ - 1.46576176948256193810e+01, /* 0x402D50B3, 0x44391809 */ -}; - -static double pzero(double x) -{ - const double *p,*q; - double_t z,r,s; - uint32_t ix; - - GET_HIGH_WORD(ix, x); - ix &= 0x7fffffff; - if (ix >= 0x40200000){p = pR8; q = pS8;} - else if (ix >= 0x40122E8B){p = pR5; q = pS5;} - else if (ix >= 0x4006DB6D){p = pR3; q = pS3;} - else /*ix >= 0x40000000*/ {p = pR2; q = pS2;} - z = 1.0/(x*x); - r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5])))); - s = 1.0+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*q[4])))); - return 1.0 + r/s; -} - - -/* For x >= 8, the asymptotic expansions of qzero is - * -1/8 s + 75/1024 s^3 - ..., where s = 1/x. - * We approximate pzero by - * qzero(x) = s*(-1.25 + (R/S)) - * where R = qR0 + qR1*s^2 + qR2*s^4 + ... + qR5*s^10 - * S = 1 + qS0*s^2 + ... + qS5*s^12 - * and - * | qzero(x)/s +1.25-R/S | <= 2 ** ( -61.22) - */ -static const double qR8[6] = { /* for x in [inf, 8]=1/[0,0.125] */ - 0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */ - 7.32421874999935051953e-02, /* 0x3FB2BFFF, 0xFFFFFE2C */ - 1.17682064682252693899e+01, /* 0x40278952, 0x5BB334D6 */ - 5.57673380256401856059e+02, /* 0x40816D63, 0x15301825 */ - 8.85919720756468632317e+03, /* 0x40C14D99, 0x3E18F46D */ - 3.70146267776887834771e+04, /* 0x40E212D4, 0x0E901566 */ -}; -static const double qS8[6] = { - 1.63776026895689824414e+02, /* 0x406478D5, 0x365B39BC */ - 8.09834494656449805916e+03, /* 0x40BFA258, 0x4E6B0563 */ - 1.42538291419120476348e+05, /* 0x41016652, 0x54D38C3F */ - 8.03309257119514397345e+05, /* 0x412883DA, 0x83A52B43 */ - 8.40501579819060512818e+05, /* 0x4129A66B, 0x28DE0B3D */ - -3.43899293537866615225e+05, /* 0xC114FD6D, 0x2C9530C5 */ -}; - -static const double qR5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */ - 1.84085963594515531381e-11, /* 0x3DB43D8F, 0x29CC8CD9 */ - 7.32421766612684765896e-02, /* 0x3FB2BFFF, 0xD172B04C */ - 5.83563508962056953777e+00, /* 0x401757B0, 0xB9953DD3 */ - 1.35111577286449829671e+02, /* 0x4060E392, 0x0A8788E9 */ - 1.02724376596164097464e+03, /* 0x40900CF9, 0x9DC8C481 */ - 1.98997785864605384631e+03, /* 0x409F17E9, 0x53C6E3A6 */ -}; -static const double qS5[6] = { - 8.27766102236537761883e+01, /* 0x4054B1B3, 0xFB5E1543 */ - 2.07781416421392987104e+03, /* 0x40A03BA0, 0xDA21C0CE */ - 1.88472887785718085070e+04, /* 0x40D267D2, 0x7B591E6D */ - 5.67511122894947329769e+04, /* 0x40EBB5E3, 0x97E02372 */ - 3.59767538425114471465e+04, /* 0x40E19118, 0x1F7A54A0 */ - -5.35434275601944773371e+03, /* 0xC0B4EA57, 0xBEDBC609 */ -}; - -static const double qR3[6] = {/* for x in [4.547,2.8571]=1/[0.2199,0.35001] */ - 4.37741014089738620906e-09, /* 0x3E32CD03, 0x6ADECB82 */ - 7.32411180042911447163e-02, /* 0x3FB2BFEE, 0x0E8D0842 */ - 3.34423137516170720929e+00, /* 0x400AC0FC, 0x61149CF5 */ - 4.26218440745412650017e+01, /* 0x40454F98, 0x962DAEDD */ - 1.70808091340565596283e+02, /* 0x406559DB, 0xE25EFD1F */ - 1.66733948696651168575e+02, /* 0x4064D77C, 0x81FA21E0 */ -}; -static const double qS3[6] = { - 4.87588729724587182091e+01, /* 0x40486122, 0xBFE343A6 */ - 7.09689221056606015736e+02, /* 0x40862D83, 0x86544EB3 */ - 3.70414822620111362994e+03, /* 0x40ACF04B, 0xE44DFC63 */ - 6.46042516752568917582e+03, /* 0x40B93C6C, 0xD7C76A28 */ - 2.51633368920368957333e+03, /* 0x40A3A8AA, 0xD94FB1C0 */ - -1.49247451836156386662e+02, /* 0xC062A7EB, 0x201CF40F */ -}; - -static const double qR2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */ - 1.50444444886983272379e-07, /* 0x3E84313B, 0x54F76BDB */ - 7.32234265963079278272e-02, /* 0x3FB2BEC5, 0x3E883E34 */ - 1.99819174093815998816e+00, /* 0x3FFFF897, 0xE727779C */ - 1.44956029347885735348e+01, /* 0x402CFDBF, 0xAAF96FE5 */ - 3.16662317504781540833e+01, /* 0x403FAA8E, 0x29FBDC4A */ - 1.62527075710929267416e+01, /* 0x403040B1, 0x71814BB4 */ -}; -static const double qS2[6] = { - 3.03655848355219184498e+01, /* 0x403E5D96, 0xF7C07AED */ - 2.69348118608049844624e+02, /* 0x4070D591, 0xE4D14B40 */ - 8.44783757595320139444e+02, /* 0x408A6645, 0x22B3BF22 */ - 8.82935845112488550512e+02, /* 0x408B977C, 0x9C5CC214 */ - 2.12666388511798828631e+02, /* 0x406A9553, 0x0E001365 */ - -5.31095493882666946917e+00, /* 0xC0153E6A, 0xF8B32931 */ -}; - -static double qzero(double x) -{ - const double *p,*q; - double_t s,r,z; - uint32_t ix; - - GET_HIGH_WORD(ix, x); - ix &= 0x7fffffff; - if (ix >= 0x40200000){p = qR8; q = qS8;} - else if (ix >= 0x40122E8B){p = qR5; q = qS5;} - else if (ix >= 0x4006DB6D){p = qR3; q = qS3;} - else /*ix >= 0x40000000*/ {p = qR2; q = qS2;} - z = 1.0/(x*x); - r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5])))); - s = 1.0+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*(q[4]+z*q[5]))))); - return (-.125 + r/s)/x; -} diff --git a/waterbox/libc/functions/math/j0f.c b/waterbox/libc/functions/math/j0f.c deleted file mode 100644 index 45883dc419..0000000000 --- a/waterbox/libc/functions/math/j0f.c +++ /dev/null @@ -1,314 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/e_j0f.c */ -/* - * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. - */ -/* - * ==================================================== - * 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. - * ==================================================== - */ - -#define _GNU_SOURCE -#include "libm.h" - -static float pzerof(float), qzerof(float); - -static const float -invsqrtpi = 5.6418961287e-01, /* 0x3f106ebb */ -tpi = 6.3661974669e-01; /* 0x3f22f983 */ - -static float common(uint32_t ix, float x, int y0) -{ - float z,s,c,ss,cc; - /* - * j0(x) = 1/sqrt(pi) * (P(0,x)*cc - Q(0,x)*ss) / sqrt(x) - * y0(x) = 1/sqrt(pi) * (P(0,x)*ss + Q(0,x)*cc) / sqrt(x) - */ - s = sinf(x); - c = cosf(x); - if (y0) - c = -c; - cc = s+c; - if (ix < 0x7f000000) { - ss = s-c; - z = -cosf(2*x); - if (s*c < 0) - cc = z/ss; - else - ss = z/cc; - if (ix < 0x58800000) { - if (y0) - ss = -ss; - cc = pzerof(x)*cc-qzerof(x)*ss; - } - } - return invsqrtpi*cc/sqrtf(x); -} - -/* R0/S0 on [0, 2.00] */ -static const float -R02 = 1.5625000000e-02, /* 0x3c800000 */ -R03 = -1.8997929874e-04, /* 0xb947352e */ -R04 = 1.8295404516e-06, /* 0x35f58e88 */ -R05 = -4.6183270541e-09, /* 0xb19eaf3c */ -S01 = 1.5619102865e-02, /* 0x3c7fe744 */ -S02 = 1.1692678527e-04, /* 0x38f53697 */ -S03 = 5.1354652442e-07, /* 0x3509daa6 */ -S04 = 1.1661400734e-09; /* 0x30a045e8 */ - -float j0f(float x) -{ - float z,r,s; - uint32_t ix; - - GET_FLOAT_WORD(ix, x); - ix &= 0x7fffffff; - if (ix >= 0x7f800000) - return 1/(x*x); - x = fabsf(x); - - if (ix >= 0x40000000) { /* |x| >= 2 */ - /* large ulp error near zeros */ - return common(ix, x, 0); - } - if (ix >= 0x3a000000) { /* |x| >= 2**-11 */ - /* up to 4ulp error near 2 */ - z = x*x; - r = z*(R02+z*(R03+z*(R04+z*R05))); - s = 1+z*(S01+z*(S02+z*(S03+z*S04))); - return (1+x/2)*(1-x/2) + z*(r/s); - } - if (ix >= 0x21800000) /* |x| >= 2**-60 */ - x = 0.25f*x*x; - return 1 - x; -} - -static const float -u00 = -7.3804296553e-02, /* 0xbd9726b5 */ -u01 = 1.7666645348e-01, /* 0x3e34e80d */ -u02 = -1.3818567619e-02, /* 0xbc626746 */ -u03 = 3.4745343146e-04, /* 0x39b62a69 */ -u04 = -3.8140706238e-06, /* 0xb67ff53c */ -u05 = 1.9559013964e-08, /* 0x32a802ba */ -u06 = -3.9820518410e-11, /* 0xae2f21eb */ -v01 = 1.2730483897e-02, /* 0x3c509385 */ -v02 = 7.6006865129e-05, /* 0x389f65e0 */ -v03 = 2.5915085189e-07, /* 0x348b216c */ -v04 = 4.4111031494e-10; /* 0x2ff280c2 */ - -float y0f(float x) -{ - float z,u,v; - uint32_t ix; - - GET_FLOAT_WORD(ix, x); - if ((ix & 0x7fffffff) == 0) - return -1/0.0f; - if (ix>>31) - return 0/0.0f; - if (ix >= 0x7f800000) - return 1/x; - if (ix >= 0x40000000) { /* |x| >= 2.0 */ - /* large ulp error near zeros */ - return common(ix,x,1); - } - if (ix >= 0x39000000) { /* x >= 2**-13 */ - /* large ulp error at x ~= 0.89 */ - z = x*x; - u = u00+z*(u01+z*(u02+z*(u03+z*(u04+z*(u05+z*u06))))); - v = 1+z*(v01+z*(v02+z*(v03+z*v04))); - return u/v + tpi*(j0f(x)*logf(x)); - } - return u00 + tpi*logf(x); -} - -/* The asymptotic expansions of pzero is - * 1 - 9/128 s^2 + 11025/98304 s^4 - ..., where s = 1/x. - * For x >= 2, We approximate pzero by - * pzero(x) = 1 + (R/S) - * where R = pR0 + pR1*s^2 + pR2*s^4 + ... + pR5*s^10 - * S = 1 + pS0*s^2 + ... + pS4*s^10 - * and - * | pzero(x)-1-R/S | <= 2 ** ( -60.26) - */ -static const float pR8[6] = { /* for x in [inf, 8]=1/[0,0.125] */ - 0.0000000000e+00, /* 0x00000000 */ - -7.0312500000e-02, /* 0xbd900000 */ - -8.0816707611e+00, /* 0xc1014e86 */ - -2.5706311035e+02, /* 0xc3808814 */ - -2.4852163086e+03, /* 0xc51b5376 */ - -5.2530439453e+03, /* 0xc5a4285a */ -}; -static const float pS8[5] = { - 1.1653436279e+02, /* 0x42e91198 */ - 3.8337448730e+03, /* 0x456f9beb */ - 4.0597855469e+04, /* 0x471e95db */ - 1.1675296875e+05, /* 0x47e4087c */ - 4.7627726562e+04, /* 0x473a0bba */ -}; -static const float pR5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */ - -1.1412546255e-11, /* 0xad48c58a */ - -7.0312492549e-02, /* 0xbd8fffff */ - -4.1596107483e+00, /* 0xc0851b88 */ - -6.7674766541e+01, /* 0xc287597b */ - -3.3123129272e+02, /* 0xc3a59d9b */ - -3.4643338013e+02, /* 0xc3ad3779 */ -}; -static const float pS5[5] = { - 6.0753936768e+01, /* 0x42730408 */ - 1.0512523193e+03, /* 0x44836813 */ - 5.9789707031e+03, /* 0x45bad7c4 */ - 9.6254453125e+03, /* 0x461665c8 */ - 2.4060581055e+03, /* 0x451660ee */ -}; - -static const float pR3[6] = {/* for x in [4.547,2.8571]=1/[0.2199,0.35001] */ - -2.5470459075e-09, /* 0xb12f081b */ - -7.0311963558e-02, /* 0xbd8fffb8 */ - -2.4090321064e+00, /* 0xc01a2d95 */ - -2.1965976715e+01, /* 0xc1afba52 */ - -5.8079170227e+01, /* 0xc2685112 */ - -3.1447946548e+01, /* 0xc1fb9565 */ -}; -static const float pS3[5] = { - 3.5856033325e+01, /* 0x420f6c94 */ - 3.6151397705e+02, /* 0x43b4c1ca */ - 1.1936077881e+03, /* 0x44953373 */ - 1.1279968262e+03, /* 0x448cffe6 */ - 1.7358093262e+02, /* 0x432d94b8 */ -}; - -static const float pR2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */ - -8.8753431271e-08, /* 0xb3be98b7 */ - -7.0303097367e-02, /* 0xbd8ffb12 */ - -1.4507384300e+00, /* 0xbfb9b1cc */ - -7.6356959343e+00, /* 0xc0f4579f */ - -1.1193166733e+01, /* 0xc1331736 */ - -3.2336456776e+00, /* 0xc04ef40d */ -}; -static const float pS2[5] = { - 2.2220300674e+01, /* 0x41b1c32d */ - 1.3620678711e+02, /* 0x430834f0 */ - 2.7047027588e+02, /* 0x43873c32 */ - 1.5387539673e+02, /* 0x4319e01a */ - 1.4657617569e+01, /* 0x416a859a */ -}; - -static float pzerof(float x) -{ - const float *p,*q; - float_t z,r,s; - uint32_t ix; - - GET_FLOAT_WORD(ix, x); - ix &= 0x7fffffff; - if (ix >= 0x41000000){p = pR8; q = pS8;} - else if (ix >= 0x40f71c58){p = pR5; q = pS5;} - else if (ix >= 0x4036db68){p = pR3; q = pS3;} - else /*ix >= 0x40000000*/ {p = pR2; q = pS2;} - z = 1.0f/(x*x); - r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5])))); - s = 1.0f+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*q[4])))); - return 1.0f + r/s; -} - - -/* For x >= 8, the asymptotic expansions of qzero is - * -1/8 s + 75/1024 s^3 - ..., where s = 1/x. - * We approximate pzero by - * qzero(x) = s*(-1.25 + (R/S)) - * where R = qR0 + qR1*s^2 + qR2*s^4 + ... + qR5*s^10 - * S = 1 + qS0*s^2 + ... + qS5*s^12 - * and - * | qzero(x)/s +1.25-R/S | <= 2 ** ( -61.22) - */ -static const float qR8[6] = { /* for x in [inf, 8]=1/[0,0.125] */ - 0.0000000000e+00, /* 0x00000000 */ - 7.3242187500e-02, /* 0x3d960000 */ - 1.1768206596e+01, /* 0x413c4a93 */ - 5.5767340088e+02, /* 0x440b6b19 */ - 8.8591972656e+03, /* 0x460a6cca */ - 3.7014625000e+04, /* 0x471096a0 */ -}; -static const float qS8[6] = { - 1.6377603149e+02, /* 0x4323c6aa */ - 8.0983447266e+03, /* 0x45fd12c2 */ - 1.4253829688e+05, /* 0x480b3293 */ - 8.0330925000e+05, /* 0x49441ed4 */ - 8.4050156250e+05, /* 0x494d3359 */ - -3.4389928125e+05, /* 0xc8a7eb69 */ -}; - -static const float qR5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */ - 1.8408595828e-11, /* 0x2da1ec79 */ - 7.3242180049e-02, /* 0x3d95ffff */ - 5.8356351852e+00, /* 0x40babd86 */ - 1.3511157227e+02, /* 0x43071c90 */ - 1.0272437744e+03, /* 0x448067cd */ - 1.9899779053e+03, /* 0x44f8bf4b */ -}; -static const float qS5[6] = { - 8.2776611328e+01, /* 0x42a58da0 */ - 2.0778142090e+03, /* 0x4501dd07 */ - 1.8847289062e+04, /* 0x46933e94 */ - 5.6751113281e+04, /* 0x475daf1d */ - 3.5976753906e+04, /* 0x470c88c1 */ - -5.3543427734e+03, /* 0xc5a752be */ -}; - -static const float qR3[6] = {/* for x in [4.547,2.8571]=1/[0.2199,0.35001] */ - 4.3774099900e-09, /* 0x3196681b */ - 7.3241114616e-02, /* 0x3d95ff70 */ - 3.3442313671e+00, /* 0x405607e3 */ - 4.2621845245e+01, /* 0x422a7cc5 */ - 1.7080809021e+02, /* 0x432acedf */ - 1.6673394775e+02, /* 0x4326bbe4 */ -}; -static const float qS3[6] = { - 4.8758872986e+01, /* 0x42430916 */ - 7.0968920898e+02, /* 0x44316c1c */ - 3.7041481934e+03, /* 0x4567825f */ - 6.4604252930e+03, /* 0x45c9e367 */ - 2.5163337402e+03, /* 0x451d4557 */ - -1.4924745178e+02, /* 0xc3153f59 */ -}; - -static const float qR2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */ - 1.5044444979e-07, /* 0x342189db */ - 7.3223426938e-02, /* 0x3d95f62a */ - 1.9981917143e+00, /* 0x3fffc4bf */ - 1.4495602608e+01, /* 0x4167edfd */ - 3.1666231155e+01, /* 0x41fd5471 */ - 1.6252708435e+01, /* 0x4182058c */ -}; -static const float qS2[6] = { - 3.0365585327e+01, /* 0x41f2ecb8 */ - 2.6934811401e+02, /* 0x4386ac8f */ - 8.4478375244e+02, /* 0x44533229 */ - 8.8293585205e+02, /* 0x445cbbe5 */ - 2.1266638184e+02, /* 0x4354aa98 */ - -5.3109550476e+00, /* 0xc0a9f358 */ -}; - -static float qzerof(float x) -{ - const float *p,*q; - float_t s,r,z; - uint32_t ix; - - GET_FLOAT_WORD(ix, x); - ix &= 0x7fffffff; - if (ix >= 0x41000000){p = qR8; q = qS8;} - else if (ix >= 0x40f71c58){p = qR5; q = qS5;} - else if (ix >= 0x4036db68){p = qR3; q = qS3;} - else /*ix >= 0x40000000*/ {p = qR2; q = qS2;} - z = 1.0f/(x*x); - r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5])))); - s = 1.0f+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*(q[4]+z*q[5]))))); - return (-.125f + r/s)/x; -} diff --git a/waterbox/libc/functions/math/j1.c b/waterbox/libc/functions/math/j1.c deleted file mode 100644 index df724d172e..0000000000 --- a/waterbox/libc/functions/math/j1.c +++ /dev/null @@ -1,362 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/e_j1.c */ -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * - * Developed at SunSoft, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ -/* j1(x), y1(x) - * Bessel function of the first and second kinds of order zero. - * Method -- j1(x): - * 1. For tiny x, we use j1(x) = x/2 - x^3/16 + x^5/384 - ... - * 2. Reduce x to |x| since j1(x)=-j1(-x), and - * for x in (0,2) - * j1(x) = x/2 + x*z*R0/S0, where z = x*x; - * (precision: |j1/x - 1/2 - R0/S0 |<2**-61.51 ) - * for x in (2,inf) - * j1(x) = sqrt(2/(pi*x))*(p1(x)*cos(x1)-q1(x)*sin(x1)) - * y1(x) = sqrt(2/(pi*x))*(p1(x)*sin(x1)+q1(x)*cos(x1)) - * where x1 = x-3*pi/4. It is better to compute sin(x1),cos(x1) - * as follow: - * cos(x1) = cos(x)cos(3pi/4)+sin(x)sin(3pi/4) - * = 1/sqrt(2) * (sin(x) - cos(x)) - * sin(x1) = sin(x)cos(3pi/4)-cos(x)sin(3pi/4) - * = -1/sqrt(2) * (sin(x) + cos(x)) - * (To avoid cancellation, use - * sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x)) - * to compute the worse one.) - * - * 3 Special cases - * j1(nan)= nan - * j1(0) = 0 - * j1(inf) = 0 - * - * Method -- y1(x): - * 1. screen out x<=0 cases: y1(0)=-inf, y1(x<0)=NaN - * 2. For x<2. - * Since - * y1(x) = 2/pi*(j1(x)*(ln(x/2)+Euler)-1/x-x/2+5/64*x^3-...) - * therefore y1(x)-2/pi*j1(x)*ln(x)-1/x is an odd function. - * We use the following function to approximate y1, - * y1(x) = x*U(z)/V(z) + (2/pi)*(j1(x)*ln(x)-1/x), z= x^2 - * where for x in [0,2] (abs err less than 2**-65.89) - * U(z) = U0[0] + U0[1]*z + ... + U0[4]*z^4 - * V(z) = 1 + v0[0]*z + ... + v0[4]*z^5 - * Note: For tiny x, 1/x dominate y1 and hence - * y1(tiny) = -2/pi/tiny, (choose tiny<2**-54) - * 3. For x>=2. - * y1(x) = sqrt(2/(pi*x))*(p1(x)*sin(x1)+q1(x)*cos(x1)) - * where x1 = x-3*pi/4. It is better to compute sin(x1),cos(x1) - * by method mentioned above. - */ - -#include "libm.h" - -static double pone(double), qone(double); - -static const double -invsqrtpi = 5.64189583547756279280e-01, /* 0x3FE20DD7, 0x50429B6D */ -tpi = 6.36619772367581382433e-01; /* 0x3FE45F30, 0x6DC9C883 */ - -static double common(uint32_t ix, double x, int y1, int sign) -{ - double z,s,c,ss,cc; - - /* - * j1(x) = sqrt(2/(pi*x))*(p1(x)*cos(x-3pi/4)-q1(x)*sin(x-3pi/4)) - * y1(x) = sqrt(2/(pi*x))*(p1(x)*sin(x-3pi/4)+q1(x)*cos(x-3pi/4)) - * - * sin(x-3pi/4) = -(sin(x) + cos(x))/sqrt(2) - * cos(x-3pi/4) = (sin(x) - cos(x))/sqrt(2) - * sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x)) - */ - s = sin(x); - if (y1) - s = -s; - c = cos(x); - cc = s-c; - if (ix < 0x7fe00000) { - /* avoid overflow in 2*x */ - ss = -s-c; - z = cos(2*x); - if (s*c > 0) - cc = z/ss; - else - ss = z/cc; - if (ix < 0x48000000) { - if (y1) - ss = -ss; - cc = pone(x)*cc-qone(x)*ss; - } - } - if (sign) - cc = -cc; - return invsqrtpi*cc/sqrt(x); -} - -/* R0/S0 on [0,2] */ -static const double -r00 = -6.25000000000000000000e-02, /* 0xBFB00000, 0x00000000 */ -r01 = 1.40705666955189706048e-03, /* 0x3F570D9F, 0x98472C61 */ -r02 = -1.59955631084035597520e-05, /* 0xBEF0C5C6, 0xBA169668 */ -r03 = 4.96727999609584448412e-08, /* 0x3E6AAAFA, 0x46CA0BD9 */ -s01 = 1.91537599538363460805e-02, /* 0x3F939D0B, 0x12637E53 */ -s02 = 1.85946785588630915560e-04, /* 0x3F285F56, 0xB9CDF664 */ -s03 = 1.17718464042623683263e-06, /* 0x3EB3BFF8, 0x333F8498 */ -s04 = 5.04636257076217042715e-09, /* 0x3E35AC88, 0xC97DFF2C */ -s05 = 1.23542274426137913908e-11; /* 0x3DAB2ACF, 0xCFB97ED8 */ - -double j1(double x) -{ - double z,r,s; - uint32_t ix; - int sign; - - GET_HIGH_WORD(ix, x); - sign = ix>>31; - ix &= 0x7fffffff; - if (ix >= 0x7ff00000) - return 1/(x*x); - if (ix >= 0x40000000) /* |x| >= 2 */ - return common(ix, fabs(x), 0, sign); - if (ix >= 0x38000000) { /* |x| >= 2**-127 */ - z = x*x; - r = z*(r00+z*(r01+z*(r02+z*r03))); - s = 1+z*(s01+z*(s02+z*(s03+z*(s04+z*s05)))); - z = r/s; - } else - /* avoid underflow, raise inexact if x!=0 */ - z = x; - return (0.5 + z)*x; -} - -static const double U0[5] = { - -1.96057090646238940668e-01, /* 0xBFC91866, 0x143CBC8A */ - 5.04438716639811282616e-02, /* 0x3FA9D3C7, 0x76292CD1 */ - -1.91256895875763547298e-03, /* 0xBF5F55E5, 0x4844F50F */ - 2.35252600561610495928e-05, /* 0x3EF8AB03, 0x8FA6B88E */ - -9.19099158039878874504e-08, /* 0xBE78AC00, 0x569105B8 */ -}; -static const double V0[5] = { - 1.99167318236649903973e-02, /* 0x3F94650D, 0x3F4DA9F0 */ - 2.02552581025135171496e-04, /* 0x3F2A8C89, 0x6C257764 */ - 1.35608801097516229404e-06, /* 0x3EB6C05A, 0x894E8CA6 */ - 6.22741452364621501295e-09, /* 0x3E3ABF1D, 0x5BA69A86 */ - 1.66559246207992079114e-11, /* 0x3DB25039, 0xDACA772A */ -}; - -double y1(double x) -{ - double z,u,v; - uint32_t ix,lx; - - EXTRACT_WORDS(ix, lx, x); - /* y1(nan)=nan, y1(<0)=nan, y1(0)=-inf, y1(inf)=0 */ - if ((ix<<1 | lx) == 0) - return -1/0.0; - if (ix>>31) - return 0/0.0; - if (ix >= 0x7ff00000) - return 1/x; - - if (ix >= 0x40000000) /* x >= 2 */ - return common(ix, x, 1, 0); - if (ix < 0x3c900000) /* x < 2**-54 */ - return -tpi/x; - z = x*x; - u = U0[0]+z*(U0[1]+z*(U0[2]+z*(U0[3]+z*U0[4]))); - v = 1+z*(V0[0]+z*(V0[1]+z*(V0[2]+z*(V0[3]+z*V0[4])))); - return x*(u/v) + tpi*(j1(x)*log(x)-1/x); -} - -/* For x >= 8, the asymptotic expansions of pone is - * 1 + 15/128 s^2 - 4725/2^15 s^4 - ..., where s = 1/x. - * We approximate pone by - * pone(x) = 1 + (R/S) - * where R = pr0 + pr1*s^2 + pr2*s^4 + ... + pr5*s^10 - * S = 1 + ps0*s^2 + ... + ps4*s^10 - * and - * | pone(x)-1-R/S | <= 2 ** ( -60.06) - */ - -static const double pr8[6] = { /* for x in [inf, 8]=1/[0,0.125] */ - 0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */ - 1.17187499999988647970e-01, /* 0x3FBDFFFF, 0xFFFFFCCE */ - 1.32394806593073575129e+01, /* 0x402A7A9D, 0x357F7FCE */ - 4.12051854307378562225e+02, /* 0x4079C0D4, 0x652EA590 */ - 3.87474538913960532227e+03, /* 0x40AE457D, 0xA3A532CC */ - 7.91447954031891731574e+03, /* 0x40BEEA7A, 0xC32782DD */ -}; -static const double ps8[5] = { - 1.14207370375678408436e+02, /* 0x405C8D45, 0x8E656CAC */ - 3.65093083420853463394e+03, /* 0x40AC85DC, 0x964D274F */ - 3.69562060269033463555e+04, /* 0x40E20B86, 0x97C5BB7F */ - 9.76027935934950801311e+04, /* 0x40F7D42C, 0xB28F17BB */ - 3.08042720627888811578e+04, /* 0x40DE1511, 0x697A0B2D */ -}; - -static const double pr5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */ - 1.31990519556243522749e-11, /* 0x3DAD0667, 0xDAE1CA7D */ - 1.17187493190614097638e-01, /* 0x3FBDFFFF, 0xE2C10043 */ - 6.80275127868432871736e+00, /* 0x401B3604, 0x6E6315E3 */ - 1.08308182990189109773e+02, /* 0x405B13B9, 0x452602ED */ - 5.17636139533199752805e+02, /* 0x40802D16, 0xD052D649 */ - 5.28715201363337541807e+02, /* 0x408085B8, 0xBB7E0CB7 */ -}; -static const double ps5[5] = { - 5.92805987221131331921e+01, /* 0x404DA3EA, 0xA8AF633D */ - 9.91401418733614377743e+02, /* 0x408EFB36, 0x1B066701 */ - 5.35326695291487976647e+03, /* 0x40B4E944, 0x5706B6FB */ - 7.84469031749551231769e+03, /* 0x40BEA4B0, 0xB8A5BB15 */ - 1.50404688810361062679e+03, /* 0x40978030, 0x036F5E51 */ -}; - -static const double pr3[6] = { - 3.02503916137373618024e-09, /* 0x3E29FC21, 0xA7AD9EDD */ - 1.17186865567253592491e-01, /* 0x3FBDFFF5, 0x5B21D17B */ - 3.93297750033315640650e+00, /* 0x400F76BC, 0xE85EAD8A */ - 3.51194035591636932736e+01, /* 0x40418F48, 0x9DA6D129 */ - 9.10550110750781271918e+01, /* 0x4056C385, 0x4D2C1837 */ - 4.85590685197364919645e+01, /* 0x4048478F, 0x8EA83EE5 */ -}; -static const double ps3[5] = { - 3.47913095001251519989e+01, /* 0x40416549, 0xA134069C */ - 3.36762458747825746741e+02, /* 0x40750C33, 0x07F1A75F */ - 1.04687139975775130551e+03, /* 0x40905B7C, 0x5037D523 */ - 8.90811346398256432622e+02, /* 0x408BD67D, 0xA32E31E9 */ - 1.03787932439639277504e+02, /* 0x4059F26D, 0x7C2EED53 */ -}; - -static const double pr2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */ - 1.07710830106873743082e-07, /* 0x3E7CE9D4, 0xF65544F4 */ - 1.17176219462683348094e-01, /* 0x3FBDFF42, 0xBE760D83 */ - 2.36851496667608785174e+00, /* 0x4002F2B7, 0xF98FAEC0 */ - 1.22426109148261232917e+01, /* 0x40287C37, 0x7F71A964 */ - 1.76939711271687727390e+01, /* 0x4031B1A8, 0x177F8EE2 */ - 5.07352312588818499250e+00, /* 0x40144B49, 0xA574C1FE */ -}; -static const double ps2[5] = { - 2.14364859363821409488e+01, /* 0x40356FBD, 0x8AD5ECDC */ - 1.25290227168402751090e+02, /* 0x405F5293, 0x14F92CD5 */ - 2.32276469057162813669e+02, /* 0x406D08D8, 0xD5A2DBD9 */ - 1.17679373287147100768e+02, /* 0x405D6B7A, 0xDA1884A9 */ - 8.36463893371618283368e+00, /* 0x4020BAB1, 0xF44E5192 */ -}; - -static double pone(double x) -{ - const double *p,*q; - double_t z,r,s; - uint32_t ix; - - GET_HIGH_WORD(ix, x); - ix &= 0x7fffffff; - if (ix >= 0x40200000){p = pr8; q = ps8;} - else if (ix >= 0x40122E8B){p = pr5; q = ps5;} - else if (ix >= 0x4006DB6D){p = pr3; q = ps3;} - else /*ix >= 0x40000000*/ {p = pr2; q = ps2;} - z = 1.0/(x*x); - r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5])))); - s = 1.0+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*q[4])))); - return 1.0+ r/s; -} - -/* For x >= 8, the asymptotic expansions of qone is - * 3/8 s - 105/1024 s^3 - ..., where s = 1/x. - * We approximate pone by - * qone(x) = s*(0.375 + (R/S)) - * where R = qr1*s^2 + qr2*s^4 + ... + qr5*s^10 - * S = 1 + qs1*s^2 + ... + qs6*s^12 - * and - * | qone(x)/s -0.375-R/S | <= 2 ** ( -61.13) - */ - -static const double qr8[6] = { /* for x in [inf, 8]=1/[0,0.125] */ - 0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */ - -1.02539062499992714161e-01, /* 0xBFBA3FFF, 0xFFFFFDF3 */ - -1.62717534544589987888e+01, /* 0xC0304591, 0xA26779F7 */ - -7.59601722513950107896e+02, /* 0xC087BCD0, 0x53E4B576 */ - -1.18498066702429587167e+04, /* 0xC0C724E7, 0x40F87415 */ - -4.84385124285750353010e+04, /* 0xC0E7A6D0, 0x65D09C6A */ -}; -static const double qs8[6] = { - 1.61395369700722909556e+02, /* 0x40642CA6, 0xDE5BCDE5 */ - 7.82538599923348465381e+03, /* 0x40BE9162, 0xD0D88419 */ - 1.33875336287249578163e+05, /* 0x4100579A, 0xB0B75E98 */ - 7.19657723683240939863e+05, /* 0x4125F653, 0x72869C19 */ - 6.66601232617776375264e+05, /* 0x412457D2, 0x7719AD5C */ - -2.94490264303834643215e+05, /* 0xC111F969, 0x0EA5AA18 */ -}; - -static const double qr5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */ - -2.08979931141764104297e-11, /* 0xBDB6FA43, 0x1AA1A098 */ - -1.02539050241375426231e-01, /* 0xBFBA3FFF, 0xCB597FEF */ - -8.05644828123936029840e+00, /* 0xC0201CE6, 0xCA03AD4B */ - -1.83669607474888380239e+02, /* 0xC066F56D, 0x6CA7B9B0 */ - -1.37319376065508163265e+03, /* 0xC09574C6, 0x6931734F */ - -2.61244440453215656817e+03, /* 0xC0A468E3, 0x88FDA79D */ -}; -static const double qs5[6] = { - 8.12765501384335777857e+01, /* 0x405451B2, 0xFF5A11B2 */ - 1.99179873460485964642e+03, /* 0x409F1F31, 0xE77BF839 */ - 1.74684851924908907677e+04, /* 0x40D10F1F, 0x0D64CE29 */ - 4.98514270910352279316e+04, /* 0x40E8576D, 0xAABAD197 */ - 2.79480751638918118260e+04, /* 0x40DB4B04, 0xCF7C364B */ - -4.71918354795128470869e+03, /* 0xC0B26F2E, 0xFCFFA004 */ -}; - -static const double qr3[6] = { - -5.07831226461766561369e-09, /* 0xBE35CFA9, 0xD38FC84F */ - -1.02537829820837089745e-01, /* 0xBFBA3FEB, 0x51AEED54 */ - -4.61011581139473403113e+00, /* 0xC01270C2, 0x3302D9FF */ - -5.78472216562783643212e+01, /* 0xC04CEC71, 0xC25D16DA */ - -2.28244540737631695038e+02, /* 0xC06C87D3, 0x4718D55F */ - -2.19210128478909325622e+02, /* 0xC06B66B9, 0x5F5C1BF6 */ -}; -static const double qs3[6] = { - 4.76651550323729509273e+01, /* 0x4047D523, 0xCCD367E4 */ - 6.73865112676699709482e+02, /* 0x40850EEB, 0xC031EE3E */ - 3.38015286679526343505e+03, /* 0x40AA684E, 0x448E7C9A */ - 5.54772909720722782367e+03, /* 0x40B5ABBA, 0xA61D54A6 */ - 1.90311919338810798763e+03, /* 0x409DBC7A, 0x0DD4DF4B */ - -1.35201191444307340817e+02, /* 0xC060E670, 0x290A311F */ -}; - -static const double qr2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */ - -1.78381727510958865572e-07, /* 0xBE87F126, 0x44C626D2 */ - -1.02517042607985553460e-01, /* 0xBFBA3E8E, 0x9148B010 */ - -2.75220568278187460720e+00, /* 0xC0060484, 0x69BB4EDA */ - -1.96636162643703720221e+01, /* 0xC033A9E2, 0xC168907F */ - -4.23253133372830490089e+01, /* 0xC04529A3, 0xDE104AAA */ - -2.13719211703704061733e+01, /* 0xC0355F36, 0x39CF6E52 */ -}; -static const double qs2[6] = { - 2.95333629060523854548e+01, /* 0x403D888A, 0x78AE64FF */ - 2.52981549982190529136e+02, /* 0x406F9F68, 0xDB821CBA */ - 7.57502834868645436472e+02, /* 0x4087AC05, 0xCE49A0F7 */ - 7.39393205320467245656e+02, /* 0x40871B25, 0x48D4C029 */ - 1.55949003336666123687e+02, /* 0x40637E5E, 0x3C3ED8D4 */ - -4.95949898822628210127e+00, /* 0xC013D686, 0xE71BE86B */ -}; - -static double qone(double x) -{ - const double *p,*q; - double_t s,r,z; - uint32_t ix; - - GET_HIGH_WORD(ix, x); - ix &= 0x7fffffff; - if (ix >= 0x40200000){p = qr8; q = qs8;} - else if (ix >= 0x40122E8B){p = qr5; q = qs5;} - else if (ix >= 0x4006DB6D){p = qr3; q = qs3;} - else /*ix >= 0x40000000*/ {p = qr2; q = qs2;} - z = 1.0/(x*x); - r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5])))); - s = 1.0+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*(q[4]+z*q[5]))))); - return (.375 + r/s)/x; -} diff --git a/waterbox/libc/functions/math/j1f.c b/waterbox/libc/functions/math/j1f.c deleted file mode 100644 index 58875af9fc..0000000000 --- a/waterbox/libc/functions/math/j1f.c +++ /dev/null @@ -1,311 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/e_j1f.c */ -/* - * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. - */ -/* - * ==================================================== - * 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. - * ==================================================== - */ - -#define _GNU_SOURCE -#include "libm.h" - -static float ponef(float), qonef(float); - -static const float -invsqrtpi = 5.6418961287e-01, /* 0x3f106ebb */ -tpi = 6.3661974669e-01; /* 0x3f22f983 */ - -static float common(uint32_t ix, float x, int y1, int sign) -{ - double z,s,c,ss,cc; - - s = sinf(x); - if (y1) - s = -s; - c = cosf(x); - cc = s-c; - if (ix < 0x7f000000) { - ss = -s-c; - z = cosf(2*x); - if (s*c > 0) - cc = z/ss; - else - ss = z/cc; - if (ix < 0x58800000) { - if (y1) - ss = -ss; - cc = ponef(x)*cc-qonef(x)*ss; - } - } - if (sign) - cc = -cc; - return invsqrtpi*cc/sqrtf(x); -} - -/* R0/S0 on [0,2] */ -static const float -r00 = -6.2500000000e-02, /* 0xbd800000 */ -r01 = 1.4070566976e-03, /* 0x3ab86cfd */ -r02 = -1.5995563444e-05, /* 0xb7862e36 */ -r03 = 4.9672799207e-08, /* 0x335557d2 */ -s01 = 1.9153760746e-02, /* 0x3c9ce859 */ -s02 = 1.8594678841e-04, /* 0x3942fab6 */ -s03 = 1.1771846857e-06, /* 0x359dffc2 */ -s04 = 5.0463624390e-09, /* 0x31ad6446 */ -s05 = 1.2354227016e-11; /* 0x2d59567e */ - -float j1f(float x) -{ - float z,r,s; - uint32_t ix; - int sign; - - GET_FLOAT_WORD(ix, x); - sign = ix>>31; - ix &= 0x7fffffff; - if (ix >= 0x7f800000) - return 1/(x*x); - if (ix >= 0x40000000) /* |x| >= 2 */ - return common(ix, fabsf(x), 0, sign); - if (ix >= 0x32000000) { /* |x| >= 2**-27 */ - z = x*x; - r = z*(r00+z*(r01+z*(r02+z*r03))); - s = 1+z*(s01+z*(s02+z*(s03+z*(s04+z*s05)))); - z = 0.5f + r/s; - } else - /* raise inexact if x!=0 */ - z = 0.5f + x; - return z*x; -} - -static const float U0[5] = { - -1.9605709612e-01, /* 0xbe48c331 */ - 5.0443872809e-02, /* 0x3d4e9e3c */ - -1.9125689287e-03, /* 0xbafaaf2a */ - 2.3525259166e-05, /* 0x37c5581c */ - -9.1909917899e-08, /* 0xb3c56003 */ -}; -static const float V0[5] = { - 1.9916731864e-02, /* 0x3ca3286a */ - 2.0255257550e-04, /* 0x3954644b */ - 1.3560879779e-06, /* 0x35b602d4 */ - 6.2274145840e-09, /* 0x31d5f8eb */ - 1.6655924903e-11, /* 0x2d9281cf */ -}; - -float y1f(float x) -{ - float z,u,v; - uint32_t ix; - - GET_FLOAT_WORD(ix, x); - if ((ix & 0x7fffffff) == 0) - return -1/0.0f; - if (ix>>31) - return 0/0.0f; - if (ix >= 0x7f800000) - return 1/x; - if (ix >= 0x40000000) /* |x| >= 2.0 */ - return common(ix,x,1,0); - if (ix < 0x32000000) /* x < 2**-27 */ - return -tpi/x; - z = x*x; - u = U0[0]+z*(U0[1]+z*(U0[2]+z*(U0[3]+z*U0[4]))); - v = 1.0f+z*(V0[0]+z*(V0[1]+z*(V0[2]+z*(V0[3]+z*V0[4])))); - return x*(u/v) + tpi*(j1f(x)*logf(x)-1.0f/x); -} - -/* For x >= 8, the asymptotic expansions of pone is - * 1 + 15/128 s^2 - 4725/2^15 s^4 - ..., where s = 1/x. - * We approximate pone by - * pone(x) = 1 + (R/S) - * where R = pr0 + pr1*s^2 + pr2*s^4 + ... + pr5*s^10 - * S = 1 + ps0*s^2 + ... + ps4*s^10 - * and - * | pone(x)-1-R/S | <= 2 ** ( -60.06) - */ - -static const float pr8[6] = { /* for x in [inf, 8]=1/[0,0.125] */ - 0.0000000000e+00, /* 0x00000000 */ - 1.1718750000e-01, /* 0x3df00000 */ - 1.3239480972e+01, /* 0x4153d4ea */ - 4.1205184937e+02, /* 0x43ce06a3 */ - 3.8747453613e+03, /* 0x45722bed */ - 7.9144794922e+03, /* 0x45f753d6 */ -}; -static const float ps8[5] = { - 1.1420736694e+02, /* 0x42e46a2c */ - 3.6509309082e+03, /* 0x45642ee5 */ - 3.6956207031e+04, /* 0x47105c35 */ - 9.7602796875e+04, /* 0x47bea166 */ - 3.0804271484e+04, /* 0x46f0a88b */ -}; - -static const float pr5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */ - 1.3199052094e-11, /* 0x2d68333f */ - 1.1718749255e-01, /* 0x3defffff */ - 6.8027510643e+00, /* 0x40d9b023 */ - 1.0830818176e+02, /* 0x42d89dca */ - 5.1763616943e+02, /* 0x440168b7 */ - 5.2871520996e+02, /* 0x44042dc6 */ -}; -static const float ps5[5] = { - 5.9280597687e+01, /* 0x426d1f55 */ - 9.9140142822e+02, /* 0x4477d9b1 */ - 5.3532670898e+03, /* 0x45a74a23 */ - 7.8446904297e+03, /* 0x45f52586 */ - 1.5040468750e+03, /* 0x44bc0180 */ -}; - -static const float pr3[6] = { - 3.0250391081e-09, /* 0x314fe10d */ - 1.1718686670e-01, /* 0x3defffab */ - 3.9329774380e+00, /* 0x407bb5e7 */ - 3.5119403839e+01, /* 0x420c7a45 */ - 9.1055007935e+01, /* 0x42b61c2a */ - 4.8559066772e+01, /* 0x42423c7c */ -}; -static const float ps3[5] = { - 3.4791309357e+01, /* 0x420b2a4d */ - 3.3676245117e+02, /* 0x43a86198 */ - 1.0468714600e+03, /* 0x4482dbe3 */ - 8.9081134033e+02, /* 0x445eb3ed */ - 1.0378793335e+02, /* 0x42cf936c */ -}; - -static const float pr2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */ - 1.0771083225e-07, /* 0x33e74ea8 */ - 1.1717621982e-01, /* 0x3deffa16 */ - 2.3685150146e+00, /* 0x401795c0 */ - 1.2242610931e+01, /* 0x4143e1bc */ - 1.7693971634e+01, /* 0x418d8d41 */ - 5.0735230446e+00, /* 0x40a25a4d */ -}; -static const float ps2[5] = { - 2.1436485291e+01, /* 0x41ab7dec */ - 1.2529022980e+02, /* 0x42fa9499 */ - 2.3227647400e+02, /* 0x436846c7 */ - 1.1767937469e+02, /* 0x42eb5bd7 */ - 8.3646392822e+00, /* 0x4105d590 */ -}; - -static float ponef(float x) -{ - const float *p,*q; - float_t z,r,s; - uint32_t ix; - - GET_FLOAT_WORD(ix, x); - ix &= 0x7fffffff; - if (ix >= 0x41000000){p = pr8; q = ps8;} - else if (ix >= 0x40f71c58){p = pr5; q = ps5;} - else if (ix >= 0x4036db68){p = pr3; q = ps3;} - else /*ix >= 0x40000000*/ {p = pr2; q = ps2;} - z = 1.0f/(x*x); - r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5])))); - s = 1.0f+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*q[4])))); - return 1.0f + r/s; -} - -/* For x >= 8, the asymptotic expansions of qone is - * 3/8 s - 105/1024 s^3 - ..., where s = 1/x. - * We approximate pone by - * qone(x) = s*(0.375 + (R/S)) - * where R = qr1*s^2 + qr2*s^4 + ... + qr5*s^10 - * S = 1 + qs1*s^2 + ... + qs6*s^12 - * and - * | qone(x)/s -0.375-R/S | <= 2 ** ( -61.13) - */ - -static const float qr8[6] = { /* for x in [inf, 8]=1/[0,0.125] */ - 0.0000000000e+00, /* 0x00000000 */ - -1.0253906250e-01, /* 0xbdd20000 */ - -1.6271753311e+01, /* 0xc1822c8d */ - -7.5960174561e+02, /* 0xc43de683 */ - -1.1849806641e+04, /* 0xc639273a */ - -4.8438511719e+04, /* 0xc73d3683 */ -}; -static const float qs8[6] = { - 1.6139537048e+02, /* 0x43216537 */ - 7.8253862305e+03, /* 0x45f48b17 */ - 1.3387534375e+05, /* 0x4802bcd6 */ - 7.1965775000e+05, /* 0x492fb29c */ - 6.6660125000e+05, /* 0x4922be94 */ - -2.9449025000e+05, /* 0xc88fcb48 */ -}; - -static const float qr5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */ - -2.0897993405e-11, /* 0xadb7d219 */ - -1.0253904760e-01, /* 0xbdd1fffe */ - -8.0564479828e+00, /* 0xc100e736 */ - -1.8366960144e+02, /* 0xc337ab6b */ - -1.3731937256e+03, /* 0xc4aba633 */ - -2.6124443359e+03, /* 0xc523471c */ -}; -static const float qs5[6] = { - 8.1276550293e+01, /* 0x42a28d98 */ - 1.9917987061e+03, /* 0x44f8f98f */ - 1.7468484375e+04, /* 0x468878f8 */ - 4.9851425781e+04, /* 0x4742bb6d */ - 2.7948074219e+04, /* 0x46da5826 */ - -4.7191835938e+03, /* 0xc5937978 */ -}; - -static const float qr3[6] = { - -5.0783124372e-09, /* 0xb1ae7d4f */ - -1.0253783315e-01, /* 0xbdd1ff5b */ - -4.6101160049e+00, /* 0xc0938612 */ - -5.7847221375e+01, /* 0xc267638e */ - -2.2824453735e+02, /* 0xc3643e9a */ - -2.1921012878e+02, /* 0xc35b35cb */ -}; -static const float qs3[6] = { - 4.7665153503e+01, /* 0x423ea91e */ - 6.7386511230e+02, /* 0x4428775e */ - 3.3801528320e+03, /* 0x45534272 */ - 5.5477290039e+03, /* 0x45ad5dd5 */ - 1.9031191406e+03, /* 0x44ede3d0 */ - -1.3520118713e+02, /* 0xc3073381 */ -}; - -static const float qr2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */ - -1.7838172539e-07, /* 0xb43f8932 */ - -1.0251704603e-01, /* 0xbdd1f475 */ - -2.7522056103e+00, /* 0xc0302423 */ - -1.9663616180e+01, /* 0xc19d4f16 */ - -4.2325313568e+01, /* 0xc2294d1f */ - -2.1371921539e+01, /* 0xc1aaf9b2 */ -}; -static const float qs2[6] = { - 2.9533363342e+01, /* 0x41ec4454 */ - 2.5298155212e+02, /* 0x437cfb47 */ - 7.5750280762e+02, /* 0x443d602e */ - 7.3939318848e+02, /* 0x4438d92a */ - 1.5594900513e+02, /* 0x431bf2f2 */ - -4.9594988823e+00, /* 0xc09eb437 */ -}; - -static float qonef(float x) -{ - const float *p,*q; - float_t s,r,z; - uint32_t ix; - - GET_FLOAT_WORD(ix, x); - ix &= 0x7fffffff; - if (ix >= 0x40200000){p = qr8; q = qs8;} - else if (ix >= 0x40f71c58){p = qr5; q = qs5;} - else if (ix >= 0x4036db68){p = qr3; q = qs3;} - else /*ix >= 0x40000000*/ {p = qr2; q = qs2;} - z = 1.0f/(x*x); - r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5])))); - s = 1.0f+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*(q[4]+z*q[5]))))); - return (.375f + r/s)/x; -} diff --git a/waterbox/libc/functions/math/jn.c b/waterbox/libc/functions/math/jn.c deleted file mode 100644 index 4878a54fed..0000000000 --- a/waterbox/libc/functions/math/jn.c +++ /dev/null @@ -1,280 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/e_jn.c */ -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * - * Developed at SunSoft, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ -/* - * jn(n, x), yn(n, x) - * floating point Bessel's function of the 1st and 2nd kind - * of order n - * - * Special cases: - * y0(0)=y1(0)=yn(n,0) = -inf with division by zero signal; - * y0(-ve)=y1(-ve)=yn(n,-ve) are NaN with invalid signal. - * Note 2. About jn(n,x), yn(n,x) - * For n=0, j0(x) is called, - * for n=1, j1(x) is called, - * for n<=x, forward recursion is used starting - * from values of j0(x) and j1(x). - * for n>x, a continued fraction approximation to - * j(n,x)/j(n-1,x) is evaluated and then backward - * recursion is used starting from a supposed value - * for j(n,x). The resulting value of j(0,x) is - * compared with the actual value to correct the - * supposed value of j(n,x). - * - * yn(n,x) is similar in all respects, except - * that forward recursion is used for all - * values of n>1. - */ - -#include "libm.h" - -static const double invsqrtpi = 5.64189583547756279280e-01; /* 0x3FE20DD7, 0x50429B6D */ - -double jn(int n, double x) -{ - uint32_t ix, lx; - int nm1, i, sign; - double a, b, temp; - - EXTRACT_WORDS(ix, lx, x); - sign = ix>>31; - ix &= 0x7fffffff; - - if ((ix | (lx|-lx)>>31) > 0x7ff00000) /* nan */ - return x; - - /* J(-n,x) = (-1)^n * J(n, x), J(n, -x) = (-1)^n * J(n, x) - * Thus, J(-n,x) = J(n,-x) - */ - /* nm1 = |n|-1 is used instead of |n| to handle n==INT_MIN */ - if (n == 0) - return j0(x); - if (n < 0) { - nm1 = -(n+1); - x = -x; - sign ^= 1; - } else - nm1 = n-1; - if (nm1 == 0) - return j1(x); - - sign &= n; /* even n: 0, odd n: signbit(x) */ - x = fabs(x); - if ((ix|lx) == 0 || ix == 0x7ff00000) /* if x is 0 or inf */ - b = 0.0; - else if (nm1 < x) { - /* Safe to use J(n+1,x)=2n/x *J(n,x)-J(n-1,x) */ - if (ix >= 0x52d00000) { /* x > 2**302 */ - /* (x >> n**2) - * Jn(x) = cos(x-(2n+1)*pi/4)*sqrt(2/x*pi) - * Yn(x) = sin(x-(2n+1)*pi/4)*sqrt(2/x*pi) - * Let s=sin(x), c=cos(x), - * xn=x-(2n+1)*pi/4, sqt2 = sqrt(2),then - * - * n sin(xn)*sqt2 cos(xn)*sqt2 - * ---------------------------------- - * 0 s-c c+s - * 1 -s-c -c+s - * 2 -s+c -c-s - * 3 s+c c-s - */ - switch(nm1&3) { - case 0: temp = -cos(x)+sin(x); break; - case 1: temp = -cos(x)-sin(x); break; - case 2: temp = cos(x)-sin(x); break; - default: - case 3: temp = cos(x)+sin(x); break; - } - b = invsqrtpi*temp/sqrt(x); - } else { - a = j0(x); - b = j1(x); - for (i=0; i 32) /* underflow */ - b = 0.0; - else { - temp = x*0.5; - b = temp; - a = 1.0; - for (i=2; i<=nm1+1; i++) { - a *= (double)i; /* a = n! */ - b *= temp; /* b = (x/2)^n */ - } - b = b/a; - } - } else { - /* use backward recurrence */ - /* x x^2 x^2 - * J(n,x)/J(n-1,x) = ---- ------ ------ ..... - * 2n - 2(n+1) - 2(n+2) - * - * 1 1 1 - * (for large x) = ---- ------ ------ ..... - * 2n 2(n+1) 2(n+2) - * -- - ------ - ------ - - * x x x - * - * Let w = 2n/x and h=2/x, then the above quotient - * is equal to the continued fraction: - * 1 - * = ----------------------- - * 1 - * w - ----------------- - * 1 - * w+h - --------- - * w+2h - ... - * - * To determine how many terms needed, let - * Q(0) = w, Q(1) = w(w+h) - 1, - * Q(k) = (w+k*h)*Q(k-1) - Q(k-2), - * When Q(k) > 1e4 good for single - * When Q(k) > 1e9 good for double - * When Q(k) > 1e17 good for quadruple - */ - /* determine k */ - double t,q0,q1,w,h,z,tmp,nf; - int k; - - nf = nm1 + 1.0; - w = 2*nf/x; - h = 2/x; - z = w+h; - q0 = w; - q1 = w*z - 1.0; - k = 1; - while (q1 < 1.0e9) { - k += 1; - z += h; - tmp = z*q1 - q0; - q0 = q1; - q1 = tmp; - } - for (t=0.0, i=k; i>=0; i--) - t = 1/(2*(i+nf)/x - t); - a = t; - b = 1.0; - /* estimate log((2/x)^n*n!) = n*log(2/x)+n*ln(n) - * Hence, if n*(log(2n/x)) > ... - * single 8.8722839355e+01 - * double 7.09782712893383973096e+02 - * long double 1.1356523406294143949491931077970765006170e+04 - * then recurrent value may overflow and the result is - * likely underflow to zero - */ - tmp = nf*log(fabs(w)); - if (tmp < 7.09782712893383973096e+02) { - for (i=nm1; i>0; i--) { - temp = b; - b = b*(2.0*i)/x - a; - a = temp; - } - } else { - for (i=nm1; i>0; i--) { - temp = b; - b = b*(2.0*i)/x - a; - a = temp; - /* scale b to avoid spurious overflow */ - if (b > 0x1p500) { - a /= b; - t /= b; - b = 1.0; - } - } - } - z = j0(x); - w = j1(x); - if (fabs(z) >= fabs(w)) - b = t*z/b; - else - b = t*w/a; - } - } - return sign ? -b : b; -} - - -double yn(int n, double x) -{ - uint32_t ix, lx, ib; - int nm1, sign, i; - double a, b, temp; - - EXTRACT_WORDS(ix, lx, x); - sign = ix>>31; - ix &= 0x7fffffff; - - if ((ix | (lx|-lx)>>31) > 0x7ff00000) /* nan */ - return x; - if (sign && (ix|lx)!=0) /* x < 0 */ - return 0/0.0; - if (ix == 0x7ff00000) - return 0.0; - - if (n == 0) - return y0(x); - if (n < 0) { - nm1 = -(n+1); - sign = n&1; - } else { - nm1 = n-1; - sign = 0; - } - if (nm1 == 0) - return sign ? -y1(x) : y1(x); - - if (ix >= 0x52d00000) { /* x > 2**302 */ - /* (x >> n**2) - * Jn(x) = cos(x-(2n+1)*pi/4)*sqrt(2/x*pi) - * Yn(x) = sin(x-(2n+1)*pi/4)*sqrt(2/x*pi) - * Let s=sin(x), c=cos(x), - * xn=x-(2n+1)*pi/4, sqt2 = sqrt(2),then - * - * n sin(xn)*sqt2 cos(xn)*sqt2 - * ---------------------------------- - * 0 s-c c+s - * 1 -s-c -c+s - * 2 -s+c -c-s - * 3 s+c c-s - */ - switch(nm1&3) { - case 0: temp = -sin(x)-cos(x); break; - case 1: temp = -sin(x)+cos(x); break; - case 2: temp = sin(x)+cos(x); break; - default: - case 3: temp = sin(x)-cos(x); break; - } - b = invsqrtpi*temp/sqrt(x); - } else { - a = y0(x); - b = y1(x); - /* quit if b is -inf */ - GET_HIGH_WORD(ib, b); - for (i=0; i>31; - ix &= 0x7fffffff; - if (ix > 0x7f800000) /* nan */ - return x; - - /* J(-n,x) = J(n,-x), use |n|-1 to avoid overflow in -n */ - if (n == 0) - return j0f(x); - if (n < 0) { - nm1 = -(n+1); - x = -x; - sign ^= 1; - } else - nm1 = n-1; - if (nm1 == 0) - return j1f(x); - - sign &= n; /* even n: 0, odd n: signbit(x) */ - x = fabsf(x); - if (ix == 0 || ix == 0x7f800000) /* if x is 0 or inf */ - b = 0.0f; - else if (nm1 < x) { - /* Safe to use J(n+1,x)=2n/x *J(n,x)-J(n-1,x) */ - a = j0f(x); - b = j1f(x); - for (i=0; i 8) /* underflow */ - nm1 = 8; - temp = 0.5f * x; - b = temp; - a = 1.0f; - for (i=2; i<=nm1+1; i++) { - a *= (float)i; /* a = n! */ - b *= temp; /* b = (x/2)^n */ - } - b = b/a; - } else { - /* use backward recurrence */ - /* x x^2 x^2 - * J(n,x)/J(n-1,x) = ---- ------ ------ ..... - * 2n - 2(n+1) - 2(n+2) - * - * 1 1 1 - * (for large x) = ---- ------ ------ ..... - * 2n 2(n+1) 2(n+2) - * -- - ------ - ------ - - * x x x - * - * Let w = 2n/x and h=2/x, then the above quotient - * is equal to the continued fraction: - * 1 - * = ----------------------- - * 1 - * w - ----------------- - * 1 - * w+h - --------- - * w+2h - ... - * - * To determine how many terms needed, let - * Q(0) = w, Q(1) = w(w+h) - 1, - * Q(k) = (w+k*h)*Q(k-1) - Q(k-2), - * When Q(k) > 1e4 good for single - * When Q(k) > 1e9 good for double - * When Q(k) > 1e17 good for quadruple - */ - /* determine k */ - float t,q0,q1,w,h,z,tmp,nf; - int k; - - nf = nm1+1.0f; - w = 2*nf/x; - h = 2/x; - z = w+h; - q0 = w; - q1 = w*z - 1.0f; - k = 1; - while (q1 < 1.0e4f) { - k += 1; - z += h; - tmp = z*q1 - q0; - q0 = q1; - q1 = tmp; - } - for (t=0.0f, i=k; i>=0; i--) - t = 1.0f/(2*(i+nf)/x-t); - a = t; - b = 1.0f; - /* estimate log((2/x)^n*n!) = n*log(2/x)+n*ln(n) - * Hence, if n*(log(2n/x)) > ... - * single 8.8722839355e+01 - * double 7.09782712893383973096e+02 - * long double 1.1356523406294143949491931077970765006170e+04 - * then recurrent value may overflow and the result is - * likely underflow to zero - */ - tmp = nf*logf(fabsf(w)); - if (tmp < 88.721679688f) { - for (i=nm1; i>0; i--) { - temp = b; - b = 2.0f*i*b/x - a; - a = temp; - } - } else { - for (i=nm1; i>0; i--){ - temp = b; - b = 2.0f*i*b/x - a; - a = temp; - /* scale b to avoid spurious overflow */ - if (b > 0x1p60f) { - a /= b; - t /= b; - b = 1.0f; - } - } - } - z = j0f(x); - w = j1f(x); - if (fabsf(z) >= fabsf(w)) - b = t*z/b; - else - b = t*w/a; - } - } - return sign ? -b : b; -} - -float ynf(int n, float x) -{ - uint32_t ix, ib; - int nm1, sign, i; - float a, b, temp; - - GET_FLOAT_WORD(ix, x); - sign = ix>>31; - ix &= 0x7fffffff; - if (ix > 0x7f800000) /* nan */ - return x; - if (sign && ix != 0) /* x < 0 */ - return 0/0.0f; - if (ix == 0x7f800000) - return 0.0f; - - if (n == 0) - return y0f(x); - if (n < 0) { - nm1 = -(n+1); - sign = n&1; - } else { - nm1 = n-1; - sign = 0; - } - if (nm1 == 0) - return sign ? -y1f(x) : y1f(x); - - a = y0f(x); - b = y1f(x); - /* quit if b is -inf */ - GET_FLOAT_WORD(ib,b); - for (i = 0; i < nm1 && ib != 0xff800000; ) { - i++; - temp = b; - b = (2.0f*i/x)*b - a; - GET_FLOAT_WORD(ib, b); - a = temp; - } - return sign ? -b : b; -} diff --git a/waterbox/libc/functions/math/ldexp.c b/waterbox/libc/functions/math/ldexp.c deleted file mode 100644 index f4d1cd6af5..0000000000 --- a/waterbox/libc/functions/math/ldexp.c +++ /dev/null @@ -1,6 +0,0 @@ -#include - -double ldexp(double x, int n) -{ - return scalbn(x, n); -} diff --git a/waterbox/libc/functions/math/ldexpf.c b/waterbox/libc/functions/math/ldexpf.c deleted file mode 100644 index 3bad5f393f..0000000000 --- a/waterbox/libc/functions/math/ldexpf.c +++ /dev/null @@ -1,6 +0,0 @@ -#include - -float ldexpf(float x, int n) -{ - return scalbnf(x, n); -} diff --git a/waterbox/libc/functions/math/ldexpl.c b/waterbox/libc/functions/math/ldexpl.c deleted file mode 100644 index fd145ccc56..0000000000 --- a/waterbox/libc/functions/math/ldexpl.c +++ /dev/null @@ -1,6 +0,0 @@ -#include - -long double ldexpl(long double x, int n) -{ - return scalbnl(x, n); -} diff --git a/waterbox/libc/functions/math/lgamma.c b/waterbox/libc/functions/math/lgamma.c deleted file mode 100644 index e25ec8e600..0000000000 --- a/waterbox/libc/functions/math/lgamma.c +++ /dev/null @@ -1,9 +0,0 @@ -#include - -extern int __signgam; -double __lgamma_r(double, int *); - -double lgamma(double x) -{ - return __lgamma_r(x, &__signgam); -} diff --git a/waterbox/libc/functions/math/lgamma_r.c b/waterbox/libc/functions/math/lgamma_r.c deleted file mode 100644 index 947afa27a8..0000000000 --- a/waterbox/libc/functions/math/lgamma_r.c +++ /dev/null @@ -1,284 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/e_lgamma_r.c */ -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * - * Developed at SunSoft, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - * - */ -/* lgamma_r(x, signgamp) - * Reentrant version of the logarithm of the Gamma function - * with user provide pointer for the sign of Gamma(x). - * - * Method: - * 1. Argument Reduction for 0 < x <= 8 - * Since gamma(1+s)=s*gamma(s), for x in [0,8], we may - * reduce x to a number in [1.5,2.5] by - * lgamma(1+s) = log(s) + lgamma(s) - * for example, - * lgamma(7.3) = log(6.3) + lgamma(6.3) - * = log(6.3*5.3) + lgamma(5.3) - * = log(6.3*5.3*4.3*3.3*2.3) + lgamma(2.3) - * 2. Polynomial approximation of lgamma around its - * minimun ymin=1.461632144968362245 to maintain monotonicity. - * On [ymin-0.23, ymin+0.27] (i.e., [1.23164,1.73163]), use - * Let z = x-ymin; - * lgamma(x) = -1.214862905358496078218 + z^2*poly(z) - * where - * poly(z) is a 14 degree polynomial. - * 2. Rational approximation in the primary interval [2,3] - * We use the following approximation: - * s = x-2.0; - * lgamma(x) = 0.5*s + s*P(s)/Q(s) - * with accuracy - * |P/Q - (lgamma(x)-0.5s)| < 2**-61.71 - * Our algorithms are based on the following observation - * - * zeta(2)-1 2 zeta(3)-1 3 - * lgamma(2+s) = s*(1-Euler) + --------- * s - --------- * s + ... - * 2 3 - * - * where Euler = 0.5771... is the Euler constant, which is very - * close to 0.5. - * - * 3. For x>=8, we have - * lgamma(x)~(x-0.5)log(x)-x+0.5*log(2pi)+1/(12x)-1/(360x**3)+.... - * (better formula: - * lgamma(x)~(x-0.5)*(log(x)-1)-.5*(log(2pi)-1) + ...) - * Let z = 1/x, then we approximation - * f(z) = lgamma(x) - (x-0.5)(log(x)-1) - * by - * 3 5 11 - * w = w0 + w1*z + w2*z + w3*z + ... + w6*z - * where - * |w - f(z)| < 2**-58.74 - * - * 4. For negative x, since (G is gamma function) - * -x*G(-x)*G(x) = pi/sin(pi*x), - * we have - * G(x) = pi/(sin(pi*x)*(-x)*G(-x)) - * since G(-x) is positive, sign(G(x)) = sign(sin(pi*x)) for x<0 - * Hence, for x<0, signgam = sign(sin(pi*x)) and - * lgamma(x) = log(|Gamma(x)|) - * = log(pi/(|x*sin(pi*x)|)) - lgamma(-x); - * Note: one should avoid compute pi*(-x) directly in the - * computation of sin(pi*(-x)). - * - * 5. Special Cases - * lgamma(2+s) ~ s*(1-Euler) for tiny s - * lgamma(1) = lgamma(2) = 0 - * lgamma(x) ~ -log(|x|) for tiny x - * lgamma(0) = lgamma(neg.integer) = inf and raise divide-by-zero - * lgamma(inf) = inf - * lgamma(-inf) = inf (bug for bug compatible with C99!?) - * - */ - -#include "libm.h" -#include "_alias.h" - -static const double -pi = 3.14159265358979311600e+00, /* 0x400921FB, 0x54442D18 */ -a0 = 7.72156649015328655494e-02, /* 0x3FB3C467, 0xE37DB0C8 */ -a1 = 3.22467033424113591611e-01, /* 0x3FD4A34C, 0xC4A60FAD */ -a2 = 6.73523010531292681824e-02, /* 0x3FB13E00, 0x1A5562A7 */ -a3 = 2.05808084325167332806e-02, /* 0x3F951322, 0xAC92547B */ -a4 = 7.38555086081402883957e-03, /* 0x3F7E404F, 0xB68FEFE8 */ -a5 = 2.89051383673415629091e-03, /* 0x3F67ADD8, 0xCCB7926B */ -a6 = 1.19270763183362067845e-03, /* 0x3F538A94, 0x116F3F5D */ -a7 = 5.10069792153511336608e-04, /* 0x3F40B6C6, 0x89B99C00 */ -a8 = 2.20862790713908385557e-04, /* 0x3F2CF2EC, 0xED10E54D */ -a9 = 1.08011567247583939954e-04, /* 0x3F1C5088, 0x987DFB07 */ -a10 = 2.52144565451257326939e-05, /* 0x3EFA7074, 0x428CFA52 */ -a11 = 4.48640949618915160150e-05, /* 0x3F07858E, 0x90A45837 */ -tc = 1.46163214496836224576e+00, /* 0x3FF762D8, 0x6356BE3F */ -tf = -1.21486290535849611461e-01, /* 0xBFBF19B9, 0xBCC38A42 */ -/* tt = -(tail of tf) */ -tt = -3.63867699703950536541e-18, /* 0xBC50C7CA, 0xA48A971F */ -t0 = 4.83836122723810047042e-01, /* 0x3FDEF72B, 0xC8EE38A2 */ -t1 = -1.47587722994593911752e-01, /* 0xBFC2E427, 0x8DC6C509 */ -t2 = 6.46249402391333854778e-02, /* 0x3FB08B42, 0x94D5419B */ -t3 = -3.27885410759859649565e-02, /* 0xBFA0C9A8, 0xDF35B713 */ -t4 = 1.79706750811820387126e-02, /* 0x3F9266E7, 0x970AF9EC */ -t5 = -1.03142241298341437450e-02, /* 0xBF851F9F, 0xBA91EC6A */ -t6 = 6.10053870246291332635e-03, /* 0x3F78FCE0, 0xE370E344 */ -t7 = -3.68452016781138256760e-03, /* 0xBF6E2EFF, 0xB3E914D7 */ -t8 = 2.25964780900612472250e-03, /* 0x3F6282D3, 0x2E15C915 */ -t9 = -1.40346469989232843813e-03, /* 0xBF56FE8E, 0xBF2D1AF1 */ -t10 = 8.81081882437654011382e-04, /* 0x3F4CDF0C, 0xEF61A8E9 */ -t11 = -5.38595305356740546715e-04, /* 0xBF41A610, 0x9C73E0EC */ -t12 = 3.15632070903625950361e-04, /* 0x3F34AF6D, 0x6C0EBBF7 */ -t13 = -3.12754168375120860518e-04, /* 0xBF347F24, 0xECC38C38 */ -t14 = 3.35529192635519073543e-04, /* 0x3F35FD3E, 0xE8C2D3F4 */ -u0 = -7.72156649015328655494e-02, /* 0xBFB3C467, 0xE37DB0C8 */ -u1 = 6.32827064025093366517e-01, /* 0x3FE4401E, 0x8B005DFF */ -u2 = 1.45492250137234768737e+00, /* 0x3FF7475C, 0xD119BD6F */ -u3 = 9.77717527963372745603e-01, /* 0x3FEF4976, 0x44EA8450 */ -u4 = 2.28963728064692451092e-01, /* 0x3FCD4EAE, 0xF6010924 */ -u5 = 1.33810918536787660377e-02, /* 0x3F8B678B, 0xBF2BAB09 */ -v1 = 2.45597793713041134822e+00, /* 0x4003A5D7, 0xC2BD619C */ -v2 = 2.12848976379893395361e+00, /* 0x40010725, 0xA42B18F5 */ -v3 = 7.69285150456672783825e-01, /* 0x3FE89DFB, 0xE45050AF */ -v4 = 1.04222645593369134254e-01, /* 0x3FBAAE55, 0xD6537C88 */ -v5 = 3.21709242282423911810e-03, /* 0x3F6A5ABB, 0x57D0CF61 */ -s0 = -7.72156649015328655494e-02, /* 0xBFB3C467, 0xE37DB0C8 */ -s1 = 2.14982415960608852501e-01, /* 0x3FCB848B, 0x36E20878 */ -s2 = 3.25778796408930981787e-01, /* 0x3FD4D98F, 0x4F139F59 */ -s3 = 1.46350472652464452805e-01, /* 0x3FC2BB9C, 0xBEE5F2F7 */ -s4 = 2.66422703033638609560e-02, /* 0x3F9B481C, 0x7E939961 */ -s5 = 1.84028451407337715652e-03, /* 0x3F5E26B6, 0x7368F239 */ -s6 = 3.19475326584100867617e-05, /* 0x3F00BFEC, 0xDD17E945 */ -r1 = 1.39200533467621045958e+00, /* 0x3FF645A7, 0x62C4AB74 */ -r2 = 7.21935547567138069525e-01, /* 0x3FE71A18, 0x93D3DCDC */ -r3 = 1.71933865632803078993e-01, /* 0x3FC601ED, 0xCCFBDF27 */ -r4 = 1.86459191715652901344e-02, /* 0x3F9317EA, 0x742ED475 */ -r5 = 7.77942496381893596434e-04, /* 0x3F497DDA, 0xCA41A95B */ -r6 = 7.32668430744625636189e-06, /* 0x3EDEBAF7, 0xA5B38140 */ -w0 = 4.18938533204672725052e-01, /* 0x3FDACFE3, 0x90C97D69 */ -w1 = 8.33333333333329678849e-02, /* 0x3FB55555, 0x5555553B */ -w2 = -2.77777777728775536470e-03, /* 0xBF66C16C, 0x16B02E5C */ -w3 = 7.93650558643019558500e-04, /* 0x3F4A019F, 0x98CF38B6 */ -w4 = -5.95187557450339963135e-04, /* 0xBF4380CB, 0x8C0FE741 */ -w5 = 8.36339918996282139126e-04, /* 0x3F4B67BA, 0x4CDAD5D1 */ -w6 = -1.63092934096575273989e-03; /* 0xBF5AB89D, 0x0B9E43E4 */ - -/* sin(pi*x) assuming x > 2^-100, if sin(pi*x)==0 the sign is arbitrary */ -static double sin_pi(double x) -{ - int n; - - /* spurious inexact if odd int */ - x = 2.0*(x*0.5 - floor(x*0.5)); /* x mod 2.0 */ - - n = (int)(x*4.0); - n = (n+1)/2; - x -= n*0.5f; - x *= pi; - - switch (n) { - default: /* case 4: */ - case 0: return __sin(x, 0.0, 0); - case 1: return __cos(x, 0.0); - case 2: return __sin(-x, 0.0, 0); - case 3: return -__cos(x, 0.0); - } -} - -double __lgamma_r(double x, int *signgamp) -{ - union {double f; uint64_t i;} u = {x}; - double_t t,y,z,nadj,p,p1,p2,p3,q,r,w; - uint32_t ix; - int sign,i; - - /* purge off +-inf, NaN, +-0, tiny and negative arguments */ - *signgamp = 1; - sign = u.i>>63; - ix = u.i>>32 & 0x7fffffff; - if (ix >= 0x7ff00000) - return x*x; - if (ix < (0x3ff-70)<<20) { /* |x|<2**-70, return -log(|x|) */ - if(sign) { - x = -x; - *signgamp = -1; - } - return -log(x); - } - if (sign) { - x = -x; - t = sin_pi(x); - if (t == 0.0) /* -integer */ - return 1.0/(x-x); - if (t > 0.0) - *signgamp = -1; - else - t = -t; - nadj = log(pi/(t*x)); - } - - /* purge off 1 and 2 */ - if ((ix == 0x3ff00000 || ix == 0x40000000) && (uint32_t)u.i == 0) - r = 0; - /* for x < 2.0 */ - else if (ix < 0x40000000) { - if (ix <= 0x3feccccc) { /* lgamma(x) = lgamma(x+1)-log(x) */ - r = -log(x); - if (ix >= 0x3FE76944) { - y = 1.0 - x; - i = 0; - } else if (ix >= 0x3FCDA661) { - y = x - (tc-1.0); - i = 1; - } else { - y = x; - i = 2; - } - } else { - r = 0.0; - if (ix >= 0x3FFBB4C3) { /* [1.7316,2] */ - y = 2.0 - x; - i = 0; - } else if(ix >= 0x3FF3B4C4) { /* [1.23,1.73] */ - y = x - tc; - i = 1; - } else { - y = x - 1.0; - i = 2; - } - } - switch (i) { - case 0: - z = y*y; - p1 = a0+z*(a2+z*(a4+z*(a6+z*(a8+z*a10)))); - p2 = z*(a1+z*(a3+z*(a5+z*(a7+z*(a9+z*a11))))); - p = y*p1+p2; - r += (p-0.5*y); - break; - case 1: - z = y*y; - w = z*y; - p1 = t0+w*(t3+w*(t6+w*(t9 +w*t12))); /* parallel comp */ - p2 = t1+w*(t4+w*(t7+w*(t10+w*t13))); - p3 = t2+w*(t5+w*(t8+w*(t11+w*t14))); - p = z*p1-(tt-w*(p2+y*p3)); - r += tf + p; - break; - case 2: - p1 = y*(u0+y*(u1+y*(u2+y*(u3+y*(u4+y*u5))))); - p2 = 1.0+y*(v1+y*(v2+y*(v3+y*(v4+y*v5)))); - r += -0.5*y + p1/p2; - } - } else if (ix < 0x40200000) { /* x < 8.0 */ - i = (int)x; - y = x - (double)i; - p = y*(s0+y*(s1+y*(s2+y*(s3+y*(s4+y*(s5+y*s6)))))); - q = 1.0+y*(r1+y*(r2+y*(r3+y*(r4+y*(r5+y*r6))))); - r = 0.5*y+p/q; - z = 1.0; /* lgamma(1+s) = log(s) + lgamma(s) */ - switch (i) { - case 7: z *= y + 6.0; /* FALLTHRU */ - case 6: z *= y + 5.0; /* FALLTHRU */ - case 5: z *= y + 4.0; /* FALLTHRU */ - case 4: z *= y + 3.0; /* FALLTHRU */ - case 3: z *= y + 2.0; /* FALLTHRU */ - r += log(z); - break; - } - } else if (ix < 0x43900000) { /* 8.0 <= x < 2**58 */ - t = log(x); - z = 1.0/x; - y = z*z; - w = w0+z*(w1+y*(w2+y*(w3+y*(w4+y*(w5+y*w6))))); - r = (x-0.5)*(t-1.0)+w; - } else /* 2**58 <= x <= inf */ - r = x*(log(x)-1.0); - if (sign) - r = nadj - r; - return r; -} - -weak_alias(__lgamma_r, lgamma_r); diff --git a/waterbox/libc/functions/math/lgammaf.c b/waterbox/libc/functions/math/lgammaf.c deleted file mode 100644 index badb6dfec9..0000000000 --- a/waterbox/libc/functions/math/lgammaf.c +++ /dev/null @@ -1,9 +0,0 @@ -#include - -extern int __signgam; -float __lgammaf_r(float, int *); - -float lgammaf(float x) -{ - return __lgammaf_r(x, &__signgam); -} diff --git a/waterbox/libc/functions/math/lgammaf_r.c b/waterbox/libc/functions/math/lgammaf_r.c deleted file mode 100644 index 43a39cccbc..0000000000 --- a/waterbox/libc/functions/math/lgammaf_r.c +++ /dev/null @@ -1,219 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/e_lgammaf_r.c */ -/* - * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. - */ -/* - * ==================================================== - * 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 "libm.h" -#include "_alias.h" - -static const float -pi = 3.1415927410e+00, /* 0x40490fdb */ -a0 = 7.7215664089e-02, /* 0x3d9e233f */ -a1 = 3.2246702909e-01, /* 0x3ea51a66 */ -a2 = 6.7352302372e-02, /* 0x3d89f001 */ -a3 = 2.0580807701e-02, /* 0x3ca89915 */ -a4 = 7.3855509982e-03, /* 0x3bf2027e */ -a5 = 2.8905137442e-03, /* 0x3b3d6ec6 */ -a6 = 1.1927076848e-03, /* 0x3a9c54a1 */ -a7 = 5.1006977446e-04, /* 0x3a05b634 */ -a8 = 2.2086278477e-04, /* 0x39679767 */ -a9 = 1.0801156895e-04, /* 0x38e28445 */ -a10 = 2.5214456400e-05, /* 0x37d383a2 */ -a11 = 4.4864096708e-05, /* 0x383c2c75 */ -tc = 1.4616321325e+00, /* 0x3fbb16c3 */ -tf = -1.2148628384e-01, /* 0xbdf8cdcd */ -/* tt = -(tail of tf) */ -tt = 6.6971006518e-09, /* 0x31e61c52 */ -t0 = 4.8383611441e-01, /* 0x3ef7b95e */ -t1 = -1.4758771658e-01, /* 0xbe17213c */ -t2 = 6.4624942839e-02, /* 0x3d845a15 */ -t3 = -3.2788541168e-02, /* 0xbd064d47 */ -t4 = 1.7970675603e-02, /* 0x3c93373d */ -t5 = -1.0314224288e-02, /* 0xbc28fcfe */ -t6 = 6.1005386524e-03, /* 0x3bc7e707 */ -t7 = -3.6845202558e-03, /* 0xbb7177fe */ -t8 = 2.2596477065e-03, /* 0x3b141699 */ -t9 = -1.4034647029e-03, /* 0xbab7f476 */ -t10 = 8.8108185446e-04, /* 0x3a66f867 */ -t11 = -5.3859531181e-04, /* 0xba0d3085 */ -t12 = 3.1563205994e-04, /* 0x39a57b6b */ -t13 = -3.1275415677e-04, /* 0xb9a3f927 */ -t14 = 3.3552918467e-04, /* 0x39afe9f7 */ -u0 = -7.7215664089e-02, /* 0xbd9e233f */ -u1 = 6.3282704353e-01, /* 0x3f2200f4 */ -u2 = 1.4549225569e+00, /* 0x3fba3ae7 */ -u3 = 9.7771751881e-01, /* 0x3f7a4bb2 */ -u4 = 2.2896373272e-01, /* 0x3e6a7578 */ -u5 = 1.3381091878e-02, /* 0x3c5b3c5e */ -v1 = 2.4559779167e+00, /* 0x401d2ebe */ -v2 = 2.1284897327e+00, /* 0x4008392d */ -v3 = 7.6928514242e-01, /* 0x3f44efdf */ -v4 = 1.0422264785e-01, /* 0x3dd572af */ -v5 = 3.2170924824e-03, /* 0x3b52d5db */ -s0 = -7.7215664089e-02, /* 0xbd9e233f */ -s1 = 2.1498242021e-01, /* 0x3e5c245a */ -s2 = 3.2577878237e-01, /* 0x3ea6cc7a */ -s3 = 1.4635047317e-01, /* 0x3e15dce6 */ -s4 = 2.6642270386e-02, /* 0x3cda40e4 */ -s5 = 1.8402845599e-03, /* 0x3af135b4 */ -s6 = 3.1947532989e-05, /* 0x3805ff67 */ -r1 = 1.3920053244e+00, /* 0x3fb22d3b */ -r2 = 7.2193557024e-01, /* 0x3f38d0c5 */ -r3 = 1.7193385959e-01, /* 0x3e300f6e */ -r4 = 1.8645919859e-02, /* 0x3c98bf54 */ -r5 = 7.7794247773e-04, /* 0x3a4beed6 */ -r6 = 7.3266842264e-06, /* 0x36f5d7bd */ -w0 = 4.1893854737e-01, /* 0x3ed67f1d */ -w1 = 8.3333335817e-02, /* 0x3daaaaab */ -w2 = -2.7777778450e-03, /* 0xbb360b61 */ -w3 = 7.9365057172e-04, /* 0x3a500cfd */ -w4 = -5.9518753551e-04, /* 0xba1c065c */ -w5 = 8.3633989561e-04, /* 0x3a5b3dd2 */ -w6 = -1.6309292987e-03; /* 0xbad5c4e8 */ - -/* sin(pi*x) assuming x > 2^-100, if sin(pi*x)==0 the sign is arbitrary */ -static float sin_pi(float x) -{ - double_t y; - int n; - - /* spurious inexact if odd int */ - x = 2*(x*0.5f - floorf(x*0.5f)); /* x mod 2.0 */ - - n = (int)(x*4); - n = (n+1)/2; - y = x - n*0.5f; - y *= 3.14159265358979323846; - switch (n) { - default: /* case 4: */ - case 0: return __sindf(y); - case 1: return __cosdf(y); - case 2: return __sindf(-y); - case 3: return -__cosdf(y); - } -} - -float __lgammaf_r(float x, int *signgamp) -{ - union {float f; uint32_t i;} u = {x}; - float t,y,z,nadj,p,p1,p2,p3,q,r,w; - uint32_t ix; - int i,sign; - - /* purge off +-inf, NaN, +-0, tiny and negative arguments */ - *signgamp = 1; - sign = u.i>>31; - ix = u.i & 0x7fffffff; - if (ix >= 0x7f800000) - return x*x; - if (ix < 0x35000000) { /* |x| < 2**-21, return -log(|x|) */ - if (sign) { - *signgamp = -1; - x = -x; - } - return -logf(x); - } - if (sign) { - x = -x; - t = sin_pi(x); - if (t == 0.0f) /* -integer */ - return 1.0f/(x-x); - if (t > 0.0f) - *signgamp = -1; - else - t = -t; - nadj = logf(pi/(t*x)); - } - - /* purge off 1 and 2 */ - if (ix == 0x3f800000 || ix == 0x40000000) - r = 0; - /* for x < 2.0 */ - else if (ix < 0x40000000) { - if (ix <= 0x3f666666) { /* lgamma(x) = lgamma(x+1)-log(x) */ - r = -logf(x); - if (ix >= 0x3f3b4a20) { - y = 1.0f - x; - i = 0; - } else if (ix >= 0x3e6d3308) { - y = x - (tc-1.0f); - i = 1; - } else { - y = x; - i = 2; - } - } else { - r = 0.0f; - if (ix >= 0x3fdda618) { /* [1.7316,2] */ - y = 2.0f - x; - i = 0; - } else if (ix >= 0x3F9da620) { /* [1.23,1.73] */ - y = x - tc; - i = 1; - } else { - y = x - 1.0f; - i = 2; - } - } - switch(i) { - case 0: - z = y*y; - p1 = a0+z*(a2+z*(a4+z*(a6+z*(a8+z*a10)))); - p2 = z*(a1+z*(a3+z*(a5+z*(a7+z*(a9+z*a11))))); - p = y*p1+p2; - r += p - 0.5f*y; - break; - case 1: - z = y*y; - w = z*y; - p1 = t0+w*(t3+w*(t6+w*(t9 +w*t12))); /* parallel comp */ - p2 = t1+w*(t4+w*(t7+w*(t10+w*t13))); - p3 = t2+w*(t5+w*(t8+w*(t11+w*t14))); - p = z*p1-(tt-w*(p2+y*p3)); - r += (tf + p); - break; - case 2: - p1 = y*(u0+y*(u1+y*(u2+y*(u3+y*(u4+y*u5))))); - p2 = 1.0f+y*(v1+y*(v2+y*(v3+y*(v4+y*v5)))); - r += -0.5f*y + p1/p2; - } - } else if (ix < 0x41000000) { /* x < 8.0 */ - i = (int)x; - y = x - (float)i; - p = y*(s0+y*(s1+y*(s2+y*(s3+y*(s4+y*(s5+y*s6)))))); - q = 1.0f+y*(r1+y*(r2+y*(r3+y*(r4+y*(r5+y*r6))))); - r = 0.5f*y+p/q; - z = 1.0f; /* lgamma(1+s) = log(s) + lgamma(s) */ - switch (i) { - case 7: z *= y + 6.0f; /* FALLTHRU */ - case 6: z *= y + 5.0f; /* FALLTHRU */ - case 5: z *= y + 4.0f; /* FALLTHRU */ - case 4: z *= y + 3.0f; /* FALLTHRU */ - case 3: z *= y + 2.0f; /* FALLTHRU */ - r += logf(z); - break; - } - } else if (ix < 0x5c800000) { /* 8.0 <= x < 2**58 */ - t = logf(x); - z = 1.0f/x; - y = z*z; - w = w0+z*(w1+y*(w2+y*(w3+y*(w4+y*(w5+y*w6))))); - r = (x-0.5f)*(t-1.0f)+w; - } else /* 2**58 <= x <= inf */ - r = x*(logf(x)-1.0f); - if (sign) - r = nadj - r; - return r; -} - -weak_alias(__lgammaf_r, lgammaf_r); diff --git a/waterbox/libc/functions/math/lgammal.c b/waterbox/libc/functions/math/lgammal.c deleted file mode 100644 index e9e6da63f4..0000000000 --- a/waterbox/libc/functions/math/lgammal.c +++ /dev/null @@ -1,360 +0,0 @@ -/* origin: OpenBSD /usr/src/lib/libm/src/ld80/e_lgammal.c */ -/* - * ==================================================== - * 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. - * ==================================================== - */ -/* - * Copyright (c) 2008 Stephen L. Moshier - * - * 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 THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR 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. - */ -/* lgammal(x) - * Reentrant version of the logarithm of the Gamma function - * with user provide pointer for the sign of Gamma(x). - * - * Method: - * 1. Argument Reduction for 0 < x <= 8 - * Since gamma(1+s)=s*gamma(s), for x in [0,8], we may - * reduce x to a number in [1.5,2.5] by - * lgamma(1+s) = log(s) + lgamma(s) - * for example, - * lgamma(7.3) = log(6.3) + lgamma(6.3) - * = log(6.3*5.3) + lgamma(5.3) - * = log(6.3*5.3*4.3*3.3*2.3) + lgamma(2.3) - * 2. Polynomial approximation of lgamma around its - * minimun ymin=1.461632144968362245 to maintain monotonicity. - * On [ymin-0.23, ymin+0.27] (i.e., [1.23164,1.73163]), use - * Let z = x-ymin; - * lgamma(x) = -1.214862905358496078218 + z^2*poly(z) - * 2. Rational approximation in the primary interval [2,3] - * We use the following approximation: - * s = x-2.0; - * lgamma(x) = 0.5*s + s*P(s)/Q(s) - * Our algorithms are based on the following observation - * - * zeta(2)-1 2 zeta(3)-1 3 - * lgamma(2+s) = s*(1-Euler) + --------- * s - --------- * s + ... - * 2 3 - * - * where Euler = 0.5771... is the Euler constant, which is very - * close to 0.5. - * - * 3. For x>=8, we have - * lgamma(x)~(x-0.5)log(x)-x+0.5*log(2pi)+1/(12x)-1/(360x**3)+.... - * (better formula: - * lgamma(x)~(x-0.5)*(log(x)-1)-.5*(log(2pi)-1) + ...) - * Let z = 1/x, then we approximation - * f(z) = lgamma(x) - (x-0.5)(log(x)-1) - * by - * 3 5 11 - * w = w0 + w1*z + w2*z + w3*z + ... + w6*z - * - * 4. For negative x, since (G is gamma function) - * -x*G(-x)*G(x) = pi/sin(pi*x), - * we have - * G(x) = pi/(sin(pi*x)*(-x)*G(-x)) - * since G(-x) is positive, sign(G(x)) = sign(sin(pi*x)) for x<0 - * Hence, for x<0, signgam = sign(sin(pi*x)) and - * lgamma(x) = log(|Gamma(x)|) - * = log(pi/(|x*sin(pi*x)|)) - lgamma(-x); - * Note: one should avoid compute pi*(-x) directly in the - * computation of sin(pi*(-x)). - * - * 5. Special Cases - * lgamma(2+s) ~ s*(1-Euler) for tiny s - * lgamma(1)=lgamma(2)=0 - * lgamma(x) ~ -log(x) for tiny x - * lgamma(0) = lgamma(inf) = inf - * lgamma(-integer) = +-inf - * - */ - -#define _GNU_SOURCE -#include "libm.h" -#include "_alias.h" - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -double __lgamma_r(double x, int *sg); - -long double __lgammal_r(long double x, int *sg) -{ - return __lgamma_r(x, sg); -} -#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384 -static const long double -pi = 3.14159265358979323846264L, - -/* lgam(1+x) = 0.5 x + x a(x)/b(x) - -0.268402099609375 <= x <= 0 - peak relative error 6.6e-22 */ -a0 = -6.343246574721079391729402781192128239938E2L, -a1 = 1.856560238672465796768677717168371401378E3L, -a2 = 2.404733102163746263689288466865843408429E3L, -a3 = 8.804188795790383497379532868917517596322E2L, -a4 = 1.135361354097447729740103745999661157426E2L, -a5 = 3.766956539107615557608581581190400021285E0L, - -b0 = 8.214973713960928795704317259806842490498E3L, -b1 = 1.026343508841367384879065363925870888012E4L, -b2 = 4.553337477045763320522762343132210919277E3L, -b3 = 8.506975785032585797446253359230031874803E2L, -b4 = 6.042447899703295436820744186992189445813E1L, -/* b5 = 1.000000000000000000000000000000000000000E0 */ - - -tc = 1.4616321449683623412626595423257213284682E0L, -tf = -1.2148629053584961146050602565082954242826E-1, /* double precision */ -/* tt = (tail of tf), i.e. tf + tt has extended precision. */ -tt = 3.3649914684731379602768989080467587736363E-18L, -/* lgam ( 1.4616321449683623412626595423257213284682E0 ) = --1.2148629053584960809551455717769158215135617312999903886372437313313530E-1 */ - -/* lgam (x + tc) = tf + tt + x g(x)/h(x) - -0.230003726999612341262659542325721328468 <= x - <= 0.2699962730003876587373404576742786715318 - peak relative error 2.1e-21 */ -g0 = 3.645529916721223331888305293534095553827E-18L, -g1 = 5.126654642791082497002594216163574795690E3L, -g2 = 8.828603575854624811911631336122070070327E3L, -g3 = 5.464186426932117031234820886525701595203E3L, -g4 = 1.455427403530884193180776558102868592293E3L, -g5 = 1.541735456969245924860307497029155838446E2L, -g6 = 4.335498275274822298341872707453445815118E0L, - -h0 = 1.059584930106085509696730443974495979641E4L, -h1 = 2.147921653490043010629481226937850618860E4L, -h2 = 1.643014770044524804175197151958100656728E4L, -h3 = 5.869021995186925517228323497501767586078E3L, -h4 = 9.764244777714344488787381271643502742293E2L, -h5 = 6.442485441570592541741092969581997002349E1L, -/* h6 = 1.000000000000000000000000000000000000000E0 */ - - -/* lgam (x+1) = -0.5 x + x u(x)/v(x) - -0.100006103515625 <= x <= 0.231639862060546875 - peak relative error 1.3e-21 */ -u0 = -8.886217500092090678492242071879342025627E1L, -u1 = 6.840109978129177639438792958320783599310E2L, -u2 = 2.042626104514127267855588786511809932433E3L, -u3 = 1.911723903442667422201651063009856064275E3L, -u4 = 7.447065275665887457628865263491667767695E2L, -u5 = 1.132256494121790736268471016493103952637E2L, -u6 = 4.484398885516614191003094714505960972894E0L, - -v0 = 1.150830924194461522996462401210374632929E3L, -v1 = 3.399692260848747447377972081399737098610E3L, -v2 = 3.786631705644460255229513563657226008015E3L, -v3 = 1.966450123004478374557778781564114347876E3L, -v4 = 4.741359068914069299837355438370682773122E2L, -v5 = 4.508989649747184050907206782117647852364E1L, -/* v6 = 1.000000000000000000000000000000000000000E0 */ - - -/* lgam (x+2) = .5 x + x s(x)/r(x) - 0 <= x <= 1 - peak relative error 7.2e-22 */ -s0 = 1.454726263410661942989109455292824853344E6L, -s1 = -3.901428390086348447890408306153378922752E6L, -s2 = -6.573568698209374121847873064292963089438E6L, -s3 = -3.319055881485044417245964508099095984643E6L, -s4 = -7.094891568758439227560184618114707107977E5L, -s5 = -6.263426646464505837422314539808112478303E4L, -s6 = -1.684926520999477529949915657519454051529E3L, - -r0 = -1.883978160734303518163008696712983134698E7L, -r1 = -2.815206082812062064902202753264922306830E7L, -r2 = -1.600245495251915899081846093343626358398E7L, -r3 = -4.310526301881305003489257052083370058799E6L, -r4 = -5.563807682263923279438235987186184968542E5L, -r5 = -3.027734654434169996032905158145259713083E4L, -r6 = -4.501995652861105629217250715790764371267E2L, -/* r6 = 1.000000000000000000000000000000000000000E0 */ - - -/* lgam(x) = ( x - 0.5 ) * log(x) - x + LS2PI + 1/x w(1/x^2) - x >= 8 - Peak relative error 1.51e-21 -w0 = LS2PI - 0.5 */ -w0 = 4.189385332046727417803e-1L, -w1 = 8.333333333333331447505E-2L, -w2 = -2.777777777750349603440E-3L, -w3 = 7.936507795855070755671E-4L, -w4 = -5.952345851765688514613E-4L, -w5 = 8.412723297322498080632E-4L, -w6 = -1.880801938119376907179E-3L, -w7 = 4.885026142432270781165E-3L; - -/* sin(pi*x) assuming x > 2^-1000, if sin(pi*x)==0 the sign is arbitrary */ -static long double sin_pi(long double x) -{ - int n; - - /* spurious inexact if odd int */ - x *= 0.5; - x = 2.0*(x - floorl(x)); /* x mod 2.0 */ - - n = (int)(x*4.0); - n = (n+1)/2; - x -= n*0.5f; - x *= pi; - - switch (n) { - default: /* case 4: */ - case 0: return __sinl(x, 0.0, 0); - case 1: return __cosl(x, 0.0); - case 2: return __sinl(-x, 0.0, 0); - case 3: return -__cosl(x, 0.0); - } -} - -long double __lgammal_r(long double x, int *sg) { - long double t, y, z, nadj, p, p1, p2, q, r, w; - union ldshape u = {x}; - uint32_t ix = (u.i.se & 0x7fffU)<<16 | u.i.m>>48; - int sign = u.i.se >> 15; - int i; - - *sg = 1; - - /* purge off +-inf, NaN, +-0, tiny and negative arguments */ - if (ix >= 0x7fff0000) - return x * x; - if (ix < 0x3fc08000) { /* |x|<2**-63, return -log(|x|) */ - if (sign) { - *sg = -1; - x = -x; - } - return -logl(x); - } - if (sign) { - x = -x; - t = sin_pi(x); - if (t == 0.0) - return 1.0 / (x-x); /* -integer */ - if (t > 0.0) - *sg = -1; - else - t = -t; - nadj = logl(pi / (t * x)); - } - - /* purge off 1 and 2 (so the sign is ok with downward rounding) */ - if ((ix == 0x3fff8000 || ix == 0x40008000) && u.i.m == 0) { - r = 0; - } else if (ix < 0x40008000) { /* x < 2.0 */ - if (ix <= 0x3ffee666) { /* 8.99993896484375e-1 */ - /* lgamma(x) = lgamma(x+1) - log(x) */ - r = -logl(x); - if (ix >= 0x3ffebb4a) { /* 7.31597900390625e-1 */ - y = x - 1.0; - i = 0; - } else if (ix >= 0x3ffced33) { /* 2.31639862060546875e-1 */ - y = x - (tc - 1.0); - i = 1; - } else { /* x < 0.23 */ - y = x; - i = 2; - } - } else { - r = 0.0; - if (ix >= 0x3fffdda6) { /* 1.73162841796875 */ - /* [1.7316,2] */ - y = x - 2.0; - i = 0; - } else if (ix >= 0x3fff9da6) { /* 1.23162841796875 */ - /* [1.23,1.73] */ - y = x - tc; - i = 1; - } else { - /* [0.9, 1.23] */ - y = x - 1.0; - i = 2; - } - } - switch (i) { - case 0: - p1 = a0 + y * (a1 + y * (a2 + y * (a3 + y * (a4 + y * a5)))); - p2 = b0 + y * (b1 + y * (b2 + y * (b3 + y * (b4 + y)))); - r += 0.5 * y + y * p1/p2; - break; - case 1: - p1 = g0 + y * (g1 + y * (g2 + y * (g3 + y * (g4 + y * (g5 + y * g6))))); - p2 = h0 + y * (h1 + y * (h2 + y * (h3 + y * (h4 + y * (h5 + y))))); - p = tt + y * p1/p2; - r += (tf + p); - break; - case 2: - p1 = y * (u0 + y * (u1 + y * (u2 + y * (u3 + y * (u4 + y * (u5 + y * u6)))))); - p2 = v0 + y * (v1 + y * (v2 + y * (v3 + y * (v4 + y * (v5 + y))))); - r += (-0.5 * y + p1 / p2); - } - } else if (ix < 0x40028000) { /* 8.0 */ - /* x < 8.0 */ - i = (int)x; - y = x - (double)i; - p = y * (s0 + y * (s1 + y * (s2 + y * (s3 + y * (s4 + y * (s5 + y * s6)))))); - q = r0 + y * (r1 + y * (r2 + y * (r3 + y * (r4 + y * (r5 + y * (r6 + y)))))); - r = 0.5 * y + p / q; - z = 1.0; - /* lgamma(1+s) = log(s) + lgamma(s) */ - switch (i) { - case 7: - z *= (y + 6.0); /* FALLTHRU */ - case 6: - z *= (y + 5.0); /* FALLTHRU */ - case 5: - z *= (y + 4.0); /* FALLTHRU */ - case 4: - z *= (y + 3.0); /* FALLTHRU */ - case 3: - z *= (y + 2.0); /* FALLTHRU */ - r += logl(z); - break; - } - } else if (ix < 0x40418000) { /* 2^66 */ - /* 8.0 <= x < 2**66 */ - t = logl(x); - z = 1.0 / x; - y = z * z; - w = w0 + z * (w1 + y * (w2 + y * (w3 + y * (w4 + y * (w5 + y * (w6 + y * w7)))))); - r = (x - 0.5) * (t - 1.0) + w; - } else /* 2**66 <= x <= inf */ - r = x * (logl(x) - 1.0); - if (sign) - r = nadj - r; - return r; -} -#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384 -// TODO: broken implementation to make things compile -double __lgamma_r(double x, int *sg); - -long double __lgammal_r(long double x, int *sg) -{ - return __lgamma_r(x, sg); -} -#endif - -extern int __signgam; - -long double lgammal(long double x) -{ - return __lgammal_r(x, &__signgam); -} - -weak_alias(__lgammal_r, lgammal_r); diff --git a/waterbox/libc/functions/math/llrint.c b/waterbox/libc/functions/math/llrint.c deleted file mode 100644 index 4f583ae553..0000000000 --- a/waterbox/libc/functions/math/llrint.c +++ /dev/null @@ -1,8 +0,0 @@ -#include - -/* uses LLONG_MAX > 2^53, see comments in lrint.c */ - -long long llrint(double x) -{ - return rint(x); -} diff --git a/waterbox/libc/functions/math/llrintf.c b/waterbox/libc/functions/math/llrintf.c deleted file mode 100644 index 96949a006e..0000000000 --- a/waterbox/libc/functions/math/llrintf.c +++ /dev/null @@ -1,8 +0,0 @@ -#include - -/* uses LLONG_MAX > 2^24, see comments in lrint.c */ - -long long llrintf(float x) -{ - return rintf(x); -} diff --git a/waterbox/libc/functions/math/llrintl.c b/waterbox/libc/functions/math/llrintl.c deleted file mode 100644 index 3449f6f2b4..0000000000 --- a/waterbox/libc/functions/math/llrintl.c +++ /dev/null @@ -1,36 +0,0 @@ -#include -#include -#include "libm.h" - - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long long llrintl(long double x) -{ - return llrint(x); -} -#elif defined(FE_INEXACT) -/* -see comments in lrint.c - -Note that if LLONG_MAX == 0x7fffffffffffffff && LDBL_MANT_DIG == 64 -then x == 2**63 - 0.5 is the only input that overflows and -raises inexact (with tonearest or upward rounding mode) -*/ -long long llrintl(long double x) -{ - #pragma STDC FENV_ACCESS ON - int e; - - e = fetestexcept(FE_INEXACT); - x = rintl(x); - if (!e && (x > LLONG_MAX || x < LLONG_MIN)) - feclearexcept(FE_INEXACT); - /* conversion */ - return x; -} -#else -long long llrintl(long double x) -{ - return rintl(x); -} -#endif diff --git a/waterbox/libc/functions/math/llround.c b/waterbox/libc/functions/math/llround.c deleted file mode 100644 index 4d94787d62..0000000000 --- a/waterbox/libc/functions/math/llround.c +++ /dev/null @@ -1,6 +0,0 @@ -#include - -long long llround(double x) -{ - return round(x); -} diff --git a/waterbox/libc/functions/math/llroundf.c b/waterbox/libc/functions/math/llroundf.c deleted file mode 100644 index 19eb77ee3d..0000000000 --- a/waterbox/libc/functions/math/llroundf.c +++ /dev/null @@ -1,6 +0,0 @@ -#include - -long long llroundf(float x) -{ - return roundf(x); -} diff --git a/waterbox/libc/functions/math/llroundl.c b/waterbox/libc/functions/math/llroundl.c deleted file mode 100644 index 2c2ee5ecd6..0000000000 --- a/waterbox/libc/functions/math/llroundl.c +++ /dev/null @@ -1,6 +0,0 @@ -#include - -long long llroundl(long double x) -{ - return roundl(x); -} diff --git a/waterbox/libc/functions/math/log.c b/waterbox/libc/functions/math/log.c deleted file mode 100644 index e61e113d41..0000000000 --- a/waterbox/libc/functions/math/log.c +++ /dev/null @@ -1,118 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/e_log.c */ -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * - * Developed at SunSoft, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ -/* log(x) - * Return the logarithm of x - * - * Method : - * 1. Argument Reduction: find k and f such that - * x = 2^k * (1+f), - * where sqrt(2)/2 < 1+f < sqrt(2) . - * - * 2. Approximation of log(1+f). - * Let s = f/(2+f) ; based on log(1+f) = log(1+s) - log(1-s) - * = 2s + 2/3 s**3 + 2/5 s**5 + ....., - * = 2s + s*R - * We use a special Remez algorithm on [0,0.1716] to generate - * a polynomial of degree 14 to approximate R The maximum error - * of this polynomial approximation is bounded by 2**-58.45. In - * other words, - * 2 4 6 8 10 12 14 - * R(z) ~ Lg1*s +Lg2*s +Lg3*s +Lg4*s +Lg5*s +Lg6*s +Lg7*s - * (the values of Lg1 to Lg7 are listed in the program) - * and - * | 2 14 | -58.45 - * | Lg1*s +...+Lg7*s - R(z) | <= 2 - * | | - * Note that 2s = f - s*f = f - hfsq + s*hfsq, where hfsq = f*f/2. - * In order to guarantee error in log below 1ulp, we compute log - * by - * log(1+f) = f - s*(f - R) (if f is not too large) - * log(1+f) = f - (hfsq - s*(hfsq+R)). (better accuracy) - * - * 3. Finally, log(x) = k*ln2 + log(1+f). - * = k*ln2_hi+(f-(hfsq-(s*(hfsq+R)+k*ln2_lo))) - * Here ln2 is split into two floating point number: - * ln2_hi + ln2_lo, - * where n*ln2_hi is always exact for |n| < 2000. - * - * Special cases: - * log(x) is NaN with signal if x < 0 (including -INF) ; - * log(+INF) is +INF; log(0) is -INF with signal; - * log(NaN) is that NaN with no signal. - * - * Accuracy: - * according to an error analysis, the error is always less than - * 1 ulp (unit in the last place). - * - * 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. - */ - -#include -#include - -static const double -ln2_hi = 6.93147180369123816490e-01, /* 3fe62e42 fee00000 */ -ln2_lo = 1.90821492927058770002e-10, /* 3dea39ef 35793c76 */ -Lg1 = 6.666666666666735130e-01, /* 3FE55555 55555593 */ -Lg2 = 3.999999999940941908e-01, /* 3FD99999 9997FA04 */ -Lg3 = 2.857142874366239149e-01, /* 3FD24924 94229359 */ -Lg4 = 2.222219843214978396e-01, /* 3FCC71C5 1D8E78AF */ -Lg5 = 1.818357216161805012e-01, /* 3FC74664 96CB03DE */ -Lg6 = 1.531383769920937332e-01, /* 3FC39A09 D078C69F */ -Lg7 = 1.479819860511658591e-01; /* 3FC2F112 DF3E5244 */ - -double log(double x) -{ - union {double f; uint64_t i;} u = {x}; - double_t hfsq,f,s,z,R,w,t1,t2,dk; - uint32_t hx; - int k; - - hx = u.i>>32; - k = 0; - if (hx < 0x00100000 || hx>>31) { - if (u.i<<1 == 0) - return -1/(x*x); /* log(+-0)=-inf */ - if (hx>>31) - return (x-x)/0.0; /* log(-#) = NaN */ - /* subnormal number, scale x up */ - k -= 54; - x *= 0x1p54; - u.f = x; - hx = u.i>>32; - } else if (hx >= 0x7ff00000) { - return x; - } else if (hx == 0x3ff00000 && u.i<<32 == 0) - return 0; - - /* reduce x into [sqrt(2)/2, sqrt(2)] */ - hx += 0x3ff00000 - 0x3fe6a09e; - k += (int)(hx>>20) - 0x3ff; - hx = (hx&0x000fffff) + 0x3fe6a09e; - u.i = (uint64_t)hx<<32 | (u.i&0xffffffff); - x = u.f; - - f = x - 1.0; - hfsq = 0.5*f*f; - s = f/(2.0+f); - z = s*s; - w = z*z; - t1 = w*(Lg2+w*(Lg4+w*Lg6)); - t2 = z*(Lg1+w*(Lg3+w*(Lg5+w*Lg7))); - R = t2 + t1; - dk = k; - return s*(hfsq+R) + dk*ln2_lo - hfsq + f + dk*ln2_hi; -} diff --git a/waterbox/libc/functions/math/log10.c b/waterbox/libc/functions/math/log10.c deleted file mode 100644 index 81026876b2..0000000000 --- a/waterbox/libc/functions/math/log10.c +++ /dev/null @@ -1,101 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/e_log10.c */ -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * - * Developed at SunSoft, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ -/* - * Return the base 10 logarithm of x. See log.c for most comments. - * - * Reduce x to 2^k (1+f) and calculate r = log(1+f) - f + f*f/2 - * as in log.c, then combine and scale in extra precision: - * log10(x) = (f - f*f/2 + r)/log(10) + k*log10(2) - */ - -#include -#include - -static const double -ivln10hi = 4.34294481878168880939e-01, /* 0x3fdbcb7b, 0x15200000 */ -ivln10lo = 2.50829467116452752298e-11, /* 0x3dbb9438, 0xca9aadd5 */ -log10_2hi = 3.01029995663611771306e-01, /* 0x3FD34413, 0x509F6000 */ -log10_2lo = 3.69423907715893078616e-13, /* 0x3D59FEF3, 0x11F12B36 */ -Lg1 = 6.666666666666735130e-01, /* 3FE55555 55555593 */ -Lg2 = 3.999999999940941908e-01, /* 3FD99999 9997FA04 */ -Lg3 = 2.857142874366239149e-01, /* 3FD24924 94229359 */ -Lg4 = 2.222219843214978396e-01, /* 3FCC71C5 1D8E78AF */ -Lg5 = 1.818357216161805012e-01, /* 3FC74664 96CB03DE */ -Lg6 = 1.531383769920937332e-01, /* 3FC39A09 D078C69F */ -Lg7 = 1.479819860511658591e-01; /* 3FC2F112 DF3E5244 */ - -double log10(double x) -{ - union {double f; uint64_t i;} u = {x}; - double_t hfsq,f,s,z,R,w,t1,t2,dk,y,hi,lo,val_hi,val_lo; - uint32_t hx; - int k; - - hx = u.i>>32; - k = 0; - if (hx < 0x00100000 || hx>>31) { - if (u.i<<1 == 0) - return -1/(x*x); /* log(+-0)=-inf */ - if (hx>>31) - return (x-x)/0.0; /* log(-#) = NaN */ - /* subnormal number, scale x up */ - k -= 54; - x *= 0x1p54; - u.f = x; - hx = u.i>>32; - } else if (hx >= 0x7ff00000) { - return x; - } else if (hx == 0x3ff00000 && u.i<<32 == 0) - return 0; - - /* reduce x into [sqrt(2)/2, sqrt(2)] */ - hx += 0x3ff00000 - 0x3fe6a09e; - k += (int)(hx>>20) - 0x3ff; - hx = (hx&0x000fffff) + 0x3fe6a09e; - u.i = (uint64_t)hx<<32 | (u.i&0xffffffff); - x = u.f; - - f = x - 1.0; - hfsq = 0.5*f*f; - s = f/(2.0+f); - z = s*s; - w = z*z; - t1 = w*(Lg2+w*(Lg4+w*Lg6)); - t2 = z*(Lg1+w*(Lg3+w*(Lg5+w*Lg7))); - R = t2 + t1; - - /* See log2.c for details. */ - /* hi+lo = f - hfsq + s*(hfsq+R) ~ log(1+f) */ - hi = f - hfsq; - u.f = hi; - u.i &= (uint64_t)-1<<32; - hi = u.f; - lo = f - hi - hfsq + s*(hfsq+R); - - /* val_hi+val_lo ~ log10(1+f) + k*log10(2) */ - val_hi = hi*ivln10hi; - dk = k; - y = dk*log10_2hi; - val_lo = dk*log10_2lo + (lo+hi)*ivln10lo + lo*ivln10hi; - - /* - * Extra precision in for adding y is not strictly needed - * since there is no very large cancellation near x = sqrt(2) or - * x = 1/sqrt(2), but we do it anyway since it costs little on CPUs - * with some parallelism and it reduces the error for many args. - */ - w = y + val_hi; - val_lo += (y - w) + val_hi; - val_hi = w; - - return val_lo + val_hi; -} diff --git a/waterbox/libc/functions/math/log10f.c b/waterbox/libc/functions/math/log10f.c deleted file mode 100644 index 9ca2f017da..0000000000 --- a/waterbox/libc/functions/math/log10f.c +++ /dev/null @@ -1,77 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/e_log10f.c */ -/* - * ==================================================== - * 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. - * ==================================================== - */ -/* - * See comments in log10.c. - */ - -#include -#include - -static const float -ivln10hi = 4.3432617188e-01, /* 0x3ede6000 */ -ivln10lo = -3.1689971365e-05, /* 0xb804ead9 */ -log10_2hi = 3.0102920532e-01, /* 0x3e9a2080 */ -log10_2lo = 7.9034151668e-07, /* 0x355427db */ -/* |(log(1+s)-log(1-s))/s - Lg(s)| < 2**-34.24 (~[-4.95e-11, 4.97e-11]). */ -Lg1 = 0xaaaaaa.0p-24, /* 0.66666662693 */ -Lg2 = 0xccce13.0p-25, /* 0.40000972152 */ -Lg3 = 0x91e9ee.0p-25, /* 0.28498786688 */ -Lg4 = 0xf89e26.0p-26; /* 0.24279078841 */ - -float log10f(float x) -{ - union {float f; uint32_t i;} u = {x}; - float_t hfsq,f,s,z,R,w,t1,t2,dk,hi,lo; - uint32_t ix; - int k; - - ix = u.i; - k = 0; - if (ix < 0x00800000 || ix>>31) { /* x < 2**-126 */ - if (ix<<1 == 0) - return -1/(x*x); /* log(+-0)=-inf */ - if (ix>>31) - return (x-x)/0.0f; /* log(-#) = NaN */ - /* subnormal number, scale up x */ - k -= 25; - x *= 0x1p25f; - u.f = x; - ix = u.i; - } else if (ix >= 0x7f800000) { - return x; - } else if (ix == 0x3f800000) - return 0; - - /* reduce x into [sqrt(2)/2, sqrt(2)] */ - ix += 0x3f800000 - 0x3f3504f3; - k += (int)(ix>>23) - 0x7f; - ix = (ix&0x007fffff) + 0x3f3504f3; - u.i = ix; - x = u.f; - - f = x - 1.0f; - s = f/(2.0f + f); - z = s*s; - w = z*z; - t1= w*(Lg2+w*Lg4); - t2= z*(Lg1+w*Lg3); - R = t2 + t1; - hfsq = 0.5f*f*f; - - hi = f - hfsq; - u.f = hi; - u.i &= 0xfffff000; - hi = u.f; - lo = f - hi - hfsq + s*(hfsq+R); - dk = k; - return dk*log10_2lo + (lo+hi)*ivln10lo + lo*ivln10hi + hi*ivln10hi + dk*log10_2hi; -} diff --git a/waterbox/libc/functions/math/log10l.c b/waterbox/libc/functions/math/log10l.c deleted file mode 100644 index 63dcc286d6..0000000000 --- a/waterbox/libc/functions/math/log10l.c +++ /dev/null @@ -1,191 +0,0 @@ -/* origin: OpenBSD /usr/src/lib/libm/src/ld80/e_log10l.c */ -/* - * Copyright (c) 2008 Stephen L. Moshier - * - * 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 THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR 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. - */ -/* - * Common logarithm, long double precision - * - * - * SYNOPSIS: - * - * long double x, y, log10l(); - * - * y = log10l( x ); - * - * - * DESCRIPTION: - * - * Returns the base 10 logarithm of x. - * - * The argument is separated into its exponent and fractional - * parts. If the exponent is between -1 and +1, the logarithm - * of the fraction is approximated by - * - * log(1+x) = x - 0.5 x**2 + x**3 P(x)/Q(x). - * - * Otherwise, setting z = 2(x-1)/x+1), - * - * log(x) = z + z**3 P(z)/Q(z). - * - * - * ACCURACY: - * - * Relative error: - * arithmetic domain # trials peak rms - * IEEE 0.5, 2.0 30000 9.0e-20 2.6e-20 - * IEEE exp(+-10000) 30000 6.0e-20 2.3e-20 - * - * In the tests over the interval exp(+-10000), the logarithms - * of the random arguments were uniformly distributed over - * [-10000, +10000]. - * - * ERROR MESSAGES: - * - * log singularity: x = 0; returns MINLOG - * log domain: x < 0; returns MINLOG - */ - -#include "libm.h" - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long double log10l(long double x) -{ - return log10(x); -} -#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384 -/* Coefficients for log(1+x) = x - x**2/2 + x**3 P(x)/Q(x) - * 1/sqrt(2) <= x < sqrt(2) - * Theoretical peak relative error = 6.2e-22 - */ -static const long double P[] = { - 4.9962495940332550844739E-1L, - 1.0767376367209449010438E1L, - 7.7671073698359539859595E1L, - 2.5620629828144409632571E2L, - 4.2401812743503691187826E2L, - 3.4258224542413922935104E2L, - 1.0747524399916215149070E2L, -}; -static const long double Q[] = { -/* 1.0000000000000000000000E0,*/ - 2.3479774160285863271658E1L, - 1.9444210022760132894510E2L, - 7.7952888181207260646090E2L, - 1.6911722418503949084863E3L, - 2.0307734695595183428202E3L, - 1.2695660352705325274404E3L, - 3.2242573199748645407652E2L, -}; - -/* Coefficients for log(x) = z + z^3 P(z^2)/Q(z^2), - * where z = 2(x-1)/(x+1) - * 1/sqrt(2) <= x < sqrt(2) - * Theoretical peak relative error = 6.16e-22 - */ -static const long double R[4] = { - 1.9757429581415468984296E-3L, --7.1990767473014147232598E-1L, - 1.0777257190312272158094E1L, --3.5717684488096787370998E1L, -}; -static const long double S[4] = { -/* 1.00000000000000000000E0L,*/ --2.6201045551331104417768E1L, - 1.9361891836232102174846E2L, --4.2861221385716144629696E2L, -}; -/* log10(2) */ -#define L102A 0.3125L -#define L102B -1.1470004336018804786261e-2L -/* log10(e) */ -#define L10EA 0.5L -#define L10EB -6.5705518096748172348871e-2L - -#define SQRTH 0.70710678118654752440L - -long double log10l(long double x) -{ - long double y, z; - int e; - - if (isnan(x)) - return x; - if(x <= 0.0) { - if(x == 0.0) - return -1.0 / (x*x); - return (x - x) / 0.0; - } - if (x == INFINITY) - return INFINITY; - /* separate mantissa from exponent */ - /* Note, frexp is used so that denormal numbers - * will be handled properly. - */ - x = frexpl(x, &e); - - /* logarithm using log(x) = z + z**3 P(z)/Q(z), - * where z = 2(x-1)/x+1) - */ - if (e > 2 || e < -2) { - if (x < SQRTH) { /* 2(2x-1)/(2x+1) */ - e -= 1; - z = x - 0.5; - y = 0.5 * z + 0.5; - } else { /* 2 (x-1)/(x+1) */ - z = x - 0.5; - z -= 0.5; - y = 0.5 * x + 0.5; - } - x = z / y; - z = x*x; - y = x * (z * __polevll(z, R, 3) / __p1evll(z, S, 3)); - goto done; - } - - /* logarithm using log(1+x) = x - .5x**2 + x**3 P(x)/Q(x) */ - if (x < SQRTH) { - e -= 1; - x = 2.0*x - 1.0; - } else { - x = x - 1.0; - } - z = x*x; - y = x * (z * __polevll(x, P, 6) / __p1evll(x, Q, 7)); - y = y - 0.5*z; - -done: - /* Multiply log of fraction by log10(e) - * and base 2 exponent by log10(2). - * - * ***CAUTION*** - * - * This sequence of operations is critical and it may - * be horribly defeated by some compiler optimizers. - */ - z = y * (L10EB); - z += x * (L10EB); - z += e * (L102B); - z += y * (L10EA); - z += x * (L10EA); - z += e * (L102A); - return z; -} -#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384 -// TODO: broken implementation to make things compile -long double log10l(long double x) -{ - return log10(x); -} -#endif diff --git a/waterbox/libc/functions/math/log1p.c b/waterbox/libc/functions/math/log1p.c deleted file mode 100644 index 0097134940..0000000000 --- a/waterbox/libc/functions/math/log1p.c +++ /dev/null @@ -1,122 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/s_log1p.c */ -/* - * ==================================================== - * 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. - * ==================================================== - */ -/* double log1p(double x) - * Return the natural logarithm of 1+x. - * - * Method : - * 1. Argument Reduction: find k and f such that - * 1+x = 2^k * (1+f), - * where sqrt(2)/2 < 1+f < sqrt(2) . - * - * Note. If k=0, then f=x is exact. However, if k!=0, then f - * may not be representable exactly. In that case, a correction - * term is need. Let u=1+x rounded. Let c = (1+x)-u, then - * log(1+x) - log(u) ~ c/u. Thus, we proceed to compute log(u), - * and add back the correction term c/u. - * (Note: when x > 2**53, one can simply return log(x)) - * - * 2. Approximation of log(1+f): See log.c - * - * 3. Finally, log1p(x) = k*ln2 + log(1+f) + c/u. See log.c - * - * Special cases: - * log1p(x) is NaN with signal if x < -1 (including -INF) ; - * log1p(+INF) is +INF; log1p(-1) is -INF with signal; - * log1p(NaN) is that NaN with no signal. - * - * Accuracy: - * according to an error analysis, the error is always less than - * 1 ulp (unit in the last place). - * - * 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. - * - * Note: Assuming log() return accurate answer, the following - * algorithm can be used to compute log1p(x) to within a few ULP: - * - * u = 1+x; - * if(u==1.0) return x ; else - * return log(u)*(x/(u-1.0)); - * - * See HP-15C Advanced Functions Handbook, p.193. - */ - -#include "libm.h" - -static const double -ln2_hi = 6.93147180369123816490e-01, /* 3fe62e42 fee00000 */ -ln2_lo = 1.90821492927058770002e-10, /* 3dea39ef 35793c76 */ -Lg1 = 6.666666666666735130e-01, /* 3FE55555 55555593 */ -Lg2 = 3.999999999940941908e-01, /* 3FD99999 9997FA04 */ -Lg3 = 2.857142874366239149e-01, /* 3FD24924 94229359 */ -Lg4 = 2.222219843214978396e-01, /* 3FCC71C5 1D8E78AF */ -Lg5 = 1.818357216161805012e-01, /* 3FC74664 96CB03DE */ -Lg6 = 1.531383769920937332e-01, /* 3FC39A09 D078C69F */ -Lg7 = 1.479819860511658591e-01; /* 3FC2F112 DF3E5244 */ - -double log1p(double x) -{ - union {double f; uint64_t i;} u = {x}; - double_t hfsq,f,c,s,z,R,w,t1,t2,dk; - uint32_t hx,hu; - int k; - - hx = u.i>>32; - k = 1; - if (hx < 0x3fda827a || hx>>31) { /* 1+x < sqrt(2)+ */ - if (hx >= 0xbff00000) { /* x <= -1.0 */ - if (x == -1) - return x/0.0; /* log1p(-1) = -inf */ - return (x-x)/0.0; /* log1p(x<-1) = NaN */ - } - if (hx<<1 < 0x3ca00000<<1) { /* |x| < 2**-53 */ - /* underflow if subnormal */ - if ((hx&0x7ff00000) == 0) - FORCE_EVAL((float)x); - return x; - } - if (hx <= 0xbfd2bec4) { /* sqrt(2)/2- <= 1+x < sqrt(2)+ */ - k = 0; - c = 0; - f = x; - } - } else if (hx >= 0x7ff00000) - return x; - if (k) { - u.f = 1 + x; - hu = u.i>>32; - hu += 0x3ff00000 - 0x3fe6a09e; - k = (int)(hu>>20) - 0x3ff; - /* correction term ~ log(1+x)-log(u), avoid underflow in c/u */ - if (k < 54) { - c = k >= 2 ? 1-(u.f-x) : x-(u.f-1); - c /= u.f; - } else - c = 0; - /* reduce u into [sqrt(2)/2, sqrt(2)] */ - hu = (hu&0x000fffff) + 0x3fe6a09e; - u.i = (uint64_t)hu<<32 | (u.i&0xffffffff); - f = u.f - 1; - } - hfsq = 0.5*f*f; - s = f/(2.0+f); - z = s*s; - w = z*z; - t1 = w*(Lg2+w*(Lg4+w*Lg6)); - t2 = z*(Lg1+w*(Lg3+w*(Lg5+w*Lg7))); - R = t2 + t1; - dk = k; - return s*(hfsq+R) + (dk*ln2_lo+c) - hfsq + f + dk*ln2_hi; -} diff --git a/waterbox/libc/functions/math/log1pf.c b/waterbox/libc/functions/math/log1pf.c deleted file mode 100644 index 23985c3567..0000000000 --- a/waterbox/libc/functions/math/log1pf.c +++ /dev/null @@ -1,77 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/s_log1pf.c */ -/* - * ==================================================== - * 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 "libm.h" - -static const float -ln2_hi = 6.9313812256e-01, /* 0x3f317180 */ -ln2_lo = 9.0580006145e-06, /* 0x3717f7d1 */ -/* |(log(1+s)-log(1-s))/s - Lg(s)| < 2**-34.24 (~[-4.95e-11, 4.97e-11]). */ -Lg1 = 0xaaaaaa.0p-24, /* 0.66666662693 */ -Lg2 = 0xccce13.0p-25, /* 0.40000972152 */ -Lg3 = 0x91e9ee.0p-25, /* 0.28498786688 */ -Lg4 = 0xf89e26.0p-26; /* 0.24279078841 */ - -float log1pf(float x) -{ - union {float f; uint32_t i;} u = {x}; - float_t hfsq,f,c,s,z,R,w,t1,t2,dk; - uint32_t ix,iu; - int k; - - ix = u.i; - k = 1; - if (ix < 0x3ed413d0 || ix>>31) { /* 1+x < sqrt(2)+ */ - if (ix >= 0xbf800000) { /* x <= -1.0 */ - if (x == -1) - return x/0.0f; /* log1p(-1)=+inf */ - return (x-x)/0.0f; /* log1p(x<-1)=NaN */ - } - if (ix<<1 < 0x33800000<<1) { /* |x| < 2**-24 */ - /* underflow if subnormal */ - if ((ix&0x7f800000) == 0) - FORCE_EVAL(x*x); - return x; - } - if (ix <= 0xbe95f619) { /* sqrt(2)/2- <= 1+x < sqrt(2)+ */ - k = 0; - c = 0; - f = x; - } - } else if (ix >= 0x7f800000) - return x; - if (k) { - u.f = 1 + x; - iu = u.i; - iu += 0x3f800000 - 0x3f3504f3; - k = (int)(iu>>23) - 0x7f; - /* correction term ~ log(1+x)-log(u), avoid underflow in c/u */ - if (k < 25) { - c = k >= 2 ? 1-(u.f-x) : x-(u.f-1); - c /= u.f; - } else - c = 0; - /* reduce u into [sqrt(2)/2, sqrt(2)] */ - iu = (iu&0x007fffff) + 0x3f3504f3; - u.i = iu; - f = u.f - 1; - } - s = f/(2.0f + f); - z = s*s; - w = z*z; - t1= w*(Lg2+w*Lg4); - t2= z*(Lg1+w*Lg3); - R = t2 + t1; - hfsq = 0.5f*f*f; - dk = k; - return s*(hfsq+R) + (dk*ln2_lo+c) - hfsq + f + dk*ln2_hi; -} diff --git a/waterbox/libc/functions/math/log1pl.c b/waterbox/libc/functions/math/log1pl.c deleted file mode 100644 index 141b5f0b0c..0000000000 --- a/waterbox/libc/functions/math/log1pl.c +++ /dev/null @@ -1,177 +0,0 @@ -/* origin: OpenBSD /usr/src/lib/libm/src/ld80/s_log1pl.c */ -/* - * Copyright (c) 2008 Stephen L. Moshier - * - * 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 THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR 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. - */ -/* - * Relative error logarithm - * Natural logarithm of 1+x, long double precision - * - * - * SYNOPSIS: - * - * long double x, y, log1pl(); - * - * y = log1pl( x ); - * - * - * DESCRIPTION: - * - * Returns the base e (2.718...) logarithm of 1+x. - * - * The argument 1+x is separated into its exponent and fractional - * parts. If the exponent is between -1 and +1, the logarithm - * of the fraction is approximated by - * - * log(1+x) = x - 0.5 x^2 + x^3 P(x)/Q(x). - * - * Otherwise, setting z = 2(x-1)/x+1), - * - * log(x) = z + z^3 P(z)/Q(z). - * - * - * ACCURACY: - * - * Relative error: - * arithmetic domain # trials peak rms - * IEEE -1.0, 9.0 100000 8.2e-20 2.5e-20 - */ - -#include "libm.h" - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long double log1pl(long double x) -{ - return log1p(x); -} -#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384 -/* Coefficients for log(1+x) = x - x^2 / 2 + x^3 P(x)/Q(x) - * 1/sqrt(2) <= x < sqrt(2) - * Theoretical peak relative error = 2.32e-20 - */ -static const long double P[] = { - 4.5270000862445199635215E-5L, - 4.9854102823193375972212E-1L, - 6.5787325942061044846969E0L, - 2.9911919328553073277375E1L, - 6.0949667980987787057556E1L, - 5.7112963590585538103336E1L, - 2.0039553499201281259648E1L, -}; -static const long double Q[] = { -/* 1.0000000000000000000000E0,*/ - 1.5062909083469192043167E1L, - 8.3047565967967209469434E1L, - 2.2176239823732856465394E2L, - 3.0909872225312059774938E2L, - 2.1642788614495947685003E2L, - 6.0118660497603843919306E1L, -}; - -/* Coefficients for log(x) = z + z^3 P(z^2)/Q(z^2), - * where z = 2(x-1)/(x+1) - * 1/sqrt(2) <= x < sqrt(2) - * Theoretical peak relative error = 6.16e-22 - */ -static const long double R[4] = { - 1.9757429581415468984296E-3L, --7.1990767473014147232598E-1L, - 1.0777257190312272158094E1L, --3.5717684488096787370998E1L, -}; -static const long double S[4] = { -/* 1.00000000000000000000E0L,*/ --2.6201045551331104417768E1L, - 1.9361891836232102174846E2L, --4.2861221385716144629696E2L, -}; -static const long double C1 = 6.9314575195312500000000E-1L; -static const long double C2 = 1.4286068203094172321215E-6L; - -#define SQRTH 0.70710678118654752440L - -long double log1pl(long double xm1) -{ - long double x, y, z; - int e; - - if (isnan(xm1)) - return xm1; - if (xm1 == INFINITY) - return xm1; - if (xm1 == 0.0) - return xm1; - - x = xm1 + 1.0; - - /* Test for domain errors. */ - if (x <= 0.0) { - if (x == 0.0) - return -1/(x*x); /* -inf with divbyzero */ - return 0/0.0f; /* nan with invalid */ - } - - /* Separate mantissa from exponent. - Use frexp so that denormal numbers will be handled properly. */ - x = frexpl(x, &e); - - /* logarithm using log(x) = z + z^3 P(z)/Q(z), - where z = 2(x-1)/x+1) */ - if (e > 2 || e < -2) { - if (x < SQRTH) { /* 2(2x-1)/(2x+1) */ - e -= 1; - z = x - 0.5; - y = 0.5 * z + 0.5; - } else { /* 2 (x-1)/(x+1) */ - z = x - 0.5; - z -= 0.5; - y = 0.5 * x + 0.5; - } - x = z / y; - z = x*x; - z = x * (z * __polevll(z, R, 3) / __p1evll(z, S, 3)); - z = z + e * C2; - z = z + x; - z = z + e * C1; - return z; - } - - /* logarithm using log(1+x) = x - .5x**2 + x**3 P(x)/Q(x) */ - if (x < SQRTH) { - e -= 1; - if (e != 0) - x = 2.0 * x - 1.0; - else - x = xm1; - } else { - if (e != 0) - x = x - 1.0; - else - x = xm1; - } - z = x*x; - y = x * (z * __polevll(x, P, 6) / __p1evll(x, Q, 6)); - y = y + e * C2; - z = y - 0.5 * z; - z = z + x; - z = z + e * C1; - return z; -} -#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384 -// TODO: broken implementation to make things compile -long double log1pl(long double x) -{ - return log1p(x); -} -#endif diff --git a/waterbox/libc/functions/math/log2.c b/waterbox/libc/functions/math/log2.c deleted file mode 100644 index 0aafad4b86..0000000000 --- a/waterbox/libc/functions/math/log2.c +++ /dev/null @@ -1,122 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/e_log2.c */ -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * - * Developed at SunSoft, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ -/* - * Return the base 2 logarithm of x. See log.c for most comments. - * - * Reduce x to 2^k (1+f) and calculate r = log(1+f) - f + f*f/2 - * as in log.c, then combine and scale in extra precision: - * log2(x) = (f - f*f/2 + r)/log(2) + k - */ - -#include -#include - -static const double -ivln2hi = 1.44269504072144627571e+00, /* 0x3ff71547, 0x65200000 */ -ivln2lo = 1.67517131648865118353e-10, /* 0x3de705fc, 0x2eefa200 */ -Lg1 = 6.666666666666735130e-01, /* 3FE55555 55555593 */ -Lg2 = 3.999999999940941908e-01, /* 3FD99999 9997FA04 */ -Lg3 = 2.857142874366239149e-01, /* 3FD24924 94229359 */ -Lg4 = 2.222219843214978396e-01, /* 3FCC71C5 1D8E78AF */ -Lg5 = 1.818357216161805012e-01, /* 3FC74664 96CB03DE */ -Lg6 = 1.531383769920937332e-01, /* 3FC39A09 D078C69F */ -Lg7 = 1.479819860511658591e-01; /* 3FC2F112 DF3E5244 */ - -double log2(double x) -{ - union {double f; uint64_t i;} u = {x}; - double_t hfsq,f,s,z,R,w,t1,t2,y,hi,lo,val_hi,val_lo; - uint32_t hx; - int k; - - hx = u.i>>32; - k = 0; - if (hx < 0x00100000 || hx>>31) { - if (u.i<<1 == 0) - return -1/(x*x); /* log(+-0)=-inf */ - if (hx>>31) - return (x-x)/0.0; /* log(-#) = NaN */ - /* subnormal number, scale x up */ - k -= 54; - x *= 0x1p54; - u.f = x; - hx = u.i>>32; - } else if (hx >= 0x7ff00000) { - return x; - } else if (hx == 0x3ff00000 && u.i<<32 == 0) - return 0; - - /* reduce x into [sqrt(2)/2, sqrt(2)] */ - hx += 0x3ff00000 - 0x3fe6a09e; - k += (int)(hx>>20) - 0x3ff; - hx = (hx&0x000fffff) + 0x3fe6a09e; - u.i = (uint64_t)hx<<32 | (u.i&0xffffffff); - x = u.f; - - f = x - 1.0; - hfsq = 0.5*f*f; - s = f/(2.0+f); - z = s*s; - w = z*z; - t1 = w*(Lg2+w*(Lg4+w*Lg6)); - t2 = z*(Lg1+w*(Lg3+w*(Lg5+w*Lg7))); - R = t2 + t1; - - /* - * f-hfsq must (for args near 1) be evaluated in extra precision - * to avoid a large cancellation when x is near sqrt(2) or 1/sqrt(2). - * This is fairly efficient since f-hfsq only depends on f, so can - * be evaluated in parallel with R. Not combining hfsq with R also - * keeps R small (though not as small as a true `lo' term would be), - * so that extra precision is not needed for terms involving R. - * - * Compiler bugs involving extra precision used to break Dekker's - * theorem for spitting f-hfsq as hi+lo, unless double_t was used - * or the multi-precision calculations were avoided when double_t - * has extra precision. These problems are now automatically - * avoided as a side effect of the optimization of combining the - * Dekker splitting step with the clear-low-bits step. - * - * y must (for args near sqrt(2) and 1/sqrt(2)) be added in extra - * precision to avoid a very large cancellation when x is very near - * these values. Unlike the above cancellations, this problem is - * specific to base 2. It is strange that adding +-1 is so much - * harder than adding +-ln2 or +-log10_2. - * - * This uses Dekker's theorem to normalize y+val_hi, so the - * compiler bugs are back in some configurations, sigh. And I - * don't want to used double_t to avoid them, since that gives a - * pessimization and the support for avoiding the pessimization - * is not yet available. - * - * The multi-precision calculations for the multiplications are - * routine. - */ - - /* hi+lo = f - hfsq + s*(hfsq+R) ~ log(1+f) */ - hi = f - hfsq; - u.f = hi; - u.i &= (uint64_t)-1<<32; - hi = u.f; - lo = f - hi - hfsq + s*(hfsq+R); - - val_hi = hi*ivln2hi; - val_lo = (lo+hi)*ivln2lo + lo*ivln2hi; - - /* spadd(val_hi, val_lo, y), except for not using double_t: */ - y = k; - w = y + val_hi; - val_lo += (y - w) + val_hi; - val_hi = w; - - return val_lo + val_hi; -} diff --git a/waterbox/libc/functions/math/log2f.c b/waterbox/libc/functions/math/log2f.c deleted file mode 100644 index b3e305fe2a..0000000000 --- a/waterbox/libc/functions/math/log2f.c +++ /dev/null @@ -1,74 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/e_log2f.c */ -/* - * ==================================================== - * 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. - * ==================================================== - */ -/* - * See comments in log2.c. - */ - -#include -#include - -static const float -ivln2hi = 1.4428710938e+00, /* 0x3fb8b000 */ -ivln2lo = -1.7605285393e-04, /* 0xb9389ad4 */ -/* |(log(1+s)-log(1-s))/s - Lg(s)| < 2**-34.24 (~[-4.95e-11, 4.97e-11]). */ -Lg1 = 0xaaaaaa.0p-24, /* 0.66666662693 */ -Lg2 = 0xccce13.0p-25, /* 0.40000972152 */ -Lg3 = 0x91e9ee.0p-25, /* 0.28498786688 */ -Lg4 = 0xf89e26.0p-26; /* 0.24279078841 */ - -float log2f(float x) -{ - union {float f; uint32_t i;} u = {x}; - float_t hfsq,f,s,z,R,w,t1,t2,hi,lo; - uint32_t ix; - int k; - - ix = u.i; - k = 0; - if (ix < 0x00800000 || ix>>31) { /* x < 2**-126 */ - if (ix<<1 == 0) - return -1/(x*x); /* log(+-0)=-inf */ - if (ix>>31) - return (x-x)/0.0f; /* log(-#) = NaN */ - /* subnormal number, scale up x */ - k -= 25; - x *= 0x1p25f; - u.f = x; - ix = u.i; - } else if (ix >= 0x7f800000) { - return x; - } else if (ix == 0x3f800000) - return 0; - - /* reduce x into [sqrt(2)/2, sqrt(2)] */ - ix += 0x3f800000 - 0x3f3504f3; - k += (int)(ix>>23) - 0x7f; - ix = (ix&0x007fffff) + 0x3f3504f3; - u.i = ix; - x = u.f; - - f = x - 1.0f; - s = f/(2.0f + f); - z = s*s; - w = z*z; - t1= w*(Lg2+w*Lg4); - t2= z*(Lg1+w*Lg3); - R = t2 + t1; - hfsq = 0.5f*f*f; - - hi = f - hfsq; - u.f = hi; - u.i &= 0xfffff000; - hi = u.f; - lo = f - hi - hfsq + s*(hfsq+R); - return (lo+hi)*ivln2lo + lo*ivln2hi + hi*ivln2hi + k; -} diff --git a/waterbox/libc/functions/math/log2l.c b/waterbox/libc/functions/math/log2l.c deleted file mode 100644 index 722b451a02..0000000000 --- a/waterbox/libc/functions/math/log2l.c +++ /dev/null @@ -1,182 +0,0 @@ -/* origin: OpenBSD /usr/src/lib/libm/src/ld80/e_log2l.c */ -/* - * Copyright (c) 2008 Stephen L. Moshier - * - * 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 THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR 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. - */ -/* - * Base 2 logarithm, long double precision - * - * - * SYNOPSIS: - * - * long double x, y, log2l(); - * - * y = log2l( x ); - * - * - * DESCRIPTION: - * - * Returns the base 2 logarithm of x. - * - * The argument is separated into its exponent and fractional - * parts. If the exponent is between -1 and +1, the (natural) - * logarithm of the fraction is approximated by - * - * log(1+x) = x - 0.5 x**2 + x**3 P(x)/Q(x). - * - * Otherwise, setting z = 2(x-1)/x+1), - * - * log(x) = z + z**3 P(z)/Q(z). - * - * - * ACCURACY: - * - * Relative error: - * arithmetic domain # trials peak rms - * IEEE 0.5, 2.0 30000 9.8e-20 2.7e-20 - * IEEE exp(+-10000) 70000 5.4e-20 2.3e-20 - * - * In the tests over the interval exp(+-10000), the logarithms - * of the random arguments were uniformly distributed over - * [-10000, +10000]. - */ - -#include "libm.h" - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long double log2l(long double x) -{ - return log2(x); -} -#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384 -/* Coefficients for ln(1+x) = x - x**2/2 + x**3 P(x)/Q(x) - * 1/sqrt(2) <= x < sqrt(2) - * Theoretical peak relative error = 6.2e-22 - */ -static const long double P[] = { - 4.9962495940332550844739E-1L, - 1.0767376367209449010438E1L, - 7.7671073698359539859595E1L, - 2.5620629828144409632571E2L, - 4.2401812743503691187826E2L, - 3.4258224542413922935104E2L, - 1.0747524399916215149070E2L, -}; -static const long double Q[] = { -/* 1.0000000000000000000000E0,*/ - 2.3479774160285863271658E1L, - 1.9444210022760132894510E2L, - 7.7952888181207260646090E2L, - 1.6911722418503949084863E3L, - 2.0307734695595183428202E3L, - 1.2695660352705325274404E3L, - 3.2242573199748645407652E2L, -}; - -/* Coefficients for log(x) = z + z^3 P(z^2)/Q(z^2), - * where z = 2(x-1)/(x+1) - * 1/sqrt(2) <= x < sqrt(2) - * Theoretical peak relative error = 6.16e-22 - */ -static const long double R[4] = { - 1.9757429581415468984296E-3L, --7.1990767473014147232598E-1L, - 1.0777257190312272158094E1L, --3.5717684488096787370998E1L, -}; -static const long double S[4] = { -/* 1.00000000000000000000E0L,*/ --2.6201045551331104417768E1L, - 1.9361891836232102174846E2L, --4.2861221385716144629696E2L, -}; -/* log2(e) - 1 */ -#define LOG2EA 4.4269504088896340735992e-1L - -#define SQRTH 0.70710678118654752440L - -long double log2l(long double x) -{ - long double y, z; - int e; - - if (isnan(x)) - return x; - if (x == INFINITY) - return x; - if (x <= 0.0) { - if (x == 0.0) - return -1/(x*x); /* -inf with divbyzero */ - return 0/0.0f; /* nan with invalid */ - } - - /* separate mantissa from exponent */ - /* Note, frexp is used so that denormal numbers - * will be handled properly. - */ - x = frexpl(x, &e); - - /* logarithm using log(x) = z + z**3 P(z)/Q(z), - * where z = 2(x-1)/x+1) - */ - if (e > 2 || e < -2) { - if (x < SQRTH) { /* 2(2x-1)/(2x+1) */ - e -= 1; - z = x - 0.5; - y = 0.5 * z + 0.5; - } else { /* 2 (x-1)/(x+1) */ - z = x - 0.5; - z -= 0.5; - y = 0.5 * x + 0.5; - } - x = z / y; - z = x*x; - y = x * (z * __polevll(z, R, 3) / __p1evll(z, S, 3)); - goto done; - } - - /* logarithm using log(1+x) = x - .5x**2 + x**3 P(x)/Q(x) */ - if (x < SQRTH) { - e -= 1; - x = 2.0*x - 1.0; - } else { - x = x - 1.0; - } - z = x*x; - y = x * (z * __polevll(x, P, 6) / __p1evll(x, Q, 7)); - y = y - 0.5*z; - -done: - /* Multiply log of fraction by log2(e) - * and base 2 exponent by 1 - * - * ***CAUTION*** - * - * This sequence of operations is critical and it may - * be horribly defeated by some compiler optimizers. - */ - z = y * LOG2EA; - z += x * LOG2EA; - z += y; - z += x; - z += e; - return z; -} -#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384 -// TODO: broken implementation to make things compile -long double log2l(long double x) -{ - return log2(x); -} -#endif diff --git a/waterbox/libc/functions/math/logb.c b/waterbox/libc/functions/math/logb.c deleted file mode 100644 index 7f8bdfae19..0000000000 --- a/waterbox/libc/functions/math/logb.c +++ /dev/null @@ -1,17 +0,0 @@ -#include - -/* -special cases: - logb(+-0) = -inf, and raise divbyzero - logb(+-inf) = +inf - logb(nan) = nan -*/ - -double logb(double x) -{ - if (!isfinite(x)) - return x * x; - if (x == 0) - return -1/(x*x); - return ilogb(x); -} diff --git a/waterbox/libc/functions/math/logbf.c b/waterbox/libc/functions/math/logbf.c deleted file mode 100644 index a0a0b5ed5b..0000000000 --- a/waterbox/libc/functions/math/logbf.c +++ /dev/null @@ -1,10 +0,0 @@ -#include - -float logbf(float x) -{ - if (!isfinite(x)) - return x * x; - if (x == 0) - return -1/(x*x); - return ilogbf(x); -} diff --git a/waterbox/libc/functions/math/logbl.c b/waterbox/libc/functions/math/logbl.c deleted file mode 100644 index 962973a7b9..0000000000 --- a/waterbox/libc/functions/math/logbl.c +++ /dev/null @@ -1,16 +0,0 @@ -#include -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long double logbl(long double x) -{ - return logb(x); -} -#else -long double logbl(long double x) -{ - if (!isfinite(x)) - return x * x; - if (x == 0) - return -1/(x*x); - return ilogbl(x); -} -#endif diff --git a/waterbox/libc/functions/math/logf.c b/waterbox/libc/functions/math/logf.c deleted file mode 100644 index 52230a1bd4..0000000000 --- a/waterbox/libc/functions/math/logf.c +++ /dev/null @@ -1,69 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/e_logf.c */ -/* - * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. - */ -/* - * ==================================================== - * 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 -#include - -static const float -ln2_hi = 6.9313812256e-01, /* 0x3f317180 */ -ln2_lo = 9.0580006145e-06, /* 0x3717f7d1 */ -/* |(log(1+s)-log(1-s))/s - Lg(s)| < 2**-34.24 (~[-4.95e-11, 4.97e-11]). */ -Lg1 = 0xaaaaaa.0p-24, /* 0.66666662693 */ -Lg2 = 0xccce13.0p-25, /* 0.40000972152 */ -Lg3 = 0x91e9ee.0p-25, /* 0.28498786688 */ -Lg4 = 0xf89e26.0p-26; /* 0.24279078841 */ - -float logf(float x) -{ - union {float f; uint32_t i;} u = {x}; - float_t hfsq,f,s,z,R,w,t1,t2,dk; - uint32_t ix; - int k; - - ix = u.i; - k = 0; - if (ix < 0x00800000 || ix>>31) { /* x < 2**-126 */ - if (ix<<1 == 0) - return -1/(x*x); /* log(+-0)=-inf */ - if (ix>>31) - return (x-x)/0.0f; /* log(-#) = NaN */ - /* subnormal number, scale up x */ - k -= 25; - x *= 0x1p25f; - u.f = x; - ix = u.i; - } else if (ix >= 0x7f800000) { - return x; - } else if (ix == 0x3f800000) - return 0; - - /* reduce x into [sqrt(2)/2, sqrt(2)] */ - ix += 0x3f800000 - 0x3f3504f3; - k += (int)(ix>>23) - 0x7f; - ix = (ix&0x007fffff) + 0x3f3504f3; - u.i = ix; - x = u.f; - - f = x - 1.0f; - s = f/(2.0f + f); - z = s*s; - w = z*z; - t1= w*(Lg2+w*Lg4); - t2= z*(Lg1+w*Lg3); - R = t2 + t1; - hfsq = 0.5f*f*f; - dk = k; - return s*(hfsq+R) + dk*ln2_lo - hfsq + f + dk*ln2_hi; -} diff --git a/waterbox/libc/functions/math/logl.c b/waterbox/libc/functions/math/logl.c deleted file mode 100644 index 5d5365929e..0000000000 --- a/waterbox/libc/functions/math/logl.c +++ /dev/null @@ -1,175 +0,0 @@ -/* origin: OpenBSD /usr/src/lib/libm/src/ld80/e_logl.c */ -/* - * Copyright (c) 2008 Stephen L. Moshier - * - * 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 THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR 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. - */ -/* - * Natural logarithm, 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. If the exponent is between -1 and +1, the logarithm - * of the fraction is approximated by - * - * log(1+x) = x - 0.5 x**2 + x**3 P(x)/Q(x). - * - * Otherwise, setting z = 2(x-1)/(x+1), - * - * log(x) = log(1+z/2) - log(1-z/2) = z + z**3 P(z)/Q(z). - * - * - * ACCURACY: - * - * Relative error: - * arithmetic domain # trials peak rms - * IEEE 0.5, 2.0 150000 8.71e-20 2.75e-20 - * IEEE exp(+-10000) 100000 5.39e-20 2.34e-20 - * - * In the tests over the interval exp(+-10000), the logarithms - * of the random arguments were uniformly distributed over - * [-10000, +10000]. - */ - -#include "libm.h" - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long double logl(long double x) -{ - return log(x); -} -#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384 -/* Coefficients for log(1+x) = x - x**2/2 + x**3 P(x)/Q(x) - * 1/sqrt(2) <= x < sqrt(2) - * Theoretical peak relative error = 2.32e-20 - */ -static const long double P[] = { - 4.5270000862445199635215E-5L, - 4.9854102823193375972212E-1L, - 6.5787325942061044846969E0L, - 2.9911919328553073277375E1L, - 6.0949667980987787057556E1L, - 5.7112963590585538103336E1L, - 2.0039553499201281259648E1L, -}; -static const long double Q[] = { -/* 1.0000000000000000000000E0,*/ - 1.5062909083469192043167E1L, - 8.3047565967967209469434E1L, - 2.2176239823732856465394E2L, - 3.0909872225312059774938E2L, - 2.1642788614495947685003E2L, - 6.0118660497603843919306E1L, -}; - -/* Coefficients for log(x) = z + z^3 P(z^2)/Q(z^2), - * where z = 2(x-1)/(x+1) - * 1/sqrt(2) <= x < sqrt(2) - * Theoretical peak relative error = 6.16e-22 - */ -static const long double R[4] = { - 1.9757429581415468984296E-3L, --7.1990767473014147232598E-1L, - 1.0777257190312272158094E1L, --3.5717684488096787370998E1L, -}; -static const long double S[4] = { -/* 1.00000000000000000000E0L,*/ --2.6201045551331104417768E1L, - 1.9361891836232102174846E2L, --4.2861221385716144629696E2L, -}; -static const long double C1 = 6.9314575195312500000000E-1L; -static const long double C2 = 1.4286068203094172321215E-6L; - -#define SQRTH 0.70710678118654752440L - -long double logl(long double x) -{ - long double y, z; - int e; - - if (isnan(x)) - return x; - if (x == INFINITY) - return x; - if (x <= 0.0) { - if (x == 0.0) - return -1/(x*x); /* -inf with divbyzero */ - return 0/0.0f; /* nan with invalid */ - } - - /* separate mantissa from exponent */ - /* Note, frexp is used so that denormal numbers - * will be handled properly. - */ - x = frexpl(x, &e); - - /* logarithm using log(x) = z + z**3 P(z)/Q(z), - * where z = 2(x-1)/(x+1) - */ - if (e > 2 || e < -2) { - if (x < SQRTH) { /* 2(2x-1)/(2x+1) */ - e -= 1; - z = x - 0.5; - y = 0.5 * z + 0.5; - } else { /* 2 (x-1)/(x+1) */ - z = x - 0.5; - z -= 0.5; - y = 0.5 * x + 0.5; - } - x = z / y; - z = x*x; - z = x * (z * __polevll(z, R, 3) / __p1evll(z, S, 3)); - z = z + e * C2; - z = z + x; - z = z + e * C1; - return z; - } - - /* logarithm using log(1+x) = x - .5x**2 + x**3 P(x)/Q(x) */ - if (x < SQRTH) { - e -= 1; - x = 2.0*x - 1.0; - } else { - x = x - 1.0; - } - z = x*x; - y = x * (z * __polevll(x, P, 6) / __p1evll(x, Q, 6)); - y = y + e * C2; - z = y - 0.5*z; - /* Note, the sum of above terms does not exceed x/4, - * so it contributes at most about 1/4 lsb to the error. - */ - z = z + x; - z = z + e * C1; /* This sum has an error of 1/2 lsb. */ - return z; -} -#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384 -// TODO: broken implementation to make things compile -long double logl(long double x) -{ - return log(x); -} -#endif diff --git a/waterbox/libc/functions/math/lrint.c b/waterbox/libc/functions/math/lrint.c deleted file mode 100644 index bdca8b7cb8..0000000000 --- a/waterbox/libc/functions/math/lrint.c +++ /dev/null @@ -1,46 +0,0 @@ -#include -#include -#include "libm.h" - -/* -If the result cannot be represented (overflow, nan), then -lrint raises the invalid exception. - -Otherwise if the input was not an integer then the inexact -exception is raised. - -C99 is a bit vague about whether inexact exception is -allowed to be raised when invalid is raised. -(F.9 explicitly allows spurious inexact exceptions, F.9.6.5 -does not make it clear if that rule applies to lrint, but -IEEE 754r 7.8 seems to forbid spurious inexact exception in -the ineger conversion functions) - -So we try to make sure that no spurious inexact exception is -raised in case of an overflow. - -If the bit size of long > precision of double, then there -cannot be inexact rounding in case the result overflows, -otherwise LONG_MAX and LONG_MIN can be represented exactly -as a double. -*/ - -#if LONG_MAX < 1U<<53 && defined(FE_INEXACT) -long lrint(double x) -{ - #pragma STDC FENV_ACCESS ON - int e; - - e = fetestexcept(FE_INEXACT); - x = rint(x); - if (!e && (x > LONG_MAX || x < LONG_MIN)) - feclearexcept(FE_INEXACT); - /* conversion */ - return x; -} -#else -long lrint(double x) -{ - return rint(x); -} -#endif diff --git a/waterbox/libc/functions/math/lrintf.c b/waterbox/libc/functions/math/lrintf.c deleted file mode 100644 index ca0b6a46aa..0000000000 --- a/waterbox/libc/functions/math/lrintf.c +++ /dev/null @@ -1,8 +0,0 @@ -#include - -/* uses LONG_MAX > 2^24, see comments in lrint.c */ - -long lrintf(float x) -{ - return rintf(x); -} diff --git a/waterbox/libc/functions/math/lrintl.c b/waterbox/libc/functions/math/lrintl.c deleted file mode 100644 index b2a8106d7c..0000000000 --- a/waterbox/libc/functions/math/lrintl.c +++ /dev/null @@ -1,36 +0,0 @@ -#include -#include -#include "libm.h" - - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long lrintl(long double x) -{ - return lrint(x); -} -#elif defined(FE_INEXACT) -/* -see comments in lrint.c - -Note that if LONG_MAX == 0x7fffffffffffffff && LDBL_MANT_DIG == 64 -then x == 2**63 - 0.5 is the only input that overflows and -raises inexact (with tonearest or upward rounding mode) -*/ -long lrintl(long double x) -{ - #pragma STDC FENV_ACCESS ON - int e; - - e = fetestexcept(FE_INEXACT); - x = rintl(x); - if (!e && (x > LONG_MAX || x < LONG_MIN)) - feclearexcept(FE_INEXACT); - /* conversion */ - return x; -} -#else -long lrintl(long double x) -{ - return rintl(x); -} -#endif diff --git a/waterbox/libc/functions/math/lround.c b/waterbox/libc/functions/math/lround.c deleted file mode 100644 index b8b795470f..0000000000 --- a/waterbox/libc/functions/math/lround.c +++ /dev/null @@ -1,6 +0,0 @@ -#include - -long lround(double x) -{ - return round(x); -} diff --git a/waterbox/libc/functions/math/lroundf.c b/waterbox/libc/functions/math/lroundf.c deleted file mode 100644 index c4707e7db7..0000000000 --- a/waterbox/libc/functions/math/lroundf.c +++ /dev/null @@ -1,6 +0,0 @@ -#include - -long lroundf(float x) -{ - return roundf(x); -} diff --git a/waterbox/libc/functions/math/lroundl.c b/waterbox/libc/functions/math/lroundl.c deleted file mode 100644 index 094fdf6483..0000000000 --- a/waterbox/libc/functions/math/lroundl.c +++ /dev/null @@ -1,6 +0,0 @@ -#include - -long lroundl(long double x) -{ - return roundl(x); -} diff --git a/waterbox/libc/functions/math/modf.c b/waterbox/libc/functions/math/modf.c deleted file mode 100644 index 1c8a1db90d..0000000000 --- a/waterbox/libc/functions/math/modf.c +++ /dev/null @@ -1,34 +0,0 @@ -#include "libm.h" - -double modf(double x, double *iptr) -{ - union {double f; uint64_t i;} u = {x}; - uint64_t mask; - int e = (int)(u.i>>52 & 0x7ff) - 0x3ff; - - /* no fractional part */ - if (e >= 52) { - *iptr = x; - if (e == 0x400 && u.i<<12 != 0) /* nan */ - return x; - u.i &= 1ULL<<63; - return u.f; - } - - /* no integral part*/ - if (e < 0) { - u.i &= 1ULL<<63; - *iptr = u.f; - return x; - } - - mask = -1ULL>>12>>e; - if ((u.i & mask) == 0) { - *iptr = x; - u.i &= 1ULL<<63; - return u.f; - } - u.i &= ~mask; - *iptr = u.f; - return x - u.f; -} diff --git a/waterbox/libc/functions/math/modff.c b/waterbox/libc/functions/math/modff.c deleted file mode 100644 index 639514effa..0000000000 --- a/waterbox/libc/functions/math/modff.c +++ /dev/null @@ -1,34 +0,0 @@ -#include "libm.h" - -float modff(float x, float *iptr) -{ - union {float f; uint32_t i;} u = {x}; - uint32_t mask; - int e = (int)(u.i>>23 & 0xff) - 0x7f; - - /* no fractional part */ - if (e >= 23) { - *iptr = x; - if (e == 0x80 && u.i<<9 != 0) { /* nan */ - return x; - } - u.i &= 0x80000000; - return u.f; - } - /* no integral part */ - if (e < 0) { - u.i &= 0x80000000; - *iptr = u.f; - return x; - } - - mask = 0x007fffff>>e; - if ((u.i & mask) == 0) { - *iptr = x; - u.i &= 0x80000000; - return u.f; - } - u.i &= ~mask; - *iptr = u.f; - return x - u.f; -} diff --git a/waterbox/libc/functions/math/modfl.c b/waterbox/libc/functions/math/modfl.c deleted file mode 100644 index a47b1924f7..0000000000 --- a/waterbox/libc/functions/math/modfl.c +++ /dev/null @@ -1,53 +0,0 @@ -#include "libm.h" - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long double modfl(long double x, long double *iptr) -{ - double d; - long double r; - - r = modf(x, &d); - *iptr = d; - return r; -} -#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384 - -static const long double toint = 1/LDBL_EPSILON; - -long double modfl(long double x, long double *iptr) -{ - union ldshape u = {x}; - int e = (u.i.se & 0x7fff) - 0x3fff; - int s = u.i.se >> 15; - long double absx; - long double y; - - /* no fractional part */ - if (e >= LDBL_MANT_DIG-1) { - *iptr = x; - if (isnan(x)) - return x; - return s ? -0.0 : 0.0; - } - - /* no integral part*/ - if (e < 0) { - *iptr = s ? -0.0 : 0.0; - return x; - } - - /* raises spurious inexact */ - absx = s ? -x : x; - y = absx + toint - toint - absx; - if (y == 0) { - *iptr = x; - return s ? -0.0 : 0.0; - } - if (y > 0) - y -= 1; - if (s) - y = -y; - *iptr = x + y; - return -y; -} -#endif diff --git a/waterbox/libc/functions/math/nan.c b/waterbox/libc/functions/math/nan.c deleted file mode 100644 index 9e0826c778..0000000000 --- a/waterbox/libc/functions/math/nan.c +++ /dev/null @@ -1,6 +0,0 @@ -#include - -double nan(const char *s) -{ - return NAN; -} diff --git a/waterbox/libc/functions/math/nanf.c b/waterbox/libc/functions/math/nanf.c deleted file mode 100644 index 752ce54634..0000000000 --- a/waterbox/libc/functions/math/nanf.c +++ /dev/null @@ -1,6 +0,0 @@ -#include - -float nanf(const char *s) -{ - return NAN; -} diff --git a/waterbox/libc/functions/math/nanl.c b/waterbox/libc/functions/math/nanl.c deleted file mode 100644 index 969af5641f..0000000000 --- a/waterbox/libc/functions/math/nanl.c +++ /dev/null @@ -1,6 +0,0 @@ -#include - -long double nanl(const char *s) -{ - return NAN; -} diff --git a/waterbox/libc/functions/math/nearbyint.c b/waterbox/libc/functions/math/nearbyint.c deleted file mode 100644 index f4e8aac4f0..0000000000 --- a/waterbox/libc/functions/math/nearbyint.c +++ /dev/null @@ -1,20 +0,0 @@ -#include -#include - -/* nearbyint is the same as rint, but it must not raise the inexact exception */ - -double nearbyint(double x) -{ -#ifdef FE_INEXACT - #pragma STDC FENV_ACCESS ON - int e; - - e = fetestexcept(FE_INEXACT); -#endif - x = rint(x); -#ifdef FE_INEXACT - if (!e) - feclearexcept(FE_INEXACT); -#endif - return x; -} diff --git a/waterbox/libc/functions/math/nearbyintf.c b/waterbox/libc/functions/math/nearbyintf.c deleted file mode 100644 index 092e9ffae5..0000000000 --- a/waterbox/libc/functions/math/nearbyintf.c +++ /dev/null @@ -1,18 +0,0 @@ -#include -#include - -float nearbyintf(float x) -{ -#ifdef FE_INEXACT - #pragma STDC FENV_ACCESS ON - int e; - - e = fetestexcept(FE_INEXACT); -#endif - x = rintf(x); -#ifdef FE_INEXACT - if (!e) - feclearexcept(FE_INEXACT); -#endif - return x; -} diff --git a/waterbox/libc/functions/math/nearbyintl.c b/waterbox/libc/functions/math/nearbyintl.c deleted file mode 100644 index 82852492f8..0000000000 --- a/waterbox/libc/functions/math/nearbyintl.c +++ /dev/null @@ -1,26 +0,0 @@ -#include -#include - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long double nearbyintl(long double x) -{ - return nearbyint(x); -} -#else -#include -long double nearbyintl(long double x) -{ -#ifdef FE_INEXACT - #pragma STDC FENV_ACCESS ON - int e; - - e = fetestexcept(FE_INEXACT); -#endif - x = rintl(x); -#ifdef FE_INEXACT - if (!e) - feclearexcept(FE_INEXACT); -#endif - return x; -} -#endif diff --git a/waterbox/libc/functions/math/nextafter.c b/waterbox/libc/functions/math/nextafter.c deleted file mode 100644 index ab5795a47a..0000000000 --- a/waterbox/libc/functions/math/nextafter.c +++ /dev/null @@ -1,31 +0,0 @@ -#include "libm.h" - -double nextafter(double x, double y) -{ - union {double f; uint64_t i;} ux={x}, uy={y}; - uint64_t ax, ay; - int e; - - if (isnan(x) || isnan(y)) - return x + y; - if (ux.i == uy.i) - return y; - ax = ux.i & -1ULL/2; - ay = uy.i & -1ULL/2; - if (ax == 0) { - if (ay == 0) - return y; - ux.i = (uy.i & 1ULL<<63) | 1; - } else if (ax > ay || ((ux.i ^ uy.i) & 1ULL<<63)) - ux.i--; - else - ux.i++; - e = ux.i >> 52 & 0x7ff; - /* raise overflow if ux.f is infinite and x is finite */ - if (e == 0x7ff) - FORCE_EVAL(x+x); - /* raise underflow if ux.f is subnormal or zero */ - if (e == 0) - FORCE_EVAL(x*x + ux.f*ux.f); - return ux.f; -} diff --git a/waterbox/libc/functions/math/nextafterf.c b/waterbox/libc/functions/math/nextafterf.c deleted file mode 100644 index 75a09f7d1c..0000000000 --- a/waterbox/libc/functions/math/nextafterf.c +++ /dev/null @@ -1,30 +0,0 @@ -#include "libm.h" - -float nextafterf(float x, float y) -{ - union {float f; uint32_t i;} ux={x}, uy={y}; - uint32_t ax, ay, e; - - if (isnan(x) || isnan(y)) - return x + y; - if (ux.i == uy.i) - return y; - ax = ux.i & 0x7fffffff; - ay = uy.i & 0x7fffffff; - if (ax == 0) { - if (ay == 0) - return y; - ux.i = (uy.i & 0x80000000) | 1; - } else if (ax > ay || ((ux.i ^ uy.i) & 0x80000000)) - ux.i--; - else - ux.i++; - e = ux.i & 0x7f800000; - /* raise overflow if ux.f is infinite and x is finite */ - if (e == 0x7f800000) - FORCE_EVAL(x+x); - /* raise underflow if ux.f is subnormal or zero */ - if (e == 0) - FORCE_EVAL(x*x + ux.f*ux.f); - return ux.f; -} diff --git a/waterbox/libc/functions/math/nextafterl.c b/waterbox/libc/functions/math/nextafterl.c deleted file mode 100644 index 37e858fb49..0000000000 --- a/waterbox/libc/functions/math/nextafterl.c +++ /dev/null @@ -1,75 +0,0 @@ -#include "libm.h" - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long double nextafterl(long double x, long double y) -{ - return nextafter(x, y); -} -#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384 -long double nextafterl(long double x, long double y) -{ - union ldshape ux, uy; - - if (isnan(x) || isnan(y)) - return x + y; - if (x == y) - return y; - ux.f = x; - if (x == 0) { - uy.f = y; - ux.i.m = 1; - ux.i.se = uy.i.se & 0x8000; - } else if ((x < y) == !(ux.i.se & 0x8000)) { - ux.i.m++; - if (ux.i.m << 1 == 0) { - ux.i.m = 1ULL << 63; - ux.i.se++; - } - } else { - if (ux.i.m << 1 == 0) { - ux.i.se--; - if (ux.i.se) - ux.i.m = 0; - } - ux.i.m--; - } - /* raise overflow if ux is infinite and x is finite */ - if ((ux.i.se & 0x7fff) == 0x7fff) - return x + x; - /* raise underflow if ux is subnormal or zero */ - if ((ux.i.se & 0x7fff) == 0) - FORCE_EVAL(x*x + ux.f*ux.f); - return ux.f; -} -#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384 -long double nextafterl(long double x, long double y) -{ - union ldshape ux, uy; - - if (isnan(x) || isnan(y)) - return x + y; - if (x == y) - return y; - ux.f = x; - if (x == 0) { - uy.f = y; - ux.i.lo = 1; - ux.i.se = uy.i.se & 0x8000; - } else if ((x < y) == !(ux.i.se & 0x8000)) { - ux.i2.lo++; - if (ux.i2.lo == 0) - ux.i2.hi++; - } else { - if (ux.i2.lo == 0) - ux.i2.hi--; - ux.i2.lo--; - } - /* raise overflow if ux is infinite and x is finite */ - if ((ux.i.se & 0x7fff) == 0x7fff) - return x + x; - /* raise underflow if ux is subnormal or zero */ - if ((ux.i.se & 0x7fff) == 0) - FORCE_EVAL(x*x + ux.f*ux.f); - return ux.f; -} -#endif diff --git a/waterbox/libc/functions/math/nexttoward.c b/waterbox/libc/functions/math/nexttoward.c deleted file mode 100644 index 827ee5c3c2..0000000000 --- a/waterbox/libc/functions/math/nexttoward.c +++ /dev/null @@ -1,42 +0,0 @@ -#include "libm.h" - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -double nexttoward(double x, long double y) -{ - return nextafter(x, y); -} -#else -double nexttoward(double x, long double y) -{ - union {double f; uint64_t i;} ux = {x}; - int e; - - if (isnan(x) || isnan(y)) - return x + y; - if (x == y) - return y; - if (x == 0) { - ux.i = 1; - if (signbit(y)) - ux.i |= 1ULL<<63; - } else if (x < y) { - if (signbit(x)) - ux.i--; - else - ux.i++; - } else { - if (signbit(x)) - ux.i++; - else - ux.i--; - } - e = ux.i>>52 & 0x7ff; - /* raise overflow if ux.f is infinite and x is finite */ - if (e == 0x7ff) - FORCE_EVAL(x+x); - /* raise underflow if ux.f is subnormal or zero */ - if (e == 0) - FORCE_EVAL(x*x + ux.f*ux.f); - return ux.f; -} -#endif diff --git a/waterbox/libc/functions/math/nexttowardf.c b/waterbox/libc/functions/math/nexttowardf.c deleted file mode 100644 index bbf172f9e6..0000000000 --- a/waterbox/libc/functions/math/nexttowardf.c +++ /dev/null @@ -1,35 +0,0 @@ -#include "libm.h" - -float nexttowardf(float x, long double y) -{ - union {float f; uint32_t i;} ux = {x}; - uint32_t e; - - if (isnan(x) || isnan(y)) - return x + y; - if (x == y) - return y; - if (x == 0) { - ux.i = 1; - if (signbit(y)) - ux.i |= 0x80000000; - } else if (x < y) { - if (signbit(x)) - ux.i--; - else - ux.i++; - } else { - if (signbit(x)) - ux.i++; - else - ux.i--; - } - e = ux.i & 0x7f800000; - /* raise overflow if ux.f is infinite and x is finite */ - if (e == 0x7f800000) - FORCE_EVAL(x+x); - /* raise underflow if ux.f is subnormal or zero */ - if (e == 0) - FORCE_EVAL(x*x + ux.f*ux.f); - return ux.f; -} diff --git a/waterbox/libc/functions/math/nexttowardl.c b/waterbox/libc/functions/math/nexttowardl.c deleted file mode 100644 index 67a634039f..0000000000 --- a/waterbox/libc/functions/math/nexttowardl.c +++ /dev/null @@ -1,6 +0,0 @@ -#include - -long double nexttowardl(long double x, long double y) -{ - return nextafterl(x, y); -} diff --git a/waterbox/libc/functions/math/pow.c b/waterbox/libc/functions/math/pow.c deleted file mode 100644 index b66f632d8e..0000000000 --- a/waterbox/libc/functions/math/pow.c +++ /dev/null @@ -1,328 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/e_pow.c */ -/* - * ==================================================== - * Copyright (C) 2004 by Sun Microsystems, Inc. All rights reserved. - * - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ -/* pow(x,y) return x**y - * - * n - * Method: Let x = 2 * (1+f) - * 1. Compute and return log2(x) in two pieces: - * log2(x) = w1 + w2, - * where w1 has 53-24 = 29 bit trailing zeros. - * 2. Perform y*log2(x) = n+y' by simulating muti-precision - * arithmetic, where |y'|<=0.5. - * 3. Return x**y = 2**n*exp(y'*log2) - * - * Special cases: - * 1. (anything) ** 0 is 1 - * 2. 1 ** (anything) is 1 - * 3. (anything except 1) ** NAN is NAN - * 4. NAN ** (anything except 0) is NAN - * 5. +-(|x| > 1) ** +INF is +INF - * 6. +-(|x| > 1) ** -INF is +0 - * 7. +-(|x| < 1) ** +INF is +0 - * 8. +-(|x| < 1) ** -INF is +INF - * 9. -1 ** +-INF is 1 - * 10. +0 ** (+anything except 0, NAN) is +0 - * 11. -0 ** (+anything except 0, NAN, odd integer) is +0 - * 12. +0 ** (-anything except 0, NAN) is +INF, raise divbyzero - * 13. -0 ** (-anything except 0, NAN, odd integer) is +INF, raise divbyzero - * 14. -0 ** (+odd integer) is -0 - * 15. -0 ** (-odd integer) is -INF, raise divbyzero - * 16. +INF ** (+anything except 0,NAN) is +INF - * 17. +INF ** (-anything except 0,NAN) is +0 - * 18. -INF ** (+odd integer) is -INF - * 19. -INF ** (anything) = -0 ** (-anything), (anything except odd integer) - * 20. (anything) ** 1 is (anything) - * 21. (anything) ** -1 is 1/(anything) - * 22. (-anything) ** (integer) is (-1)**(integer)*(+anything**integer) - * 23. (-anything except 0 and inf) ** (non-integer) is NAN - * - * Accuracy: - * pow(x,y) returns x**y nearly rounded. In particular - * pow(integer,integer) - * always returns the correct integer provided it is - * representable. - * - * 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. - */ - -#include "libm.h" - -static const double -bp[] = {1.0, 1.5,}, -dp_h[] = { 0.0, 5.84962487220764160156e-01,}, /* 0x3FE2B803, 0x40000000 */ -dp_l[] = { 0.0, 1.35003920212974897128e-08,}, /* 0x3E4CFDEB, 0x43CFD006 */ -two53 = 9007199254740992.0, /* 0x43400000, 0x00000000 */ -huge = 1.0e300, -tiny = 1.0e-300, -/* poly coefs for (3/2)*(log(x)-2s-2/3*s**3 */ -L1 = 5.99999999999994648725e-01, /* 0x3FE33333, 0x33333303 */ -L2 = 4.28571428578550184252e-01, /* 0x3FDB6DB6, 0xDB6FABFF */ -L3 = 3.33333329818377432918e-01, /* 0x3FD55555, 0x518F264D */ -L4 = 2.72728123808534006489e-01, /* 0x3FD17460, 0xA91D4101 */ -L5 = 2.30660745775561754067e-01, /* 0x3FCD864A, 0x93C9DB65 */ -L6 = 2.06975017800338417784e-01, /* 0x3FCA7E28, 0x4A454EEF */ -P1 = 1.66666666666666019037e-01, /* 0x3FC55555, 0x5555553E */ -P2 = -2.77777777770155933842e-03, /* 0xBF66C16C, 0x16BEBD93 */ -P3 = 6.61375632143793436117e-05, /* 0x3F11566A, 0xAF25DE2C */ -P4 = -1.65339022054652515390e-06, /* 0xBEBBBD41, 0xC5D26BF1 */ -P5 = 4.13813679705723846039e-08, /* 0x3E663769, 0x72BEA4D0 */ -lg2 = 6.93147180559945286227e-01, /* 0x3FE62E42, 0xFEFA39EF */ -lg2_h = 6.93147182464599609375e-01, /* 0x3FE62E43, 0x00000000 */ -lg2_l = -1.90465429995776804525e-09, /* 0xBE205C61, 0x0CA86C39 */ -ovt = 8.0085662595372944372e-017, /* -(1024-log2(ovfl+.5ulp)) */ -cp = 9.61796693925975554329e-01, /* 0x3FEEC709, 0xDC3A03FD =2/(3ln2) */ -cp_h = 9.61796700954437255859e-01, /* 0x3FEEC709, 0xE0000000 =(float)cp */ -cp_l = -7.02846165095275826516e-09, /* 0xBE3E2FE0, 0x145B01F5 =tail of cp_h*/ -ivln2 = 1.44269504088896338700e+00, /* 0x3FF71547, 0x652B82FE =1/ln2 */ -ivln2_h = 1.44269502162933349609e+00, /* 0x3FF71547, 0x60000000 =24b 1/ln2*/ -ivln2_l = 1.92596299112661746887e-08; /* 0x3E54AE0B, 0xF85DDF44 =1/ln2 tail*/ - -double pow(double x, double y) -{ - double z,ax,z_h,z_l,p_h,p_l; - double y1,t1,t2,r,s,t,u,v,w; - int32_t i,j,k,yisint,n; - int32_t hx,hy,ix,iy; - uint32_t lx,ly; - - EXTRACT_WORDS(hx, lx, x); - EXTRACT_WORDS(hy, ly, y); - ix = hx & 0x7fffffff; - iy = hy & 0x7fffffff; - - /* x**0 = 1, even if x is NaN */ - if ((iy|ly) == 0) - return 1.0; - /* 1**y = 1, even if y is NaN */ - if (hx == 0x3ff00000 && lx == 0) - return 1.0; - /* NaN if either arg is NaN */ - if (ix > 0x7ff00000 || (ix == 0x7ff00000 && lx != 0) || - iy > 0x7ff00000 || (iy == 0x7ff00000 && ly != 0)) - return x + y; - - /* determine if y is an odd int when x < 0 - * yisint = 0 ... y is not an integer - * yisint = 1 ... y is an odd int - * yisint = 2 ... y is an even int - */ - yisint = 0; - if (hx < 0) { - if (iy >= 0x43400000) - yisint = 2; /* even integer y */ - else if (iy >= 0x3ff00000) { - k = (iy>>20) - 0x3ff; /* exponent */ - if (k > 20) { - j = ly>>(52-k); - if ((j<<(52-k)) == ly) - yisint = 2 - (j&1); - } else if (ly == 0) { - j = iy>>(20-k); - if ((j<<(20-k)) == iy) - yisint = 2 - (j&1); - } - } - } - - /* special value of y */ - if (ly == 0) { - if (iy == 0x7ff00000) { /* y is +-inf */ - if (((ix-0x3ff00000)|lx) == 0) /* (-1)**+-inf is 1 */ - return 1.0; - else if (ix >= 0x3ff00000) /* (|x|>1)**+-inf = inf,0 */ - return hy >= 0 ? y : 0.0; - else /* (|x|<1)**+-inf = 0,inf */ - return hy >= 0 ? 0.0 : -y; - } - if (iy == 0x3ff00000) { /* y is +-1 */ - if (hy >= 0) - return x; - y = 1/x; -#if FLT_EVAL_METHOD!=0 - { - union {double f; uint64_t i;} u = {y}; - uint64_t i = u.i & -1ULL/2; - if (i>>52 == 0 && (i&(i-1))) - FORCE_EVAL((float)y); - } -#endif - return y; - } - if (hy == 0x40000000) /* y is 2 */ - return x*x; - if (hy == 0x3fe00000) { /* y is 0.5 */ - if (hx >= 0) /* x >= +0 */ - return sqrt(x); - } - } - - ax = fabs(x); - /* special value of x */ - if (lx == 0) { - if (ix == 0x7ff00000 || ix == 0 || ix == 0x3ff00000) { /* x is +-0,+-inf,+-1 */ - z = ax; - if (hy < 0) /* z = (1/|x|) */ - z = 1.0/z; - if (hx < 0) { - if (((ix-0x3ff00000)|yisint) == 0) { - z = (z-z)/(z-z); /* (-1)**non-int is NaN */ - } else if (yisint == 1) - z = -z; /* (x<0)**odd = -(|x|**odd) */ - } - return z; - } - } - - s = 1.0; /* sign of result */ - if (hx < 0) { - if (yisint == 0) /* (x<0)**(non-int) is NaN */ - return (x-x)/(x-x); - if (yisint == 1) /* (x<0)**(odd int) */ - s = -1.0; - } - - /* |y| is huge */ - if (iy > 0x41e00000) { /* if |y| > 2**31 */ - if (iy > 0x43f00000) { /* if |y| > 2**64, must o/uflow */ - if (ix <= 0x3fefffff) - return hy < 0 ? huge*huge : tiny*tiny; - if (ix >= 0x3ff00000) - return hy > 0 ? huge*huge : tiny*tiny; - } - /* over/underflow if x is not close to one */ - if (ix < 0x3fefffff) - return hy < 0 ? s*huge*huge : s*tiny*tiny; - if (ix > 0x3ff00000) - return hy > 0 ? s*huge*huge : s*tiny*tiny; - /* now |1-x| is tiny <= 2**-20, suffice to compute - log(x) by x-x^2/2+x^3/3-x^4/4 */ - t = ax - 1.0; /* t has 20 trailing zeros */ - w = (t*t)*(0.5 - t*(0.3333333333333333333333-t*0.25)); - u = ivln2_h*t; /* ivln2_h has 21 sig. bits */ - v = t*ivln2_l - w*ivln2; - t1 = u + v; - SET_LOW_WORD(t1, 0); - t2 = v - (t1-u); - } else { - double ss,s2,s_h,s_l,t_h,t_l; - n = 0; - /* take care subnormal number */ - if (ix < 0x00100000) { - ax *= two53; - n -= 53; - GET_HIGH_WORD(ix,ax); - } - n += ((ix)>>20) - 0x3ff; - j = ix & 0x000fffff; - /* determine interval */ - ix = j | 0x3ff00000; /* normalize ix */ - if (j <= 0x3988E) /* |x|>1)|0x20000000) + 0x00080000 + (k<<18)); - t_l = ax - (t_h-bp[k]); - s_l = v*((u-s_h*t_h)-s_h*t_l); - /* compute log(ax) */ - s2 = ss*ss; - r = s2*s2*(L1+s2*(L2+s2*(L3+s2*(L4+s2*(L5+s2*L6))))); - r += s_l*(s_h+ss); - s2 = s_h*s_h; - t_h = 3.0 + s2 + r; - SET_LOW_WORD(t_h, 0); - t_l = r - ((t_h-3.0)-s2); - /* u+v = ss*(1+...) */ - u = s_h*t_h; - v = s_l*t_h + t_l*ss; - /* 2/(3log2)*(ss+...) */ - p_h = u + v; - SET_LOW_WORD(p_h, 0); - p_l = v - (p_h-u); - z_h = cp_h*p_h; /* cp_h+cp_l = 2/(3*log2) */ - z_l = cp_l*p_h+p_l*cp + dp_l[k]; - /* log2(ax) = (ss+..)*2/(3*log2) = n + dp_h + z_h + z_l */ - t = (double)n; - t1 = ((z_h + z_l) + dp_h[k]) + t; - SET_LOW_WORD(t1, 0); - t2 = z_l - (((t1 - t) - dp_h[k]) - z_h); - } - - /* split up y into y1+y2 and compute (y1+y2)*(t1+t2) */ - y1 = y; - SET_LOW_WORD(y1, 0); - p_l = (y-y1)*t1 + y*t2; - p_h = y1*t1; - z = p_l + p_h; - EXTRACT_WORDS(j, i, z); - if (j >= 0x40900000) { /* z >= 1024 */ - if (((j-0x40900000)|i) != 0) /* if z > 1024 */ - return s*huge*huge; /* overflow */ - if (p_l + ovt > z - p_h) - return s*huge*huge; /* overflow */ - } else if ((j&0x7fffffff) >= 0x4090cc00) { /* z <= -1075 */ // FIXME: instead of abs(j) use unsigned j - if (((j-0xc090cc00)|i) != 0) /* z < -1075 */ - return s*tiny*tiny; /* underflow */ - if (p_l <= z - p_h) - return s*tiny*tiny; /* underflow */ - } - /* - * compute 2**(p_h+p_l) - */ - i = j & 0x7fffffff; - k = (i>>20) - 0x3ff; - n = 0; - if (i > 0x3fe00000) { /* if |z| > 0.5, set n = [z+0.5] */ - n = j + (0x00100000>>(k+1)); - k = ((n&0x7fffffff)>>20) - 0x3ff; /* new k for n */ - t = 0.0; - SET_HIGH_WORD(t, n & ~(0x000fffff>>k)); - n = ((n&0x000fffff)|0x00100000)>>(20-k); - if (j < 0) - n = -n; - p_h -= t; - } - t = p_l + p_h; - SET_LOW_WORD(t, 0); - u = t*lg2_h; - v = (p_l-(t-p_h))*lg2 + t*lg2_l; - z = u + v; - w = v - (z-u); - t = z*z; - t1 = z - t*(P1+t*(P2+t*(P3+t*(P4+t*P5)))); - r = (z*t1)/(t1-2.0) - (w + z*w); - z = 1.0 - (r-z); - GET_HIGH_WORD(j, z); - j += n<<20; - if ((j>>20) <= 0) /* subnormal output */ - z = scalbn(z,n); - else - SET_HIGH_WORD(z, j); - return s*z; -} diff --git a/waterbox/libc/functions/math/powf.c b/waterbox/libc/functions/math/powf.c deleted file mode 100644 index 427c8965b9..0000000000 --- a/waterbox/libc/functions/math/powf.c +++ /dev/null @@ -1,259 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/e_powf.c */ -/* - * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. - */ -/* - * ==================================================== - * 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 "libm.h" - -static const float -bp[] = {1.0, 1.5,}, -dp_h[] = { 0.0, 5.84960938e-01,}, /* 0x3f15c000 */ -dp_l[] = { 0.0, 1.56322085e-06,}, /* 0x35d1cfdc */ -two24 = 16777216.0, /* 0x4b800000 */ -huge = 1.0e30, -tiny = 1.0e-30, -/* poly coefs for (3/2)*(log(x)-2s-2/3*s**3 */ -L1 = 6.0000002384e-01, /* 0x3f19999a */ -L2 = 4.2857143283e-01, /* 0x3edb6db7 */ -L3 = 3.3333334327e-01, /* 0x3eaaaaab */ -L4 = 2.7272811532e-01, /* 0x3e8ba305 */ -L5 = 2.3066075146e-01, /* 0x3e6c3255 */ -L6 = 2.0697501302e-01, /* 0x3e53f142 */ -P1 = 1.6666667163e-01, /* 0x3e2aaaab */ -P2 = -2.7777778450e-03, /* 0xbb360b61 */ -P3 = 6.6137559770e-05, /* 0x388ab355 */ -P4 = -1.6533901999e-06, /* 0xb5ddea0e */ -P5 = 4.1381369442e-08, /* 0x3331bb4c */ -lg2 = 6.9314718246e-01, /* 0x3f317218 */ -lg2_h = 6.93145752e-01, /* 0x3f317200 */ -lg2_l = 1.42860654e-06, /* 0x35bfbe8c */ -ovt = 4.2995665694e-08, /* -(128-log2(ovfl+.5ulp)) */ -cp = 9.6179670095e-01, /* 0x3f76384f =2/(3ln2) */ -cp_h = 9.6191406250e-01, /* 0x3f764000 =12b cp */ -cp_l = -1.1736857402e-04, /* 0xb8f623c6 =tail of cp_h */ -ivln2 = 1.4426950216e+00, /* 0x3fb8aa3b =1/ln2 */ -ivln2_h = 1.4426879883e+00, /* 0x3fb8aa00 =16b 1/ln2*/ -ivln2_l = 7.0526075433e-06; /* 0x36eca570 =1/ln2 tail*/ - -float powf(float x, float y) -{ - float z,ax,z_h,z_l,p_h,p_l; - float y1,t1,t2,r,s,sn,t,u,v,w; - int32_t i,j,k,yisint,n; - int32_t hx,hy,ix,iy,is; - - GET_FLOAT_WORD(hx, x); - GET_FLOAT_WORD(hy, y); - ix = hx & 0x7fffffff; - iy = hy & 0x7fffffff; - - /* x**0 = 1, even if x is NaN */ - if (iy == 0) - return 1.0f; - /* 1**y = 1, even if y is NaN */ - if (hx == 0x3f800000) - return 1.0f; - /* NaN if either arg is NaN */ - if (ix > 0x7f800000 || iy > 0x7f800000) - return x + y; - - /* determine if y is an odd int when x < 0 - * yisint = 0 ... y is not an integer - * yisint = 1 ... y is an odd int - * yisint = 2 ... y is an even int - */ - yisint = 0; - if (hx < 0) { - if (iy >= 0x4b800000) - yisint = 2; /* even integer y */ - else if (iy >= 0x3f800000) { - k = (iy>>23) - 0x7f; /* exponent */ - j = iy>>(23-k); - if ((j<<(23-k)) == iy) - yisint = 2 - (j & 1); - } - } - - /* special value of y */ - if (iy == 0x7f800000) { /* y is +-inf */ - if (ix == 0x3f800000) /* (-1)**+-inf is 1 */ - return 1.0f; - else if (ix > 0x3f800000) /* (|x|>1)**+-inf = inf,0 */ - return hy >= 0 ? y : 0.0f; - else /* (|x|<1)**+-inf = 0,inf */ - return hy >= 0 ? 0.0f: -y; - } - if (iy == 0x3f800000) /* y is +-1 */ - return hy >= 0 ? x : 1.0f/x; - if (hy == 0x40000000) /* y is 2 */ - return x*x; - if (hy == 0x3f000000) { /* y is 0.5 */ - if (hx >= 0) /* x >= +0 */ - return sqrtf(x); - } - - ax = fabsf(x); - /* special value of x */ - if (ix == 0x7f800000 || ix == 0 || ix == 0x3f800000) { /* x is +-0,+-inf,+-1 */ - z = ax; - if (hy < 0) /* z = (1/|x|) */ - z = 1.0f/z; - if (hx < 0) { - if (((ix-0x3f800000)|yisint) == 0) { - z = (z-z)/(z-z); /* (-1)**non-int is NaN */ - } else if (yisint == 1) - z = -z; /* (x<0)**odd = -(|x|**odd) */ - } - return z; - } - - sn = 1.0f; /* sign of result */ - if (hx < 0) { - if (yisint == 0) /* (x<0)**(non-int) is NaN */ - return (x-x)/(x-x); - if (yisint == 1) /* (x<0)**(odd int) */ - sn = -1.0f; - } - - /* |y| is huge */ - if (iy > 0x4d000000) { /* if |y| > 2**27 */ - /* over/underflow if x is not close to one */ - if (ix < 0x3f7ffff8) - return hy < 0 ? sn*huge*huge : sn*tiny*tiny; - if (ix > 0x3f800007) - return hy > 0 ? sn*huge*huge : sn*tiny*tiny; - /* now |1-x| is tiny <= 2**-20, suffice to compute - log(x) by x-x^2/2+x^3/3-x^4/4 */ - t = ax - 1; /* t has 20 trailing zeros */ - w = (t*t)*(0.5f - t*(0.333333333333f - t*0.25f)); - u = ivln2_h*t; /* ivln2_h has 16 sig. bits */ - v = t*ivln2_l - w*ivln2; - t1 = u + v; - GET_FLOAT_WORD(is, t1); - SET_FLOAT_WORD(t1, is & 0xfffff000); - t2 = v - (t1-u); - } else { - float s2,s_h,s_l,t_h,t_l; - n = 0; - /* take care subnormal number */ - if (ix < 0x00800000) { - ax *= two24; - n -= 24; - GET_FLOAT_WORD(ix, ax); - } - n += ((ix)>>23) - 0x7f; - j = ix & 0x007fffff; - /* determine interval */ - ix = j | 0x3f800000; /* normalize ix */ - if (j <= 0x1cc471) /* |x|>1) & 0xfffff000) | 0x20000000; - SET_FLOAT_WORD(t_h, is + 0x00400000 + (k<<21)); - t_l = ax - (t_h - bp[k]); - s_l = v*((u - s_h*t_h) - s_h*t_l); - /* compute log(ax) */ - s2 = s*s; - r = s2*s2*(L1+s2*(L2+s2*(L3+s2*(L4+s2*(L5+s2*L6))))); - r += s_l*(s_h+s); - s2 = s_h*s_h; - t_h = 3.0f + s2 + r; - GET_FLOAT_WORD(is, t_h); - SET_FLOAT_WORD(t_h, is & 0xfffff000); - t_l = r - ((t_h - 3.0f) - s2); - /* u+v = s*(1+...) */ - u = s_h*t_h; - v = s_l*t_h + t_l*s; - /* 2/(3log2)*(s+...) */ - p_h = u + v; - GET_FLOAT_WORD(is, p_h); - SET_FLOAT_WORD(p_h, is & 0xfffff000); - p_l = v - (p_h - u); - z_h = cp_h*p_h; /* cp_h+cp_l = 2/(3*log2) */ - z_l = cp_l*p_h + p_l*cp+dp_l[k]; - /* log2(ax) = (s+..)*2/(3*log2) = n + dp_h + z_h + z_l */ - t = (float)n; - t1 = (((z_h + z_l) + dp_h[k]) + t); - GET_FLOAT_WORD(is, t1); - SET_FLOAT_WORD(t1, is & 0xfffff000); - t2 = z_l - (((t1 - t) - dp_h[k]) - z_h); - } - - /* split up y into y1+y2 and compute (y1+y2)*(t1+t2) */ - GET_FLOAT_WORD(is, y); - SET_FLOAT_WORD(y1, is & 0xfffff000); - p_l = (y-y1)*t1 + y*t2; - p_h = y1*t1; - z = p_l + p_h; - GET_FLOAT_WORD(j, z); - if (j > 0x43000000) /* if z > 128 */ - return sn*huge*huge; /* overflow */ - else if (j == 0x43000000) { /* if z == 128 */ - if (p_l + ovt > z - p_h) - return sn*huge*huge; /* overflow */ - } else if ((j&0x7fffffff) > 0x43160000) /* z < -150 */ // FIXME: check should be (uint32_t)j > 0xc3160000 - return sn*tiny*tiny; /* underflow */ - else if (j == 0xc3160000) { /* z == -150 */ - if (p_l <= z-p_h) - return sn*tiny*tiny; /* underflow */ - } - /* - * compute 2**(p_h+p_l) - */ - i = j & 0x7fffffff; - k = (i>>23) - 0x7f; - n = 0; - if (i > 0x3f000000) { /* if |z| > 0.5, set n = [z+0.5] */ - n = j + (0x00800000>>(k+1)); - k = ((n&0x7fffffff)>>23) - 0x7f; /* new k for n */ - SET_FLOAT_WORD(t, n & ~(0x007fffff>>k)); - n = ((n&0x007fffff)|0x00800000)>>(23-k); - if (j < 0) - n = -n; - p_h -= t; - } - t = p_l + p_h; - GET_FLOAT_WORD(is, t); - SET_FLOAT_WORD(t, is & 0xffff8000); - u = t*lg2_h; - v = (p_l-(t-p_h))*lg2 + t*lg2_l; - z = u + v; - w = v - (z - u); - t = z*z; - t1 = z - t*(P1+t*(P2+t*(P3+t*(P4+t*P5)))); - r = (z*t1)/(t1-2.0f) - (w+z*w); - z = 1.0f - (r - z); - GET_FLOAT_WORD(j, z); - j += n<<23; - if ((j>>23) <= 0) /* subnormal output */ - z = scalbnf(z, n); - else - SET_FLOAT_WORD(z, j); - return sn*z; -} diff --git a/waterbox/libc/functions/math/powl.c b/waterbox/libc/functions/math/powl.c deleted file mode 100644 index 5b6da07b2e..0000000000 --- a/waterbox/libc/functions/math/powl.c +++ /dev/null @@ -1,522 +0,0 @@ -/* origin: OpenBSD /usr/src/lib/libm/src/ld80/e_powl.c */ -/* - * Copyright (c) 2008 Stephen L. Moshier - * - * 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 THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR 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. - */ -/* powl.c - * - * Power function, long double precision - * - * - * SYNOPSIS: - * - * long double x, y, z, powl(); - * - * z = powl( x, y ); - * - * - * DESCRIPTION: - * - * Computes x raised to the yth power. Analytically, - * - * x**y = exp( y log(x) ). - * - * Following Cody and Waite, this program uses a lookup table - * of 2**-i/32 and pseudo extended precision arithmetic to - * obtain several extra bits of accuracy in both the logarithm - * and the exponential. - * - * - * ACCURACY: - * - * The relative error of pow(x,y) can be estimated - * by y dl ln(2), where dl is the absolute error of - * the internally computed base 2 logarithm. At the ends - * of the approximation interval the logarithm equal 1/32 - * and its relative error is about 1 lsb = 1.1e-19. Hence - * the predicted relative error in the result is 2.3e-21 y . - * - * Relative error: - * arithmetic domain # trials peak rms - * - * IEEE +-1000 40000 2.8e-18 3.7e-19 - * .001 < x < 1000, with log(x) uniformly distributed. - * -1000 < y < 1000, y uniformly distributed. - * - * IEEE 0,8700 60000 6.5e-18 1.0e-18 - * 0.99 < x < 1.01, 0 < y < 8700, uniformly distributed. - * - * - * ERROR MESSAGES: - * - * message condition value returned - * pow overflow x**y > MAXNUM INFINITY - * pow underflow x**y < 1/MAXNUM 0.0 - * pow domain x<0 and y noninteger 0.0 - * - */ - -#include "libm.h" - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long double powl(long double x, long double y) -{ - return pow(x, y); -} -#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384 - -/* Table size */ -#define NXT 32 - -/* log(1+x) = x - .5x^2 + x^3 * P(z)/Q(z) - * on the domain 2^(-1/32) - 1 <= x <= 2^(1/32) - 1 - */ -static const long double P[] = { - 8.3319510773868690346226E-4L, - 4.9000050881978028599627E-1L, - 1.7500123722550302671919E0L, - 1.4000100839971580279335E0L, -}; -static const long double Q[] = { -/* 1.0000000000000000000000E0L,*/ - 5.2500282295834889175431E0L, - 8.4000598057587009834666E0L, - 4.2000302519914740834728E0L, -}; -/* A[i] = 2^(-i/32), rounded to IEEE long double precision. - * If i is even, A[i] + B[i/2] gives additional accuracy. - */ -static const long double A[33] = { - 1.0000000000000000000000E0L, - 9.7857206208770013448287E-1L, - 9.5760328069857364691013E-1L, - 9.3708381705514995065011E-1L, - 9.1700404320467123175367E-1L, - 8.9735453750155359320742E-1L, - 8.7812608018664974155474E-1L, - 8.5930964906123895780165E-1L, - 8.4089641525371454301892E-1L, - 8.2287773907698242225554E-1L, - 8.0524516597462715409607E-1L, - 7.8799042255394324325455E-1L, - 7.7110541270397041179298E-1L, - 7.5458221379671136985669E-1L, - 7.3841307296974965571198E-1L, - 7.2259040348852331001267E-1L, - 7.0710678118654752438189E-1L, - 6.9195494098191597746178E-1L, - 6.7712777346844636413344E-1L, - 6.6261832157987064729696E-1L, - 6.4841977732550483296079E-1L, - 6.3452547859586661129850E-1L, - 6.2092890603674202431705E-1L, - 6.0762367999023443907803E-1L, - 5.9460355750136053334378E-1L, - 5.8186242938878875689693E-1L, - 5.6939431737834582684856E-1L, - 5.5719337129794626814472E-1L, - 5.4525386633262882960438E-1L, - 5.3357020033841180906486E-1L, - 5.2213689121370692017331E-1L, - 5.1094857432705833910408E-1L, - 5.0000000000000000000000E-1L, -}; -static const long double B[17] = { - 0.0000000000000000000000E0L, - 2.6176170809902549338711E-20L, --1.0126791927256478897086E-20L, - 1.3438228172316276937655E-21L, - 1.2207982955417546912101E-20L, --6.3084814358060867200133E-21L, - 1.3164426894366316434230E-20L, --1.8527916071632873716786E-20L, - 1.8950325588932570796551E-20L, - 1.5564775779538780478155E-20L, - 6.0859793637556860974380E-21L, --2.0208749253662532228949E-20L, - 1.4966292219224761844552E-20L, - 3.3540909728056476875639E-21L, --8.6987564101742849540743E-22L, --1.2327176863327626135542E-20L, - 0.0000000000000000000000E0L, -}; - -/* 2^x = 1 + x P(x), - * on the interval -1/32 <= x <= 0 - */ -static const long double R[] = { - 1.5089970579127659901157E-5L, - 1.5402715328927013076125E-4L, - 1.3333556028915671091390E-3L, - 9.6181291046036762031786E-3L, - 5.5504108664798463044015E-2L, - 2.4022650695910062854352E-1L, - 6.9314718055994530931447E-1L, -}; - -#define MEXP (NXT*16384.0L) -/* The following if denormal numbers are supported, else -MEXP: */ -#define MNEXP (-NXT*(16384.0L+64.0L)) -/* log2(e) - 1 */ -#define LOG2EA 0.44269504088896340735992L - -#define F W -#define Fa Wa -#define Fb Wb -#define G W -#define Ga Wa -#define Gb u -#define H W -#define Ha Wb -#define Hb Wb - -static const long double MAXLOGL = 1.1356523406294143949492E4L; -static const long double MINLOGL = -1.13994985314888605586758E4L; -static const long double LOGE2L = 6.9314718055994530941723E-1L; -static const long double huge = 0x1p10000L; -/* XXX Prevent gcc from erroneously constant folding this. */ -static const volatile long double twom10000 = 0x1p-10000L; - -static long double reducl(long double); -static long double powil(long double, int); - -long double powl(long double x, long double y) -{ - /* double F, Fa, Fb, G, Ga, Gb, H, Ha, Hb */ - int i, nflg, iyflg, yoddint; - long e; - volatile long double z=0; - long double w=0, W=0, Wa=0, Wb=0, ya=0, yb=0, u=0; - - /* make sure no invalid exception is raised by nan comparision */ - if (isnan(x)) { - if (!isnan(y) && y == 0.0) - return 1.0; - return x; - } - if (isnan(y)) { - if (x == 1.0) - return 1.0; - return y; - } - if (x == 1.0) - return 1.0; /* 1**y = 1, even if y is nan */ - if (x == -1.0 && !isfinite(y)) - return 1.0; /* -1**inf = 1 */ - if (y == 0.0) - return 1.0; /* x**0 = 1, even if x is nan */ - if (y == 1.0) - return x; - if (y >= LDBL_MAX) { - if (x > 1.0 || x < -1.0) - return INFINITY; - if (x != 0.0) - return 0.0; - } - if (y <= -LDBL_MAX) { - if (x > 1.0 || x < -1.0) - return 0.0; - if (x != 0.0 || y == -INFINITY) - return INFINITY; - } - if (x >= LDBL_MAX) { - if (y > 0.0) - return INFINITY; - return 0.0; - } - - w = floorl(y); - - /* Set iyflg to 1 if y is an integer. */ - iyflg = 0; - if (w == y) - iyflg = 1; - - /* Test for odd integer y. */ - yoddint = 0; - if (iyflg) { - ya = fabsl(y); - ya = floorl(0.5 * ya); - yb = 0.5 * fabsl(w); - if( ya != yb ) - yoddint = 1; - } - - if (x <= -LDBL_MAX) { - if (y > 0.0) { - if (yoddint) - return -INFINITY; - return INFINITY; - } - if (y < 0.0) { - if (yoddint) - return -0.0; - return 0.0; - } - } - nflg = 0; /* (x<0)**(odd int) */ - if (x <= 0.0) { - if (x == 0.0) { - if (y < 0.0) { - if (signbit(x) && yoddint) - /* (-0.0)**(-odd int) = -inf, divbyzero */ - return -1.0/0.0; - /* (+-0.0)**(negative) = inf, divbyzero */ - return 1.0/0.0; - } - if (signbit(x) && yoddint) - return -0.0; - return 0.0; - } - if (iyflg == 0) - return (x - x) / (x - x); /* (x<0)**(non-int) is NaN */ - /* (x<0)**(integer) */ - if (yoddint) - nflg = 1; /* negate result */ - x = -x; - } - /* (+integer)**(integer) */ - if (iyflg && floorl(x) == x && fabsl(y) < 32768.0) { - w = powil(x, (int)y); - return nflg ? -w : w; - } - - /* separate significand from exponent */ - x = frexpl(x, &i); - e = i; - - /* find significand in antilog table A[] */ - i = 1; - if (x <= A[17]) - i = 17; - if (x <= A[i+8]) - i += 8; - if (x <= A[i+4]) - i += 4; - if (x <= A[i+2]) - i += 2; - if (x >= A[1]) - i = -1; - i += 1; - - /* Find (x - A[i])/A[i] - * in order to compute log(x/A[i]): - * - * log(x) = log( a x/a ) = log(a) + log(x/a) - * - * log(x/a) = log(1+v), v = x/a - 1 = (x-a)/a - */ - x -= A[i]; - x -= B[i/2]; - x /= A[i]; - - /* rational approximation for log(1+v): - * - * log(1+v) = v - v**2/2 + v**3 P(v) / Q(v) - */ - z = x*x; - w = x * (z * __polevll(x, P, 3) / __p1evll(x, Q, 3)); - w = w - 0.5*z; - - /* Convert to base 2 logarithm: - * multiply by log2(e) = 1 + LOG2EA - */ - z = LOG2EA * w; - z += w; - z += LOG2EA * x; - z += x; - - /* Compute exponent term of the base 2 logarithm. */ - w = -i; - w /= NXT; - w += e; - /* Now base 2 log of x is w + z. */ - - /* Multiply base 2 log by y, in extended precision. */ - - /* separate y into large part ya - * and small part yb less than 1/NXT - */ - ya = reducl(y); - yb = y - ya; - - /* (w+z)(ya+yb) - * = w*ya + w*yb + z*y - */ - F = z * y + w * yb; - Fa = reducl(F); - Fb = F - Fa; - - G = Fa + w * ya; - Ga = reducl(G); - Gb = G - Ga; - - H = Fb + Gb; - Ha = reducl(H); - w = (Ga + Ha) * NXT; - - /* Test the power of 2 for overflow */ - if (w > MEXP) - return huge * huge; /* overflow */ - if (w < MNEXP) - return twom10000 * twom10000; /* underflow */ - - e = w; - Hb = H - Ha; - - if (Hb > 0.0) { - e += 1; - Hb -= 1.0/NXT; /*0.0625L;*/ - } - - /* Now the product y * log2(x) = Hb + e/NXT. - * - * Compute base 2 exponential of Hb, - * where -0.0625 <= Hb <= 0. - */ - z = Hb * __polevll(Hb, R, 6); /* z = 2**Hb - 1 */ - - /* Express e/NXT as an integer plus a negative number of (1/NXT)ths. - * Find lookup table entry for the fractional power of 2. - */ - if (e < 0) - i = 0; - else - i = 1; - i = e/NXT + i; - e = NXT*i - e; - w = A[e]; - z = w * z; /* 2**-e * ( 1 + (2**Hb-1) ) */ - z = z + w; - z = scalbnl(z, i); /* multiply by integer power of 2 */ - - if (nflg) - z = -z; - return z; -} - - -/* Find a multiple of 1/NXT that is within 1/NXT of x. */ -static long double reducl(long double x) -{ - long double t; - - t = x * NXT; - t = floorl(t); - t = t / NXT; - return t; -} - -/* - * Positive real raised to integer power, long double precision - * - * - * SYNOPSIS: - * - * long double x, y, powil(); - * int n; - * - * y = powil( x, n ); - * - * - * DESCRIPTION: - * - * Returns argument x>0 raised to the nth power. - * The routine efficiently decomposes n as a sum of powers of - * two. The desired power is a product of two-to-the-kth - * powers of x. Thus to compute the 32767 power of x requires - * 28 multiplications instead of 32767 multiplications. - * - * - * ACCURACY: - * - * Relative error: - * arithmetic x domain n domain # trials peak rms - * IEEE .001,1000 -1022,1023 50000 4.3e-17 7.8e-18 - * IEEE 1,2 -1022,1023 20000 3.9e-17 7.6e-18 - * IEEE .99,1.01 0,8700 10000 3.6e-16 7.2e-17 - * - * Returns MAXNUM on overflow, zero on underflow. - */ - -static long double powil(long double x, int nn) -{ - long double ww, y; - long double s; - int n, e, sign, lx; - - if (nn == 0) - return 1.0; - - if (nn < 0) { - sign = -1; - n = -nn; - } else { - sign = 1; - n = nn; - } - - /* Overflow detection */ - - /* Calculate approximate logarithm of answer */ - s = x; - s = frexpl( s, &lx); - e = (lx - 1)*n; - if ((e == 0) || (e > 64) || (e < -64)) { - s = (s - 7.0710678118654752e-1L) / (s + 7.0710678118654752e-1L); - s = (2.9142135623730950L * s - 0.5 + lx) * nn * LOGE2L; - } else { - s = LOGE2L * e; - } - - if (s > MAXLOGL) - return huge * huge; /* overflow */ - - if (s < MINLOGL) - return twom10000 * twom10000; /* underflow */ - /* Handle tiny denormal answer, but with less accuracy - * since roundoff error in 1.0/x will be amplified. - * The precise demarcation should be the gradual underflow threshold. - */ - if (s < -MAXLOGL+2.0) { - x = 1.0/x; - sign = -sign; - } - - /* First bit of the power */ - if (n & 1) - y = x; - else - y = 1.0; - - ww = x; - n >>= 1; - while (n) { - ww = ww * ww; /* arg to the 2-to-the-kth power */ - if (n & 1) /* if that bit is set, then include in product */ - y *= ww; - n >>= 1; - } - - if (sign < 0) - y = 1.0/y; - return y; -} -#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384 -// TODO: broken implementation to make things compile -long double powl(long double x, long double y) -{ - return pow(x, y); -} -#endif diff --git a/waterbox/libc/functions/math/remainder.c b/waterbox/libc/functions/math/remainder.c deleted file mode 100644 index 4521352869..0000000000 --- a/waterbox/libc/functions/math/remainder.c +++ /dev/null @@ -1,10 +0,0 @@ -#include -#include "_alias.h" - -double remainder(double x, double y) -{ - int q; - return remquo(x, y, &q); -} - -weak_alias(remainder, drem); diff --git a/waterbox/libc/functions/math/remainderf.c b/waterbox/libc/functions/math/remainderf.c deleted file mode 100644 index e7bf3ddfc6..0000000000 --- a/waterbox/libc/functions/math/remainderf.c +++ /dev/null @@ -1,10 +0,0 @@ -#include -#include "_alias.h" - -float remainderf(float x, float y) -{ - int q; - return remquof(x, y, &q); -} - -weak_alias(remainderf, dremf); diff --git a/waterbox/libc/functions/math/remainderl.c b/waterbox/libc/functions/math/remainderl.c deleted file mode 100644 index 2a13c1d5af..0000000000 --- a/waterbox/libc/functions/math/remainderl.c +++ /dev/null @@ -1,15 +0,0 @@ -#include -#include - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long double remainderl(long double x, long double y) -{ - return remainder(x, y); -} -#else -long double remainderl(long double x, long double y) -{ - int q; - return remquol(x, y, &q); -} -#endif diff --git a/waterbox/libc/functions/math/remquo.c b/waterbox/libc/functions/math/remquo.c deleted file mode 100644 index 59d5ad57e5..0000000000 --- a/waterbox/libc/functions/math/remquo.c +++ /dev/null @@ -1,82 +0,0 @@ -#include -#include - -double remquo(double x, double y, int *quo) -{ - union {double f; uint64_t i;} ux = {x}, uy = {y}; - int ex = ux.i>>52 & 0x7ff; - int ey = uy.i>>52 & 0x7ff; - int sx = ux.i>>63; - int sy = uy.i>>63; - uint32_t q; - uint64_t i; - uint64_t uxi = ux.i; - - *quo = 0; - if (uy.i<<1 == 0 || isnan(y) || ex == 0x7ff) - return (x*y)/(x*y); - if (ux.i<<1 == 0) - return x; - - /* normalize x and y */ - if (!ex) { - for (i = uxi<<12; i>>63 == 0; ex--, i <<= 1); - uxi <<= -ex + 1; - } else { - uxi &= -1ULL >> 12; - uxi |= 1ULL << 52; - } - if (!ey) { - for (i = uy.i<<12; i>>63 == 0; ey--, i <<= 1); - uy.i <<= -ey + 1; - } else { - uy.i &= -1ULL >> 12; - uy.i |= 1ULL << 52; - } - - q = 0; - if (ex < ey) { - if (ex+1 == ey) - goto end; - return x; - } - - /* x mod y */ - for (; ex > ey; ex--) { - i = uxi - uy.i; - if (i >> 63 == 0) { - uxi = i; - q++; - } - uxi <<= 1; - q <<= 1; - } - i = uxi - uy.i; - if (i >> 63 == 0) { - uxi = i; - q++; - } - if (uxi == 0) - ex = -60; - else - for (; uxi>>52 == 0; uxi <<= 1, ex--); -end: - /* scale result and decide between |x| and |x|-|y| */ - if (ex > 0) { - uxi -= 1ULL << 52; - uxi |= (uint64_t)ex << 52; - } else { - uxi >>= -ex + 1; - } - ux.i = uxi; - x = ux.f; - if (sy) - y = -y; - if (ex == ey || (ex+1 == ey && (2*x > y || (2*x == y && q%2)))) { - x -= y; - q++; - } - q &= 0x7fffffff; - *quo = sx^sy ? -(int)q : (int)q; - return sx ? -x : x; -} diff --git a/waterbox/libc/functions/math/remquof.c b/waterbox/libc/functions/math/remquof.c deleted file mode 100644 index 2f41ff706d..0000000000 --- a/waterbox/libc/functions/math/remquof.c +++ /dev/null @@ -1,82 +0,0 @@ -#include -#include - -float remquof(float x, float y, int *quo) -{ - union {float f; uint32_t i;} ux = {x}, uy = {y}; - int ex = ux.i>>23 & 0xff; - int ey = uy.i>>23 & 0xff; - int sx = ux.i>>31; - int sy = uy.i>>31; - uint32_t q; - uint32_t i; - uint32_t uxi = ux.i; - - *quo = 0; - if (uy.i<<1 == 0 || isnan(y) || ex == 0xff) - return (x*y)/(x*y); - if (ux.i<<1 == 0) - return x; - - /* normalize x and y */ - if (!ex) { - for (i = uxi<<9; i>>31 == 0; ex--, i <<= 1); - uxi <<= -ex + 1; - } else { - uxi &= -1U >> 9; - uxi |= 1U << 23; - } - if (!ey) { - for (i = uy.i<<9; i>>31 == 0; ey--, i <<= 1); - uy.i <<= -ey + 1; - } else { - uy.i &= -1U >> 9; - uy.i |= 1U << 23; - } - - q = 0; - if (ex < ey) { - if (ex+1 == ey) - goto end; - return x; - } - - /* x mod y */ - for (; ex > ey; ex--) { - i = uxi - uy.i; - if (i >> 31 == 0) { - uxi = i; - q++; - } - uxi <<= 1; - q <<= 1; - } - i = uxi - uy.i; - if (i >> 31 == 0) { - uxi = i; - q++; - } - if (uxi == 0) - ex = -30; - else - for (; uxi>>23 == 0; uxi <<= 1, ex--); -end: - /* scale result and decide between |x| and |x|-|y| */ - if (ex > 0) { - uxi -= 1U << 23; - uxi |= (uint32_t)ex << 23; - } else { - uxi >>= -ex + 1; - } - ux.i = uxi; - x = ux.f; - if (sy) - y = -y; - if (ex == ey || (ex+1 == ey && (2*x > y || (2*x == y && q%2)))) { - x -= y; - q++; - } - q &= 0x7fffffff; - *quo = sx^sy ? -(int)q : (int)q; - return sx ? -x : x; -} diff --git a/waterbox/libc/functions/math/remquol.c b/waterbox/libc/functions/math/remquol.c deleted file mode 100644 index 9b065c007f..0000000000 --- a/waterbox/libc/functions/math/remquol.c +++ /dev/null @@ -1,124 +0,0 @@ -#include "libm.h" - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long double remquol(long double x, long double y, int *quo) -{ - return remquo(x, y, quo); -} -#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384 -long double remquol(long double x, long double y, int *quo) -{ - union ldshape ux = {x}, uy = {y}; - int ex = ux.i.se & 0x7fff; - int ey = uy.i.se & 0x7fff; - int sx = ux.i.se >> 15; - int sy = uy.i.se >> 15; - uint32_t q; - - *quo = 0; - if (y == 0 || isnan(y) || ex == 0x7fff) - return (x*y)/(x*y); - if (x == 0) - return x; - - /* normalize x and y */ - if (!ex) { - ux.i.se = ex; - ux.f *= 0x1p120f; - ex = ux.i.se - 120; - } - if (!ey) { - uy.i.se = ey; - uy.f *= 0x1p120f; - ey = uy.i.se - 120; - } - - q = 0; - if (ex >= ey) { - /* x mod y */ -#if LDBL_MANT_DIG == 64 - uint64_t i, mx, my; - mx = ux.i.m; - my = uy.i.m; - for (; ex > ey; ex--) { - i = mx - my; - if (mx >= my) { - mx = 2*i; - q++; - q <<= 1; - } else if (2*mx < mx) { - mx = 2*mx - my; - q <<= 1; - q++; - } else { - mx = 2*mx; - q <<= 1; - } - } - i = mx - my; - if (mx >= my) { - mx = i; - q++; - } - if (mx == 0) - ex = -120; - else - for (; mx >> 63 == 0; mx *= 2, ex--); - ux.i.m = mx; -#elif LDBL_MANT_DIG == 113 - uint64_t hi, lo, xhi, xlo, yhi, ylo; - xhi = (ux.i2.hi & -1ULL>>16) | 1ULL<<48; - yhi = (uy.i2.hi & -1ULL>>16) | 1ULL<<48; - xlo = ux.i2.lo; - ylo = ux.i2.lo; - for (; ex > ey; ex--) { - hi = xhi - yhi; - lo = xlo - ylo; - if (xlo < ylo) - hi -= 1; - if (hi >> 63 == 0) { - xhi = 2*hi + (lo>>63); - xlo = 2*lo; - q++; - } else { - xhi = 2*xhi + (xlo>>63); - xlo = 2*xlo; - } - q <<= 1; - } - hi = xhi - yhi; - lo = xlo - ylo; - if (xlo < ylo) - hi -= 1; - if (hi >> 63 == 0) { - xhi = hi; - xlo = lo; - q++; - } - if ((xhi|xlo) == 0) - ex = -120; - else - for (; xhi >> 48 == 0; xhi = 2*xhi + (xlo>>63), xlo = 2*xlo, ex--); - ux.i2.hi = xhi; - ux.i2.lo = xlo; -#endif - } - - /* scale result and decide between |x| and |x|-|y| */ - if (ex <= 0) { - ux.i.se = ex + 120; - ux.f *= 0x1p-120f; - } else - ux.i.se = ex; - x = ux.f; - if (sy) - y = -y; - if (ex == ey || (ex+1 == ey && (2*x > y || (2*x == y && q%2)))) { - x -= y; - q++; - } - q &= 0x7fffffff; - *quo = sx^sy ? -(int)q : (int)q; - return sx ? -x : x; -} -#endif diff --git a/waterbox/libc/functions/math/rint.c b/waterbox/libc/functions/math/rint.c deleted file mode 100644 index fbba390e7d..0000000000 --- a/waterbox/libc/functions/math/rint.c +++ /dev/null @@ -1,28 +0,0 @@ -#include -#include -#include - -#if FLT_EVAL_METHOD==0 || FLT_EVAL_METHOD==1 -#define EPS DBL_EPSILON -#elif FLT_EVAL_METHOD==2 -#define EPS LDBL_EPSILON -#endif -static const double_t toint = 1/EPS; - -double rint(double x) -{ - union {double f; uint64_t i;} u = {x}; - int e = u.i>>52 & 0x7ff; - int s = u.i>>63; - double_t y; - - if (e >= 0x3ff+52) - return x; - if (s) - y = x - toint + toint; - else - y = x + toint - toint; - if (y == 0) - return s ? -0.0 : 0; - return y; -} diff --git a/waterbox/libc/functions/math/rintf.c b/waterbox/libc/functions/math/rintf.c deleted file mode 100644 index 9047688d24..0000000000 --- a/waterbox/libc/functions/math/rintf.c +++ /dev/null @@ -1,30 +0,0 @@ -#include -#include -#include - -#if FLT_EVAL_METHOD==0 -#define EPS FLT_EPSILON -#elif FLT_EVAL_METHOD==1 -#define EPS DBL_EPSILON -#elif FLT_EVAL_METHOD==2 -#define EPS LDBL_EPSILON -#endif -static const float_t toint = 1/EPS; - -float rintf(float x) -{ - union {float f; uint32_t i;} u = {x}; - int e = u.i>>23 & 0xff; - int s = u.i>>31; - float_t y; - - if (e >= 0x7f+23) - return x; - if (s) - y = x - toint + toint; - else - y = x + toint - toint; - if (y == 0) - return s ? -0.0f : 0.0f; - return y; -} diff --git a/waterbox/libc/functions/math/rintl.c b/waterbox/libc/functions/math/rintl.c deleted file mode 100644 index 374327db22..0000000000 --- a/waterbox/libc/functions/math/rintl.c +++ /dev/null @@ -1,29 +0,0 @@ -#include "libm.h" - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long double rintl(long double x) -{ - return rint(x); -} -#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384 - -static const long double toint = 1/LDBL_EPSILON; - -long double rintl(long double x) -{ - union ldshape u = {x}; - int e = u.i.se & 0x7fff; - int s = u.i.se >> 15; - long double y; - - if (e >= 0x3fff+LDBL_MANT_DIG-1) - return x; - if (s) - y = x - toint + toint; - else - y = x + toint - toint; - if (y == 0) - return 0*x; - return y; -} -#endif diff --git a/waterbox/libc/functions/math/round.c b/waterbox/libc/functions/math/round.c deleted file mode 100644 index 130d58d257..0000000000 --- a/waterbox/libc/functions/math/round.c +++ /dev/null @@ -1,35 +0,0 @@ -#include "libm.h" - -#if FLT_EVAL_METHOD==0 || FLT_EVAL_METHOD==1 -#define EPS DBL_EPSILON -#elif FLT_EVAL_METHOD==2 -#define EPS LDBL_EPSILON -#endif -static const double_t toint = 1/EPS; - -double round(double x) -{ - union {double f; uint64_t i;} u = {x}; - int e = u.i >> 52 & 0x7ff; - double_t y; - - if (e >= 0x3ff+52) - return x; - if (u.i >> 63) - x = -x; - if (e < 0x3ff-1) { - /* raise inexact if x!=0 */ - FORCE_EVAL(x + toint); - return 0*u.f; - } - y = x + toint - toint - x; - if (y > 0.5) - y = y + x - 1; - else if (y <= -0.5) - y = y + x + 1; - else - y = y + x; - if (u.i >> 63) - y = -y; - return y; -} diff --git a/waterbox/libc/functions/math/roundf.c b/waterbox/libc/functions/math/roundf.c deleted file mode 100644 index e8210af562..0000000000 --- a/waterbox/libc/functions/math/roundf.c +++ /dev/null @@ -1,36 +0,0 @@ -#include "libm.h" - -#if FLT_EVAL_METHOD==0 -#define EPS FLT_EPSILON -#elif FLT_EVAL_METHOD==1 -#define EPS DBL_EPSILON -#elif FLT_EVAL_METHOD==2 -#define EPS LDBL_EPSILON -#endif -static const float_t toint = 1/EPS; - -float roundf(float x) -{ - union {float f; uint32_t i;} u = {x}; - int e = u.i >> 23 & 0xff; - float_t y; - - if (e >= 0x7f+23) - return x; - if (u.i >> 31) - x = -x; - if (e < 0x7f-1) { - FORCE_EVAL(x + toint); - return 0*u.f; - } - y = x + toint - toint - x; - if (y > 0.5f) - y = y + x - 1; - else if (y <= -0.5f) - y = y + x + 1; - else - y = y + x; - if (u.i >> 31) - y = -y; - return y; -} diff --git a/waterbox/libc/functions/math/roundl.c b/waterbox/libc/functions/math/roundl.c deleted file mode 100644 index f4ff6820a9..0000000000 --- a/waterbox/libc/functions/math/roundl.c +++ /dev/null @@ -1,37 +0,0 @@ -#include "libm.h" - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long double roundl(long double x) -{ - return round(x); -} -#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384 - -static const long double toint = 1/LDBL_EPSILON; - -long double roundl(long double x) -{ - union ldshape u = {x}; - int e = u.i.se & 0x7fff; - long double y; - - if (e >= 0x3fff+LDBL_MANT_DIG-1) - return x; - if (u.i.se >> 15) - x = -x; - if (e < 0x3fff-1) { - FORCE_EVAL(x + toint); - return 0*u.f; - } - y = x + toint - toint - x; - if (y > 0.5) - y = y + x - 1; - else if (y <= -0.5) - y = y + x + 1; - else - y = y + x; - if (u.i.se >> 15) - y = -y; - return y; -} -#endif diff --git a/waterbox/libc/functions/math/scalb.c b/waterbox/libc/functions/math/scalb.c deleted file mode 100644 index efe69e60cd..0000000000 --- a/waterbox/libc/functions/math/scalb.c +++ /dev/null @@ -1,35 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/e_scalb.c */ -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * - * Developed at SunSoft, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ -/* - * scalb(x, fn) is provide for - * passing various standard test suite. One - * should use scalbn() instead. - */ - -#define _GNU_SOURCE -#include - -double scalb(double x, double fn) -{ - if (isnan(x) || isnan(fn)) - return x*fn; - if (!isfinite(fn)) { - if (fn > 0.0) - return x*fn; - else - return x/(-fn); - } - if (rint(fn) != fn) return (fn-fn)/(fn-fn); - if ( fn > 65000.0) return scalbn(x, 65000); - if (-fn > 65000.0) return scalbn(x,-65000); - return scalbn(x,(int)fn); -} diff --git a/waterbox/libc/functions/math/scalbf.c b/waterbox/libc/functions/math/scalbf.c deleted file mode 100644 index f44ed5b64a..0000000000 --- a/waterbox/libc/functions/math/scalbf.c +++ /dev/null @@ -1,32 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/e_scalbf.c */ -/* - * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. - */ -/* - * ==================================================== - * 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. - * ==================================================== - */ - -#define _GNU_SOURCE -#include - -float scalbf(float x, float fn) -{ - if (isnan(x) || isnan(fn)) return x*fn; - if (!isfinite(fn)) { - if (fn > 0.0f) - return x*fn; - else - return x/(-fn); - } - if (rintf(fn) != fn) return (fn-fn)/(fn-fn); - if ( fn > 65000.0f) return scalbnf(x, 65000); - if (-fn > 65000.0f) return scalbnf(x,-65000); - return scalbnf(x,(int)fn); -} diff --git a/waterbox/libc/functions/math/scalbln.c b/waterbox/libc/functions/math/scalbln.c deleted file mode 100644 index e6f3f195c8..0000000000 --- a/waterbox/libc/functions/math/scalbln.c +++ /dev/null @@ -1,11 +0,0 @@ -#include -#include - -double scalbln(double x, long n) -{ - if (n > INT_MAX) - n = INT_MAX; - else if (n < INT_MIN) - n = INT_MIN; - return scalbn(x, n); -} diff --git a/waterbox/libc/functions/math/scalblnf.c b/waterbox/libc/functions/math/scalblnf.c deleted file mode 100644 index d8e8166b10..0000000000 --- a/waterbox/libc/functions/math/scalblnf.c +++ /dev/null @@ -1,11 +0,0 @@ -#include -#include - -float scalblnf(float x, long n) -{ - if (n > INT_MAX) - n = INT_MAX; - else if (n < INT_MIN) - n = INT_MIN; - return scalbnf(x, n); -} diff --git a/waterbox/libc/functions/math/scalblnl.c b/waterbox/libc/functions/math/scalblnl.c deleted file mode 100644 index 854c51c4cb..0000000000 --- a/waterbox/libc/functions/math/scalblnl.c +++ /dev/null @@ -1,19 +0,0 @@ -#include -#include -#include - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long double scalblnl(long double x, long n) -{ - return scalbln(x, n); -} -#else -long double scalblnl(long double x, long n) -{ - if (n > INT_MAX) - n = INT_MAX; - else if (n < INT_MIN) - n = INT_MIN; - return scalbnl(x, n); -} -#endif diff --git a/waterbox/libc/functions/math/scalbn.c b/waterbox/libc/functions/math/scalbn.c deleted file mode 100644 index 530e07c79f..0000000000 --- a/waterbox/libc/functions/math/scalbn.c +++ /dev/null @@ -1,31 +0,0 @@ -#include -#include - -double scalbn(double x, int n) -{ - union {double f; uint64_t i;} u; - double_t y = x; - - if (n > 1023) { - y *= 0x1p1023; - n -= 1023; - if (n > 1023) { - y *= 0x1p1023; - n -= 1023; - if (n > 1023) - n = 1023; - } - } else if (n < -1022) { - y *= 0x1p-1022; - n += 1022; - if (n < -1022) { - y *= 0x1p-1022; - n += 1022; - if (n < -1022) - n = -1022; - } - } - u.i = (uint64_t)(0x3ff+n)<<52; - x = y * u.f; - return x; -} diff --git a/waterbox/libc/functions/math/scalbnf.c b/waterbox/libc/functions/math/scalbnf.c deleted file mode 100644 index 0b62c3c71f..0000000000 --- a/waterbox/libc/functions/math/scalbnf.c +++ /dev/null @@ -1,31 +0,0 @@ -#include -#include - -float scalbnf(float x, int n) -{ - union {float f; uint32_t i;} u; - float_t y = x; - - if (n > 127) { - y *= 0x1p127f; - n -= 127; - if (n > 127) { - y *= 0x1p127f; - n -= 127; - if (n > 127) - n = 127; - } - } else if (n < -126) { - y *= 0x1p-126f; - n += 126; - if (n < -126) { - y *= 0x1p-126f; - n += 126; - if (n < -126) - n = -126; - } - } - u.i = (uint32_t)(0x7f+n)<<23; - x = y * u.f; - return x; -} diff --git a/waterbox/libc/functions/math/scalbnl.c b/waterbox/libc/functions/math/scalbnl.c deleted file mode 100644 index 08a4c58754..0000000000 --- a/waterbox/libc/functions/math/scalbnl.c +++ /dev/null @@ -1,36 +0,0 @@ -#include "libm.h" - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long double scalbnl(long double x, int n) -{ - return scalbn(x, n); -} -#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384 -long double scalbnl(long double x, int n) -{ - union ldshape u; - - if (n > 16383) { - x *= 0x1p16383L; - n -= 16383; - if (n > 16383) { - x *= 0x1p16383L; - n -= 16383; - if (n > 16383) - n = 16383; - } - } else if (n < -16382) { - x *= 0x1p-16382L; - n += 16382; - if (n < -16382) { - x *= 0x1p-16382L; - n += 16382; - if (n < -16382) - n = -16382; - } - } - u.f = 1.0; - u.i.se = 0x3fff + n; - return x * u.f; -} -#endif diff --git a/waterbox/libc/functions/math/signgam.c b/waterbox/libc/functions/math/signgam.c deleted file mode 100644 index 267a2b06c7..0000000000 --- a/waterbox/libc/functions/math/signgam.c +++ /dev/null @@ -1,6 +0,0 @@ -#include -#include "_alias.h" - -int __signgam = 0; - -weak_alias(__signgam, signgam); diff --git a/waterbox/libc/functions/math/significand.c b/waterbox/libc/functions/math/significand.c deleted file mode 100644 index 40d9aa9f49..0000000000 --- a/waterbox/libc/functions/math/significand.c +++ /dev/null @@ -1,7 +0,0 @@ -#define _GNU_SOURCE -#include - -double significand(double x) -{ - return scalbn(x, -ilogb(x)); -} diff --git a/waterbox/libc/functions/math/significandf.c b/waterbox/libc/functions/math/significandf.c deleted file mode 100644 index 8a697e1aa2..0000000000 --- a/waterbox/libc/functions/math/significandf.c +++ /dev/null @@ -1,7 +0,0 @@ -#define _GNU_SOURCE -#include - -float significandf(float x) -{ - return scalbnf(x, -ilogbf(x)); -} diff --git a/waterbox/libc/functions/math/sin.c b/waterbox/libc/functions/math/sin.c deleted file mode 100644 index 055e215bc8..0000000000 --- a/waterbox/libc/functions/math/sin.c +++ /dev/null @@ -1,78 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/s_sin.c */ -/* - * ==================================================== - * 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. - * ==================================================== - */ -/* sin(x) - * Return sine function of x. - * - * kernel function: - * __sin ... sine function on [-pi/4,pi/4] - * __cos ... cose function on [-pi/4,pi/4] - * __rem_pio2 ... 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 "libm.h" - -double sin(double x) -{ - double y[2]; - uint32_t ix; - unsigned n; - - /* High word of x. */ - GET_HIGH_WORD(ix, x); - ix &= 0x7fffffff; - - /* |x| ~< pi/4 */ - if (ix <= 0x3fe921fb) { - if (ix < 0x3e500000) { /* |x| < 2**-26 */ - /* raise inexact if x != 0 and underflow if subnormal*/ - FORCE_EVAL(ix < 0x00100000 ? x/0x1p120f : x+0x1p120f); - return x; - } - return __sin(x, 0.0, 0); - } - - /* sin(Inf or NaN) is NaN */ - if (ix >= 0x7ff00000) - return x - x; - - /* argument reduction needed */ - n = __rem_pio2(x, y); - switch (n&3) { - case 0: return __sin(y[0], y[1], 1); - case 1: return __cos(y[0], y[1]); - case 2: return -__sin(y[0], y[1], 1); - default: - return -__cos(y[0], y[1]); - } -} diff --git a/waterbox/libc/functions/math/sincos.c b/waterbox/libc/functions/math/sincos.c deleted file mode 100644 index 35b2d92396..0000000000 --- a/waterbox/libc/functions/math/sincos.c +++ /dev/null @@ -1,69 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/s_sin.c */ -/* - * ==================================================== - * 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. - * ==================================================== - */ - -#define _GNU_SOURCE -#include "libm.h" - -void sincos(double x, double *sin, double *cos) -{ - double y[2], s, c; - uint32_t ix; - unsigned n; - - GET_HIGH_WORD(ix, x); - ix &= 0x7fffffff; - - /* |x| ~< pi/4 */ - if (ix <= 0x3fe921fb) { - /* if |x| < 2**-27 * sqrt(2) */ - if (ix < 0x3e46a09e) { - /* raise inexact if x!=0 and underflow if subnormal */ - FORCE_EVAL(ix < 0x00100000 ? x/0x1p120f : x+0x1p120f); - *sin = x; - *cos = 1.0; - return; - } - *sin = __sin(x, 0.0, 0); - *cos = __cos(x, 0.0); - return; - } - - /* sincos(Inf or NaN) is NaN */ - if (ix >= 0x7ff00000) { - *sin = *cos = x - x; - return; - } - - /* argument reduction needed */ - n = __rem_pio2(x, y); - s = __sin(y[0], y[1], 1); - c = __cos(y[0], y[1]); - switch (n&3) { - case 0: - *sin = s; - *cos = c; - break; - case 1: - *sin = c; - *cos = -s; - break; - case 2: - *sin = -s; - *cos = -c; - break; - case 3: - default: - *sin = -c; - *cos = s; - break; - } -} diff --git a/waterbox/libc/functions/math/sincosf.c b/waterbox/libc/functions/math/sincosf.c deleted file mode 100644 index f8ca7232cf..0000000000 --- a/waterbox/libc/functions/math/sincosf.c +++ /dev/null @@ -1,117 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/s_sinf.c */ -/* - * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. - * Optimized by Bruce D. Evans. - */ -/* - * ==================================================== - * 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. - * ==================================================== - */ - -#define _GNU_SOURCE -#include "libm.h" - -/* Small multiples of pi/2 rounded to double precision. */ -static const double -s1pio2 = 1*M_PI_2, /* 0x3FF921FB, 0x54442D18 */ -s2pio2 = 2*M_PI_2, /* 0x400921FB, 0x54442D18 */ -s3pio2 = 3*M_PI_2, /* 0x4012D97C, 0x7F3321D2 */ -s4pio2 = 4*M_PI_2; /* 0x401921FB, 0x54442D18 */ - -void sincosf(float x, float *sin, float *cos) -{ - double y; - float_t s, c; - uint32_t ix; - unsigned n, sign; - - GET_FLOAT_WORD(ix, x); - sign = ix >> 31; - ix &= 0x7fffffff; - - /* |x| ~<= pi/4 */ - if (ix <= 0x3f490fda) { - /* |x| < 2**-12 */ - if (ix < 0x39800000) { - /* raise inexact if x!=0 and underflow if subnormal */ - FORCE_EVAL(ix < 0x00100000 ? x/0x1p120f : x+0x1p120f); - *sin = x; - *cos = 1.0f; - return; - } - *sin = __sindf(x); - *cos = __cosdf(x); - return; - } - - /* |x| ~<= 5*pi/4 */ - if (ix <= 0x407b53d1) { - if (ix <= 0x4016cbe3) { /* |x| ~<= 3pi/4 */ - if (sign) { - *sin = -__cosdf(x + s1pio2); - *cos = __sindf(x + s1pio2); - } else { - *sin = __cosdf(s1pio2 - x); - *cos = __sindf(s1pio2 - x); - } - return; - } - /* -sin(x+c) is not correct if x+c could be 0: -0 vs +0 */ - *sin = -__sindf(sign ? x + s2pio2 : x - s2pio2); - *cos = -__cosdf(sign ? x + s2pio2 : x - s2pio2); - return; - } - - /* |x| ~<= 9*pi/4 */ - if (ix <= 0x40e231d5) { - if (ix <= 0x40afeddf) { /* |x| ~<= 7*pi/4 */ - if (sign) { - *sin = __cosdf(x + s3pio2); - *cos = -__sindf(x + s3pio2); - } else { - *sin = -__cosdf(x - s3pio2); - *cos = __sindf(x - s3pio2); - } - return; - } - *sin = __sindf(sign ? x + s4pio2 : x - s4pio2); - *cos = __cosdf(sign ? x + s4pio2 : x - s4pio2); - return; - } - - /* sin(Inf or NaN) is NaN */ - if (ix >= 0x7f800000) { - *sin = *cos = x - x; - return; - } - - /* general argument reduction needed */ - n = __rem_pio2f(x, &y); - s = __sindf(y); - c = __cosdf(y); - switch (n&3) { - case 0: - *sin = s; - *cos = c; - break; - case 1: - *sin = c; - *cos = -s; - break; - case 2: - *sin = -s; - *cos = -c; - break; - case 3: - default: - *sin = -c; - *cos = s; - break; - } -} diff --git a/waterbox/libc/functions/math/sincosl.c b/waterbox/libc/functions/math/sincosl.c deleted file mode 100644 index d3ac1c4c8c..0000000000 --- a/waterbox/libc/functions/math/sincosl.c +++ /dev/null @@ -1,60 +0,0 @@ -#define _GNU_SOURCE -#include "libm.h" - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -void sincosl(long double x, long double *sin, long double *cos) -{ - double sind, cosd; - sincos(x, &sind, &cosd); - *sin = sind; - *cos = cosd; -} -#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384 -void sincosl(long double x, long double *sin, long double *cos) -{ - union ldshape u = {x}; - unsigned n; - long double y[2], s, c; - - u.i.se &= 0x7fff; - if (u.i.se == 0x7fff) { - *sin = *cos = x - x; - return; - } - if (u.f < M_PI_4) { - if (u.i.se < 0x3fff - LDBL_MANT_DIG) { - /* raise underflow if subnormal */ - if (u.i.se == 0) FORCE_EVAL(x*0x1p-120f); - *sin = x; - /* raise inexact if x!=0 */ - *cos = 1.0 + x; - return; - } - *sin = __sinl(x, 0, 0); - *cos = __cosl(x, 0); - return; - } - n = __rem_pio2l(x, y); - s = __sinl(y[0], y[1], 1); - c = __cosl(y[0], y[1]); - switch (n & 3) { - case 0: - *sin = s; - *cos = c; - break; - case 1: - *sin = c; - *cos = -s; - break; - case 2: - *sin = -s; - *cos = -c; - break; - case 3: - default: - *sin = -c; - *cos = s; - break; - } -} -#endif diff --git a/waterbox/libc/functions/math/sinf.c b/waterbox/libc/functions/math/sinf.c deleted file mode 100644 index 64e39f5017..0000000000 --- a/waterbox/libc/functions/math/sinf.c +++ /dev/null @@ -1,76 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/s_sinf.c */ -/* - * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. - * Optimized by Bruce D. Evans. - */ -/* - * ==================================================== - * 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 "libm.h" - -/* Small multiples of pi/2 rounded to double precision. */ -static const double -s1pio2 = 1*M_PI_2, /* 0x3FF921FB, 0x54442D18 */ -s2pio2 = 2*M_PI_2, /* 0x400921FB, 0x54442D18 */ -s3pio2 = 3*M_PI_2, /* 0x4012D97C, 0x7F3321D2 */ -s4pio2 = 4*M_PI_2; /* 0x401921FB, 0x54442D18 */ - -float sinf(float x) -{ - double y; - uint32_t ix; - int n, sign; - - GET_FLOAT_WORD(ix, x); - sign = ix >> 31; - ix &= 0x7fffffff; - - if (ix <= 0x3f490fda) { /* |x| ~<= pi/4 */ - if (ix < 0x39800000) { /* |x| < 2**-12 */ - /* raise inexact if x!=0 and underflow if subnormal */ - FORCE_EVAL(ix < 0x00800000 ? x/0x1p120f : x+0x1p120f); - return x; - } - return __sindf(x); - } - if (ix <= 0x407b53d1) { /* |x| ~<= 5*pi/4 */ - if (ix <= 0x4016cbe3) { /* |x| ~<= 3pi/4 */ - if (sign) - return -__cosdf(x + s1pio2); - else - return __cosdf(x - s1pio2); - } - return __sindf(sign ? -(x + s2pio2) : -(x - s2pio2)); - } - if (ix <= 0x40e231d5) { /* |x| ~<= 9*pi/4 */ - if (ix <= 0x40afeddf) { /* |x| ~<= 7*pi/4 */ - if (sign) - return __cosdf(x + s3pio2); - else - return -__cosdf(x - s3pio2); - } - return __sindf(sign ? x + s4pio2 : x - s4pio2); - } - - /* sin(Inf or NaN) is NaN */ - if (ix >= 0x7f800000) - return x - x; - - /* general argument reduction needed */ - n = __rem_pio2f(x, &y); - switch (n&3) { - case 0: return __sindf(y); - case 1: return __cosdf(y); - case 2: return __sindf(-y); - default: - return -__cosdf(y); - } -} diff --git a/waterbox/libc/functions/math/sinh.c b/waterbox/libc/functions/math/sinh.c deleted file mode 100644 index 00022c4e6f..0000000000 --- a/waterbox/libc/functions/math/sinh.c +++ /dev/null @@ -1,39 +0,0 @@ -#include "libm.h" - -/* sinh(x) = (exp(x) - 1/exp(x))/2 - * = (exp(x)-1 + (exp(x)-1)/exp(x))/2 - * = x + x^3/6 + o(x^5) - */ -double sinh(double x) -{ - union {double f; uint64_t i;} u = {.f = x}; - uint32_t w; - double t, h, absx; - - h = 0.5; - if (u.i >> 63) - h = -h; - /* |x| */ - u.i &= (uint64_t)-1/2; - absx = u.f; - w = u.i >> 32; - - /* |x| < log(DBL_MAX) */ - if (w < 0x40862e42) { - t = expm1(absx); - if (w < 0x3ff00000) { - if (w < 0x3ff00000 - (26<<20)) - /* note: inexact and underflow are raised by expm1 */ - /* note: this branch avoids spurious underflow */ - return x; - return h*(2*t - t*t/(t+1)); - } - /* note: |x|>log(0x1p26)+eps could be just h*exp(x) */ - return h*(t + t/(t+1)); - } - - /* |x| > log(DBL_MAX) or nan */ - /* note: the result is stored to handle overflow */ - t = 2*h*__expo2(absx); - return t; -} diff --git a/waterbox/libc/functions/math/sinhf.c b/waterbox/libc/functions/math/sinhf.c deleted file mode 100644 index 6ad19ea2b0..0000000000 --- a/waterbox/libc/functions/math/sinhf.c +++ /dev/null @@ -1,31 +0,0 @@ -#include "libm.h" - -float sinhf(float x) -{ - union {float f; uint32_t i;} u = {.f = x}; - uint32_t w; - float t, h, absx; - - h = 0.5; - if (u.i >> 31) - h = -h; - /* |x| */ - u.i &= 0x7fffffff; - absx = u.f; - w = u.i; - - /* |x| < log(FLT_MAX) */ - if (w < 0x42b17217) { - t = expm1f(absx); - if (w < 0x3f800000) { - if (w < 0x3f800000 - (12<<23)) - return x; - return h*(2*t - t*t/(t+1)); - } - return h*(t + t/(t+1)); - } - - /* |x| > logf(FLT_MAX) or nan */ - t = 2*h*__expo2f(absx); - return t; -} diff --git a/waterbox/libc/functions/math/sinhl.c b/waterbox/libc/functions/math/sinhl.c deleted file mode 100644 index b305d4d2f3..0000000000 --- a/waterbox/libc/functions/math/sinhl.c +++ /dev/null @@ -1,43 +0,0 @@ -#include "libm.h" - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long double sinhl(long double x) -{ - return sinh(x); -} -#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384 -long double sinhl(long double x) -{ - union ldshape u = {x}; - unsigned ex = u.i.se & 0x7fff; - long double h, t, absx; - - h = 0.5; - if (u.i.se & 0x8000) - h = -h; - /* |x| */ - u.i.se = ex; - absx = u.f; - - /* |x| < log(LDBL_MAX) */ - if (ex < 0x3fff+13 || (ex == 0x3fff+13 && u.i.m>>32 < 0xb17217f7)) { - t = expm1l(absx); - if (ex < 0x3fff) { - if (ex < 0x3fff-32) - return x; - return h*(2*t - t*t/(1+t)); - } - return h*(t + t/(t+1)); - } - - /* |x| > log(LDBL_MAX) or nan */ - t = expl(0.5*absx); - return h*t*t; -} -#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384 -// TODO: broken implementation to make things compile -long double sinhl(long double x) -{ - return sinh(x); -} -#endif diff --git a/waterbox/libc/functions/math/sinl.c b/waterbox/libc/functions/math/sinl.c deleted file mode 100644 index 9c0b16eed3..0000000000 --- a/waterbox/libc/functions/math/sinl.c +++ /dev/null @@ -1,41 +0,0 @@ -#include "libm.h" - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long double sinl(long double x) -{ - return sin(x); -} -#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384 -long double sinl(long double x) -{ - union ldshape u = {x}; - unsigned n; - long double y[2], hi, lo; - - u.i.se &= 0x7fff; - if (u.i.se == 0x7fff) - return x - x; - if (u.f < M_PI_4) { - if (u.i.se < 0x3fff - LDBL_MANT_DIG/2) { - /* raise inexact if x!=0 and underflow if subnormal */ - FORCE_EVAL(u.i.se == 0 ? x*0x1p-120f : x+0x1p120f); - return x; - } - return __sinl(x, 0.0, 0); - } - n = __rem_pio2l(x, y); - hi = y[0]; - lo = y[1]; - switch (n & 3) { - case 0: - return __sinl(hi, lo, 1); - case 1: - return __cosl(hi, lo); - case 2: - return -__sinl(hi, lo, 1); - case 3: - default: - return -__cosl(hi, lo); - } -} -#endif diff --git a/waterbox/libc/functions/math/sqrt.c b/waterbox/libc/functions/math/sqrt.c deleted file mode 100644 index b277567385..0000000000 --- a/waterbox/libc/functions/math/sqrt.c +++ /dev/null @@ -1,185 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/e_sqrt.c */ -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * - * Developed at SunSoft, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ -/* sqrt(x) - * Return correctly rounded sqrt. - * ------------------------------------------ - * | Use the hardware sqrt if you have one | - * ------------------------------------------ - * Method: - * Bit by bit method using integer arithmetic. (Slow, but portable) - * 1. Normalization - * Scale x to y in [1,4) with even powers of 2: - * find an integer k such that 1 <= (y=x*2^(2k)) < 4, then - * sqrt(x) = 2^k * sqrt(y) - * 2. Bit by bit computation - * Let q = sqrt(y) truncated to i bit after binary point (q = 1), - * i 0 - * i+1 2 - * s = 2*q , and y = 2 * ( y - q ). (1) - * i i i i - * - * To compute q from q , one checks whether - * i+1 i - * - * -(i+1) 2 - * (q + 2 ) <= y. (2) - * i - * -(i+1) - * If (2) is false, then q = q ; otherwise q = q + 2 . - * i+1 i i+1 i - * - * With some algebric manipulation, it is not difficult to see - * that (2) is equivalent to - * -(i+1) - * s + 2 <= y (3) - * i i - * - * The advantage of (3) is that s and y can be computed by - * i i - * the following recurrence formula: - * if (3) is false - * - * s = s , y = y ; (4) - * i+1 i i+1 i - * - * otherwise, - * -i -(i+1) - * s = s + 2 , y = y - s - 2 (5) - * i+1 i i+1 i i - * - * One may easily use induction to prove (4) and (5). - * Note. Since the left hand side of (3) contain only i+2 bits, - * it does not necessary to do a full (53-bit) comparison - * in (3). - * 3. Final rounding - * After generating the 53 bits result, we compute one more bit. - * Together with the remainder, we can decide whether the - * result is exact, bigger than 1/2ulp, or less than 1/2ulp - * (it will never equal to 1/2ulp). - * The rounding mode can be detected by checking whether - * huge + tiny is equal to huge, and whether huge - tiny is - * equal to huge for some floating point number "huge" and "tiny". - * - * Special cases: - * sqrt(+-0) = +-0 ... exact - * sqrt(inf) = inf - * sqrt(-ve) = NaN ... with invalid signal - * sqrt(NaN) = NaN ... with invalid signal for signaling NaN - */ - -#include "libm.h" - -static const double tiny = 1.0e-300; - -double sqrt(double x) -{ - double z; - int32_t sign = (int)0x80000000; - int32_t ix0,s0,q,m,t,i; - uint32_t r,t1,s1,ix1,q1; - - EXTRACT_WORDS(ix0, ix1, x); - - /* take care of Inf and NaN */ - if ((ix0&0x7ff00000) == 0x7ff00000) { - return x*x + x; /* sqrt(NaN)=NaN, sqrt(+inf)=+inf, sqrt(-inf)=sNaN */ - } - /* take care of zero */ - if (ix0 <= 0) { - if (((ix0&~sign)|ix1) == 0) - return x; /* sqrt(+-0) = +-0 */ - if (ix0 < 0) - return (x-x)/(x-x); /* sqrt(-ve) = sNaN */ - } - /* normalize x */ - m = ix0>>20; - if (m == 0) { /* subnormal x */ - while (ix0 == 0) { - m -= 21; - ix0 |= (ix1>>11); - ix1 <<= 21; - } - for (i=0; (ix0&0x00100000) == 0; i++) - ix0<<=1; - m -= i - 1; - ix0 |= ix1>>(32-i); - ix1 <<= i; - } - m -= 1023; /* unbias exponent */ - ix0 = (ix0&0x000fffff)|0x00100000; - if (m & 1) { /* odd m, double x to make it even */ - ix0 += ix0 + ((ix1&sign)>>31); - ix1 += ix1; - } - m >>= 1; /* m = [m/2] */ - - /* generate sqrt(x) bit by bit */ - ix0 += ix0 + ((ix1&sign)>>31); - ix1 += ix1; - q = q1 = s0 = s1 = 0; /* [q,q1] = sqrt(x) */ - r = 0x00200000; /* r = moving bit from right to left */ - - while (r != 0) { - t = s0 + r; - if (t <= ix0) { - s0 = t + r; - ix0 -= t; - q += r; - } - ix0 += ix0 + ((ix1&sign)>>31); - ix1 += ix1; - r >>= 1; - } - - r = sign; - while (r != 0) { - t1 = s1 + r; - t = s0; - if (t < ix0 || (t == ix0 && t1 <= ix1)) { - s1 = t1 + r; - if ((t1&sign) == sign && (s1&sign) == 0) - s0++; - ix0 -= t; - if (ix1 < t1) - ix0--; - ix1 -= t1; - q1 += r; - } - ix0 += ix0 + ((ix1&sign)>>31); - ix1 += ix1; - r >>= 1; - } - - /* use floating add to find out rounding direction */ - if ((ix0|ix1) != 0) { - z = 1.0 - tiny; /* raise inexact flag */ - if (z >= 1.0) { - z = 1.0 + tiny; - if (q1 == (uint32_t)0xffffffff) { - q1 = 0; - q++; - } else if (z > 1.0) { - if (q1 == (uint32_t)0xfffffffe) - q++; - q1 += 2; - } else - q1 += q1 & 1; - } - } - ix0 = (q>>1) + 0x3fe00000; - ix1 = q1>>1; - if (q&1) - ix1 |= sign; - ix0 += m << 20; - INSERT_WORDS(z, ix0, ix1); - return z; -} diff --git a/waterbox/libc/functions/math/sqrtf.c b/waterbox/libc/functions/math/sqrtf.c deleted file mode 100644 index 28cb4ad371..0000000000 --- a/waterbox/libc/functions/math/sqrtf.c +++ /dev/null @@ -1,84 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/e_sqrtf.c */ -/* - * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. - */ -/* - * ==================================================== - * 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 "libm.h" - -static const float tiny = 1.0e-30; - -float sqrtf(float x) -{ - float z; - int32_t sign = (int)0x80000000; - int32_t ix,s,q,m,t,i; - uint32_t r; - - GET_FLOAT_WORD(ix, x); - - /* take care of Inf and NaN */ - if ((ix&0x7f800000) == 0x7f800000) - return x*x + x; /* sqrt(NaN)=NaN, sqrt(+inf)=+inf, sqrt(-inf)=sNaN */ - - /* take care of zero */ - if (ix <= 0) { - if ((ix&~sign) == 0) - return x; /* sqrt(+-0) = +-0 */ - if (ix < 0) - return (x-x)/(x-x); /* sqrt(-ve) = sNaN */ - } - /* normalize x */ - m = ix>>23; - if (m == 0) { /* subnormal x */ - for (i = 0; (ix&0x00800000) == 0; i++) - ix<<=1; - m -= i - 1; - } - m -= 127; /* unbias exponent */ - ix = (ix&0x007fffff)|0x00800000; - if (m&1) /* odd m, double x to make it even */ - ix += ix; - m >>= 1; /* m = [m/2] */ - - /* generate sqrt(x) bit by bit */ - ix += ix; - q = s = 0; /* q = sqrt(x) */ - r = 0x01000000; /* r = moving bit from right to left */ - - while (r != 0) { - t = s + r; - if (t <= ix) { - s = t+r; - ix -= t; - q += r; - } - ix += ix; - r >>= 1; - } - - /* use floating add to find out rounding direction */ - if (ix != 0) { - z = 1.0f - tiny; /* raise inexact flag */ - if (z >= 1.0f) { - z = 1.0f + tiny; - if (z > 1.0f) - q += 2; - else - q += q & 1; - } - } - ix = (q>>1) + 0x3f000000; - ix += m << 23; - SET_FLOAT_WORD(z, ix); - return z; -} diff --git a/waterbox/libc/functions/math/sqrtl.c b/waterbox/libc/functions/math/sqrtl.c deleted file mode 100644 index 83a8f80c99..0000000000 --- a/waterbox/libc/functions/math/sqrtl.c +++ /dev/null @@ -1,7 +0,0 @@ -#include - -long double sqrtl(long double x) -{ - /* FIXME: implement in C, this is for LDBL_MANT_DIG == 64 only */ - return sqrt(x); -} diff --git a/waterbox/libc/functions/math/tan.c b/waterbox/libc/functions/math/tan.c deleted file mode 100644 index 9c724a45af..0000000000 --- a/waterbox/libc/functions/math/tan.c +++ /dev/null @@ -1,70 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/s_tan.c */ -/* - * ==================================================== - * 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. - * ==================================================== - */ -/* tan(x) - * Return tangent function of x. - * - * kernel function: - * __tan ... tangent function on [-pi/4,pi/4] - * __rem_pio2 ... 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 "libm.h" - -double tan(double x) -{ - double y[2]; - uint32_t ix; - unsigned n; - - GET_HIGH_WORD(ix, x); - ix &= 0x7fffffff; - - /* |x| ~< pi/4 */ - if (ix <= 0x3fe921fb) { - if (ix < 0x3e400000) { /* |x| < 2**-27 */ - /* raise inexact if x!=0 and underflow if subnormal */ - FORCE_EVAL(ix < 0x00100000 ? x/0x1p120f : x+0x1p120f); - return x; - } - return __tan(x, 0.0, 0); - } - - /* tan(Inf or NaN) is NaN */ - if (ix >= 0x7ff00000) - return x - x; - - /* argument reduction */ - n = __rem_pio2(x, y); - return __tan(y[0], y[1], n&1); -} diff --git a/waterbox/libc/functions/math/tanf.c b/waterbox/libc/functions/math/tanf.c deleted file mode 100644 index aba197777d..0000000000 --- a/waterbox/libc/functions/math/tanf.c +++ /dev/null @@ -1,64 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/s_tanf.c */ -/* - * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. - * Optimized by Bruce D. Evans. - */ -/* - * ==================================================== - * 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 "libm.h" - -/* Small multiples of pi/2 rounded to double precision. */ -static const double -t1pio2 = 1*M_PI_2, /* 0x3FF921FB, 0x54442D18 */ -t2pio2 = 2*M_PI_2, /* 0x400921FB, 0x54442D18 */ -t3pio2 = 3*M_PI_2, /* 0x4012D97C, 0x7F3321D2 */ -t4pio2 = 4*M_PI_2; /* 0x401921FB, 0x54442D18 */ - -float tanf(float x) -{ - double y; - uint32_t ix; - unsigned n, sign; - - GET_FLOAT_WORD(ix, x); - sign = ix >> 31; - ix &= 0x7fffffff; - - if (ix <= 0x3f490fda) { /* |x| ~<= pi/4 */ - if (ix < 0x39800000) { /* |x| < 2**-12 */ - /* raise inexact if x!=0 and underflow if subnormal */ - FORCE_EVAL(ix < 0x00800000 ? x/0x1p120f : x+0x1p120f); - return x; - } - return __tandf(x, 0); - } - if (ix <= 0x407b53d1) { /* |x| ~<= 5*pi/4 */ - if (ix <= 0x4016cbe3) /* |x| ~<= 3pi/4 */ - return __tandf((sign ? x+t1pio2 : x-t1pio2), 1); - else - return __tandf((sign ? x+t2pio2 : x-t2pio2), 0); - } - if (ix <= 0x40e231d5) { /* |x| ~<= 9*pi/4 */ - if (ix <= 0x40afeddf) /* |x| ~<= 7*pi/4 */ - return __tandf((sign ? x+t3pio2 : x-t3pio2), 1); - else - return __tandf((sign ? x+t4pio2 : x-t4pio2), 0); - } - - /* tan(Inf or NaN) is NaN */ - if (ix >= 0x7f800000) - return x - x; - - /* argument reduction */ - n = __rem_pio2f(x, &y); - return __tandf(y, n&1); -} diff --git a/waterbox/libc/functions/math/tanh.c b/waterbox/libc/functions/math/tanh.c deleted file mode 100644 index 20d6dbcf41..0000000000 --- a/waterbox/libc/functions/math/tanh.c +++ /dev/null @@ -1,45 +0,0 @@ -#include "libm.h" - -/* tanh(x) = (exp(x) - exp(-x))/(exp(x) + exp(-x)) - * = (exp(2*x) - 1)/(exp(2*x) - 1 + 2) - * = (1 - exp(-2*x))/(exp(-2*x) - 1 + 2) - */ -double tanh(double x) -{ - union {double f; uint64_t i;} u = {.f = x}; - uint32_t w; - int sign; - double_t t; - - /* x = |x| */ - sign = u.i >> 63; - u.i &= (uint64_t)-1/2; - x = u.f; - w = u.i >> 32; - - if (w > 0x3fe193ea) { - /* |x| > log(3)/2 ~= 0.5493 or nan */ - if (w > 0x40340000) { - /* |x| > 20 or nan */ - /* note: this branch avoids raising overflow */ - t = 1 - 0/x; - } else { - t = expm1(2*x); - t = 1 - 2/(t+2); - } - } else if (w > 0x3fd058ae) { - /* |x| > log(5/3)/2 ~= 0.2554 */ - t = expm1(2*x); - t = t/(t+2); - } else if (w >= 0x00100000) { - /* |x| >= 0x1p-1022, up to 2ulp error in [0.1,0.2554] */ - t = expm1(-2*x); - t = -t/(t+2); - } else { - /* |x| is subnormal */ - /* note: the branch above would not raise underflow in [0x1p-1023,0x1p-1022) */ - FORCE_EVAL((float)x); - t = x; - } - return sign ? -t : t; -} diff --git a/waterbox/libc/functions/math/tanhf.c b/waterbox/libc/functions/math/tanhf.c deleted file mode 100644 index 10636fbd7b..0000000000 --- a/waterbox/libc/functions/math/tanhf.c +++ /dev/null @@ -1,39 +0,0 @@ -#include "libm.h" - -float tanhf(float x) -{ - union {float f; uint32_t i;} u = {.f = x}; - uint32_t w; - int sign; - float t; - - /* x = |x| */ - sign = u.i >> 31; - u.i &= 0x7fffffff; - x = u.f; - w = u.i; - - if (w > 0x3f0c9f54) { - /* |x| > log(3)/2 ~= 0.5493 or nan */ - if (w > 0x41200000) { - /* |x| > 10 */ - t = 1 + 0/x; - } else { - t = expm1f(2*x); - t = 1 - 2/(t+2); - } - } else if (w > 0x3e82c578) { - /* |x| > log(5/3)/2 ~= 0.2554 */ - t = expm1f(2*x); - t = t/(t+2); - } else if (w >= 0x00800000) { - /* |x| >= 0x1p-126 */ - t = expm1f(-2*x); - t = -t/(t+2); - } else { - /* |x| is subnormal */ - FORCE_EVAL(x*x); - t = x; - } - return sign ? -t : t; -} diff --git a/waterbox/libc/functions/math/tanhl.c b/waterbox/libc/functions/math/tanhl.c deleted file mode 100644 index 4e1aa9f87d..0000000000 --- a/waterbox/libc/functions/math/tanhl.c +++ /dev/null @@ -1,48 +0,0 @@ -#include "libm.h" - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long double tanhl(long double x) -{ - return tanh(x); -} -#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384 -long double tanhl(long double x) -{ - union ldshape u = {x}; - unsigned ex = u.i.se & 0x7fff; - unsigned sign = u.i.se & 0x8000; - uint32_t w; - long double t; - - /* x = |x| */ - u.i.se = ex; - x = u.f; - w = u.i.m >> 32; - - if (ex > 0x3ffe || (ex == 0x3ffe && w > 0x8c9f53d5)) { - /* |x| > log(3)/2 ~= 0.5493 or nan */ - if (ex >= 0x3fff+5) { - /* |x| >= 32 */ - t = 1 + 0/(x + 0x1p-120f); - } else { - t = expm1l(2*x); - t = 1 - 2/(t+2); - } - } else if (ex > 0x3ffd || (ex == 0x3ffd && w > 0x82c577d4)) { - /* |x| > log(5/3)/2 ~= 0.2554 */ - t = expm1l(2*x); - t = t/(t+2); - } else { - /* |x| is small */ - t = expm1l(-2*x); - t = -t/(t+2); - } - return sign ? -t : t; -} -#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384 -// TODO: broken implementation to make things compile -long double tanhl(long double x) -{ - return tanh(x); -} -#endif diff --git a/waterbox/libc/functions/math/tanl.c b/waterbox/libc/functions/math/tanl.c deleted file mode 100644 index 6af067127a..0000000000 --- a/waterbox/libc/functions/math/tanl.c +++ /dev/null @@ -1,29 +0,0 @@ -#include "libm.h" - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long double tanl(long double x) -{ - return tan(x); -} -#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384 -long double tanl(long double x) -{ - union ldshape u = {x}; - long double y[2]; - unsigned n; - - u.i.se &= 0x7fff; - if (u.i.se == 0x7fff) - return x - x; - if (u.f < M_PI_4) { - if (u.i.se < 0x3fff - LDBL_MANT_DIG/2) { - /* raise inexact if x!=0 and underflow if subnormal */ - FORCE_EVAL(u.i.se == 0 ? x*0x1p-120f : x+0x1p120f); - return x; - } - return __tanl(x, 0, 0); - } - n = __rem_pio2l(x, y); - return __tanl(y[0], y[1], n&1); -} -#endif diff --git a/waterbox/libc/functions/math/tgamma.c b/waterbox/libc/functions/math/tgamma.c deleted file mode 100644 index 28f6e0f832..0000000000 --- a/waterbox/libc/functions/math/tgamma.c +++ /dev/null @@ -1,222 +0,0 @@ -/* -"A Precision Approximation of the Gamma Function" - Cornelius Lanczos (1964) -"Lanczos Implementation of the Gamma Function" - Paul Godfrey (2001) -"An Analysis of the Lanczos Gamma Approximation" - Glendon Ralph Pugh (2004) - -approximation method: - - (x - 0.5) S(x) -Gamma(x) = (x + g - 0.5) * ---------------- - exp(x + g - 0.5) - -with - a1 a2 a3 aN -S(x) ~= [ a0 + ----- + ----- + ----- + ... + ----- ] - x + 1 x + 2 x + 3 x + N - -with a0, a1, a2, a3,.. aN constants which depend on g. - -for x < 0 the following reflection formula is used: - -Gamma(x)*Gamma(-x) = -pi/(x sin(pi x)) - -most ideas and constants are from boost and python -*/ -#include "libm.h" - -static const double pi = 3.141592653589793238462643383279502884; - -/* sin(pi x) with x > 0x1p-100, if sin(pi*x)==0 the sign is arbitrary */ -static double sinpi(double x) -{ - int n; - - /* argument reduction: x = |x| mod 2 */ - /* spurious inexact when x is odd int */ - x = x * 0.5; - x = 2 * (x - floor(x)); - - /* reduce x into [-.25,.25] */ - n = 4 * x; - n = (n+1)/2; - x -= n * 0.5; - - x *= pi; - switch (n) { - default: /* case 4 */ - case 0: - return __sin(x, 0, 0); - case 1: - return __cos(x, 0); - case 2: - return __sin(-x, 0, 0); - case 3: - return -__cos(x, 0); - } -} - -#define N 12 -//static const double g = 6.024680040776729583740234375; -static const double gmhalf = 5.524680040776729583740234375; -static const double Snum[N+1] = { - 23531376880.410759688572007674451636754734846804940, - 42919803642.649098768957899047001988850926355848959, - 35711959237.355668049440185451547166705960488635843, - 17921034426.037209699919755754458931112671403265390, - 6039542586.3520280050642916443072979210699388420708, - 1439720407.3117216736632230727949123939715485786772, - 248874557.86205415651146038641322942321632125127801, - 31426415.585400194380614231628318205362874684987640, - 2876370.6289353724412254090516208496135991145378768, - 186056.26539522349504029498971604569928220784236328, - 8071.6720023658162106380029022722506138218516325024, - 210.82427775157934587250973392071336271166969580291, - 2.5066282746310002701649081771338373386264310793408, -}; -static const double Sden[N+1] = { - 0, 39916800, 120543840, 150917976, 105258076, 45995730, 13339535, - 2637558, 357423, 32670, 1925, 66, 1, -}; -/* n! for small integer n */ -static const double fact[] = { - 1, 1, 2, 6, 24, 120, 720, 5040.0, 40320.0, 362880.0, 3628800.0, 39916800.0, - 479001600.0, 6227020800.0, 87178291200.0, 1307674368000.0, 20922789888000.0, - 355687428096000.0, 6402373705728000.0, 121645100408832000.0, - 2432902008176640000.0, 51090942171709440000.0, 1124000727777607680000.0, -}; - -/* S(x) rational function for positive x */ -static double S(double x) -{ - double_t num = 0, den = 0; - int i; - - /* to avoid overflow handle large x differently */ - if (x < 8) - for (i = N; i >= 0; i--) { - num = num * x + Snum[i]; - den = den * x + Sden[i]; - } - else - for (i = 0; i <= N; i++) { - num = num / x + Snum[i]; - den = den / x + Sden[i]; - } - return num/den; -} - -double tgamma(double x) -{ - union {double f; uint64_t i;} u = {x}; - double absx, y; - double_t dy, z, r; - uint32_t ix = u.i>>32 & 0x7fffffff; - int sign = u.i>>63; - - /* special cases */ - if (ix >= 0x7ff00000) - /* tgamma(nan)=nan, tgamma(inf)=inf, tgamma(-inf)=nan with invalid */ - return x + INFINITY; - if (ix < (0x3ff-54)<<20) - /* |x| < 2^-54: tgamma(x) ~ 1/x, +-0 raises div-by-zero */ - return 1/x; - - /* integer arguments */ - /* raise inexact when non-integer */ - if (x == floor(x)) { - if (sign) - return 0/0.0; - if (x <= sizeof fact/sizeof *fact) - return fact[(int)x - 1]; - } - - /* x >= 172: tgamma(x)=inf with overflow */ - /* x =< -184: tgamma(x)=+-0 with underflow */ - if (ix >= 0x40670000) { /* |x| >= 184 */ - if (sign) { - FORCE_EVAL((float)(0x1p-126/x)); - if (floor(x) * 0.5 == floor(x * 0.5)) - return 0; - return -0.0; - } - x *= 0x1p1023; - return x; - } - - absx = sign ? -x : x; - - /* handle the error of x + g - 0.5 */ - y = absx + gmhalf; - if (absx > gmhalf) { - dy = y - absx; - dy -= gmhalf; - } else { - dy = y - gmhalf; - dy -= absx; - } - - z = absx - 0.5; - r = S(absx) * exp(-y); - if (x < 0) { - /* reflection formula for negative x */ - /* sinpi(absx) is not 0, integers are already handled */ - r = -pi / (sinpi(absx) * absx * r); - dy = -dy; - z = -z; - } - r += dy * (gmhalf+0.5) * r / y; - z = pow(y, 0.5*z); - y = r * z * z; - return y; -} - -#if 0 -double __lgamma_r(double x, int *sign) -{ - double r, absx; - - *sign = 1; - - /* special cases */ - if (!isfinite(x)) - /* lgamma(nan)=nan, lgamma(+-inf)=inf */ - return x*x; - - /* integer arguments */ - if (x == floor(x) && x <= 2) { - /* n <= 0: lgamma(n)=inf with divbyzero */ - /* n == 1,2: lgamma(n)=0 */ - if (x <= 0) - return 1/0.0; - return 0; - } - - absx = fabs(x); - - /* lgamma(x) ~ -log(|x|) for tiny |x| */ - if (absx < 0x1p-54) { - *sign = 1 - 2*!!signbit(x); - return -log(absx); - } - - /* use tgamma for smaller |x| */ - if (absx < 128) { - x = tgamma(x); - *sign = 1 - 2*!!signbit(x); - return log(fabs(x)); - } - - /* second term (log(S)-g) could be more precise here.. */ - /* or with stirling: (|x|-0.5)*(log(|x|)-1) + poly(1/|x|) */ - r = (absx-0.5)*(log(absx+gmhalf)-1) + (log(S(absx)) - (gmhalf+0.5)); - if (x < 0) { - /* reflection formula for negative x */ - x = sinpi(absx); - *sign = 2*!!signbit(x) - 1; - r = log(pi/(fabs(x)*absx)) - r; - } - return r; -} - -weak_alias(__lgamma_r, lgamma_r); -#endif diff --git a/waterbox/libc/functions/math/tgammaf.c b/waterbox/libc/functions/math/tgammaf.c deleted file mode 100644 index b4ca51c9f7..0000000000 --- a/waterbox/libc/functions/math/tgammaf.c +++ /dev/null @@ -1,6 +0,0 @@ -#include - -float tgammaf(float x) -{ - return tgamma(x); -} diff --git a/waterbox/libc/functions/math/tgammal.c b/waterbox/libc/functions/math/tgammal.c deleted file mode 100644 index 5336c5b194..0000000000 --- a/waterbox/libc/functions/math/tgammal.c +++ /dev/null @@ -1,281 +0,0 @@ -/* origin: OpenBSD /usr/src/lib/libm/src/ld80/e_tgammal.c */ -/* - * Copyright (c) 2008 Stephen L. Moshier - * - * 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 THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR 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. - */ -/* - * Gamma function - * - * - * SYNOPSIS: - * - * long double x, y, tgammal(); - * - * y = tgammal( x ); - * - * - * DESCRIPTION: - * - * Returns gamma function of the argument. The result is - * correctly signed. - * - * Arguments |x| <= 13 are reduced by recurrence and the function - * approximated by a rational function of degree 7/8 in the - * interval (2,3). Large arguments are handled by Stirling's - * formula. Large negative arguments are made positive using - * a reflection formula. - * - * - * ACCURACY: - * - * Relative error: - * arithmetic domain # trials peak rms - * IEEE -40,+40 10000 3.6e-19 7.9e-20 - * IEEE -1755,+1755 10000 4.8e-18 6.5e-19 - * - * Accuracy for large arguments is dominated by error in powl(). - * - */ - -#include "libm.h" - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long double tgammal(long double x) -{ - return tgamma(x); -} -#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384 -/* -tgamma(x+2) = tgamma(x+2) P(x)/Q(x) -0 <= x <= 1 -Relative error -n=7, d=8 -Peak error = 1.83e-20 -Relative error spread = 8.4e-23 -*/ -static const long double P[8] = { - 4.212760487471622013093E-5L, - 4.542931960608009155600E-4L, - 4.092666828394035500949E-3L, - 2.385363243461108252554E-2L, - 1.113062816019361559013E-1L, - 3.629515436640239168939E-1L, - 8.378004301573126728826E-1L, - 1.000000000000000000009E0L, -}; -static const long double Q[9] = { --1.397148517476170440917E-5L, - 2.346584059160635244282E-4L, --1.237799246653152231188E-3L, --7.955933682494738320586E-4L, - 2.773706565840072979165E-2L, --4.633887671244534213831E-2L, --2.243510905670329164562E-1L, - 4.150160950588455434583E-1L, - 9.999999999999999999908E-1L, -}; - -/* -static const long double P[] = { --3.01525602666895735709e0L, --3.25157411956062339893e1L, --2.92929976820724030353e2L, --1.70730828800510297666e3L, --7.96667499622741999770e3L, --2.59780216007146401957e4L, --5.99650230220855581642e4L, --7.15743521530849602425e4L -}; -static const long double Q[] = { - 1.00000000000000000000e0L, --1.67955233807178858919e1L, - 8.85946791747759881659e1L, - 5.69440799097468430177e1L, --1.98526250512761318471e3L, - 3.31667508019495079814e3L, - 1.60577839621734713377e4L, --2.97045081369399940529e4L, --7.15743521530849602412e4L -}; -*/ -#define MAXGAML 1755.455L -/*static const long double LOGPI = 1.14472988584940017414L;*/ - -/* Stirling's formula for the gamma function -tgamma(x) = sqrt(2 pi) x^(x-.5) exp(-x) (1 + 1/x P(1/x)) -z(x) = x -13 <= x <= 1024 -Relative error -n=8, d=0 -Peak error = 9.44e-21 -Relative error spread = 8.8e-4 -*/ -static const long double STIR[9] = { - 7.147391378143610789273E-4L, --2.363848809501759061727E-5L, --5.950237554056330156018E-4L, - 6.989332260623193171870E-5L, - 7.840334842744753003862E-4L, --2.294719747873185405699E-4L, --2.681327161876304418288E-3L, - 3.472222222230075327854E-3L, - 8.333333333333331800504E-2L, -}; - -#define MAXSTIR 1024.0L -static const long double SQTPI = 2.50662827463100050242E0L; - -/* 1/tgamma(x) = z P(z) - * z(x) = 1/x - * 0 < x < 0.03125 - * Peak relative error 4.2e-23 - */ -static const long double S[9] = { --1.193945051381510095614E-3L, - 7.220599478036909672331E-3L, --9.622023360406271645744E-3L, --4.219773360705915470089E-2L, - 1.665386113720805206758E-1L, --4.200263503403344054473E-2L, --6.558780715202540684668E-1L, - 5.772156649015328608253E-1L, - 1.000000000000000000000E0L, -}; - -/* 1/tgamma(-x) = z P(z) - * z(x) = 1/x - * 0 < x < 0.03125 - * Peak relative error 5.16e-23 - * Relative error spread = 2.5e-24 - */ -static const long double SN[9] = { - 1.133374167243894382010E-3L, - 7.220837261893170325704E-3L, - 9.621911155035976733706E-3L, --4.219773343731191721664E-2L, --1.665386113944413519335E-1L, --4.200263503402112910504E-2L, - 6.558780715202536547116E-1L, - 5.772156649015328608727E-1L, --1.000000000000000000000E0L, -}; - -static const long double PIL = 3.1415926535897932384626L; - -/* Gamma function computed by Stirling's formula. - */ -static long double stirf(long double x) -{ - long double y, w, v; - - w = 1.0/x; - /* For large x, use rational coefficients from the analytical expansion. */ - if (x > 1024.0) - w = (((((6.97281375836585777429E-5L * w - + 7.84039221720066627474E-4L) * w - - 2.29472093621399176955E-4L) * w - - 2.68132716049382716049E-3L) * w - + 3.47222222222222222222E-3L) * w - + 8.33333333333333333333E-2L) * w - + 1.0; - else - w = 1.0 + w * __polevll(w, STIR, 8); - y = expl(x); - if (x > MAXSTIR) { /* Avoid overflow in pow() */ - v = powl(x, 0.5L * x - 0.25L); - y = v * (v / y); - } else { - y = powl(x, x - 0.5L) / y; - } - y = SQTPI * y * w; - return y; -} - -long double tgammal(long double x) -{ - long double p, q, z; - - if (!isfinite(x)) - return x + INFINITY; - - q = fabsl(x); - if (q > 13.0) { - if (x < 0.0) { - p = floorl(q); - z = q - p; - if (z == 0) - return 0 / z; - if (q > MAXGAML) { - z = 0; - } else { - if (z > 0.5) { - p += 1.0; - z = q - p; - } - z = q * sinl(PIL * z); - z = fabsl(z) * stirf(q); - z = PIL/z; - } - if (0.5 * p == floorl(q * 0.5)) - z = -z; - } else if (x > MAXGAML) { - z = x * 0x1p16383L; - } else { - z = stirf(x); - } - return z; - } - - z = 1.0; - while (x >= 3.0) { - x -= 1.0; - z *= x; - } - while (x < -0.03125L) { - z /= x; - x += 1.0; - } - if (x <= 0.03125L) - goto small; - while (x < 2.0) { - z /= x; - x += 1.0; - } - if (x == 2.0) - return z; - - x -= 2.0; - p = __polevll(x, P, 7); - q = __polevll(x, Q, 8); - z = z * p / q; - return z; - -small: - /* z==1 if x was originally +-0 */ - if (x == 0 && z != 1) - return x / x; - if (x < 0.0) { - x = -x; - q = z / (x * __polevll(x, SN, 8)); - } else - q = z / (x * __polevll(x, S, 8)); - return q; -} -#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384 -// TODO: broken implementation to make things compile -long double tgammal(long double x) -{ - return tgamma(x); -} -#endif diff --git a/waterbox/libc/functions/math/trunc.c b/waterbox/libc/functions/math/trunc.c deleted file mode 100644 index d13711b501..0000000000 --- a/waterbox/libc/functions/math/trunc.c +++ /dev/null @@ -1,19 +0,0 @@ -#include "libm.h" - -double trunc(double x) -{ - union {double f; uint64_t i;} u = {x}; - int e = (int)(u.i >> 52 & 0x7ff) - 0x3ff + 12; - uint64_t m; - - if (e >= 52 + 12) - return x; - if (e < 12) - e = 1; - m = -1ULL >> e; - if ((u.i & m) == 0) - return x; - FORCE_EVAL(x + 0x1p120f); - u.i &= ~m; - return u.f; -} diff --git a/waterbox/libc/functions/math/truncf.c b/waterbox/libc/functions/math/truncf.c deleted file mode 100644 index 1a7d03c3bc..0000000000 --- a/waterbox/libc/functions/math/truncf.c +++ /dev/null @@ -1,19 +0,0 @@ -#include "libm.h" - -float truncf(float x) -{ - union {float f; uint32_t i;} u = {x}; - int e = (int)(u.i >> 23 & 0xff) - 0x7f + 9; - uint32_t m; - - if (e >= 23 + 9) - return x; - if (e < 9) - e = 1; - m = -1U >> e; - if ((u.i & m) == 0) - return x; - FORCE_EVAL(x + 0x1p120f); - u.i &= ~m; - return u.f; -} diff --git a/waterbox/libc/functions/math/truncl.c b/waterbox/libc/functions/math/truncl.c deleted file mode 100644 index f07b193409..0000000000 --- a/waterbox/libc/functions/math/truncl.c +++ /dev/null @@ -1,34 +0,0 @@ -#include "libm.h" - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long double truncl(long double x) -{ - return trunc(x); -} -#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384 - -static const long double toint = 1/LDBL_EPSILON; - -long double truncl(long double x) -{ - union ldshape u = {x}; - int e = u.i.se & 0x7fff; - int s = u.i.se >> 15; - long double y; - - if (e >= 0x3fff+LDBL_MANT_DIG-1) - return x; - if (e <= 0x3fff-1) { - FORCE_EVAL(x + 0x1p120f); - return x*0; - } - /* y = int(|x|) - |x|, where int(|x|) is an integer neighbor of |x| */ - if (s) - x = -x; - y = x + toint - toint - x; - if (y > 0) - y -= 1; - x += y; - return s ? -x : x; -} -#endif diff --git a/waterbox/libc/functions/math/x86_64/__invtrigl.s b/waterbox/libc/functions/math/x86_64/__invtrigl.s deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/waterbox/libc/functions/math/x86_64/acosl.s b/waterbox/libc/functions/math/x86_64/acosl.s deleted file mode 100644 index 88e01b49a2..0000000000 --- a/waterbox/libc/functions/math/x86_64/acosl.s +++ /dev/null @@ -1,16 +0,0 @@ -# see ../i386/acos.s - -.global acosl -.type acosl,@function -acosl: - fldt 8(%rsp) -1: fld %st(0) - fld1 - fsub %st(0),%st(1) - fadd %st(2) - fmulp - fsqrt - fabs - fxch %st(1) - fpatan - ret diff --git a/waterbox/libc/functions/math/x86_64/asinl.s b/waterbox/libc/functions/math/x86_64/asinl.s deleted file mode 100644 index ed212d9a6c..0000000000 --- a/waterbox/libc/functions/math/x86_64/asinl.s +++ /dev/null @@ -1,12 +0,0 @@ -.global asinl -.type asinl,@function -asinl: - fldt 8(%rsp) -1: fld %st(0) - fld1 - fsub %st(0),%st(1) - fadd %st(2) - fmulp - fsqrt - fpatan - ret diff --git a/waterbox/libc/functions/math/x86_64/atan2l.s b/waterbox/libc/functions/math/x86_64/atan2l.s deleted file mode 100644 index e5f0a3deb3..0000000000 --- a/waterbox/libc/functions/math/x86_64/atan2l.s +++ /dev/null @@ -1,7 +0,0 @@ -.global atan2l -.type atan2l,@function -atan2l: - fldt 8(%rsp) - fldt 24(%rsp) - fpatan - ret diff --git a/waterbox/libc/functions/math/x86_64/atanl.s b/waterbox/libc/functions/math/x86_64/atanl.s deleted file mode 100644 index df76de5de4..0000000000 --- a/waterbox/libc/functions/math/x86_64/atanl.s +++ /dev/null @@ -1,7 +0,0 @@ -.global atanl -.type atanl,@function -atanl: - fldt 8(%rsp) - fld1 - fpatan - ret diff --git a/waterbox/libc/functions/math/x86_64/ceill.s b/waterbox/libc/functions/math/x86_64/ceill.s deleted file mode 100644 index f5cfa3b307..0000000000 --- a/waterbox/libc/functions/math/x86_64/ceill.s +++ /dev/null @@ -1 +0,0 @@ -# see floorl.s diff --git a/waterbox/libc/functions/math/x86_64/exp2l.s b/waterbox/libc/functions/math/x86_64/exp2l.s deleted file mode 100644 index effab2bd4e..0000000000 --- a/waterbox/libc/functions/math/x86_64/exp2l.s +++ /dev/null @@ -1,83 +0,0 @@ -.global expm1l -.type expm1l,@function -expm1l: - fldt 8(%rsp) - fldl2e - fmulp - movl $0xc2820000,-4(%rsp) - flds -4(%rsp) - fucomip %st(1),%st - fld1 - jb 1f - # x*log2e <= -65, return -1 without underflow - fstp %st(1) - fchs - ret -1: fld %st(1) - fabs - fucomip %st(1),%st - fstp %st(0) - ja 1f - f2xm1 - ret -1: push %rax - call 1f - pop %rax - fld1 - fsubrp - ret - -.global exp2l -.type exp2l,@function -exp2l: - fldt 8(%rsp) -1: fld %st(0) - sub $16,%rsp - fstpt (%rsp) - mov 8(%rsp),%ax - and $0x7fff,%ax - cmp $0x3fff+13,%ax - jb 4f # |x| < 8192 - cmp $0x3fff+15,%ax - jae 3f # |x| >= 32768 - fsts (%rsp) - cmpl $0xc67ff800,(%rsp) - jb 2f # x > -16382 - movl $0x5f000000,(%rsp) - flds (%rsp) # 0x1p63 - fld %st(1) - fsub %st(1) - faddp - fucomip %st(1),%st - je 2f # x - 0x1p63 + 0x1p63 == x - movl $1,(%rsp) - flds (%rsp) # 0x1p-149 - fdiv %st(1) - fstps (%rsp) # raise underflow -2: fld1 - fld %st(1) - frndint - fxch %st(2) - fsub %st(2) # st(0)=x-rint(x), st(1)=1, st(2)=rint(x) - f2xm1 - faddp # 2^(x-rint(x)) -1: fscale - fstp %st(1) - add $16,%rsp - ret -3: xor %eax,%eax -4: cmp $0x3fff-64,%ax - fld1 - jb 1b # |x| < 0x1p-64 - fstpt (%rsp) - fistl 8(%rsp) - fildl 8(%rsp) - fsubrp %st(1) - addl $0x3fff,8(%rsp) - f2xm1 - fld1 - faddp # 2^(x-rint(x)) - fldt (%rsp) # 2^rint(x) - fmulp - add $16,%rsp - ret diff --git a/waterbox/libc/functions/math/x86_64/expl.s b/waterbox/libc/functions/math/x86_64/expl.s deleted file mode 100644 index 798261d283..0000000000 --- a/waterbox/libc/functions/math/x86_64/expl.s +++ /dev/null @@ -1,101 +0,0 @@ -# exp(x) = 2^hi + 2^hi (2^lo - 1) -# where hi+lo = log2e*x with 128bit precision -# exact log2e*x calculation depends on nearest rounding mode -# using the exact multiplication method of Dekker and Veltkamp - -.global expl -.type expl,@function -expl: - fldt 8(%rsp) - - # interesting case: 0x1p-32 <= |x| < 16384 - # check if (exponent|0x8000) is in [0xbfff-32, 0xbfff+13] - mov 16(%rsp), %ax - or $0x8000, %ax - sub $0xbfdf, %ax - cmp $45, %ax - jbe 2f - test %ax, %ax - fld1 - js 1f - # if |x|>=0x1p14 or nan return 2^trunc(x) - fscale - fstp %st(1) - ret - # if |x|<0x1p-32 return 1+x -1: faddp - ret - - # should be 0x1.71547652b82fe178p0L == 0x3fff b8aa3b29 5c17f0bc - # it will be wrong on non-nearest rounding mode -2: fldl2e - subq $48, %rsp - # hi = log2e_hi*x - # 2^hi = exp2l(hi) - fmul %st(1),%st - fld %st(0) - fstpt (%rsp) - fstpt 16(%rsp) - fstpt 32(%rsp) - call exp2l@PLT - # if 2^hi == inf return 2^hi - fld %st(0) - fstpt (%rsp) - cmpw $0x7fff, 8(%rsp) - je 1f - fldt 32(%rsp) - fldt 16(%rsp) - # fpu stack: 2^hi x hi - # exact mult: x*log2e - fld %st(1) - # c = 0x1p32+1 - movq $0x41f0000000100000,%rax - pushq %rax - fldl (%rsp) - # xh = x - c*x + c*x - # xl = x - xh - fmulp - fld %st(2) - fsub %st(1), %st - faddp - fld %st(2) - fsub %st(1), %st - # yh = log2e_hi - c*log2e_hi + c*log2e_hi - movq $0x3ff7154765200000,%rax - pushq %rax - fldl (%rsp) - # fpu stack: 2^hi x hi xh xl yh - # lo = hi - xh*yh + xl*yh - fld %st(2) - fmul %st(1), %st - fsubp %st, %st(4) - fmul %st(1), %st - faddp %st, %st(3) - # yl = log2e_hi - yh - movq $0x3de705fc2f000000,%rax - pushq %rax - fldl (%rsp) - # fpu stack: 2^hi x lo xh xl yl - # lo += xh*yl + xl*yl - fmul %st, %st(2) - fmulp %st, %st(1) - fxch %st(2) - faddp - faddp - # log2e_lo - movq $0xbfbe,%rax - pushq %rax - movq $0x82f0025f2dc582ee,%rax - pushq %rax - fldt (%rsp) - addq $40,%rsp - # fpu stack: 2^hi x lo log2e_lo - # lo += log2e_lo*x - # return 2^hi + 2^hi (2^lo - 1) - fmulp %st, %st(2) - faddp - f2xm1 - fmul %st(1), %st - faddp -1: addq $48, %rsp - ret diff --git a/waterbox/libc/functions/math/x86_64/expm1l.s b/waterbox/libc/functions/math/x86_64/expm1l.s deleted file mode 100644 index e773f08053..0000000000 --- a/waterbox/libc/functions/math/x86_64/expm1l.s +++ /dev/null @@ -1 +0,0 @@ -# see exp2l.s diff --git a/waterbox/libc/functions/math/x86_64/fabs.s b/waterbox/libc/functions/math/x86_64/fabs.s deleted file mode 100644 index 5715005e33..0000000000 --- a/waterbox/libc/functions/math/x86_64/fabs.s +++ /dev/null @@ -1,9 +0,0 @@ -.global fabs -.type fabs,@function -fabs: - xor %eax,%eax - dec %rax - shr %rax - movq %rax,%xmm1 - andpd %xmm1,%xmm0 - ret diff --git a/waterbox/libc/functions/math/x86_64/fabsf.s b/waterbox/libc/functions/math/x86_64/fabsf.s deleted file mode 100644 index 501a1f1755..0000000000 --- a/waterbox/libc/functions/math/x86_64/fabsf.s +++ /dev/null @@ -1,7 +0,0 @@ -.global fabsf -.type fabsf,@function -fabsf: - mov $0x7fffffff,%eax - movq %rax,%xmm1 - andps %xmm1,%xmm0 - ret diff --git a/waterbox/libc/functions/math/x86_64/fabsl.s b/waterbox/libc/functions/math/x86_64/fabsl.s deleted file mode 100644 index 4e7ab525e9..0000000000 --- a/waterbox/libc/functions/math/x86_64/fabsl.s +++ /dev/null @@ -1,6 +0,0 @@ -.global fabsl -.type fabsl,@function -fabsl: - fldt 8(%rsp) - fabs - ret diff --git a/waterbox/libc/functions/math/x86_64/floorl.s b/waterbox/libc/functions/math/x86_64/floorl.s deleted file mode 100644 index 80da466095..0000000000 --- a/waterbox/libc/functions/math/x86_64/floorl.s +++ /dev/null @@ -1,27 +0,0 @@ -.global floorl -.type floorl,@function -floorl: - fldt 8(%rsp) -1: mov $0x7,%al -1: fstcw 8(%rsp) - mov 9(%rsp),%ah - mov %al,9(%rsp) - fldcw 8(%rsp) - frndint - mov %ah,9(%rsp) - fldcw 8(%rsp) - ret - -.global ceill -.type ceill,@function -ceill: - fldt 8(%rsp) - mov $0xb,%al - jmp 1b - -.global truncl -.type truncl,@function -truncl: - fldt 8(%rsp) - mov $0xf,%al - jmp 1b diff --git a/waterbox/libc/functions/math/x86_64/fmodl.s b/waterbox/libc/functions/math/x86_64/fmodl.s deleted file mode 100644 index ea07b402fe..0000000000 --- a/waterbox/libc/functions/math/x86_64/fmodl.s +++ /dev/null @@ -1,11 +0,0 @@ -.global fmodl -.type fmodl,@function -fmodl: - fldt 24(%rsp) - fldt 8(%rsp) -1: fprem - fnstsw %ax - testb $4,%ah - jnz 1b - fstp %st(1) - ret diff --git a/waterbox/libc/functions/math/x86_64/llrint.s b/waterbox/libc/functions/math/x86_64/llrint.s deleted file mode 100644 index bf47649831..0000000000 --- a/waterbox/libc/functions/math/x86_64/llrint.s +++ /dev/null @@ -1,5 +0,0 @@ -.global llrint -.type llrint,@function -llrint: - cvtsd2si %xmm0,%rax - ret diff --git a/waterbox/libc/functions/math/x86_64/llrintf.s b/waterbox/libc/functions/math/x86_64/llrintf.s deleted file mode 100644 index d7204ac0ca..0000000000 --- a/waterbox/libc/functions/math/x86_64/llrintf.s +++ /dev/null @@ -1,5 +0,0 @@ -.global llrintf -.type llrintf,@function -llrintf: - cvtss2si %xmm0,%rax - ret diff --git a/waterbox/libc/functions/math/x86_64/llrintl.s b/waterbox/libc/functions/math/x86_64/llrintl.s deleted file mode 100644 index 1ec0817d3f..0000000000 --- a/waterbox/libc/functions/math/x86_64/llrintl.s +++ /dev/null @@ -1,7 +0,0 @@ -.global llrintl -.type llrintl,@function -llrintl: - fldt 8(%rsp) - fistpll 8(%rsp) - mov 8(%rsp),%rax - ret diff --git a/waterbox/libc/functions/math/x86_64/log10l.s b/waterbox/libc/functions/math/x86_64/log10l.s deleted file mode 100644 index 48ea4af727..0000000000 --- a/waterbox/libc/functions/math/x86_64/log10l.s +++ /dev/null @@ -1,7 +0,0 @@ -.global log10l -.type log10l,@function -log10l: - fldlg2 - fldt 8(%rsp) - fyl2x - ret diff --git a/waterbox/libc/functions/math/x86_64/log1pl.s b/waterbox/libc/functions/math/x86_64/log1pl.s deleted file mode 100644 index 955c9dbff0..0000000000 --- a/waterbox/libc/functions/math/x86_64/log1pl.s +++ /dev/null @@ -1,15 +0,0 @@ -.global log1pl -.type log1pl,@function -log1pl: - mov 14(%rsp),%eax - fldln2 - and $0x7fffffff,%eax - fldt 8(%rsp) - cmp $0x3ffd9400,%eax - ja 1f - fyl2xp1 - ret -1: fld1 - faddp - fyl2x - ret diff --git a/waterbox/libc/functions/math/x86_64/log2l.s b/waterbox/libc/functions/math/x86_64/log2l.s deleted file mode 100644 index ba08b9fb65..0000000000 --- a/waterbox/libc/functions/math/x86_64/log2l.s +++ /dev/null @@ -1,7 +0,0 @@ -.global log2l -.type log2l,@function -log2l: - fld1 - fldt 8(%rsp) - fyl2x - ret diff --git a/waterbox/libc/functions/math/x86_64/logl.s b/waterbox/libc/functions/math/x86_64/logl.s deleted file mode 100644 index 20dd1f819b..0000000000 --- a/waterbox/libc/functions/math/x86_64/logl.s +++ /dev/null @@ -1,7 +0,0 @@ -.global logl -.type logl,@function -logl: - fldln2 - fldt 8(%rsp) - fyl2x - ret diff --git a/waterbox/libc/functions/math/x86_64/lrint.s b/waterbox/libc/functions/math/x86_64/lrint.s deleted file mode 100644 index 15fc2454bc..0000000000 --- a/waterbox/libc/functions/math/x86_64/lrint.s +++ /dev/null @@ -1,5 +0,0 @@ -.global lrint -.type lrint,@function -lrint: - cvtsd2si %xmm0,%rax - ret diff --git a/waterbox/libc/functions/math/x86_64/lrintf.s b/waterbox/libc/functions/math/x86_64/lrintf.s deleted file mode 100644 index 488423d217..0000000000 --- a/waterbox/libc/functions/math/x86_64/lrintf.s +++ /dev/null @@ -1,5 +0,0 @@ -.global lrintf -.type lrintf,@function -lrintf: - cvtss2si %xmm0,%rax - ret diff --git a/waterbox/libc/functions/math/x86_64/lrintl.s b/waterbox/libc/functions/math/x86_64/lrintl.s deleted file mode 100644 index d587b12b5a..0000000000 --- a/waterbox/libc/functions/math/x86_64/lrintl.s +++ /dev/null @@ -1,7 +0,0 @@ -.global lrintl -.type lrintl,@function -lrintl: - fldt 8(%rsp) - fistpll 8(%rsp) - mov 8(%rsp),%rax - ret diff --git a/waterbox/libc/functions/math/x86_64/remainderl.s b/waterbox/libc/functions/math/x86_64/remainderl.s deleted file mode 100644 index cb3857b486..0000000000 --- a/waterbox/libc/functions/math/x86_64/remainderl.s +++ /dev/null @@ -1,11 +0,0 @@ -.global remainderl -.type remainderl,@function -remainderl: - fldt 24(%rsp) - fldt 8(%rsp) -1: fprem1 - fnstsw %ax - testb $4,%ah - jnz 1b - fstp %st(1) - ret diff --git a/waterbox/libc/functions/math/x86_64/rintl.s b/waterbox/libc/functions/math/x86_64/rintl.s deleted file mode 100644 index 64e663cd2d..0000000000 --- a/waterbox/libc/functions/math/x86_64/rintl.s +++ /dev/null @@ -1,6 +0,0 @@ -.global rintl -.type rintl,@function -rintl: - fldt 8(%rsp) - frndint - ret diff --git a/waterbox/libc/functions/math/x86_64/sqrt.s b/waterbox/libc/functions/math/x86_64/sqrt.s deleted file mode 100644 index d3c609f9f8..0000000000 --- a/waterbox/libc/functions/math/x86_64/sqrt.s +++ /dev/null @@ -1,4 +0,0 @@ -.global sqrt -.type sqrt,@function -sqrt: sqrtsd %xmm0, %xmm0 - ret diff --git a/waterbox/libc/functions/math/x86_64/sqrtf.s b/waterbox/libc/functions/math/x86_64/sqrtf.s deleted file mode 100644 index eec48c6094..0000000000 --- a/waterbox/libc/functions/math/x86_64/sqrtf.s +++ /dev/null @@ -1,4 +0,0 @@ -.global sqrtf -.type sqrtf,@function -sqrtf: sqrtss %xmm0, %xmm0 - ret diff --git a/waterbox/libc/functions/math/x86_64/sqrtl.s b/waterbox/libc/functions/math/x86_64/sqrtl.s deleted file mode 100644 index 23cd687d02..0000000000 --- a/waterbox/libc/functions/math/x86_64/sqrtl.s +++ /dev/null @@ -1,5 +0,0 @@ -.global sqrtl -.type sqrtl,@function -sqrtl: fldt 8(%rsp) - fsqrt - ret diff --git a/waterbox/libc/functions/math/x86_64/truncl.s b/waterbox/libc/functions/math/x86_64/truncl.s deleted file mode 100644 index f5cfa3b307..0000000000 --- a/waterbox/libc/functions/math/x86_64/truncl.s +++ /dev/null @@ -1 +0,0 @@ -# see floorl.s diff --git a/waterbox/libc/functions/nothread/call_once.c b/waterbox/libc/functions/nothread/call_once.c deleted file mode 100644 index 6673d611a1..0000000000 --- a/waterbox/libc/functions/nothread/call_once.c +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef REGTEST -#include - -void _PDCLIB_call_once(_PDCLIB_once_flag *flag, void (*func)(void)) -{ - if(!_PDCLIB_ONCE_FLAG_IS_DONE(flag)) { - func(); - *flag = 1; - } -} -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -#ifndef REGTEST -static int count = 0; -static once_flag once = ONCE_FLAG_INIT; - -static void do_once(void) -{ - count++; -} -#endif - -int main( void ) -{ -#ifndef REGTEST - TESTCASE(count == 0); - call_once(&once, do_once); - TESTCASE(count == 1); - call_once(&once, do_once); - TESTCASE(count == 1); - do_once(); - TESTCASE(count == 2); -#endif - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/nothread/cnd_init.c b/waterbox/libc/functions/nothread/cnd_init.c deleted file mode 100644 index 4e05427bd5..0000000000 --- a/waterbox/libc/functions/nothread/cnd_init.c +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef REGTEST -#include - -int cnd_init(cnd_t *cond) -{ - /* does nothing */ - return thrd_success; -} -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/nothread/cnd_signal.c b/waterbox/libc/functions/nothread/cnd_signal.c deleted file mode 100644 index 275ba16ff8..0000000000 --- a/waterbox/libc/functions/nothread/cnd_signal.c +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef REGTEST -#include - -int cnd_signal(cnd_t *cond) -{ - return thrd_success; -} -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/nothread/cnd_wait.c b/waterbox/libc/functions/nothread/cnd_wait.c deleted file mode 100644 index 444e1d477c..0000000000 --- a/waterbox/libc/functions/nothread/cnd_wait.c +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef REGTEST -#include - -int cnd_wait(cnd_t *cond, mtx_t *mtx) -{ - return thrd_error; -} -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/nothread/mtx_destroy.c b/waterbox/libc/functions/nothread/mtx_destroy.c deleted file mode 100644 index 587b525cd8..0000000000 --- a/waterbox/libc/functions/nothread/mtx_destroy.c +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef REGTEST -#include - -void mtx_destroy(mtx_t *mtx) -{} -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/nothread/mtx_init.c b/waterbox/libc/functions/nothread/mtx_init.c deleted file mode 100644 index e1bf08e93b..0000000000 --- a/waterbox/libc/functions/nothread/mtx_init.c +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef REGTEST -#include - -int mtx_init(mtx_t *mtx, int type) -{ - *mtx = 0; - return thrd_success; -} -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/nothread/mtx_lock.c b/waterbox/libc/functions/nothread/mtx_lock.c deleted file mode 100644 index 2c5a26df3b..0000000000 --- a/waterbox/libc/functions/nothread/mtx_lock.c +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef REGTEST -#include - -int mtx_lock(mtx_t *mtx) -{ - (*mtx)++; - return thrd_success; -} -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/nothread/mtx_timedlock.c b/waterbox/libc/functions/nothread/mtx_timedlock.c deleted file mode 100644 index c9d8f205a5..0000000000 --- a/waterbox/libc/functions/nothread/mtx_timedlock.c +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef REGTEST -#include - -int mtx_timedlock(mtx_t *restrict mtx, const struct timespec *restrict ts) -{ - return mtx_lock(mtx); -} -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/nothread/mtx_trylock.c b/waterbox/libc/functions/nothread/mtx_trylock.c deleted file mode 100644 index cd0c701c6f..0000000000 --- a/waterbox/libc/functions/nothread/mtx_trylock.c +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef REGTEST -#include - -int mtx_trylock(mtx_t *mtx) -{ - (*mtx)++; - return thrd_success; -} -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/nothread/mtx_unlock.c b/waterbox/libc/functions/nothread/mtx_unlock.c deleted file mode 100644 index 42f696aa27..0000000000 --- a/waterbox/libc/functions/nothread/mtx_unlock.c +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef REGTEST -#include - -int mtx_unlock(mtx_t *mtx) -{ - if(--(*mtx) >= 0) - return thrd_success; - return thrd_error; -} -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/nothread/thrd_yield.c b/waterbox/libc/functions/nothread/thrd_yield.c deleted file mode 100644 index 55ce0a2a4d..0000000000 --- a/waterbox/libc/functions/nothread/thrd_yield.c +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef REGTEST -#include - -void thrd_yield(void) -{ - /* does nothing */ -} -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/nothread/tss_create.c b/waterbox/libc/functions/nothread/tss_create.c deleted file mode 100644 index a778c7b438..0000000000 --- a/waterbox/libc/functions/nothread/tss_create.c +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef REGTEST -#include - -int tss_create(tss_t *key, tss_dtor_t dtor) -{ - key->self = key; - key->value = NULL; - return thrd_success; -} -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -/* Tested in tss_get.c */ -int main( void ) -{ - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/nothread/tss_delete.c b/waterbox/libc/functions/nothread/tss_delete.c deleted file mode 100644 index bad8d0bf3d..0000000000 --- a/waterbox/libc/functions/nothread/tss_delete.c +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef REGTEST -#include - -void tss_delete(tss_t key) -{ - key.self->self = NULL; -} -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -/* Tested in tss_get.c */ -int main( void ) -{ - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/nothread/tss_get.c b/waterbox/libc/functions/nothread/tss_get.c deleted file mode 100644 index 483088a252..0000000000 --- a/waterbox/libc/functions/nothread/tss_get.c +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef REGTEST -#include - -void *tss_get(tss_t key) -{ - return key.value; -} -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -#ifndef REGTEST -static tss_t key; -static char v; -#endif - -int main( void ) -{ -#ifndef REGTEST - TESTCASE(tss_create(&key, NULL) == thrd_success); - TESTCASE(tss_get(key) == NULL); - TESTCASE(tss_set(key, &v) == thrd_success); - TESTCASE(tss_get(key) == &v); - tss_delete(key); -#endif - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/nothread/tss_set.c b/waterbox/libc/functions/nothread/tss_set.c deleted file mode 100644 index e66ea33894..0000000000 --- a/waterbox/libc/functions/nothread/tss_set.c +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef REGTEST -#include - -int tss_set(tss_t key, void *val) -{ - key.self->value = val; - return thrd_success; -} -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -/* Tested in tss_get.c */ -int main( void ) -{ - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/setjmp/setjmp.s b/waterbox/libc/functions/setjmp/setjmp.s deleted file mode 100644 index 1c53411ed3..0000000000 --- a/waterbox/libc/functions/setjmp/setjmp.s +++ /dev/null @@ -1,53 +0,0 @@ -/* - * ==================================================== - * Copyright (C) 2007 by Ellips BV. All rights reserved. - * - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ - - /* - ** jmp_buf: - ** rbx rbp r12 r13 r14 r15 rsp rip - ** 0 8 16 24 32 40 48 56 - */ -.global setjmp -.global longjmp -.type setjmp,@function -.type longjmp,@function - -setjmp: - movq %rbx, 0 (%rdi) - movq %rbp, 8 (%rdi) - movq %r12, 16 (%rdi) - movq %r13, 24 (%rdi) - movq %r14, 32 (%rdi) - movq %r15, 40 (%rdi) - leaq 8 (%rsp), %rax - movq %rax, 48 (%rdi) - movq (%rsp), %rax - movq %rax, 56 (%rdi) - movq $0, %rax - ret - -longjmp: - movq %rsi, %rax /* Return value */ - test %rax, %rax - jnz L0 - inc %rax /* if 0 was passed, send back 1 instead */ -L0: - movq 8 (%rdi), %rbp - - cli - movq 48 (%rdi), %rsp - pushq 56 (%rdi) - movq 0 (%rdi), %rbx - movq 16 (%rdi), %r12 - movq 24 (%rdi), %r13 - movq 32 (%rdi), %r14 - movq 40 (%rdi), %r15 - sti - - ret diff --git a/waterbox/libc/functions/signal/raise.c b/waterbox/libc/functions/signal/raise.c deleted file mode 100644 index 13a8b50b9f..0000000000 --- a/waterbox/libc/functions/signal/raise.c +++ /dev/null @@ -1,112 +0,0 @@ -/* raise( int ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -#include -#include - -extern void (*_PDCLIB_sigabrt)( int ); -extern void (*_PDCLIB_sigfpe)( int ); -extern void (*_PDCLIB_sigill)( int ); -extern void (*_PDCLIB_sigint)( int ); -extern void (*_PDCLIB_sigsegv)( int ); -extern void (*_PDCLIB_sigterm)( int ); - -int raise( int sig ) -{ - void (*sighandler)( int ); - char const * message; - switch ( sig ) - { - case SIGABRT: - sighandler = _PDCLIB_sigabrt; - message = "Abnormal termination (SIGABRT)"; - break; - case SIGFPE: - sighandler = _PDCLIB_sigfpe; - message = "Arithmetic exception (SIGFPE)"; - break; - case SIGILL: - sighandler = _PDCLIB_sigill; - message = "Illegal instruction (SIGILL)"; - break; - case SIGINT: - sighandler = _PDCLIB_sigint; - message = "Interactive attention signal (SIGINT)"; - break; - case SIGSEGV: - sighandler = _PDCLIB_sigsegv; - message = "Invalid memory access (SIGSEGV)"; - break; - case SIGTERM: - sighandler = _PDCLIB_sigterm; - message = "Termination request (SIGTERM)"; - break; - default: - fprintf( stderr, "Unknown signal #%d\n", sig ); - _Exit( EXIT_FAILURE ); - } - if ( sighandler == SIG_DFL ) - { - fputs( message, stderr ); - _Exit( EXIT_FAILURE ); - } - else if ( sighandler != SIG_IGN ) - { - sighandler = signal( sig, SIG_DFL ); - sighandler( sig ); - } - return 0; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -#include - -static volatile sig_atomic_t flag = 0; - -static int expected_signal = 0; - -static void test_handler( int sig ) -{ - TESTCASE( sig == expected_signal ); - flag = 1; -} - -int main( void ) -{ - /* Could be other than SIG_DFL if you changed the implementation. */ - TESTCASE( signal( SIGABRT, SIG_IGN ) == SIG_DFL ); - /* Should be ignored. */ - TESTCASE( raise( SIGABRT ) == 0 ); - /* Installing test handler, old handler should be returned */ - TESTCASE( signal( SIGABRT, test_handler ) == SIG_IGN ); - /* Raising and checking SIGABRT */ - expected_signal = SIGABRT; - TESTCASE( raise( SIGABRT ) == 0 ); - TESTCASE( flag == 1 ); - /* Re-installing test handler, should have been reset to default */ - /* Could be other than SIG_DFL if you changed the implementation. */ - TESTCASE( signal( SIGABRT, test_handler ) == SIG_DFL ); - /* Raising and checking SIGABRT */ - flag = 0; - TESTCASE( raise( SIGABRT ) == 0 ); - TESTCASE( flag == 1 ); - /* Installing test handler for different signal... */ - TESTCASE( signal( SIGTERM, test_handler ) == SIG_DFL ); - /* Raising and checking SIGTERM */ - expected_signal = SIGTERM; - TESTCASE( raise( SIGTERM ) == 0 ); - TESTCASE( flag == 1 ); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/signal/signal.c b/waterbox/libc/functions/signal/signal.c deleted file mode 100644 index 569daf5ec9..0000000000 --- a/waterbox/libc/functions/signal/signal.c +++ /dev/null @@ -1,69 +0,0 @@ -/* signal( int sig, void (*func)( int ) ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#include - -#ifndef REGTEST - -void (*_PDCLIB_sigabrt)( int ) = SIG_DFL; -void (*_PDCLIB_sigfpe)( int ) = SIG_DFL; -void (*_PDCLIB_sigill)( int ) = SIG_DFL; -void (*_PDCLIB_sigint)( int ) = SIG_DFL; -void (*_PDCLIB_sigsegv)( int ) = SIG_DFL; -void (*_PDCLIB_sigterm)( int ) = SIG_DFL; - -void (*signal( int sig, void (*func)( int ) ) )( int ) -{ - void (*oldhandler)( int ); - if ( sig <= 0 || func == SIG_ERR ) - { - return SIG_ERR; - } - switch ( sig ) - { - case SIGABRT: - oldhandler = _PDCLIB_sigabrt; - _PDCLIB_sigabrt = func; - break; - case SIGFPE: - oldhandler = _PDCLIB_sigfpe; - _PDCLIB_sigfpe = func; - break; - case SIGILL: - oldhandler = _PDCLIB_sigill; - _PDCLIB_sigill = func; - break; - case SIGINT: - oldhandler = _PDCLIB_sigint; - _PDCLIB_sigint = func; - break; - case SIGSEGV: - oldhandler = _PDCLIB_sigsegv; - _PDCLIB_sigsegv = func; - break; - case SIGTERM: - oldhandler = _PDCLIB_sigterm; - _PDCLIB_sigterm = func; - break; - default: - errno = EINVAL; - return SIG_ERR; - } - return oldhandler; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - /* Testing covered by raise.c */ - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/stdio/_PDCLIB_filemode.c b/waterbox/libc/functions/stdio/_PDCLIB_filemode.c deleted file mode 100644 index 92b7b41b65..0000000000 --- a/waterbox/libc/functions/stdio/_PDCLIB_filemode.c +++ /dev/null @@ -1,90 +0,0 @@ -/* _PDCLIB_filemode( const char * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST -#include "_PDCLIB_io.h" -/* Helper function that parses the C-style mode string passed to fopen() into - the PDCLib flags FREAD, FWRITE, FAPPEND, FRW (read-write) and FBIN (binary - mode). -*/ -unsigned int _PDCLIB_filemode( char const * const mode ) -{ - if(!mode) return 0; - - unsigned rc = 0; - switch ( mode[0] ) - { - case 'r': - rc |= _PDCLIB_FREAD; - break; - case 'w': - rc |= _PDCLIB_FWRITE; - break; - case 'a': - rc |= _PDCLIB_FAPPEND | _PDCLIB_FWRITE; - break; - default: - /* Other than read, write, or append - invalid */ - return 0; - } - for ( size_t i = 1; i < 4; ++i ) - { - switch ( mode[i] ) - { - case '+': - if ( rc & _PDCLIB_FRW ) return 0; /* Duplicates are invalid */ - rc |= _PDCLIB_FRW; - break; - case 'b': - if ( rc & _PDCLIB_FBIN ) return 0; /* Duplicates are invalid */ - rc |= _PDCLIB_FBIN; - break; - case '\0': - /* End of mode */ - return rc; - default: - /* Other than read/write or binary - invalid. */ - return 0; - } - } - /* Longer than three chars - invalid. */ - return 0; -} -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ -#ifndef REGTEST - TESTCASE( _PDCLIB_filemode( "r" ) == _PDCLIB_FREAD ); - TESTCASE( _PDCLIB_filemode( "w" ) == _PDCLIB_FWRITE ); - TESTCASE( _PDCLIB_filemode( "a" ) == ( _PDCLIB_FAPPEND | _PDCLIB_FWRITE ) ); - TESTCASE( _PDCLIB_filemode( "r+" ) == ( _PDCLIB_FREAD | _PDCLIB_FRW ) ); - TESTCASE( _PDCLIB_filemode( "w+" ) == ( _PDCLIB_FWRITE | _PDCLIB_FRW ) ); - TESTCASE( _PDCLIB_filemode( "a+" ) == ( _PDCLIB_FAPPEND | _PDCLIB_FWRITE | _PDCLIB_FRW ) ); - TESTCASE( _PDCLIB_filemode( "rb" ) == ( _PDCLIB_FREAD | _PDCLIB_FBIN ) ); - TESTCASE( _PDCLIB_filemode( "wb" ) == ( _PDCLIB_FWRITE | _PDCLIB_FBIN ) ); - TESTCASE( _PDCLIB_filemode( "ab" ) == ( _PDCLIB_FAPPEND | _PDCLIB_FWRITE | _PDCLIB_FBIN ) ); - TESTCASE( _PDCLIB_filemode( "r+b" ) == ( _PDCLIB_FREAD | _PDCLIB_FRW | _PDCLIB_FBIN ) ); - TESTCASE( _PDCLIB_filemode( "w+b" ) == ( _PDCLIB_FWRITE | _PDCLIB_FRW | _PDCLIB_FBIN ) ); - TESTCASE( _PDCLIB_filemode( "a+b" ) == ( _PDCLIB_FAPPEND | _PDCLIB_FWRITE | _PDCLIB_FRW | _PDCLIB_FBIN ) ); - TESTCASE( _PDCLIB_filemode( "rb+" ) == ( _PDCLIB_FREAD | _PDCLIB_FRW | _PDCLIB_FBIN ) ); - TESTCASE( _PDCLIB_filemode( "wb+" ) == ( _PDCLIB_FWRITE | _PDCLIB_FRW | _PDCLIB_FBIN ) ); - TESTCASE( _PDCLIB_filemode( "ab+" ) == ( _PDCLIB_FAPPEND | _PDCLIB_FWRITE | _PDCLIB_FRW | _PDCLIB_FBIN ) ); - TESTCASE( _PDCLIB_filemode( "x" ) == 0 ); - TESTCASE( _PDCLIB_filemode( "r++" ) == 0 ); - TESTCASE( _PDCLIB_filemode( "wbb" ) == 0 ); - TESTCASE( _PDCLIB_filemode( "a+bx" ) == 0 ); -#endif - return TEST_RESULTS; -} - -#endif - diff --git a/waterbox/libc/functions/stdio/_PDCLIB_fillbuffer.c b/waterbox/libc/functions/stdio/_PDCLIB_fillbuffer.c deleted file mode 100644 index 7cfbe93553..0000000000 --- a/waterbox/libc/functions/stdio/_PDCLIB_fillbuffer.c +++ /dev/null @@ -1,46 +0,0 @@ -/* _PDCLIB_fillbuffer( FILE * stream ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST -#include "_PDCLIB_glue.h" -#include "_PDCLIB_io.h" - -int _PDCLIB_fillbuffer( FILE * stream ) -{ - size_t bytesRead; - bool ok = stream->ops->read( stream->handle, stream->buffer, stream->bufsize, - &bytesRead); - - if( ok ) { - if( bytesRead == 0 ) { - stream->status |= _PDCLIB_EOFFLAG; - return EOF; - } - stream->pos.offset += bytesRead; - stream->bufend = bytesRead; - stream->bufidx = 0; - return 0; - } else { - stream->status |= _PDCLIB_ERRORFLAG; - return EOF; - } -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - /* Testing covered by ftell.c */ - return TEST_RESULTS; -} - -#endif - diff --git a/waterbox/libc/functions/stdio/_PDCLIB_flushbuffer.c b/waterbox/libc/functions/stdio/_PDCLIB_flushbuffer.c deleted file mode 100644 index e7cf47c354..0000000000 --- a/waterbox/libc/functions/stdio/_PDCLIB_flushbuffer.c +++ /dev/null @@ -1,119 +0,0 @@ -/* _PDCLIB_flushbuffer( struct _PDCLIB_file_t * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#include - -#ifndef REGTEST -#include "_PDCLIB_glue.h" -#include "_PDCLIB_io.h" - - -static int flushsubbuffer( FILE * stream, size_t length ) -{ - size_t justWrote; - size_t written = 0; - int rv = 0; - -#if 0 - // Very useful for debugging buffering issues - char l = '<', r = '>'; - stream->ops->write( stream->handle, &l, 1, &justWrote ); -#endif - - while( written != length ) - { - size_t toWrite = length - written; - - bool res = stream->ops->write( stream->handle, stream->buffer + written, - toWrite, &justWrote); - written += justWrote; - stream->pos.offset += justWrote; - - if (!res) - { - stream->status |= _PDCLIB_ERRORFLAG; - rv = EOF; - break; - } - } - -#if 0 - stream->ops->write( stream->handle, &r, 1, &justWrote ); -#endif - - stream->bufidx -= written; -#ifdef _PDCLIB_NEED_EOL_TRANSLATION - stream->bufnlexp -= written; -#endif - memmove( stream->buffer, stream->buffer + written, stream->bufidx ); - - return rv; -} - -int _PDCLIB_flushbuffer( FILE * stream ) -{ -#ifdef _PDCLIB_NEED_EOL_TRANSLATION - // if a text stream, and this platform needs EOL translation, well... - if ( ! ( stream->status & _PDCLIB_FBIN ) ) - { - // Special case: buffer is full and we start with a \n - if ( stream->bufnlexp == 0 - && stream->bufidx == stream->bufend - && stream->buffer[0] == '\n' ) - { - char cr = '\r'; - size_t written = 0; - bool res = stream->ops->write( stream->handle, &cr, 1, &written ); - - if (!res) { - stream->status |= _PDCLIB_ERRORFLAG; - return EOF; - } - - } - - for ( ; stream->bufnlexp < stream->bufidx; stream->bufnlexp++ ) - { - if (stream->buffer[stream->bufnlexp] == '\n' ) { - if ( stream->bufidx == stream->bufend ) { - // buffer is full. Need to print out everything up till now - if( flushsubbuffer( stream, stream->bufnlexp - 1 ) ) - { - return EOF; - } - } - - // we have spare space in buffer. Shift everything 1char and - // insert \r - memmove( &stream->buffer[stream->bufnlexp + 1], - &stream->buffer[stream->bufnlexp], - stream->bufidx - stream->bufnlexp ); - stream->buffer[stream->bufnlexp] = '\r'; - - stream->bufnlexp++; - stream->bufidx++; - } - } - } -#endif - return flushsubbuffer( stream, stream->bufidx ); -} - -#endif - - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - /* Testing covered by ftell.c */ - return TEST_RESULTS; -} - -#endif - diff --git a/waterbox/libc/functions/stdio/_PDCLIB_ftell64.c b/waterbox/libc/functions/stdio/_PDCLIB_ftell64.c deleted file mode 100644 index ea93fc69f4..0000000000 --- a/waterbox/libc/functions/stdio/_PDCLIB_ftell64.c +++ /dev/null @@ -1,62 +0,0 @@ -/* _PDCLIB_ftell64( FILE * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#include -#include - -#ifndef REGTEST -#include "_PDCLIB_io.h" - -uint_fast64_t _PDCLIB_ftell64_unlocked( FILE * stream ) -{ - /* ftell() must take into account: - - the actual *physical* offset of the file, i.e. the offset as recognized - by the operating system (and stored in stream->pos.offset); and - - any buffers held by PDCLib, which - - in case of unwritten buffers, count in *addition* to the offset; or - - in case of unprocessed pre-read buffers, count in *substraction* to - the offset. (Remember to count ungetidx into this number.) - Conveniently, the calculation ( ( bufend - bufidx ) + ungetidx ) results - in just the right number in both cases: - - in case of unwritten buffers, ( ( 0 - unwritten ) + 0 ) - i.e. unwritten bytes as negative number - - in case of unprocessed pre-read, ( ( preread - processed ) + unget ) - i.e. unprocessed bytes as positive number. - That is how the somewhat obscure return-value calculation works. - */ - - /* ungetc on a stream at offset==0 will cause an overflow to UINT64_MAX. - * C99/C11 says that the return value of ftell in this case is - * "indeterminate" - */ - - return ( stream->pos.offset - ( ( (int)stream->bufend - (int)stream->bufidx ) + (int)stream->ungetidx ) ); -} - -uint_fast64_t _PDCLIB_ftell64( FILE * stream ) -{ - _PDCLIB_flockfile( stream ); - uint_fast64_t pos = _PDCLIB_ftell64_unlocked( stream ); - _PDCLIB_funlockfile( stream ); - return pos; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -#include - -int main( void ) -{ - /* Tested by ftell */ - return TEST_RESULTS; -} - -#endif - diff --git a/waterbox/libc/functions/stdio/_PDCLIB_fvopen.c b/waterbox/libc/functions/stdio/_PDCLIB_fvopen.c deleted file mode 100644 index 292ba3922c..0000000000 --- a/waterbox/libc/functions/stdio/_PDCLIB_fvopen.c +++ /dev/null @@ -1,105 +0,0 @@ -/* _PDCLIB_fvopen( _PDCLIB_fd_t, _PDCLIB_fileops_t * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#include - -#ifndef REGTEST -#include "_PDCLIB_glue.h" -#include "_PDCLIB_io.h" -#include -#include - -extern FILE * _PDCLIB_filelist; - -FILE * _PDCLIB_fvopen( - _PDCLIB_fd_t fd, - const _PDCLIB_fileops_t *_PDCLIB_restrict ops, - int mode, - const char *_PDCLIB_restrict filename -) -{ - size_t filename_len; - FILE * rc; - if ( mode == NULL ) - { - /* Mode invalid */ - return NULL; - } - /* To reduce the number of malloc calls, all data fields are concatenated: - * the FILE structure itself, - * ungetc buffer, - * filename buffer, - * data buffer. - Data buffer comes last because it might change in size ( setvbuf() ). - */ - filename_len = filename ? strlen( filename ) + 1 : 1; - if ( ( rc = calloc( 1, sizeof( FILE ) + _PDCLIB_UNGETCBUFSIZE + filename_len + BUFSIZ ) ) == NULL ) - { - /* no memory */ - return NULL; - } - - if(mtx_init(&rc->lock, mtx_recursive) != thrd_success) { - free(rc); - return NULL; - } - - rc->status = mode; - rc->ops = ops; - rc->handle = fd; - /* Setting pointers into the memory block allocated above */ - rc->ungetbuf = (unsigned char *)rc + sizeof( FILE ); - rc->filename = (char *)rc->ungetbuf + _PDCLIB_UNGETCBUFSIZE; - rc->buffer = rc->filename + filename_len; - /* Copying filename to FILE structure */ - if(filename) strcpy( rc->filename, filename ); - /* Initializing the rest of the structure */ - rc->bufsize = BUFSIZ; - rc->bufidx = 0; -#ifdef _PDCLIB_NEED_EOL_TRANSLATION - rc->bufnlexp = 0; -#endif - rc->ungetidx = 0; - /* Setting buffer to _IOLBF because "when opened, a stream is fully - buffered if and only if it can be determined not to refer to an - interactive device." - */ - rc->status |= _IOLBF; - /* TODO: Setting mbstate */ - /* Adding to list of open files */ - rc->next = _PDCLIB_filelist; - _PDCLIB_filelist = rc; - return rc; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - /* Some of the tests are not executed for regression tests, as the libc on - my system is at once less forgiving (segfaults on mode NULL) and more - forgiving (accepts undefined modes). - */ - FILE * fh; - remove( testfile ); - TESTCASE_NOREG( fopen( NULL, NULL ) == NULL ); - TESTCASE( fopen( NULL, "w" ) == NULL ); - TESTCASE_NOREG( fopen( "", NULL ) == NULL ); - TESTCASE( fopen( "", "w" ) == NULL ); - TESTCASE( fopen( "foo", "" ) == NULL ); - TESTCASE_NOREG( fopen( testfile, "wq" ) == NULL ); /* Undefined mode */ - TESTCASE_NOREG( fopen( testfile, "wr" ) == NULL ); /* Undefined mode */ - TESTCASE( ( fh = fopen( testfile, "w" ) ) != NULL ); - TESTCASE( fclose( fh ) == 0 ); - TESTCASE( remove( testfile ) == 0 ); - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdio/_PDCLIB_prepread.c b/waterbox/libc/functions/stdio/_PDCLIB_prepread.c deleted file mode 100644 index b0a38dbad8..0000000000 --- a/waterbox/libc/functions/stdio/_PDCLIB_prepread.c +++ /dev/null @@ -1,49 +0,0 @@ -/* _PDCLIB_prepread( FILE * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#include - -#ifndef REGTEST -#include "_PDCLIB_glue.h" - -int _PDCLIB_prepread( FILE * stream ) -{ - if ( ( stream->bufidx > stream->bufend ) || - ( stream->status & ( _PDCLIB_FWRITE | _PDCLIB_FAPPEND | _PDCLIB_ERRORFLAG | _PDCLIB_WIDESTREAM | _PDCLIB_EOFFLAG ) ) || - ! ( stream->status & ( _PDCLIB_FREAD | _PDCLIB_FRW ) ) ) - { - /* Function called on illegal (e.g. output) stream. - See comments on implementation-defined errno values in - <_PDCLIB_config.h>. - */ - errno = EINVAL; - stream->status |= _PDCLIB_ERRORFLAG; - return EOF; - } - stream->status |= _PDCLIB_FREAD | _PDCLIB_BYTESTREAM; - if ( ( stream->bufidx == stream->bufend ) && ( stream->ungetidx == 0 ) ) - { - return _PDCLIB_fillbuffer( stream ); - } - else - { - return 0; - } -} -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - /* Testing covered by ftell.c */ - return TEST_RESULTS; -} - -#endif - diff --git a/waterbox/libc/functions/stdio/_PDCLIB_prepwrite.c b/waterbox/libc/functions/stdio/_PDCLIB_prepwrite.c deleted file mode 100644 index fde9603fd1..0000000000 --- a/waterbox/libc/functions/stdio/_PDCLIB_prepwrite.c +++ /dev/null @@ -1,42 +0,0 @@ -/* _PDCLIB_prepwrite( FILE * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#include - -#ifndef REGTEST -#include "_PDCLIB_io.h" - -int _PDCLIB_prepwrite( FILE * stream ) -{ - if ( ( stream->bufidx < stream->bufend ) || ( stream->ungetidx > 0 ) || - ( stream->status & ( _PDCLIB_FREAD | _PDCLIB_ERRORFLAG | _PDCLIB_WIDESTREAM | _PDCLIB_EOFFLAG ) ) || - ! ( stream->status & ( _PDCLIB_FWRITE | _PDCLIB_FAPPEND | _PDCLIB_FRW ) ) ) - { - /* Function called on illegal (e.g. input) stream. - See the comments on implementation-defined errno values in - <_PDCLIB_config.h>. - */ - errno = EINVAL; - stream->status |= _PDCLIB_ERRORFLAG; - return EOF; - } - stream->status |= _PDCLIB_FWRITE | _PDCLIB_BYTESTREAM; - return 0; -} -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - /* Testing covered by ftell.c */ - return TEST_RESULTS; -} - -#endif - diff --git a/waterbox/libc/functions/stdio/_PDCLIB_print.c b/waterbox/libc/functions/stdio/_PDCLIB_print.c deleted file mode 100644 index c14516f691..0000000000 --- a/waterbox/libc/functions/stdio/_PDCLIB_print.c +++ /dev/null @@ -1,641 +0,0 @@ -/* _PDCLIB_print( const char *, struct _PDCLIB_status_t * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#include -#include -#include -#include -#include -#include -#include - -#ifndef REGTEST -#include "_PDCLIB_io.h" - -/* Using an integer's bits as flags for both the conversion flags and length - modifiers. -*/ -/* FIXME: one too many flags to work on a 16-bit machine, join some (e.g. the - width flags) into a combined field. -*/ -#define E_minus (1<<0) -#define E_plus (1<<1) -#define E_alt (1<<2) -#define E_space (1<<3) -#define E_zero (1<<4) -#define E_done (1<<5) - -#define E_char (1<<6) -#define E_short (1<<7) -#define E_long (1<<8) -#define E_llong (1<<9) -#define E_intmax (1<<10) -#define E_size (1<<11) -#define E_ptrdiff (1<<12) -#define E_intptr (1<<13) - -#define E_ldouble (1<<14) - -#define E_lower (1<<15) -#define E_unsigned (1<<16) - -#define E_TYPES (E_char | E_short | E_long | E_llong | E_intmax \ - | E_size | E_ptrdiff | E_intptr) - -/* returns true if callback-based output succeeded; else false */ -static inline bool cbout( - struct _PDCLIB_status_t * status, - const void * buf, - size_t size ) -{ - size_t rv = status->write( status->ctx, buf, size ); - status->i += rv; - status->current += rv; - return rv == size; -} - -/* repeated output of a single character */ -static inline bool cbrept( - struct _PDCLIB_status_t * status, - char c, - size_t times ) -{ - if ( sizeof(size_t) == 8 && CHAR_BIT == 8) - { - uint64_t spread = UINT64_C(0x0101010101010101) * c; - while ( times ) - { - size_t n = times > 8 ? 8 : times; - if ( !cbout( status, &spread, n ) ) - return false; - times -= n; - } - return true; - } - else if ( sizeof(size_t) == 4 && CHAR_BIT == 8) - { - uint32_t spread = UINT32_C(0x01010101) * c; - while ( times ) - { - size_t n = times > 4 ? 4 : times; - if ( !cbout( status, &spread, n ) ) - return false; - times -= n; - } - return true; - } - else - { - while ( times ) - { - if ( !cbout( status, &c, 1) ) - return false; - times--; - } - return true; - } -} - - -/* Maximum number of output characters = - * number of bits in (u)intmax_t / number of bits per character in smallest - * base. Smallest base is octal, 3 bits/char. - * - * Additionally require 2 extra characters for prefixes - * - * Returns false if an I/O error occured. - */ -static const size_t maxIntLen = sizeof(intmax_t) * CHAR_BIT / 3 + 1; - -static bool int2base( uintmax_t value, struct _PDCLIB_status_t * status ) -{ - char sign = 0; - if ( ! ( status->flags & E_unsigned ) ) - { - intmax_t signval = (intmax_t) value; - bool negative = signval < 0; - value = signval < 0 ? -signval : signval; - - if ( negative ) - { - sign = '-'; - } - else if ( status->flags & E_plus ) - { - sign = '+'; - } - else if (status->flags & E_space ) - { - sign = ' '; - } - } - - // The user could theoretically ask for a silly buffer length here. - // Perhaps after a certain size we should malloc? Or do we refuse to protect - // them from their own stupidity? - size_t bufLen = (status->width > maxIntLen ? status->width : maxIntLen) + 2; - char outbuf[bufLen]; - char * outend = outbuf + bufLen; - int written = 0; - - // Build up our output string - backwards - { - const char * digits = (status->flags & E_lower) ? - _PDCLIB_digits : _PDCLIB_Xdigits; - uintmax_t remaining = value; - if(status->prec != 0 || remaining != 0) do { - uintmax_t digit = remaining % status->base; - remaining /= status->base; - - outend[-++written] = digits[digit]; - } while(remaining != 0); - } - - // Pad field out to the precision specification - while( (long) written < status->prec ) outend[-++written] = '0'; - - // If a field width specified, and zero padding was requested, then pad to - // the field width - unsigned padding = 0; - if ( ( ! ( status->flags & E_minus ) ) && ( status->flags & E_zero ) ) - { - while( written < (int) status->width ) - { - outend[-++written] = '0'; - padding++; - } - } - - // Prefixes - if ( sign != 0 ) - { - if ( padding == 0 ) written++; - outend[-written] = sign; - } - else if ( status->flags & E_alt ) - { - switch ( status->base ) - { - case 8: - if ( outend[-written] != '0' ) outend[-++written] = '0'; - break; - case 16: - // No prefix if zero - if ( value == 0 ) break; - - written += padding < 2 ? 2 - padding : 0; - outend[-written ] = '0'; - outend[-written + 1] = (status->flags & E_lower) ? 'x' : 'X'; - break; - default: - break; - } - } - - // Space padding to field width - if ( ! ( status->flags & ( E_minus | E_zero ) ) ) - { - while( written < (int) status->width ) outend[-++written] = ' '; - } - - // Write output - return cbout( status, outend - written, written ); -} - -/* print a string. returns false if an I/O error occured */ -static bool printstr( const char * str, struct _PDCLIB_status_t * status ) -{ - size_t len = status->prec >= 0 ? strnlen( str, status-> prec) - : strlen(str); - - if ( status->width == 0 || status->flags & E_minus ) - { - // Simple case or left justification - if ( status->prec > 0 ) - { - len = (unsigned) status->prec < len ? (unsigned) status->prec : len; - } - - if ( !cbout( status, str, len ) ) - return false; - - /* right padding */ - if ( status->width > status->current ) { - len = status->width - status->current; - - if ( !cbrept( status, ' ', len ) ) - return false; - } - } else { - // Right justification - - if ( status->width > len ) { - size_t padding = status->width - len; - - if ( !cbrept( status, ' ', padding )) - return false; - } - - if ( !cbout( status, str, len ) ) - return false; - } - - return true; -} - -static bool printchar( char chr, struct _PDCLIB_status_t * status ) -{ - if( ! ( status->flags & E_minus ) ) - { - // Right justification - if ( status-> width ) { - size_t justification = status->width - status->current - 1; - if ( !cbrept( status, ' ', justification )) - return false; - } - - if ( !cbout( status, &chr, 1 )) - return false; - } else { - // Left justification - - if ( !cbout( status, &chr, 1 )) - return false; - - if ( status->width > status->current ) { - if ( !cbrept( status, ' ', status->width - status->current ) ) - return false; - } - } - - return true; -} - -int _PDCLIB_print( const char * spec, struct _PDCLIB_status_t * status ) -{ - const char * orig_spec = spec; - if ( *(++spec) == '%' ) - { - /* %% -> print single '%' */ - if ( !cbout(status, spec, 1) ) - return -1; - ++spec; - return (spec - orig_spec); - } - /* Initializing status structure */ - status->flags = 0; - status->base = 0; - status->current = 0; - status->width = 0; - status->prec = EOF; - - /* First come 0..n flags */ - do - { - switch ( *spec ) - { - case '-': - /* left-aligned output */ - status->flags |= E_minus; - ++spec; - break; - case '+': - /* positive numbers prefixed with '+' */ - status->flags |= E_plus; - ++spec; - break; - case '#': - /* alternative format (leading 0x for hex, 0 for octal) */ - status->flags |= E_alt; - ++spec; - break; - case ' ': - /* positive numbers prefixed with ' ' */ - status->flags |= E_space; - ++spec; - break; - case '0': - /* right-aligned padding done with '0' instead of ' ' */ - status->flags |= E_zero; - ++spec; - break; - default: - /* not a flag, exit flag parsing */ - status->flags |= E_done; - break; - } - } while ( ! ( status->flags & E_done ) ); - - /* Optional field width */ - if ( *spec == '*' ) - { - /* Retrieve width value from argument stack */ - int width = va_arg( status->arg, int ); - if ( width < 0 ) - { - status->flags |= E_minus; - status->width = abs( width ); - } - else - { - status->width = width; - } - ++spec; - } - else - { - /* If a width is given, strtol() will return its value. If not given, - strtol() will return zero. In both cases, endptr will point to the - rest of the conversion specifier - just what we need. - */ - status->width = (int)strtol( spec, (char**)&spec, 10 ); - } - - /* Optional precision */ - if ( *spec == '.' ) - { - ++spec; - if ( *spec == '*' ) - { - /* Retrieve precision value from argument stack. A negative value - is as if no precision is given - as precision is initalized to - EOF (negative), there is no need for testing for negative here. - */ - status->prec = va_arg( status->arg, int ); - ++spec; - } - else - { - status->prec = (int)strtol( spec, (char**) &spec, 10 ); - } - /* Having a precision cancels out any zero flag. */ - status->flags &= ~E_zero; - } - - /* Optional length modifier - We step one character ahead in any case, and step back only if we find - there has been no length modifier (or step ahead another character if it - has been "hh" or "ll"). - */ - switch ( *(spec++) ) - { - case 'h': - if ( *spec == 'h' ) - { - /* hh -> char */ - status->flags |= E_char; - ++spec; - } - else - { - /* h -> short */ - status->flags |= E_short; - } - break; - case 'l': - if ( *spec == 'l' ) - { - /* ll -> long long */ - status->flags |= E_llong; - ++spec; - } - else - { - /* k -> long */ - status->flags |= E_long; - } - break; - case 'j': - /* j -> intmax_t, which might or might not be long long */ - status->flags |= E_intmax; - break; - case 'z': - /* z -> size_t, which might or might not be unsigned int */ - status->flags |= E_size; - break; - case 't': - /* t -> ptrdiff_t, which might or might not be long */ - status->flags |= E_ptrdiff; - break; - case 'L': - /* L -> long double */ - status->flags |= E_ldouble; - break; - default: - --spec; - break; - } - - /* Conversion specifier */ - switch ( *spec ) - { - case 'd': - /* FALLTHROUGH */ - case 'i': - status->base = 10; - break; - case 'o': - status->base = 8; - status->flags |= E_unsigned; - break; - case 'u': - status->base = 10; - status->flags |= E_unsigned; - break; - case 'x': - status->base = 16; - status->flags |= ( E_lower | E_unsigned ); - break; - case 'X': - status->base = 16; - status->flags |= E_unsigned; - break; - case 'f': - case 'F': - case 'e': - case 'E': - case 'g': - case 'G': - break; - case 'a': - case 'A': - break; - case 'c': - /* TODO: wide chars. */ - if ( !printchar( va_arg( status->arg, int ), status ) ) - return -1; - ++spec; - return (spec - orig_spec); - case 's': - /* TODO: wide chars. */ - { - char * s = va_arg( status->arg, char * ); - if ( !printstr( s, status ) ) - return -1; - ++spec; - return (spec - orig_spec); - } - case 'p': - status->base = 16; - status->flags |= ( E_lower | E_unsigned | E_alt | E_intptr ); - break; - case 'n': - { - int * val = va_arg( status->arg, int * ); - *val = status->i; - ++spec; - return (spec - orig_spec); - } - default: - /* No conversion specifier. Bad conversion. */ - return 0; - } - /* Do the actual output based on our findings */ - if ( status->base != 0 ) - { - /* Integer conversions */ - /* TODO: Check for invalid flag combinations. */ - if ( status->flags & E_unsigned ) - { - /* TODO: Marking the default case _PDCLIB_UNREACHABLE breaks %ju test driver? */ - uintmax_t value = 0; - switch ( status->flags & E_TYPES ) - { - case E_char: - value = (uintmax_t)(unsigned char)va_arg( status->arg, int ); - break; - case E_short: - value = (uintmax_t)(unsigned short)va_arg( status->arg, int ); - break; - case 0: - value = (uintmax_t)va_arg( status->arg, unsigned int ); - break; - case E_long: - value = (uintmax_t)va_arg( status->arg, unsigned long ); - break; - case E_llong: - value = (uintmax_t)va_arg( status->arg, unsigned long long ); - break; - case E_size: - value = (uintmax_t)va_arg( status->arg, size_t ); - break; - case E_intptr: - value = (uintmax_t)va_arg( status->arg, uintptr_t ); - break; - case E_ptrdiff: - value = (uintmax_t)va_arg( status->arg, ptrdiff_t ); - break; - case E_intmax: - value = va_arg( status->arg, uintmax_t ); - } - if ( !int2base( value, status ) ) - return -1; - } - else - { - intmax_t value = 0; - switch ( status->flags & E_TYPES ) - { - case E_char: - value = (intmax_t)(char)va_arg( status->arg, int ); - break; - case E_short: - value = (intmax_t)(short)va_arg( status->arg, int ); - break; - case 0: - value = (intmax_t)va_arg( status->arg, int ); - break; - case E_long: - value = (intmax_t)va_arg( status->arg, long ); - break; - case E_llong: - value = (intmax_t)va_arg( status->arg, long long ); - break; - case E_size: - value = (intmax_t)va_arg( status->arg, size_t ); - break; - case E_intptr: - value = (intmax_t)va_arg( status->arg, intptr_t ); - break; - case E_ptrdiff: - value = (intmax_t)va_arg( status->arg, ptrdiff_t ); - break; - case E_intmax: - value = va_arg( status->arg, intmax_t ); - break; - default: - _PDCLIB_UNREACHABLE; - } - - if (!int2base( value, status ) ) - return -1; - } - - if ( status->flags & E_minus && status->current < status->width ) - { - if (!cbrept( status, ' ', status->width - status->current )) - return -1; - } - } - ++spec; - return spec - orig_spec; -} - -#endif - -#ifdef TEST -#define _PDCLIB_FILEID "_PDCLIB/print.c" -#define _PDCLIB_STRINGIO - -#include "_PDCLIB_test.h" - -#ifndef REGTEST -static size_t testcb( void *p, const char *buf, size_t size ) -{ - char **destbuf = p; - memcpy(*destbuf, buf, size); - *destbuf += size; - return size; -} - -static int testprintf( char * buffer, const char * format, ... ) -{ - /* Members: base, flags, n, i, current, width, prec, ctx, cb, arg */ - struct _PDCLIB_status_t status; - status.base = 0; - status.flags = 0; - status.n = 100; - status.i = 0; - status.current = 0; - status.width = 0; - status.prec = 0; - status.ctx = &buffer; - status.write = testcb; - va_start( status.arg, format ); - memset( buffer, '\0', 100 ); - if ( _PDCLIB_print( format, &status ) != (int)strlen( format ) ) - { - printf( "_PDCLIB_print() did not return end-of-specifier on '%s'.\n", format ); - ++TEST_RESULTS; - } - va_end( status.arg ); - return status.i; -} -#endif - -#define TEST_CONVERSION_ONLY - -int main( void ) -{ -#ifndef REGTEST - char target[100]; -#include "printf_testcases.h" -#endif - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdio/_PDCLIB_scan.c b/waterbox/libc/functions/stdio/_PDCLIB_scan.c deleted file mode 100644 index aa7be84e75..0000000000 --- a/waterbox/libc/functions/stdio/_PDCLIB_scan.c +++ /dev/null @@ -1,632 +0,0 @@ -/* _PDCLIB_scan( const char *, struct _PDCLIB_status_t * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifndef REGTEST - -#include "_PDCLIB_io.h" - -/* Using an integer's bits as flags for both the conversion flags and length - modifiers. -*/ -#define E_suppressed 1<<0 -#define E_char 1<<6 -#define E_short 1<<7 -#define E_long 1<<8 -#define E_llong 1<<9 -#define E_intmax 1<<10 -#define E_size 1<<11 -#define E_ptrdiff 1<<12 -#define E_intptr 1<<13 -#define E_ldouble 1<<14 -#define E_unsigned 1<<16 - - -/* Helper function to get a character from the string or stream, whatever is - used for input. When reading from a string, returns EOF on end-of-string - so that handling of the return value can be uniform for both streams and - strings. -*/ -static int GET( struct _PDCLIB_status_t * status ) -{ - int rc = EOF; - if ( status->stream != NULL ) - { - rc = getc( status->stream ); - } - else - { - rc = ( *status->s == '\0' ) ? EOF : (unsigned char)*((status->s)++); - } - if ( rc != EOF ) - { - ++(status->i); - ++(status->current); - } - return rc; -} - - -/* Helper function to put a read character back into the string or stream, - whatever is used for input. -*/ -static void UNGET( int c, struct _PDCLIB_status_t * status ) -{ - if ( status->stream != NULL ) - { - ungetc( c, status->stream ); /* TODO: Error? */ - } - else - { - --(status->s); - } - --(status->i); - --(status->current); -} - - -/* Helper function to check if a character is part of a given scanset */ -static bool IN_SCANSET( const char * scanlist, const char * end_scanlist, int rc ) -{ - // SOLAR - int previous = -1; - while ( scanlist != end_scanlist ) - { - if ( ( *scanlist == '-' ) && ( previous != -1 ) ) - { - /* possible scangroup ("a-z") */ - if ( ++scanlist == end_scanlist ) - { - /* '-' at end of scanlist does not describe a scangroup */ - return rc == '-'; - } - while ( ++previous <= (unsigned char)*scanlist ) - { - if ( previous == rc ) - { - return true; - } - } - previous = -1; - } - else - { - /* not a scangroup, check verbatim */ - if ( rc == (unsigned char)*scanlist ) - { - return true; - } - previous = (unsigned char)(*scanlist++); - } - } - return false; -} - - -const char * _PDCLIB_scan( const char * spec, struct _PDCLIB_status_t * status ) -{ - /* generic input character */ - int rc = EOF; - const char * orig_spec = spec; - if ( *(++spec) == '%' ) - { - /* %% -> match single '%' */ - rc = GET( status ); - switch ( rc ) - { - case EOF: - /* input error */ - if ( status->n == 0 ) - { - status->n = -1; - } - return NULL; - case '%': - return ++spec; - default: - UNGET( rc, status ); - break; - } - } - /* Initializing status structure */ - status->flags = 0; - status->base = -1; - status->current = 0; - status->width = 0; - status->prec = 0; - - /* '*' suppresses assigning parsed value to variable */ - if ( *spec == '*' ) - { - status->flags |= E_suppressed; - ++spec; - } - - /* If a width is given, strtol() will return its value. If not given, - strtol() will return zero. In both cases, endptr will point to the - rest of the conversion specifier - just what we need. - */ - char const * prev_spec = spec; - status->width = (int)strtol( spec, (char**)&spec, 10 ); - if ( spec == prev_spec ) - { - status->width = UINT_MAX; - } - - /* Optional length modifier - We step one character ahead in any case, and step back only if we find - there has been no length modifier (or step ahead another character if it - has been "hh" or "ll"). - */ - switch ( *(spec++) ) - { - case 'h': - if ( *spec == 'h' ) - { - /* hh -> char */ - status->flags |= E_char; - ++spec; - } - else - { - /* h -> short */ - status->flags |= E_short; - } - break; - case 'l': - if ( *spec == 'l' ) - { - /* ll -> long long */ - status->flags |= E_llong; - ++spec; - } - else - { - /* l -> long */ - status->flags |= E_long; - } - break; - case 'j': - /* j -> intmax_t, which might or might not be long long */ - status->flags |= E_intmax; - break; - case 'z': - /* z -> size_t, which might or might not be unsigned int */ - status->flags |= E_size; - break; - case 't': - /* t -> ptrdiff_t, which might or might not be long */ - status->flags |= E_ptrdiff; - break; - case 'L': - /* L -> long double */ - status->flags |= E_ldouble; - break; - default: - --spec; - break; - } - - /* Conversion specifier */ - - /* whether valid input had been parsed */ - bool value_parsed = false; - - switch ( *spec ) - { - case 'd': - status->base = 10; - break; - case 'i': - status->base = 0; - break; - case 'o': - status->base = 8; - status->flags |= E_unsigned; - break; - case 'u': - status->base = 10; - status->flags |= E_unsigned; - break; - case 'x': - status->base = 16; - status->flags |= E_unsigned; - break; - case 'f': - case 'F': - case 'e': - case 'E': - case 'g': - case 'G': - case 'a': - case 'A': - break; - case 'c': - { - char * c = va_arg( status->arg, char * ); - /* for %c, default width is one */ - if ( status->width == UINT_MAX ) - { - status->width = 1; - } - /* reading until width reached or input exhausted */ - while ( ( status->current < status->width ) && - ( ( rc = GET( status ) ) != EOF ) ) - { - *(c++) = rc; - value_parsed = true; - } - /* width or input exhausted */ - if ( value_parsed ) - { - ++status->n; - return ++spec; - } - else - { - /* input error, no character read */ - if ( status->n == 0 ) - { - status->n = -1; - } - return NULL; - } - } - case 's': - { - char * c = va_arg( status->arg, char * ); - while ( ( status->current < status->width ) && - ( ( rc = GET( status ) ) != EOF ) ) - { - if ( isspace( rc ) ) - { - UNGET( rc, status ); - if ( value_parsed ) - { - /* matching sequence terminated by whitespace */ - *c = '\0'; - ++status->n; - return ++spec; - } - else - { - /* matching error */ - return NULL; - } - } - else - { - /* match */ - value_parsed = true; - *(c++) = rc; - } - } - /* width or input exhausted */ - if ( value_parsed ) - { - *c = '\0'; - ++status->n; - return ++spec; - } - else - { - /* input error, no character read */ - if ( status->n == 0 ) - { - status->n = -1; - } - return NULL; - } - } - case '[': - { - const char * endspec = spec; - bool negative_scanlist = false; - if ( *(++endspec) == '^' ) - { - negative_scanlist = true; - ++endspec; - } - spec = endspec; - do - { - // TODO: This can run beyond a malformed format string - ++endspec; - } while ( *endspec != ']' ); - // read according to scanlist, equiv. to %s above - char * c = va_arg( status->arg, char * ); - while ( ( status->current < status->width ) && - ( ( rc = GET( status ) ) != EOF ) ) - { - if ( negative_scanlist ) - { - if ( IN_SCANSET( spec, endspec, rc ) ) - { - UNGET( rc, status ); - break; - } - } - else - { - if ( ! IN_SCANSET( spec, endspec, rc ) ) - { - UNGET( rc, status ); - break; - } - } - value_parsed = true; - *(c++) = rc; - } - if ( value_parsed ) - { - *c = '\0'; - ++status->n; - return ++endspec; - } - else - { - if ( rc == EOF ) - { - status->n = -1; - } - return NULL; - } - } - case 'p': - status->base = 16; - // TODO: Like _PDCLIB_print, E_pointer(?) - status->flags |= E_unsigned | E_long; - break; - case 'n': - { - int * val = va_arg( status->arg, int * ); - *val = status->i; - return ++spec; - } - default: - /* No conversion specifier. Bad conversion. */ - return orig_spec; - } - - if ( status->base != -1 ) - { - /* integer conversion */ - uintmax_t value = 0; /* absolute value read */ - bool prefix_parsed = false; - int sign = 0; - while ( ( status->current < status->width ) && - ( ( rc = GET( status ) ) != EOF ) ) - { - if ( isspace( rc ) ) - { - if ( sign ) - { - /* matching sequence terminated by whitespace */ - UNGET( rc, status ); - break; - } - else - { - /* leading whitespace not counted against width */ - status->current--; - } - } - else if ( ! sign ) - { - /* no sign parsed yet */ - switch ( rc ) - { - case '-': - sign = -1; - break; - case '+': - sign = 1; - break; - default: - /* not a sign; put back character */ - sign = 1; - UNGET( rc, status ); - break; - } - } - else if ( ! prefix_parsed ) - { - /* no prefix (0x... for hex, 0... for octal) parsed yet */ - prefix_parsed = true; - if ( rc != '0' ) - { - /* not a prefix; if base not yet set, set to decimal */ - if ( status->base == 0 ) - { - status->base = 10; - } - UNGET( rc, status ); - } - else - { - /* starts with zero, so it might be a prefix. */ - /* check what follows next (might be 0x...) */ - if ( ( status->current < status->width ) && - ( ( rc = GET( status ) ) != EOF ) ) - { - if ( tolower( rc ) == 'x' ) - { - /* 0x... would be prefix for hex base... */ - if ( ( status->base == 0 ) || - ( status->base == 16 ) ) - { - status->base = 16; - } - else - { - /* ...unless already set to other value */ - UNGET( rc, status ); - value_parsed = true; - } - } - else - { - /* 0... but not 0x.... would be octal prefix */ - UNGET( rc, status ); - if ( status->base == 0 ) - { - status->base = 8; - } - /* in any case we have read a zero */ - value_parsed = true; - } - } - else - { - /* failed to read beyond the initial zero */ - value_parsed = true; - break; - } - } - } - else - { - char * digitptr = memchr( _PDCLIB_digits, tolower( rc ), status->base ); - if ( digitptr == NULL ) - { - /* end of input item */ - UNGET( rc, status ); - break; - } - value *= status->base; - value += digitptr - _PDCLIB_digits; - value_parsed = true; - } - } - /* width or input exhausted, or non-matching character */ - if ( ! value_parsed ) - { - /* out of input before anything could be parsed - input error */ - /* FIXME: if first character does not match, value_parsed is not set - but it is NOT an input error */ - if ( ( status->n == 0 ) && ( rc == EOF ) ) - { - status->n = -1; - } - return NULL; - } - /* convert value to target type and assign to parameter */ - if ( ! ( status->flags & E_suppressed ) ) - { - switch ( status->flags & ( E_char | E_short | E_long | E_llong | - E_intmax | E_size | E_ptrdiff | - E_unsigned ) ) - { - case E_char: - *( va_arg( status->arg, char * ) ) = (char)( value * sign ); - break; - case E_char | E_unsigned: - *( va_arg( status->arg, unsigned char * ) ) = (unsigned char)( value * sign ); - break; - - case E_short: - *( va_arg( status->arg, short * ) ) = (short)( value * sign ); - break; - case E_short | E_unsigned: - *( va_arg( status->arg, unsigned short * ) ) = (unsigned short)( value * sign ); - break; - - case 0: - *( va_arg( status->arg, int * ) ) = (int)( value * sign ); - break; - case E_unsigned: - *( va_arg( status->arg, unsigned int * ) ) = (unsigned int)( value * sign ); - break; - - case E_long: - *( va_arg( status->arg, long * ) ) = (long)( value * sign ); - break; - case E_long | E_unsigned: - *( va_arg( status->arg, unsigned long * ) ) = (unsigned long)( value * sign ); - break; - - case E_llong: - *( va_arg( status->arg, long long * ) ) = (long long)( value * sign ); - break; - case E_llong | E_unsigned: - *( va_arg( status->arg, unsigned long long * ) ) = (unsigned long long)( value * sign ); - break; - - case E_intmax: - *( va_arg( status->arg, intmax_t * ) ) = (intmax_t)( value * sign ); - break; - case E_intmax | E_unsigned: - *( va_arg( status->arg, uintmax_t * ) ) = (uintmax_t)( value * sign ); - break; - - case E_size: - /* E_size always implies unsigned */ - *( va_arg( status->arg, size_t * ) ) = (size_t)( value * sign ); - break; - - case E_ptrdiff: - /* E_ptrdiff always implies signed */ - *( va_arg( status->arg, ptrdiff_t * ) ) = (ptrdiff_t)( value * sign ); - break; - - default: - puts( "UNSUPPORTED SCANF FLAG COMBINATION" ); - return NULL; /* behaviour unspecified */ - } - ++(status->n); - } - return ++spec; - } - /* TODO: Floats. */ - return NULL; -} -#endif - -#ifdef TEST -#define _PDCLIB_FILEID "_PDCLIB/scan.c" -#define _PDCLIB_STRINGIO - -#include "_PDCLIB_test.h" - -#ifndef REGTEST -static int testscanf( char const * s, char const * format, ... ) -{ - struct _PDCLIB_status_t status; - status.n = 0; - status.i = 0; - status.s = (char *)s; - status.stream = NULL; - va_start( status.arg, format ); - if ( *(_PDCLIB_scan( format, &status )) != '\0' ) - { - printf( "_PDCLIB_scan() did not return end-of-specifier on '%s'.\n", format ); - ++TEST_RESULTS; - } - va_end( status.arg ); - return status.n; -} -#endif - -#define TEST_CONVERSION_ONLY - -int main( void ) -{ -#ifndef REGTEST - char source[100]; -#include "scanf_testcases.h" -#endif - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdio/_PDCLIB_seek.c b/waterbox/libc/functions/stdio/_PDCLIB_seek.c deleted file mode 100644 index 5d88a15cb9..0000000000 --- a/waterbox/libc/functions/stdio/_PDCLIB_seek.c +++ /dev/null @@ -1,41 +0,0 @@ -/* int64_t _PDCLIB_seek( FILE *, int64_t, int ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#include -#include -#ifndef REGTEST -#include "_PDCLIB_io.h" - -int_fast64_t _PDCLIB_seek( FILE * stream, - int_fast64_t offset, - int whence ) -{ - int_fast64_t newPos; - if(!stream->ops->seek(stream->handle, offset, whence, &newPos)) { - return EOF; - } - - stream->ungetidx = 0; - stream->bufidx = 0; - stream->bufend = 0; - stream->pos.offset = newPos; - return newPos; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - /* Testing covered by ftell.c */ - return TEST_RESULTS; -} - -#endif - diff --git a/waterbox/libc/functions/stdio/_cbprintf.c b/waterbox/libc/functions/stdio/_cbprintf.c deleted file mode 100644 index 3598a5c47c..0000000000 --- a/waterbox/libc/functions/stdio/_cbprintf.c +++ /dev/null @@ -1,56 +0,0 @@ -/* _cbprintf( void *, size_t (*)( void *, const char *, size_t ), const char *, ... ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#include -#include - -#ifndef REGTEST - -int _cbprintf( - void * p, - size_t (*cb)( void*, const char*, size_t ), - const char * _PDCLIB_restrict format, - ...) -{ - int rc; - va_list ap; - va_start( ap, format ); - rc = _vcbprintf( p, cb, format, ap ); - va_end( ap ); - return rc; -} - -#endif - -#ifdef TEST -#define _PDCLIB_FILEID "stdio/sprintf.c" -#define _PDCLIB_STRINGIO -#include - -#include "_PDCLIB_test.h" - -static char * bufptr; -static size_t testcb( void *p, const char *buf, size_t size ) -{ - memcpy(bufptr, buf, size); - bufptr += size; - *bufptr = '\0'; - return size; -} - -#define testprintf( s, ... ) _cbprintf( bufptr = s, testcb, __VA_ARGS__ ) - -int main( void ) -{ -#ifndef REGTEST - char target[100]; -#include "printf_testcases.h" -#endif - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdio/_vcbprintf.c b/waterbox/libc/functions/stdio/_vcbprintf.c deleted file mode 100644 index bafe6aee93..0000000000 --- a/waterbox/libc/functions/stdio/_vcbprintf.c +++ /dev/null @@ -1,124 +0,0 @@ -/* vsnprintf( char *, size_t, const char *, va_list ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#include -#include - -#ifndef REGTEST -#include "_PDCLIB_io.h" - -/* returns true if callback-based output succeeded; else false */ -static inline bool cbout( - struct _PDCLIB_status_t * status, - const char *buf, - size_t size ) -{ - size_t rv = status->write( status->ctx, buf, size ); - status->i += rv; - return rv == size; -} - -int _vcbprintf( - void *p, - size_t ( *cb ) ( void *p, const char *buf, size_t size ), - const char *format, - va_list arg ) -{ - struct _PDCLIB_status_t status; - status.base = 0; - status.flags = 0; - status.n = 0; - status.i = 0; - status.current = 0; - status.width = 0; - status.prec = 0; - status.ctx = p; - status.write = cb; - va_copy( status.arg, arg ); - - /* Alternate between outputing runs of verbatim text and conversions */ - while ( *format != '\0' ) - { - const char *mark = format; - while ( *format != '\0' && *format != '%') - { - format++; - } - - if ( mark != format ) - { - if ( !cbout(&status, mark, format - mark) ) - return -1; - } - - if ( *format == '%' ) { - int consumed = _PDCLIB_print( format, &status ); - if ( consumed > 0 ) - { - format += consumed; - } - else if ( consumed == 0 ) - { - /* not a conversion specifier, print verbatim */ - if ( !cbout(&status, format++, 1) ) - return -1; - } - else - { - /* I/O callback error */ - return -1; - } - } - } - - va_end( status.arg ); - return status.i; -} - -#endif - -#ifdef TEST -#define _PDCLIB_FILEID "stdio/_vcbprintf.c" -#define _PDCLIB_STRINGIO -#include -#include -#include "_PDCLIB_test.h" - -#ifndef REGTEST - -static size_t testcb( void *p, const char *buf, size_t size ) -{ - char **destbuf = p; - memcpy(*destbuf, buf, size); - *destbuf += size; - return size; -} - -static int testprintf( char * s, const char * format, ... ) -{ - int i; - va_list arg; - va_start( arg, format ); - i = _vcbprintf( &s, testcb, format, arg ); - *s = 0; - va_end( arg ); - return i; -} - -#endif - -int main( void ) -{ -#ifndef REGTEST - char target[100]; -#include "printf_testcases.h" -#endif - return TEST_RESULTS; -} - -#endif - diff --git a/waterbox/libc/functions/stdio/clearerr.c b/waterbox/libc/functions/stdio/clearerr.c deleted file mode 100644 index e569fd4085..0000000000 --- a/waterbox/libc/functions/stdio/clearerr.c +++ /dev/null @@ -1,59 +0,0 @@ -/* clearerr( FILE * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST -#include "_PDCLIB_io.h" - -void _PDCLIB_clearerr_unlocked( FILE * stream ) -{ - stream->status &= ~( _PDCLIB_ERRORFLAG | _PDCLIB_EOFFLAG ); -} - -void clearerr( FILE * stream ) -{ - _PDCLIB_flockfile( stream ); - _PDCLIB_clearerr_unlocked( stream ); - _PDCLIB_funlockfile( stream ); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - FILE * fh; - TESTCASE( ( fh = tmpfile() ) != NULL ); - /* Flags should be clear */ - TESTCASE( ! ferror( fh ) ); - TESTCASE( ! feof( fh ) ); - /* Reading from input stream - should provoke error */ - /* FIXME: Apparently glibc disagrees on this assumption. How to provoke error on glibc? */ - TESTCASE( fgetc( fh ) == EOF ); - TESTCASE( ferror( fh ) ); - TESTCASE( ! feof( fh ) ); - /* clearerr() should clear flags */ - clearerr( fh ); - TESTCASE( ! ferror( fh ) ); - TESTCASE( ! feof( fh ) ); - /* Reading from empty stream - should provoke EOF */ - rewind( fh ); - TESTCASE( fgetc( fh ) == EOF ); - TESTCASE( ! ferror( fh ) ); - TESTCASE( feof( fh ) ); - /* clearerr() should clear flags */ - clearerr( fh ); - TESTCASE( ! ferror( fh ) ); - TESTCASE( ! feof( fh ) ); - TESTCASE( fclose( fh ) == 0 ); - return TEST_RESULTS; -} - -#endif - diff --git a/waterbox/libc/functions/stdio/fclose.c b/waterbox/libc/functions/stdio/fclose.c deleted file mode 100644 index c80e31d1a0..0000000000 --- a/waterbox/libc/functions/stdio/fclose.c +++ /dev/null @@ -1,110 +0,0 @@ -/* fclose( FILE * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#include -#include - -#ifndef REGTEST -#include "_PDCLIB_io.h" -#include - -extern FILE * _PDCLIB_filelist; - -int fclose( FILE * stream ) -{ - FILE * current = _PDCLIB_filelist; - FILE * previous = NULL; - /* Checking that the FILE handle is actually one we had opened before. */ - while ( current != NULL ) - { - if ( stream == current ) - { - /* Flush buffer */ - if ( stream->status & _PDCLIB_FWRITE ) - { - if ( _PDCLIB_flushbuffer( stream ) == EOF ) - { - /* Flush failed, errno already set */ - return EOF; - } - } - - /* Release mutex*/ - mtx_destroy( &stream->lock ); - - /* Close handle */ - stream->ops->close(stream->handle); - - /* Remove stream from list */ - if ( previous != NULL ) - { - previous->next = stream->next; - } - else - { - _PDCLIB_filelist = stream->next; - } - /* Delete tmpfile() */ - if ( stream->status & _PDCLIB_DELONCLOSE ) - { - remove( stream->filename ); - } - /* Free user buffer (SetVBuf allocated) */ - if ( stream->status & _PDCLIB_FREEBUFFER ) - { - free( stream->buffer ); - } - /* Free stream */ - if ( ! ( stream->status & _PDCLIB_STATIC ) ) - { - free( stream ); - } - return 0; - } - previous = current; - current = current->next; - } - - errno = EINVAL; - return -1; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ -#ifndef REGTEST - FILE * file1; - FILE * file2; - remove( testfile1 ); - remove( testfile2 ); - TESTCASE( _PDCLIB_filelist == stdin ); - TESTCASE( ( file1 = fopen( testfile1, "w" ) ) != NULL ); - TESTCASE( _PDCLIB_filelist == file1 ); - TESTCASE( ( file2 = fopen( testfile2, "w" ) ) != NULL ); - TESTCASE( _PDCLIB_filelist == file2 ); - TESTCASE( fclose( file2 ) == 0 ); - TESTCASE( _PDCLIB_filelist == file1 ); - TESTCASE( ( file2 = fopen( testfile2, "w" ) ) != NULL ); - TESTCASE( _PDCLIB_filelist == file2 ); - TESTCASE( fclose( file1 ) == 0 ); - TESTCASE( _PDCLIB_filelist == file2 ); - TESTCASE( fclose( file2 ) == 0 ); - TESTCASE( _PDCLIB_filelist == stdin ); - TESTCASE( remove( testfile1 ) == 0 ); - TESTCASE( remove( testfile2 ) == 0 ); -#else - puts( " NOTEST fclose() test driver is PDCLib-specific." ); -#endif - return TEST_RESULTS; -} - -#endif - diff --git a/waterbox/libc/functions/stdio/feof.c b/waterbox/libc/functions/stdio/feof.c deleted file mode 100644 index f5d0584658..0000000000 --- a/waterbox/libc/functions/stdio/feof.c +++ /dev/null @@ -1,37 +0,0 @@ -/* feof( FILE * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST -#include "_PDCLIB_io.h" - -int _PDCLIB_feof_unlocked( FILE * stream ) -{ - return stream->status & _PDCLIB_EOFFLAG; -} - -int feof( FILE * stream ) -{ - _PDCLIB_flockfile( stream ); - int eof = _PDCLIB_feof_unlocked( stream ); - _PDCLIB_funlockfile( stream ); - return eof; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - /* Testing covered by clearerr(). */ - return TEST_RESULTS; -} - -#endif - diff --git a/waterbox/libc/functions/stdio/ferror.c b/waterbox/libc/functions/stdio/ferror.c deleted file mode 100644 index 43fad2d8f6..0000000000 --- a/waterbox/libc/functions/stdio/ferror.c +++ /dev/null @@ -1,37 +0,0 @@ -/* ferror( FILE * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST -#include "_PDCLIB_io.h" - -int _PDCLIB_ferror_unlocked( FILE * stream ) -{ - return stream->status & _PDCLIB_ERRORFLAG; -} - -int ferror( FILE * stream ) -{ - _PDCLIB_flockfile( stream ); - int error = _PDCLIB_ferror_unlocked( stream ); - _PDCLIB_funlockfile( stream ); - return error; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - /* Testing covered by clearerr(). */ - return TEST_RESULTS; -} - -#endif - diff --git a/waterbox/libc/functions/stdio/fflush.c b/waterbox/libc/functions/stdio/fflush.c deleted file mode 100644 index 28793e3492..0000000000 --- a/waterbox/libc/functions/stdio/fflush.c +++ /dev/null @@ -1,60 +0,0 @@ -/* fflush( FILE * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST -#include "_PDCLIB_io.h" - -extern FILE * _PDCLIB_filelist; - -int _PDCLIB_fflush_unlocked( FILE * stream ) -{ - if ( stream == NULL ) - { - stream = _PDCLIB_filelist; - /* TODO: Check what happens when fflush( NULL ) encounters write errors, in other libs */ - int rc = 0; - while ( stream != NULL ) - { - if ( stream->status & _PDCLIB_FWRITE ) - { - if ( _PDCLIB_flushbuffer( stream ) == EOF ) - { - rc = EOF; - } - } - stream = stream->next; - } - return rc; - } - else - { - return _PDCLIB_flushbuffer( stream ); - } -} - -int fflush( FILE * stream ) -{ - _PDCLIB_flockfile( stream ); - int res = _PDCLIB_fflush_unlocked(stream); - _PDCLIB_funlockfile( stream ); - return res; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - /* Testing covered by ftell.c */ - return TEST_RESULTS; -} - -#endif - diff --git a/waterbox/libc/functions/stdio/fgetc.c b/waterbox/libc/functions/stdio/fgetc.c deleted file mode 100644 index 0b042c7d5b..0000000000 --- a/waterbox/libc/functions/stdio/fgetc.c +++ /dev/null @@ -1,45 +0,0 @@ -/* fgetc( FILE * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST -#include "_PDCLIB_io.h" - -int _PDCLIB_fgetc_unlocked( FILE * stream ) -{ - if ( _PDCLIB_prepread( stream ) == EOF ) - { - return EOF; - } - - char c; - - size_t n = _PDCLIB_getchars( &c, 1, EOF, stream ); - - return n == 0 ? EOF : (unsigned char) c; -} - -int fgetc( FILE * stream ) -{ - _PDCLIB_flockfile( stream ); - int c = _PDCLIB_fgetc_unlocked( stream ); - _PDCLIB_funlockfile( stream ); - return c; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - /* Testing covered by ftell.c */ - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdio/fgetpos.c b/waterbox/libc/functions/stdio/fgetpos.c deleted file mode 100644 index ff88fba500..0000000000 --- a/waterbox/libc/functions/stdio/fgetpos.c +++ /dev/null @@ -1,51 +0,0 @@ -/* fgetpos( FILE * , fpos_t * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST -#include "_PDCLIB_io.h" - -int _PDCLIB_fgetpos_unlocked( FILE * _PDCLIB_restrict stream, _PDCLIB_fpos_t * _PDCLIB_restrict pos ) -{ - pos->offset = stream->pos.offset + stream->bufidx - stream->ungetidx; - pos->mbs = stream->pos.mbs; - /* TODO: Add mbstate. */ - return 0; -} - -int fgetpos( FILE * _PDCLIB_restrict stream, _PDCLIB_fpos_t * _PDCLIB_restrict pos ) -{ - _PDCLIB_flockfile( stream ); - int res = _PDCLIB_fgetpos_unlocked( stream, pos ); - _PDCLIB_funlockfile( stream ); - return res; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" -#include - -int main( void ) -{ - FILE * fh; - fpos_t pos1, pos2; - TESTCASE( ( fh = tmpfile() ) != NULL ); - TESTCASE( fgetpos( fh, &pos1 ) == 0 ); - TESTCASE( fwrite( teststring, 1, strlen( teststring ), fh ) == strlen( teststring ) ); - TESTCASE( (size_t)ftell( fh ) == strlen( teststring ) ); - TESTCASE( fgetpos( fh, &pos2 ) == 0 ); - TESTCASE( fsetpos( fh, &pos1 ) == 0 ); - TESTCASE( ftell( fh ) == 0 ); - TESTCASE( fsetpos( fh, &pos2 ) == 0 ); - TESTCASE( (size_t)ftell( fh ) == strlen( teststring ) ); - TESTCASE( fclose( fh ) == 0 ); - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdio/fgets.c b/waterbox/libc/functions/stdio/fgets.c deleted file mode 100644 index 8752892bed..0000000000 --- a/waterbox/libc/functions/stdio/fgets.c +++ /dev/null @@ -1,84 +0,0 @@ -/* fgets( char *, int, FILE * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST -#include "_PDCLIB_io.h" - -char * _PDCLIB_fgets_unlocked( char * _PDCLIB_restrict s, int size, FILE * _PDCLIB_restrict stream ) -{ - if ( size == 0 ) - { - return NULL; - } - if ( size == 1 ) - { - *s = '\0'; - return s; - } - if ( _PDCLIB_prepread( stream ) == EOF ) - { - return NULL; - } - char * dest = s; - - dest += _PDCLIB_getchars( dest, size - 1, '\n', stream ); - - *dest = '\0'; - return ( dest == s ) ? NULL : s; -} - -char * fgets( char * _PDCLIB_restrict s, int size, - FILE * _PDCLIB_restrict stream ) -{ - _PDCLIB_flockfile( stream ); - char* r = _PDCLIB_fgets_unlocked( s, size, stream ); - _PDCLIB_funlockfile( stream ); - return r; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" -#include - -int main( void ) -{ - FILE * fh; - char buffer[10]; - char const * fgets_test = "foo\nbar\0baz\nweenie"; - TESTCASE( ( fh = fopen( testfile, "wb+" ) ) != NULL ); - TESTCASE( fwrite( fgets_test, 1, 18, fh ) == 18 ); - rewind( fh ); - TESTCASE( fgets( buffer, 10, fh ) == buffer ); - TESTCASE( strcmp( buffer, "foo\n" ) == 0 ); - TESTCASE( fgets( buffer, 10, fh ) == buffer ); - TESTCASE( memcmp( buffer, "bar\0baz\n", 8 ) == 0 ); - TESTCASE( fgets( buffer, 10, fh ) == buffer ); - TESTCASE( strcmp( buffer, "weenie" ) == 0 ); - TESTCASE( feof( fh ) ); - TESTCASE( fseek( fh, -1, SEEK_END ) == 0 ); - TESTCASE( fgets( buffer, 1, fh ) == buffer ); - TESTCASE( strcmp( buffer, "" ) == 0 ); - TESTCASE( fgets( buffer, 0, fh ) == NULL ); - TESTCASE( ! feof( fh ) ); - TESTCASE( fgets( buffer, 1, fh ) == buffer ); - TESTCASE( strcmp( buffer, "" ) == 0 ); - TESTCASE( ! feof( fh ) ); - TESTCASE( fgets( buffer, 2, fh ) == buffer ); - TESTCASE( strcmp( buffer, "e" ) == 0 ); - TESTCASE( fseek( fh, 0, SEEK_END ) == 0 ); - TESTCASE( fgets( buffer, 2, fh ) == NULL ); - TESTCASE( feof( fh ) ); - TESTCASE( fclose( fh ) == 0 ); - TESTCASE( remove( testfile ) == 0 ); - return TEST_RESULTS; -} - -#endif - diff --git a/waterbox/libc/functions/stdio/flockfile.c b/waterbox/libc/functions/stdio/flockfile.c deleted file mode 100644 index 559f46abd3..0000000000 --- a/waterbox/libc/functions/stdio/flockfile.c +++ /dev/null @@ -1,33 +0,0 @@ -/* flockfile(FILE * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#include - -#ifndef REGTEST -#include "_PDCLIB_io.h" -#include -#include - -void _PDCLIB_flockfile( FILE * file ) -{ - if( mtx_lock( &file->lock ) != thrd_success ) { - abort(); - } -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - // Not tested here - tested by other stdio test drivers - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdio/fopen.c b/waterbox/libc/functions/stdio/fopen.c deleted file mode 100644 index 3d9f95ab1a..0000000000 --- a/waterbox/libc/functions/stdio/fopen.c +++ /dev/null @@ -1,67 +0,0 @@ -/* fopen( const char *, const char * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#include - -#ifndef REGTEST -#include "_PDCLIB_io.h" -#include "_PDCLIB_glue.h" -#include -#include - -extern FILE * _PDCLIB_filelist; - -FILE * fopen( const char * _PDCLIB_restrict filename, - const char * _PDCLIB_restrict mode ) -{ - int imode = _PDCLIB_filemode( mode ); - - if( imode == 0 || filename == NULL ) - return NULL; - - _PDCLIB_fd_t fd; - const _PDCLIB_fileops_t * ops; - if(!_PDCLIB_open( &fd, &ops, filename, imode )) { - return NULL; - } - - FILE * f = _PDCLIB_fvopen( fd, ops, imode, filename ); - if(!f) { - int saveErrno = errno; - ops->close(fd); - errno = saveErrno; - } - return f; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - /* Some of the tests are not executed for regression tests, as the libc on - my system is at once less forgiving (segfaults on mode NULL) and more - forgiving (accepts undefined modes). - */ - FILE * fh; - remove( testfile ); - TESTCASE_NOREG( fopen( NULL, NULL ) == NULL ); - TESTCASE( fopen( NULL, "w" ) == NULL ); - TESTCASE_NOREG( fopen( "", NULL ) == NULL ); - TESTCASE( fopen( "", "w" ) == NULL ); - TESTCASE( fopen( "foo", "" ) == NULL ); - TESTCASE_NOREG( fopen( testfile, "wq" ) == NULL ); /* Undefined mode */ - TESTCASE_NOREG( fopen( testfile, "wr" ) == NULL ); /* Undefined mode */ - TESTCASE( ( fh = fopen( testfile, "w" ) ) != NULL ); - TESTCASE( fclose( fh ) == 0 ); - TESTCASE( remove( testfile ) == 0 ); - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdio/fprintf.c b/waterbox/libc/functions/stdio/fprintf.c deleted file mode 100644 index 13eaf6b758..0000000000 --- a/waterbox/libc/functions/stdio/fprintf.c +++ /dev/null @@ -1,59 +0,0 @@ -/* fprintf( FILE *, const char *, ... ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#include - -#ifndef REGTEST -#include "_PDCLIB_io.h" - -int _PDCLIB_fprintf_unlocked( FILE * _PDCLIB_restrict stream, - const char * _PDCLIB_restrict format, ... ) -{ - int rc; - va_list ap; - va_start( ap, format ); - rc = _PDCLIB_vfprintf_unlocked( stream, format, ap ); - va_end( ap ); - return rc; -} - -int fprintf( FILE * _PDCLIB_restrict stream, - const char * _PDCLIB_restrict format, ... ) -{ - int rc; - va_list ap; - va_start( ap, format ); - _PDCLIB_flockfile( stream ); - rc = _PDCLIB_vfprintf_unlocked( stream, format, ap ); - _PDCLIB_funlockfile( stream ); - va_end( ap ); - return rc; -} - -#endif - -#ifdef TEST -#include -#include -#define _PDCLIB_FILEID "stdio/fprintf.c" -#define _PDCLIB_FILEIO - -#include "_PDCLIB_test.h" - -#define testprintf( stream, ... ) fprintf( stream, __VA_ARGS__ ) - -int main( void ) -{ - FILE * target; - TESTCASE( ( target = tmpfile() ) != NULL ); -#include "printf_testcases.h" - TESTCASE( fclose( target ) == 0 ); - return TEST_RESULTS; -} - -#endif - diff --git a/waterbox/libc/functions/stdio/fputc.c b/waterbox/libc/functions/stdio/fputc.c deleted file mode 100644 index 1252e6365a..0000000000 --- a/waterbox/libc/functions/stdio/fputc.c +++ /dev/null @@ -1,53 +0,0 @@ -/* fputc( int, FILE * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST -#include "_PDCLIB_io.h" - -/* Write the value c (cast to unsigned char) to the given stream. - Returns c if successful, EOF otherwise. - If a write error occurs, the error indicator of the stream is set. -*/ -int _PDCLIB_fputc_unlocked( int c, FILE * stream ) -{ - if ( _PDCLIB_prepwrite( stream ) == EOF ) - { - return EOF; - } - stream->buffer[stream->bufidx++] = (char)c; - if ( ( stream->bufidx == stream->bufsize ) /* _IOFBF */ - || ( ( stream->status & _IOLBF ) && ( (char)c == '\n' ) ) /* _IOLBF */ - || ( stream->status & _IONBF ) /* _IONBF */ - ) - { - /* buffer filled, unbuffered stream, or end-of-line. */ - return ( _PDCLIB_flushbuffer( stream ) == 0 ) ? c : EOF; - } - return c; -} - -int fputc( int c, FILE * stream ) -{ - _PDCLIB_flockfile( stream ); - int r = _PDCLIB_fputc_unlocked( c, stream ); - _PDCLIB_funlockfile( stream ); - return r; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - /* Testing covered by ftell.c */ - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdio/fputs.c b/waterbox/libc/functions/stdio/fputs.c deleted file mode 100644 index 9bd0b5c5d6..0000000000 --- a/waterbox/libc/functions/stdio/fputs.c +++ /dev/null @@ -1,76 +0,0 @@ -/* fputs( const char *, FILE * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST -#include "_PDCLIB_io.h" - -int _PDCLIB_fputs_unlocked( const char * _PDCLIB_restrict s, - FILE * _PDCLIB_restrict stream ) -{ - if ( _PDCLIB_prepwrite( stream ) == EOF ) - { - return EOF; - } - while ( *s != '\0' ) - { - /* Unbuffered and line buffered streams get flushed when fputs() does - write the terminating end-of-line. All streams get flushed if the - buffer runs full. - */ - stream->buffer[ stream->bufidx++ ] = *s; - if ( ( stream->bufidx == stream->bufsize ) || - ( ( stream->status & _IOLBF ) && *s == '\n' ) - ) - { - if ( _PDCLIB_flushbuffer( stream ) == EOF ) - { - return EOF; - } - } - ++s; - } - if ( stream->status & _IONBF ) - { - if ( _PDCLIB_flushbuffer( stream ) == EOF ) - { - return EOF; - } - } - return 0; -} - -int fputs( const char * _PDCLIB_restrict s, - FILE * _PDCLIB_restrict stream ) -{ - _PDCLIB_flockfile( stream ); - int r = _PDCLIB_fputs_unlocked( s, stream ); - _PDCLIB_funlockfile( stream ); - return r; -} - -#endif -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - char const * const message = "SUCCESS testing fputs()"; - FILE * fh; - TESTCASE( ( fh = tmpfile() ) != NULL ); - TESTCASE( fputs( message, fh ) >= 0 ); - rewind( fh ); - for ( size_t i = 0; i < 23; ++i ) - { - TESTCASE( fgetc( fh ) == message[i] ); - } - TESTCASE( fclose( fh ) == 0 ); - return TEST_RESULTS; -} - -#endif - diff --git a/waterbox/libc/functions/stdio/fread.c b/waterbox/libc/functions/stdio/fread.c deleted file mode 100644 index bf3185c4cf..0000000000 --- a/waterbox/libc/functions/stdio/fread.c +++ /dev/null @@ -1,87 +0,0 @@ -/* fwrite( void *, size_t, size_t, FILE * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST -#include "_PDCLIB_io.h" - -#include -#include - -size_t _PDCLIB_fread_unlocked( - void * _PDCLIB_restrict ptr, - size_t size, size_t nmemb, - FILE * _PDCLIB_restrict stream -) -{ - if ( _PDCLIB_prepread( stream ) == EOF ) - { - return 0; - } - char * dest = (char *)ptr; - size_t nmemb_i; - for ( nmemb_i = 0; nmemb_i < nmemb; ++nmemb_i ) - { - size_t numread = _PDCLIB_getchars( &dest[ nmemb_i * size ], size, EOF, - stream ); - if( numread != size ) - break; - } - return nmemb_i; -} - -size_t fread( void * _PDCLIB_restrict ptr, - size_t size, size_t nmemb, - FILE * _PDCLIB_restrict stream ) -{ - _PDCLIB_flockfile( stream ); - size_t r = _PDCLIB_fread_unlocked( ptr, size, nmemb, stream ); - _PDCLIB_funlockfile( stream ); - return r; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - FILE * fh; - char const * message = "Testing fwrite()...\n"; - char buffer[21]; - buffer[20] = 'x'; - TESTCASE( ( fh = tmpfile() ) != NULL ); - /* fwrite() / readback */ - TESTCASE( fwrite( message, 1, 20, fh ) == 20 ); - rewind( fh ); - TESTCASE( fread( buffer, 1, 20, fh ) == 20 ); - TESTCASE( memcmp( buffer, message, 20 ) == 0 ); - TESTCASE( buffer[20] == 'x' ); - /* same, different nmemb / size settings */ - rewind( fh ); - TESTCASE( memset( buffer, '\0', 20 ) == buffer ); - TESTCASE( fwrite( message, 5, 4, fh ) == 4 ); - rewind( fh ); - TESTCASE( fread( buffer, 5, 4, fh ) == 4 ); - TESTCASE( memcmp( buffer, message, 20 ) == 0 ); - TESTCASE( buffer[20] == 'x' ); - /* same... */ - rewind( fh ); - TESTCASE( memset( buffer, '\0', 20 ) == buffer ); - TESTCASE( fwrite( message, 20, 1, fh ) == 1 ); - rewind( fh ); - TESTCASE( fread( buffer, 20, 1, fh ) == 1 ); - TESTCASE( memcmp( buffer, message, 20 ) == 0 ); - TESTCASE( buffer[20] == 'x' ); - /* Done. */ - TESTCASE( fclose( fh ) == 0 ); - return TEST_RESULTS; -} - -#endif - diff --git a/waterbox/libc/functions/stdio/freopen.c b/waterbox/libc/functions/stdio/freopen.c deleted file mode 100644 index d647d32033..0000000000 --- a/waterbox/libc/functions/stdio/freopen.c +++ /dev/null @@ -1,120 +0,0 @@ -/* freopen( const char *, const char *, FILE * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST -#include "_PDCLIB_io.h" -#include "_PDCLIB_glue.h" -#include -#include - -FILE * freopen( - const char * _PDCLIB_restrict filename, - const char * _PDCLIB_restrict mode, - FILE * _PDCLIB_restrict stream -) -{ - _PDCLIB_flockfile( stream ); - - unsigned int status = stream->status & - ( _IONBF | _IOLBF | _IOFBF | _PDCLIB_FREEBUFFER - | _PDCLIB_DELONCLOSE | _PDCLIB_STATIC ); - - /* TODO: This function can change wide orientation of a stream */ - if ( stream->status & _PDCLIB_FWRITE ) - { - _PDCLIB_flushbuffer( stream ); - } - if ( ( filename == NULL ) && ( stream->filename == NULL ) ) - { - /* TODO: Special handling for mode changes on std-streams */ - _PDCLIB_funlockfile( stream ); - return NULL; - } - stream->ops->close(stream->handle); - - /* TODO: It is not nice to do this on a stream we just closed. - It does not matter with the current implementation of clearerr(), - but it might start to matter if someone replaced that implementation. - */ - _PDCLIB_clearerr_unlocked( stream ); - /* The new filename might not fit the old buffer */ - if ( filename == NULL ) - { - /* Use previous filename */ - filename = stream->filename; - } - else if ( ( stream->filename != NULL ) && ( strlen( stream->filename ) >= strlen( filename ) ) ) - { - /* Copy new filename into existing buffer */ - strcpy( stream->filename, filename ); - } - else - { - /* Allocate new buffer */ - if ( ( stream->filename = (char *)malloc( strlen( filename ) ) ) == NULL ) - { - _PDCLIB_funlockfile( stream ); - return NULL; - } - strcpy( stream->filename, filename ); - } - if ( ( mode == NULL ) || ( filename[0] == '\0' ) ) - { - _PDCLIB_funlockfile( stream ); - return NULL; - } - if ( ( stream->status = _PDCLIB_filemode( mode ) ) == 0 ) - { - _PDCLIB_funlockfile( stream ); - return NULL; - } - /* Re-add the flags we saved above */ - stream->status |= status; - stream->bufidx = 0; - stream->bufend = 0; - stream->ungetidx = 0; - /* TODO: Setting mbstate */ - if ( ! _PDCLIB_open( &stream->handle, &stream->ops, filename, - stream->status ) ) - { - _PDCLIB_funlockfile( stream ); - return NULL; - } - _PDCLIB_funlockfile( stream ); - return stream; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - FILE * fin; - FILE * fout; - TESTCASE( ( fin = fopen( testfile1, "wb+" ) ) != NULL ); - TESTCASE( fputc( 'x', fin ) == 'x' ); - TESTCASE( fclose( fin ) == 0 ); - TESTCASE( ( fin = freopen( testfile1, "rb", stdin ) ) != NULL ); - TESTCASE( getchar() == 'x' ); - - TESTCASE( ( fout = freopen( testfile2, "wb+", stdout ) ) != NULL ); - TESTCASE( putchar( 'x' ) == 'x' ); - rewind( fout ); - TESTCASE( fgetc( fout ) == 'x' ); - - TESTCASE( fclose( fin ) == 0 ); - TESTCASE( fclose( fout ) == 0 ); - TESTCASE( remove( testfile1 ) == 0 ); - TESTCASE( remove( testfile2 ) == 0 ); - - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdio/fscanf.c b/waterbox/libc/functions/stdio/fscanf.c deleted file mode 100644 index 9bb775ffc6..0000000000 --- a/waterbox/libc/functions/stdio/fscanf.c +++ /dev/null @@ -1,54 +0,0 @@ -/* fscanf( FILE *, const char *, ... ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#include - -#ifndef REGTEST -#include "_PDCLIB_io.h" - -int _PDCLIB_fscanf_unlocked( FILE * _PDCLIB_restrict stream, - const char * _PDCLIB_restrict format, ... ) -{ - int rc; - va_list ap; - va_start( ap, format ); - rc = _PDCLIB_vfscanf_unlocked( stream, format, ap ); - va_end( ap ); - return rc; -} - -int fscanf( FILE * _PDCLIB_restrict stream, - const char * _PDCLIB_restrict format, ... ) -{ - int rc; - va_list ap; - va_start( ap, format ); - rc = vfscanf( stream, format, ap ); - va_end( ap ); - return rc; -} - -#endif - -#ifdef TEST -#define _PDCLIB_FILEID "stdio/fscanf.c" -#define _PDCLIB_FILEIO - -#include "_PDCLIB_test.h" - -#define testscanf( stream, format, ... ) fscanf( stream, format, __VA_ARGS__ ) - -int main( void ) -{ - FILE * source; - TESTCASE( ( source = tmpfile() ) != NULL ); -#include "scanf_testcases.h" - TESTCASE( fclose( source ) == 0 ); - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdio/fseek.c b/waterbox/libc/functions/stdio/fseek.c deleted file mode 100644 index a24a608b7c..0000000000 --- a/waterbox/libc/functions/stdio/fseek.c +++ /dev/null @@ -1,109 +0,0 @@ -/* fseek( FILE *, long, int ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST -#include "_PDCLIB_io.h" - -int _PDCLIB_fseek_unlocked( FILE * stream, long loffset, int whence ) -{ - _PDCLIB_int64_t offset = loffset; - if ( stream->status & _PDCLIB_FWRITE ) - { - if ( _PDCLIB_flushbuffer( stream ) == EOF ) - { - return EOF; - } - } - stream->status &= ~ _PDCLIB_EOFFLAG; - if ( stream->status & _PDCLIB_FRW ) - { - stream->status &= ~ ( _PDCLIB_FREAD | _PDCLIB_FWRITE ); - } - - if ( whence == SEEK_CUR ) - { - whence = SEEK_SET; - offset += _PDCLIB_ftell64_unlocked( stream ); - } - - return ( _PDCLIB_seek( stream, offset, whence ) != EOF ) ? 0 : EOF; -} - -int fseek( FILE * stream, long loffset, int whence ) -{ - _PDCLIB_flockfile( stream ); - int r = _PDCLIB_fseek_unlocked( stream, loffset, whence ); - _PDCLIB_funlockfile( stream ); - return r; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" -#include - -int main( void ) -{ - FILE * fh; - TESTCASE( ( fh = tmpfile() ) != NULL ); - TESTCASE( fwrite( teststring, 1, strlen( teststring ), fh ) == strlen( teststring ) ); - /* General functionality */ - TESTCASE( fseek( fh, -1, SEEK_END ) == 0 ); - TESTCASE( (size_t)ftell( fh ) == strlen( teststring ) - 1 ); - TESTCASE( fseek( fh, 0, SEEK_END ) == 0 ); - TESTCASE( (size_t)ftell( fh ) == strlen( teststring ) ); - TESTCASE( fseek( fh, 0, SEEK_SET ) == 0 ); - TESTCASE( ftell( fh ) == 0 ); - TESTCASE( fseek( fh, 5, SEEK_CUR ) == 0 ); - TESTCASE( ftell( fh ) == 5 ); - TESTCASE( fseek( fh, -3, SEEK_CUR ) == 0 ); - TESTCASE( ftell( fh ) == 2 ); - /* Checking behaviour around EOF */ - TESTCASE( fseek( fh, 0, SEEK_END ) == 0 ); - TESTCASE( ! feof( fh ) ); - TESTCASE( fgetc( fh ) == EOF ); - TESTCASE( feof( fh ) ); - TESTCASE( fseek( fh, 0, SEEK_END ) == 0 ); - TESTCASE( ! feof( fh ) ); - /* Checking undo of ungetc() */ - TESTCASE( fseek( fh, 0, SEEK_SET ) == 0 ); - TESTCASE( fgetc( fh ) == teststring[0] ); - TESTCASE( fgetc( fh ) == teststring[1] ); - TESTCASE( fgetc( fh ) == teststring[2] ); - TESTCASE( ftell( fh ) == 3 ); - TESTCASE( ungetc( teststring[2], fh ) == teststring[2] ); - TESTCASE( ftell( fh ) == 2 ); - TESTCASE( fgetc( fh ) == teststring[2] ); - TESTCASE( ftell( fh ) == 3 ); - TESTCASE( ungetc( 'x', fh ) == 'x' ); - TESTCASE( ftell( fh ) == 2 ); - TESTCASE( fgetc( fh ) == 'x' ); - TESTCASE( ungetc( 'x', fh ) == 'x' ); - TESTCASE( ftell( fh ) == 2 ); - TESTCASE( fseek( fh, 2, SEEK_SET ) == 0 ); - TESTCASE( fgetc( fh ) == teststring[2] ); - /* PDCLIB-7: Check that we handle the underlying file descriptor correctly - * in the SEEK_CUR case */ - TESTCASE( fseek( fh, 10, SEEK_SET ) == 0 ); - TESTCASE( ftell( fh ) == 10l ); - TESTCASE( fseek( fh, 0, SEEK_CUR ) == 0 ); - TESTCASE( ftell( fh ) == 10l ); - TESTCASE( fseek( fh, 2, SEEK_CUR ) == 0 ); - TESTCASE( ftell( fh ) == 12l ); - TESTCASE( fseek( fh, -1, SEEK_CUR ) == 0 ); - TESTCASE( ftell( fh ) == 11l ); - /* Checking error handling */ - TESTCASE( fseek( fh, -5, SEEK_SET ) == -1 ); - TESTCASE( fseek( fh, 0, SEEK_END ) == 0 ); - TESTCASE( fclose( fh ) == 0 ); - return TEST_RESULTS; -} - -#endif - diff --git a/waterbox/libc/functions/stdio/fsetpos.c b/waterbox/libc/functions/stdio/fsetpos.c deleted file mode 100644 index e28b2b1af6..0000000000 --- a/waterbox/libc/functions/stdio/fsetpos.c +++ /dev/null @@ -1,51 +0,0 @@ -/* fsetpos( FILE *, const fpos_t * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST -#include "_PDCLIB_io.h" - -int _PDCLIB_fsetpos_unlocked( FILE * stream, - const _PDCLIB_fpos_t * pos ) -{ - if ( stream->status & _PDCLIB_FWRITE ) - { - if ( _PDCLIB_flushbuffer( stream ) == EOF ) - { - return EOF; - } - } - if ( _PDCLIB_seek( stream, pos->offset, SEEK_SET ) == EOF ) - { - return EOF; - } - stream->pos.mbs = pos->mbs; - - return 0; -} - -int fsetpos( FILE * stream, - const _PDCLIB_fpos_t * pos ) -{ - _PDCLIB_flockfile( stream ); - int res = _PDCLIB_fsetpos_unlocked( stream, pos ); - _PDCLIB_funlockfile( stream ); - return res; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - /* fsetpos() tested together with fsetpos(). */ - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdio/ftell.c b/waterbox/libc/functions/stdio/ftell.c deleted file mode 100644 index 9731e33368..0000000000 --- a/waterbox/libc/functions/stdio/ftell.c +++ /dev/null @@ -1,96 +0,0 @@ -/* ftell( FILE * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#include -#include -#include - -#ifndef REGTEST -#include "_PDCLIB_io.h" - -long int _PDCLIB_ftell_unlocked( FILE * stream ) -{ - uint_fast64_t off64 = _PDCLIB_ftell64_unlocked( stream ); - - if ( off64 > LONG_MAX ) - { - /* integer overflow */ - errno = ERANGE; - return -1; - } - return off64; -} - -long int ftell( FILE * stream ) -{ - _PDCLIB_flockfile( stream ); - long int off = _PDCLIB_ftell_unlocked( stream ); - _PDCLIB_funlockfile( stream ); - return off; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" -#include -#ifndef REGTEST -#include "_PDCLIB_io.h" -#endif - -int main( void ) -{ - /* Testing all the basic I/O functions individually would result in lots - of duplicated code, so I took the liberty of lumping it all together - here. - */ - /* The following functions delegate their tests to here: - fgetc fflush rewind fputc ungetc fseek - flushbuffer seek fillbuffer prepread prepwrite - */ - char * buffer = (char*)malloc( 4 ); - FILE * fh; - TESTCASE( ( fh = tmpfile() ) != NULL ); - TESTCASE( setvbuf( fh, buffer, _IOLBF, 4 ) == 0 ); - /* Testing ungetc() at offset 0 */ - rewind( fh ); - TESTCASE( ungetc( 'x', fh ) == 'x' ); - TESTCASE( ftell( fh ) == -1l ); - rewind( fh ); - TESTCASE( ftell( fh ) == 0l ); - /* Commence "normal" tests */ - TESTCASE( fputc( '1', fh ) == '1' ); - TESTCASE( fputc( '2', fh ) == '2' ); - TESTCASE( fputc( '3', fh ) == '3' ); - /* Positions incrementing as expected? */ - TESTCASE( ftell( fh ) == 3l ); - TESTCASE_NOREG( fh->pos.offset == 0l ); - TESTCASE_NOREG( fh->bufidx == 3l ); - /* Buffer properly flushed when full? */ - TESTCASE( fputc( '4', fh ) == '4' ); - TESTCASE_NOREG( fh->pos.offset == 4l ); - TESTCASE_NOREG( fh->bufidx == 0 ); - /* fflush() resetting positions as expected? */ - TESTCASE( fputc( '5', fh ) == '5' ); - TESTCASE( fflush( fh ) == 0 ); - TESTCASE( ftell( fh ) == 5l ); - TESTCASE_NOREG( fh->pos.offset == 5l ); - TESTCASE_NOREG( fh->bufidx == 0l ); - /* rewind() resetting positions as expected? */ - rewind( fh ); - TESTCASE( ftell( fh ) == 0l ); - TESTCASE_NOREG( fh->pos.offset == 0 ); - TESTCASE_NOREG( fh->bufidx == 0 ); - /* Reading back first character after rewind for basic read check */ - TESTCASE( fgetc( fh ) == '1' ); - /* TODO: t.b.c. */ - TESTCASE( fclose( fh ) == 0 ); - return TEST_RESULTS; -} - -#endif - diff --git a/waterbox/libc/functions/stdio/ftrylockfile.c b/waterbox/libc/functions/stdio/ftrylockfile.c deleted file mode 100644 index efb67199be..0000000000 --- a/waterbox/libc/functions/stdio/ftrylockfile.c +++ /dev/null @@ -1,40 +0,0 @@ -/* ftrylockfile( FILE * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#include - -#ifndef REGTEST -#include "_PDCLIB_io.h" -#include -#include - -int _PDCLIB_ftrylockfile( FILE * file ) -{ - int res = mtx_trylock( &file->lock ); - switch(res) { - case thrd_success: - return 0; - case thrd_busy: - return 1; - - default: - abort(); - } -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - // Not tested here - tested by other stdio test drivers - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdio/funlockfile.c b/waterbox/libc/functions/stdio/funlockfile.c deleted file mode 100644 index 98a375c971..0000000000 --- a/waterbox/libc/functions/stdio/funlockfile.c +++ /dev/null @@ -1,38 +0,0 @@ -/* funlockfile( FILE * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#include - -#ifndef REGTEST -#include "_PDCLIB_io.h" -#include -#include - -void _PDCLIB_funlockfile( FILE * file ) -{ - int res = mtx_unlock( &file->lock ); - switch(res) { - case thrd_success: - return; - - default: - abort(); - } -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - // Not tested here - tested by other stdio test drivers - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdio/fwrite.c b/waterbox/libc/functions/stdio/fwrite.c deleted file mode 100644 index 47da8e25a5..0000000000 --- a/waterbox/libc/functions/stdio/fwrite.c +++ /dev/null @@ -1,78 +0,0 @@ -/* fwrite( const void *, size_t, size_t, FILE * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST -#include "_PDCLIB_io.h" -#include "_PDCLIB_glue.h" - -#include -#include - -size_t _PDCLIB_fwrite_unlocked( const void *restrict vptr, - size_t size, size_t nmemb, - FILE * _PDCLIB_restrict stream ) -{ - if ( _PDCLIB_prepwrite( stream ) == EOF ) - { - return 0; - } - - const char *restrict ptr = vptr; - size_t nmemb_i; - for ( nmemb_i = 0; nmemb_i < nmemb; ++nmemb_i ) - { - for ( size_t size_i = 0; size_i < size; ++size_i ) - { - char c = ptr[ nmemb_i * size + size_i ]; - stream->buffer[ stream->bufidx++ ] = c; - - if ( stream->bufidx == stream->bufsize || ( c == '\n' && stream->status & _IOLBF ) ) - { - if ( _PDCLIB_flushbuffer( stream ) == EOF ) - { - /* Returning number of objects completely buffered */ - return nmemb_i; - } - } - } - - if ( stream->status & _IONBF ) - { - if ( _PDCLIB_flushbuffer( stream ) == EOF ) - { - /* Returning number of objects completely buffered */ - return nmemb_i; - } - } - } - return nmemb_i; -} - -size_t fwrite( const void * _PDCLIB_restrict ptr, - size_t size, size_t nmemb, - FILE * _PDCLIB_restrict stream ) -{ - _PDCLIB_flockfile( stream ); - size_t r = _PDCLIB_fwrite_unlocked( ptr, size, nmemb, stream ); - _PDCLIB_funlockfile( stream ); - return r; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - /* Testing covered by fread(). */ - return TEST_RESULTS; -} - -#endif - diff --git a/waterbox/libc/functions/stdio/getc.c b/waterbox/libc/functions/stdio/getc.c deleted file mode 100644 index 7a2a900d32..0000000000 --- a/waterbox/libc/functions/stdio/getc.c +++ /dev/null @@ -1,33 +0,0 @@ -/* getc( FILE * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST -#include "_PDCLIB_io.h" - -int _PDCLIB_getc_unlocked( FILE * stream ) -{ - return _PDCLIB_fgetc_unlocked( stream ); -} - -int getc( FILE * stream ) -{ - return fgetc( stream ); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - /* Testing covered by ftell.c */ - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdio/getchar.c b/waterbox/libc/functions/stdio/getchar.c deleted file mode 100644 index 4a6fe4d14a..0000000000 --- a/waterbox/libc/functions/stdio/getchar.c +++ /dev/null @@ -1,34 +0,0 @@ -/* getchar( void ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST -#include "_PDCLIB_io.h" - -int _PDCLIB_getchar_unlocked( void ) -{ - return _PDCLIB_fgetc_unlocked( stdin ); -} - - -int getchar( void ) -{ - return fgetc( stdin ); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - /* Testing covered by ftell.c */ - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdio/gets.c b/waterbox/libc/functions/stdio/gets.c deleted file mode 100644 index 2fb4cad9ea..0000000000 --- a/waterbox/libc/functions/stdio/gets.c +++ /dev/null @@ -1,71 +0,0 @@ -/* gets( char * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST -#include "_PDCLIB_io.h" -#include - -char * gets( char * s ) -{ - _PDCLIB_flockfile( stdin ); - if ( _PDCLIB_prepread( stdin ) == EOF ) - { - _PDCLIB_funlockfile( stdin ); - return NULL; - } - char * dest = s; - - dest += _PDCLIB_getchars( dest, SIZE_MAX, '\n', stdin ); - _PDCLIB_funlockfile( stdin ); - - if(*(dest - 1) == '\n') { - *(--dest) = '\0'; - } else { - *dest = '\0'; - } - - return ( dest == s ) ? NULL : s; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" -#include - -int main( void ) -{ -#ifndef REGTEST - FILE * fh; - char buffer[10]; - char const * gets_test = "foo\nbar\0baz\nweenie"; - TESTCASE( ( fh = fopen( testfile, "wb" ) ) != NULL ); - TESTCASE( fwrite( gets_test, 1, 18, fh ) == 18 ); - TESTCASE( fclose( fh ) == 0 ); - TESTCASE( ( fh = freopen( testfile, "rb", stdin ) ) != NULL ); - TESTCASE( gets( buffer ) == buffer ); - TESTCASE( strcmp( buffer, "foo" ) == 0 ); - TESTCASE( gets( buffer ) == buffer ); - TESTCASE( memcmp( buffer, "bar\0baz\0", 8 ) == 0 ); - TESTCASE( gets( buffer ) == buffer ); - TESTCASE( strcmp( buffer, "weenie" ) == 0 ); - TESTCASE( feof( fh ) ); - TESTCASE( fseek( fh, -1, SEEK_END ) == 0 ); - TESTCASE( gets( buffer ) == buffer ); - TESTCASE( strcmp( buffer, "e" ) == 0 ); - TESTCASE( feof( fh ) ); - TESTCASE( fseek( fh, 0, SEEK_END ) == 0 ); - TESTCASE( gets( buffer ) == NULL ); - TESTCASE( fclose( fh ) == 0 ); - TESTCASE( remove( testfile ) == 0 ); -#endif - return TEST_RESULTS; -} - -#endif - diff --git a/waterbox/libc/functions/stdio/perror.c b/waterbox/libc/functions/stdio/perror.c deleted file mode 100644 index 97b727f253..0000000000 --- a/waterbox/libc/functions/stdio/perror.c +++ /dev/null @@ -1,56 +0,0 @@ -/* perror( const char * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST -#include -#include "_PDCLIB_locale.h" - -/* TODO: Doing this via a static array is not the way to do it. */ -void perror( const char * s ) -{ - if ( ( s != NULL ) && ( s[0] != '\n' ) ) - { - fprintf( stderr, "%s: ", s ); - } - if ( errno >= _PDCLIB_ERRNO_MAX ) - { - fprintf( stderr, "Unknown error\n" ); - } - else - { - fprintf( stderr, "%s\n", _PDCLIB_threadlocale()->_ErrnoStr[errno] ); - } - return; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" -#include -#include -#include - -int main( void ) -{ - FILE * fh; - unsigned long long max = ULLONG_MAX; - char buffer[100]; - sprintf( buffer, "%llu", max ); - TESTCASE( ( fh = freopen( testfile, "wb+", stderr ) ) != NULL ); - TESTCASE( strtol( buffer, NULL, 10 ) == LONG_MAX ); - perror( "Test" ); - rewind( fh ); - TESTCASE( fread( buffer, 1, 7, fh ) == 7 ); - TESTCASE( memcmp( buffer, "Test: ", 6 ) == 0 ); - TESTCASE( fclose( fh ) == 0 ); - TESTCASE( remove( testfile ) == 0 ); - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdio/printf.c b/waterbox/libc/functions/stdio/printf.c deleted file mode 100644 index 8e31dcdcfd..0000000000 --- a/waterbox/libc/functions/stdio/printf.c +++ /dev/null @@ -1,55 +0,0 @@ -/* printf( const char *, ... ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#include - -#ifndef REGTEST -#include "_PDCLIB_io.h" - -int printf( const char * _PDCLIB_restrict format, ... ) -{ - int rc; - va_list ap; - va_start( ap, format ); - rc = vfprintf( stdout, format, ap ); - va_end( ap ); - return rc; -} - -int _PDCLIB_printf_unlocked( const char * _PDCLIB_restrict format, ... ) -{ - int rc; - va_list ap; - va_start( ap, format ); - rc = _PDCLIB_vfprintf_unlocked( stdout, format, ap ); - va_end( ap ); - return rc; -} - -#endif - -#ifdef TEST -#define _PDCLIB_FILEID "stdio/printf.c" -#define _PDCLIB_FILEIO -#include -#include - -#include "_PDCLIB_test.h" - -#define testprintf( stream, ... ) printf( __VA_ARGS__ ) - -int main( void ) -{ - FILE * target; - TESTCASE( ( target = freopen( testfile, "wb+", stdout ) ) != NULL ); -#include "printf_testcases.h" - TESTCASE( fclose( target ) == 0 ); - TESTCASE( remove( testfile ) == 0 ); - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdio/putc.c b/waterbox/libc/functions/stdio/putc.c deleted file mode 100644 index 4017350fa5..0000000000 --- a/waterbox/libc/functions/stdio/putc.c +++ /dev/null @@ -1,34 +0,0 @@ -/* putc( int, FILE * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST -#include "_PDCLIB_io.h" - -int _PDCLIB_putc_unlocked( int c, FILE * stream ) -{ - return _PDCLIB_fputc_unlocked( c, stream ); -} - - -int putc( int c, FILE * stream ) -{ - return fputc( c, stream ); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - /* Testing covered by ftell.c */ - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdio/putchar.c b/waterbox/libc/functions/stdio/putchar.c deleted file mode 100644 index 4e69047ffd..0000000000 --- a/waterbox/libc/functions/stdio/putchar.c +++ /dev/null @@ -1,33 +0,0 @@ -/* putchar( int ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST -#include "_PDCLIB_io.h" - -int _PDCLIB_putchar_unlocked( int c ) -{ - return _PDCLIB_fputc_unlocked( c, stdout ); -} - -int putchar( int c ) -{ - return fputc( c, stdout ); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - /* Testing covered by ftell.c */ - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdio/puts.c b/waterbox/libc/functions/stdio/puts.c deleted file mode 100644 index f0c5a7bbfd..0000000000 --- a/waterbox/libc/functions/stdio/puts.c +++ /dev/null @@ -1,74 +0,0 @@ -/* puts( const char * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST -#include "_PDCLIB_io.h" - -extern char * _PDCLIB_eol; - -int _PDCLIB_puts_unlocked( const char * s ) -{ - if ( _PDCLIB_prepwrite( stdout ) == EOF ) - { - return EOF; - } - while ( *s != '\0' ) - { - stdout->buffer[ stdout->bufidx++ ] = *s++; - if ( stdout->bufidx == stdout->bufsize ) - { - if ( _PDCLIB_flushbuffer( stdout ) == EOF ) - { - return EOF; - } - } - } - stdout->buffer[ stdout->bufidx++ ] = '\n'; - if ( ( stdout->bufidx == stdout->bufsize ) || - ( stdout->status & ( _IOLBF | _IONBF ) ) ) - { - return _PDCLIB_flushbuffer( stdout ); - } - else - { - return 0; - } -} - -int puts( const char * s ) -{ - _PDCLIB_flockfile( stdout ); - int r = _PDCLIB_puts_unlocked( s ); - _PDCLIB_funlockfile( stdout ); - return r; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - FILE * fh; - char const * message = "SUCCESS testing puts()"; - char buffer[23]; - buffer[22] = 'x'; - TESTCASE( ( fh = freopen( testfile, "wb+", stdout ) ) != NULL ); - TESTCASE( puts( message ) >= 0 ); - rewind( fh ); - TESTCASE( fread( buffer, 1, 22, fh ) == 22 ); - TESTCASE( memcmp( buffer, message, 22 ) == 0 ); - TESTCASE( buffer[22] == 'x' ); - TESTCASE( fclose( fh ) == 0 ); - TESTCASE( remove( testfile ) == 0 ); - return TEST_RESULTS; -} - -#endif - diff --git a/waterbox/libc/functions/stdio/remove.c b/waterbox/libc/functions/stdio/remove.c deleted file mode 100644 index 831d968617..0000000000 --- a/waterbox/libc/functions/stdio/remove.c +++ /dev/null @@ -1,37 +0,0 @@ -/* remove( const char * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -/* This is an example implementation of remove() fit for use with POSIX kernels. -*/ - -#include - -#ifndef REGTEST - -#include -#include - -extern struct _PDCLIB_file_t * _PDCLIB_filelist; - -int remove( const char * pathname ) -{ - errno = ENOTSUP; - return 1; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - /* Testing covered by ftell.c (and several others) */ - return TEST_RESULTS; -} - -#endif - diff --git a/waterbox/libc/functions/stdio/rename.c b/waterbox/libc/functions/stdio/rename.c deleted file mode 100644 index 0c30b1e78c..0000000000 --- a/waterbox/libc/functions/stdio/rename.c +++ /dev/null @@ -1,83 +0,0 @@ -/* rename( const char *, const char * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST -#include "_PDCLIB_glue.h" - -#include - -extern _PDCLIB_file_t * _PDCLIB_filelist; - -int rename( const char * old, const char * new ) -{ - FILE * current = _PDCLIB_filelist; - while ( current != NULL ) - { - if ( ( current->filename != NULL ) && ( strcmp( current->filename, old ) == 0 ) ) - { - /* File of that name currently open. Do not rename. */ - return EOF; - } - current = current->next; - } - return _PDCLIB_rename( old, new ); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -#include - -int main( void ) -{ - FILE * file; - remove( testfile1 ); - remove( testfile2 ); - /* make sure that neither file exists */ - TESTCASE( fopen( testfile1, "r" ) == NULL ); - TESTCASE( fopen( testfile2, "r" ) == NULL ); - /* rename file 1 to file 2 - expected to fail */ - TESTCASE( rename( testfile1, testfile2 ) != 0 ); - /* create file 1 */ - TESTCASE( ( file = fopen( testfile1, "w" ) ) != NULL ); - TESTCASE( fputs( "x", file ) != EOF ); - TESTCASE( fclose( file ) == 0 ); - /* check that file 1 exists */ - TESTCASE( ( file = fopen( testfile1, "r" ) ) != NULL ); - TESTCASE( fclose( file ) == 0 ); - /* rename file 1 to file 2 */ - TESTCASE( rename( testfile1, testfile2 ) == 0 ); - /* check that file 2 exists, file 1 does not */ - TESTCASE( fopen( testfile1, "r" ) == NULL ); - TESTCASE( ( file = fopen( testfile2, "r" ) ) != NULL ); - TESTCASE( fclose( file ) == 0 ); - /* create another file 1 */ - TESTCASE( ( file = fopen( testfile1, "w" ) ) != NULL ); - TESTCASE( fputs( "x", file ) != EOF ); - TESTCASE( fclose( file ) == 0 ); - /* check that file 1 exists */ - TESTCASE( ( file = fopen( testfile1, "r" ) ) != NULL ); - TESTCASE( fclose( file ) == 0 ); - /* rename file 1 to file 2 - expected to fail, see comment in - _PDCLIB_rename() itself. - */ - /* NOREG as glibc overwrites existing destination file. */ - TESTCASE_NOREG( rename( testfile1, testfile2 ) != 0 ); - /* remove both files */ - TESTCASE( remove( testfile1 ) == 0 ); - TESTCASE( remove( testfile2 ) == 0 ); - /* check that they're gone */ - TESTCASE( fopen( testfile1, "r" ) == NULL ); - TESTCASE( fopen( testfile2, "r" ) == NULL ); - return TEST_RESULTS; -} - -#endif - diff --git a/waterbox/libc/functions/stdio/rewind.c b/waterbox/libc/functions/stdio/rewind.c deleted file mode 100644 index f50bf025b4..0000000000 --- a/waterbox/libc/functions/stdio/rewind.c +++ /dev/null @@ -1,36 +0,0 @@ -/* rewind( FILE * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST -#include "_PDCLIB_io.h" - -void _PDCLIB_rewind_unlocked( FILE * stream ) -{ - stream->status &= ~ _PDCLIB_ERRORFLAG; - _PDCLIB_fseek_unlocked( stream, 0L, SEEK_SET ); -} - -void rewind( FILE * stream ) -{ - _PDCLIB_flockfile(stream); - _PDCLIB_rewind_unlocked(stream); - _PDCLIB_funlockfile(stream); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - /* Testing covered by ftell.c */ - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdio/scanf.c b/waterbox/libc/functions/stdio/scanf.c deleted file mode 100644 index 8d0492ba06..0000000000 --- a/waterbox/libc/functions/stdio/scanf.c +++ /dev/null @@ -1,47 +0,0 @@ -/* scanf( const char *, ... ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#include - -#ifndef REGTEST -#include "_PDCLIB_io.h" - -int _PDCLIB_scanf_unlocked( const char * _PDCLIB_restrict format, ... ) -{ - va_list ap; - va_start( ap, format ); - return _PDCLIB_vfscanf_unlocked( stdin, format, ap ); -} - -int scanf( const char * _PDCLIB_restrict format, ... ) -{ - va_list ap; - va_start( ap, format ); - return vfscanf( stdin, format, ap ); -} - -#endif - -#ifdef TEST -#define _PDCLIB_FILEID "stdio/scanf.c" -#define _PDCLIB_FILEIO - -#include "_PDCLIB_test.h" - -#define testscanf( stream, format, ... ) scanf( format, __VA_ARGS__ ) - -int main( void ) -{ - FILE * source; - TESTCASE( ( source = freopen( testfile, "wb+", stdin ) ) != NULL ); -#include "scanf_testcases.h" - TESTCASE( fclose( source ) == 0 ); - TESTCASE( remove( testfile ) == 0 ); - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdio/setbuf.c b/waterbox/libc/functions/stdio/setbuf.c deleted file mode 100644 index 749ddc9d2a..0000000000 --- a/waterbox/libc/functions/stdio/setbuf.c +++ /dev/null @@ -1,56 +0,0 @@ -/* setbuf( FILE *, char * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -void setbuf( FILE * _PDCLIB_restrict stream, char * _PDCLIB_restrict buf ) -{ - if ( buf == NULL ) - { - setvbuf( stream, buf, _IONBF, BUFSIZ ); - } - else - { - setvbuf( stream, buf, _IOFBF, BUFSIZ ); - } -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" -#include -#ifndef REGTEST -#include "_PDCLIB_io.h" -#endif - -int main( void ) -{ - /* TODO: Extend testing once setvbuf() is finished. */ -#ifndef REGTEST - char buffer[ BUFSIZ + 1 ]; - FILE * fh; - /* full buffered */ - TESTCASE( ( fh = tmpfile() ) != NULL ); - setbuf( fh, buffer ); - TESTCASE( fh->buffer == buffer ); - TESTCASE( fh->bufsize == BUFSIZ ); - TESTCASE( ( fh->status & ( _IOFBF | _IONBF | _IOLBF ) ) == _IOFBF ); - TESTCASE( fclose( fh ) == 0 ); - /* not buffered */ - TESTCASE( ( fh = tmpfile() ) != NULL ); - setbuf( fh, NULL ); - TESTCASE( ( fh->status & ( _IOFBF | _IONBF | _IOLBF ) ) == _IONBF ); - TESTCASE( fclose( fh ) == 0 ); -#else - puts( " NOTEST setbuf() test driver is PDCLib-specific." ); -#endif - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdio/setvbuf.c b/waterbox/libc/functions/stdio/setvbuf.c deleted file mode 100644 index 288211baef..0000000000 --- a/waterbox/libc/functions/stdio/setvbuf.c +++ /dev/null @@ -1,115 +0,0 @@ -/* setvbuf( FILE *, char *, int, size_t ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#include -#include - -#ifndef REGTEST -#include "_PDCLIB_io.h" - -int setvbuf( FILE * _PDCLIB_restrict stream, char * _PDCLIB_restrict buf, int mode, size_t size ) -{ - _PDCLIB_flockfile( stream ); - switch ( mode ) - { - case _IONBF: - /* When unbuffered I/O is requested, we keep the buffer anyway, as - we don't want to e.g. flush the stream for every character of a - stream being printed. - */ - break; - case _IOFBF: - case _IOLBF: - if ( size > INT_MAX || size == 0 ) - { - /* PDCLib only supports buffers up to INT_MAX in size. A size - of zero doesn't make sense. - */ - _PDCLIB_funlockfile( stream ); - return -1; - } - if ( buf == NULL ) - { - /* User requested buffer size, but leaves it to library to - allocate the buffer. - */ - /* If current buffer is big enough for requested size, but not - over twice as big (and wasting memory space), we use the - current buffer (i.e., do nothing), to save the malloc() / - free() overhead. - */ - if ( ( stream->bufsize < size ) || ( stream->bufsize > ( size << 1 ) ) ) - { - /* Buffer too small, or much too large - allocate. */ - if ( ( buf = (char *) malloc( size ) ) == NULL ) - { - /* Out of memory error. */ - _PDCLIB_funlockfile( stream ); - return -1; - } - /* This buffer must be free()d on fclose() */ - stream->status |= _PDCLIB_FREEBUFFER; - } - } - stream->buffer = buf; - stream->bufsize = size; - break; - default: - /* If mode is something else than _IOFBF, _IOLBF or _IONBF -> exit */ - _PDCLIB_funlockfile( stream ); - return -1; - } - /* Deleting current buffer mode */ - stream->status &= ~( _IOFBF | _IOLBF | _IONBF ); - /* Set user-defined mode */ - stream->status |= mode; - _PDCLIB_funlockfile( stream ); - return 0; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" -#include -#ifndef REGTEST -#include "_PDCLIB_io.h" -#endif -#define BUFFERSIZE 500 - -int main( void ) -{ -#ifndef REGTEST - char buffer[ BUFFERSIZE ]; - FILE * fh; - /* full buffered, user-supplied buffer */ - TESTCASE( ( fh = tmpfile() ) != NULL ); - TESTCASE( setvbuf( fh, buffer, _IOFBF, BUFFERSIZE ) == 0 ); - TESTCASE( fh->buffer == buffer ); - TESTCASE( fh->bufsize == BUFFERSIZE ); - TESTCASE( ( fh->status & ( _IOFBF | _IONBF | _IOLBF ) ) == _IOFBF ); - TESTCASE( fclose( fh ) == 0 ); - /* line buffered, lib-supplied buffer */ - TESTCASE( ( fh = tmpfile() ) != NULL ); - TESTCASE( setvbuf( fh, NULL, _IOLBF, BUFFERSIZE ) == 0 ); - TESTCASE( fh->buffer != NULL ); - TESTCASE( fh->bufsize == BUFFERSIZE ); - TESTCASE( ( fh->status & ( _IOFBF | _IONBF | _IOLBF ) ) == _IOLBF ); - TESTCASE( fclose( fh ) == 0 ); - /* not buffered, user-supplied buffer */ - TESTCASE( ( fh = tmpfile() ) != NULL ); - TESTCASE( setvbuf( fh, buffer, _IONBF, BUFFERSIZE ) == 0 ); - TESTCASE( ( fh->status & ( _IOFBF | _IONBF | _IOLBF ) ) == _IONBF ); - TESTCASE( fclose( fh ) == 0 ); -#else - puts( " NOTEST setvbuf() test driver is PDCLib-specific." ); -#endif - return TEST_RESULTS; -} - -#endif - diff --git a/waterbox/libc/functions/stdio/snprintf.c b/waterbox/libc/functions/stdio/snprintf.c deleted file mode 100644 index f095b8cb48..0000000000 --- a/waterbox/libc/functions/stdio/snprintf.c +++ /dev/null @@ -1,43 +0,0 @@ -/* snprintf( char *, size_t, const char *, ... ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#include - -#ifndef REGTEST - -int snprintf( char * _PDCLIB_restrict s, size_t n, const char * _PDCLIB_restrict format, ...) -{ - int rc; - va_list ap; - va_start( ap, format ); - rc = vsnprintf( s, n, format, ap ); - va_end( ap ); - return rc; -} - -#endif - -#ifdef TEST -#define _PDCLIB_FILEID "stdio/snprintf.c" -#define _PDCLIB_STRINGIO -#include -#include - -#include "_PDCLIB_test.h" - -#define testprintf( s, ... ) snprintf( s, 100, __VA_ARGS__ ) - -int main( void ) -{ - char target[100]; -#include "printf_testcases.h" - TESTCASE( snprintf( NULL, 0, "foo" ) == 3 ); - TESTCASE( snprintf( NULL, 0, "%d", 100 ) == 3 ); - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdio/sprintf.c b/waterbox/libc/functions/stdio/sprintf.c deleted file mode 100644 index ce3a7ff105..0000000000 --- a/waterbox/libc/functions/stdio/sprintf.c +++ /dev/null @@ -1,41 +0,0 @@ -/* sprintf( char *, const char *, ... ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#include -#include - -#ifndef REGTEST - -int sprintf( char * _PDCLIB_restrict s, const char * _PDCLIB_restrict format, ...) -{ - int rc; - va_list ap; - va_start( ap, format ); - rc = vsnprintf( s, SIZE_MAX, format, ap ); /* TODO: replace with non-checking call */ - va_end( ap ); - return rc; -} - -#endif - -#ifdef TEST -#define _PDCLIB_FILEID "stdio/sprintf.c" -#define _PDCLIB_STRINGIO -#include - -#include "_PDCLIB_test.h" - -#define testprintf( s, ... ) sprintf( s, __VA_ARGS__ ) - -int main( void ) -{ - char target[100]; -#include "printf_testcases.h" - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdio/sscanf.c b/waterbox/libc/functions/stdio/sscanf.c deleted file mode 100644 index 5de77ae45c..0000000000 --- a/waterbox/libc/functions/stdio/sscanf.c +++ /dev/null @@ -1,40 +0,0 @@ -/* sscanf( const char *, const char *, ... ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#include - -#ifndef REGTEST - -int sscanf( const char * _PDCLIB_restrict s, const char * _PDCLIB_restrict format, ... ) -{ - int rc; - va_list ap; - va_start( ap, format ); - rc = vsscanf( s, format, ap ); - va_end( ap ); - return rc; -} - -#endif - -#ifdef TEST -#define _PDCLIB_FILEID "stdio/sscanf.c" -#define _PDCLIB_STRINGIO - -#include "_PDCLIB_test.h" - -#define testscanf( s, format, ... ) sscanf( s, format, __VA_ARGS__ ) - -int main( void ) -{ - char source[100]; -#include "scanf_testcases.h" - return TEST_RESULTS; -} - -#endif - diff --git a/waterbox/libc/functions/stdio/testfile.txt b/waterbox/libc/functions/stdio/testfile.txt deleted file mode 100644 index 62f1825430243cb0b7e4c8498195bb38fb5d7dbc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 531 zcmZWl$x_2G4DFSCg)TjLJR{4JWq%99fz7OC9ia5*i_|nFo$8?FEs~Q&nWboLm=-xo z&_&x4FcheO+XQDI%OwB~5g{PNL={3Jg+L+@Gifovi$O&s%MdBCa?OQ}IrK&|HEuz7@0OxXS_6V`QwcLnfIc(`240Of;L! xI}u0KE|05@P#X?6PKe8^>zmttcOM@fpPpAQuW#q?AD_#w@1KkH@5cYZ<_|Igd*A>7 diff --git a/waterbox/libc/functions/stdio/tmpfile.c b/waterbox/libc/functions/stdio/tmpfile.c deleted file mode 100644 index 78273422d5..0000000000 --- a/waterbox/libc/functions/stdio/tmpfile.c +++ /dev/null @@ -1,34 +0,0 @@ -/* tmpfile( void ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -#include -#include "_PDCLIB_glue.h" - -/* This is a stub implementation of tmpfile -*/ -FILE* tmpfile( void ) -{ - errno = ENOTSUP; - return NULL; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" -#include - -int main( void ) -{ - return TEST_RESULTS; -} - -#endif - diff --git a/waterbox/libc/functions/stdio/tmpnam.c b/waterbox/libc/functions/stdio/tmpnam.c deleted file mode 100644 index 6e8641d380..0000000000 --- a/waterbox/libc/functions/stdio/tmpnam.c +++ /dev/null @@ -1,41 +0,0 @@ -/* tmpnam( char * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -#include -#include "_PDCLIB_io.h" - -char * tmpnam( char * s ) -{ - static char filename[ L_tmpnam ]; - FILE * file = tmpfile(); - if ( s == NULL ) - { - s = filename; - } - strcpy( s, file->filename ); - fclose( file ); - return s; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -#include - -int main( void ) -{ - TESTCASE( strlen( tmpnam( NULL ) ) < L_tmpnam ); - return TEST_RESULTS; -} - -#endif - diff --git a/waterbox/libc/functions/stdio/ungetc.c b/waterbox/libc/functions/stdio/ungetc.c deleted file mode 100644 index 560099d4e2..0000000000 --- a/waterbox/libc/functions/stdio/ungetc.c +++ /dev/null @@ -1,67 +0,0 @@ -/* ungetc( int, FILE * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST -#include "_PDCLIB_io.h" - -int _PDCLIB_ungetc_unlocked( int c, FILE * stream ) -{ - if ( c == EOF || stream->ungetidx == _PDCLIB_UNGETCBUFSIZE ) - { - return -1; - } - return stream->ungetbuf[stream->ungetidx++] = (unsigned char) c; -} - -int ungetc( int c, FILE * stream ) -{ - _PDCLIB_flockfile( stream ); - int r = _PDCLIB_ungetc_unlocked( c, stream ); - _PDCLIB_funlockfile( stream); - return r; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" -#include - -const char* hellostr = "Hello, world!"; - -int main( void ) -{ - // Also see ftell() for some testing - - // PDCLIB-18: fread ignores ungetc - size_t bufsz = strlen( hellostr ) + 1; - char * buf = malloc( bufsz ); - FILE * fh; - - // Also fgets - TESTCASE( ( fh = tmpfile() ) != NULL ); - TESTCASE( fputs(hellostr, fh) == 0 ); - rewind(fh); - TESTCASE( fgetc( fh ) == 'H' ); - TESTCASE( ungetc( 'H', fh ) == 'H' ); - TESTCASE( fgets( buf, bufsz, fh ) != NULL ); - TESTCASE( strcmp( buf, hellostr ) == 0 ); - - // fread - rewind(fh); - TESTCASE( fgetc( fh ) == 'H' ); - TESTCASE( ungetc( 'H', fh ) == 'H' ); - TESTCASE( fread( buf, bufsz - 1, 1, fh ) == 1 ); - TESTCASE( strncmp( buf, hellostr, bufsz - 1 ) == 0 ); - - - - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdio/vasprintf.c b/waterbox/libc/functions/stdio/vasprintf.c deleted file mode 100644 index 96bbe17f51..0000000000 --- a/waterbox/libc/functions/stdio/vasprintf.c +++ /dev/null @@ -1,58 +0,0 @@ -#define _PDCLIB_EXTENSIONS -#include -#include -#include - -static size_t mcb(void *p, const char *buf, size_t size) -{ - *(size_t *)p += size; - return size; -} - -static size_t vprintflen(const char *restrict fmt, va_list arg) -{ - size_t ret = 0; - _vcbprintf(&ret, mcb, fmt, arg); - return ret + 1; -} - -int asprintf(char **strp, const char *restrict fmt, ...) -{ - va_list arg, arg2; - va_start(arg, fmt); - va_copy(arg2, arg); - - size_t sz = vprintflen(fmt, arg); - - *strp = malloc(sz); - if (!strp) - { - va_end(arg); - va_end(arg2); - return -1; - } - - int ret = vsnprintf(*strp, sz, fmt, arg2); - va_end(arg); - va_end(arg2); - return ret; -} - -int vasprintf(char **strp, const char *restrict fmt, va_list arg) -{ - va_list arg2; - va_copy(arg2, arg); - - size_t sz = vprintflen(fmt, arg); - - *strp = malloc(sz); - if (!strp) - { - va_end(arg2); - return -1; - } - - int ret = vsnprintf(*strp, sz, fmt, arg2); - va_end(arg2); - return ret; -} diff --git a/waterbox/libc/functions/stdio/vfprintf.c b/waterbox/libc/functions/stdio/vfprintf.c deleted file mode 100644 index 1eeaf0986f..0000000000 --- a/waterbox/libc/functions/stdio/vfprintf.c +++ /dev/null @@ -1,64 +0,0 @@ -/* vfprintf( FILE *, const char *, va_list ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#include -#include -#include - -#ifndef REGTEST -#include "_PDCLIB_io.h" - -static size_t filecb(void *p, const char *buf, size_t size) -{ - return _PDCLIB_fwrite_unlocked( buf, 1, size, (FILE*) p ); -} - -int _PDCLIB_vfprintf_unlocked( FILE * _PDCLIB_restrict stream, - const char * _PDCLIB_restrict format, - va_list arg ) -{ - return _vcbprintf(stream, filecb, format, arg); -} - -int vfprintf( FILE * _PDCLIB_restrict stream, - const char * _PDCLIB_restrict format, - va_list arg ) -{ - _PDCLIB_flockfile( stream ); - int r = _PDCLIB_vfprintf_unlocked( stream, format, arg ); - _PDCLIB_funlockfile( stream ); - return r; -} - -#endif - -#ifdef TEST -#define _PDCLIB_FILEID "stdio/vfprintf.c" -#define _PDCLIB_FILEIO -#include -#include "_PDCLIB_test.h" - -static int testprintf( FILE * stream, const char * format, ... ) -{ - int i; - va_list arg; - va_start( arg, format ); - i = vfprintf( stream, format, arg ); - va_end( arg ); - return i; -} - -int main( void ) -{ - FILE * target; - TESTCASE( ( target = tmpfile() ) != NULL ); -#include "printf_testcases.h" - TESTCASE( fclose( target ) == 0 ); - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdio/vfscanf.c b/waterbox/libc/functions/stdio/vfscanf.c deleted file mode 100644 index e9aa01002e..0000000000 --- a/waterbox/libc/functions/stdio/vfscanf.c +++ /dev/null @@ -1,126 +0,0 @@ -/* vfscanf( FILE *, const char *, va_list ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#include -#include - -#ifndef REGTEST -#include "_PDCLIB_io.h" - -int _PDCLIB_vfscanf_unlocked( FILE * _PDCLIB_restrict stream, - const char * _PDCLIB_restrict format, - va_list arg ) -{ - /* TODO: This function should interpret format as multibyte characters. */ - struct _PDCLIB_status_t status; - status.base = 0; - status.flags = 0; - status.n = 0; - status.i = 0; - status.current = 0; - status.s = NULL; - status.width = 0; - status.prec = 0; - status.stream = stream; - va_copy( status.arg, arg ); - - while ( *format != '\0' ) - { - const char * rc; - if ( ( *format != '%' ) || ( ( rc = _PDCLIB_scan( format, &status ) ) == format ) ) - { - int c; - /* No conversion specifier, match verbatim */ - if ( isspace( *format ) ) - { - /* Whitespace char in format string: Skip all whitespaces */ - /* No whitespaces in input does not result in matching error */ - while ( isspace( c = getc( stream ) ) ) - { - ++status.i; - } - if ( ! feof( stream ) ) - { - _PDCLIB_ungetc_unlocked( c, stream ); - } - } - else - { - /* Non-whitespace char in format string: Match verbatim */ - if ( ( ( c = _PDCLIB_getc_unlocked( stream ) ) != *format ) || feof( stream ) ) - { - /* Matching error */ - if ( ! feof( stream ) && ! ferror( stream ) ) - { - _PDCLIB_ungetc_unlocked( c, stream ); - } - else if ( status.n == 0 ) - { - return EOF; - } - return status.n; - } - else - { - ++status.i; - } - } - ++format; - } - else - { - /* NULL return code indicates matching error */ - if ( rc == NULL ) - { - break; - } - /* Continue parsing after conversion specifier */ - format = rc; - } - } - va_end( status.arg ); - return status.n; -} - -int vfscanf( FILE * _PDCLIB_restrict stream, - const char * _PDCLIB_restrict format, - va_list arg ) -{ - _PDCLIB_flockfile( stream ); - int r = _PDCLIB_vfscanf_unlocked( stream, format, arg ); - _PDCLIB_funlockfile( stream ); - return r; -} - -#endif - -#ifdef TEST -#define _PDCLIB_FILEID "stdio/vfscanf.c" -#define _PDCLIB_FILEIO - -#include "_PDCLIB_test.h" - -static int testscanf( FILE * stream, char const * format, ... ) -{ - va_list ap; - va_start( ap, format ); - int result = vfscanf( stream, format, ap ); - va_end( ap ); - return result; -} - -int main( void ) -{ - FILE * source; - TESTCASE( ( source = tmpfile() ) != NULL ); -#include "scanf_testcases.h" - TESTCASE( fclose( source ) == 0 ); - return TEST_RESULTS; -} - -#endif - diff --git a/waterbox/libc/functions/stdio/vprintf.c b/waterbox/libc/functions/stdio/vprintf.c deleted file mode 100644 index 151c75e43a..0000000000 --- a/waterbox/libc/functions/stdio/vprintf.c +++ /dev/null @@ -1,53 +0,0 @@ -/* vprintf( const char *, va_list ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#include - -#ifndef REGTEST -#include "_PDCLIB_io.h" - -int _PDCLIB_vprintf_unlocked( const char * _PDCLIB_restrict format, - _PDCLIB_va_list arg ) -{ - return _PDCLIB_vfprintf_unlocked( stdout, format, arg ); -} - -int vprintf( const char * _PDCLIB_restrict format, _PDCLIB_va_list arg ) -{ - return vfprintf( stdout, format, arg ); -} - -#endif - -#ifdef TEST -#define _PDCLIB_FILEID "stdio/vprintf.c" -#define _PDCLIB_FILEIO -#include -#include -#include "_PDCLIB_test.h" - -static int testprintf( FILE * stream, const char * format, ... ) -{ - int i; - va_list arg; - va_start( arg, format ); - i = vprintf( format, arg ); - va_end( arg ); - return i; -} - -int main( void ) -{ - FILE * target; - TESTCASE( ( target = freopen( testfile, "wb+", stdout ) ) != NULL ); -#include "printf_testcases.h" - TESTCASE( fclose( target ) == 0 ); - TESTCASE( remove( testfile ) == 0 ); - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdio/vscanf.c b/waterbox/libc/functions/stdio/vscanf.c deleted file mode 100644 index f9ce569ef7..0000000000 --- a/waterbox/libc/functions/stdio/vscanf.c +++ /dev/null @@ -1,52 +0,0 @@ -/* vscanf( const char *, va_list ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#include - -#ifndef REGTEST -#include "_PDCLIB_io.h" - -int _PDCLIB_vscanf_unlocked( const char * _PDCLIB_restrict format, - _PDCLIB_va_list arg ) -{ - return _PDCLIB_vfscanf_unlocked( stdin, format, arg ); -} - -int vscanf( const char * _PDCLIB_restrict format, _PDCLIB_va_list arg ) -{ - return vfscanf( stdin, format, arg ); -} - -#endif - -#ifdef TEST -#define _PDCLIB_FILEID "stdio/vscanf.c" -#define _PDCLIB_FILEIO - -#include "_PDCLIB_test.h" - -static int testscanf( FILE * stream, const char * format, ... ) -{ - int i; - va_list arg; - va_start( arg, format ); - i = vscanf( format, arg ); - va_end( arg ); - return i; -} - -int main( void ) -{ - FILE * source; - TESTCASE( ( source = freopen( testfile, "wb+", stdin ) ) != NULL ); -#include "scanf_testcases.h" - TESTCASE( fclose( source ) == 0 ); - TESTCASE( remove( testfile ) == 0 ); - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdio/vsnprintf.c b/waterbox/libc/functions/stdio/vsnprintf.c deleted file mode 100644 index 761853ff8f..0000000000 --- a/waterbox/libc/functions/stdio/vsnprintf.c +++ /dev/null @@ -1,73 +0,0 @@ -/* vsnprintf( char *, size_t, const char *, va_list ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#include - -#ifndef REGTEST -#include "_PDCLIB_io.h" -#include - -struct state { - size_t bufrem; - char *bufp; -}; - -static size_t strout( void *p, const char *buf, size_t sz ) -{ - struct state *s = p; - size_t copy = s->bufrem >= sz ? sz : s->bufrem; - memcpy( s->bufp, buf, copy ); - s->bufrem -= copy; - s->bufp += copy; - return sz; -} - -int vsnprintf( char * _PDCLIB_restrict s, - size_t n, - const char * _PDCLIB_restrict format, - _PDCLIB_va_list arg ) -{ - struct state st; - st.bufrem = n; - st.bufp = s; - int r = _vcbprintf( &st, strout, format, arg ); - if ( st.bufrem ) - { - *st.bufp = 0; - } - - return r; -} - -#endif - -#ifdef TEST -#define _PDCLIB_FILEID "stdio/vsnprintf.c" -#define _PDCLIB_STRINGIO -#include -#include -#include "_PDCLIB_test.h" - -static int testprintf( char * s, const char * format, ... ) -{ - int i; - va_list arg; - va_start( arg, format ); - i = vsnprintf( s, 100, format, arg ); - va_end( arg ); - return i; -} - -int main( void ) -{ - char target[100]; -#include "printf_testcases.h" - return TEST_RESULTS; -} - -#endif - diff --git a/waterbox/libc/functions/stdio/vsprintf.c b/waterbox/libc/functions/stdio/vsprintf.c deleted file mode 100644 index 21aa2da1e5..0000000000 --- a/waterbox/libc/functions/stdio/vsprintf.c +++ /dev/null @@ -1,46 +0,0 @@ -/* vsprintf( char *, const char *, va_list ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#include -#include - -#ifndef REGTEST - -int vsprintf( char * _PDCLIB_restrict s, - const char * _PDCLIB_restrict format, - va_list arg ) -{ - return vsnprintf( s, SIZE_MAX, format, arg ); /* TODO: Replace with a non-checking call */ -} - -#endif - -#ifdef TEST -#define _PDCLIB_FILEID "stdio/vsprintf.c" -#define _PDCLIB_STRINGIO -#include -#include -#include "_PDCLIB_test.h" - -static int testprintf( char * s, const char * format, ... ) -{ - int i; - va_list arg; - va_start( arg, format ); - i = vsprintf( s, format, arg ); - va_end( arg ); - return i; -} - -int main( void ) -{ - char target[100]; -#include "printf_testcases.h" - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdio/vsscanf.c b/waterbox/libc/functions/stdio/vsscanf.c deleted file mode 100644 index 00210c1f3a..0000000000 --- a/waterbox/libc/functions/stdio/vsscanf.c +++ /dev/null @@ -1,111 +0,0 @@ -/* vsscanf( const char *, const char *, va_list ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#include - -#ifndef REGTEST -#include -#include "_PDCLIB_io.h" - -int vsscanf( const char * _PDCLIB_restrict s, - const char * _PDCLIB_restrict format, - va_list arg ) -{ - /* TODO: This function should interpret format as multibyte characters. */ - struct _PDCLIB_status_t status; - status.base = 0; - status.flags = 0; - status.n = 0; - status.i = 0; - status.current = 0; - status.s = (char *) s; - status.width = 0; - status.prec = 0; - status.stream = NULL; - va_copy( status.arg, arg ); - - while ( *format != '\0' ) - { - const char * rc; - if ( ( *format != '%' ) || ( ( rc = _PDCLIB_scan( format, &status ) ) == format ) ) - { - /* No conversion specifier, match verbatim */ - if ( isspace( *format ) ) - { - /* Whitespace char in format string: Skip all whitespaces */ - /* No whitespaces in input do not result in matching error */ - while ( isspace( *status.s ) ) - { - ++status.s; - ++status.i; - } - } - else - { - /* Non-whitespace char in format string: Match verbatim */ - if ( *status.s != *format ) - { - if ( *status.s == '\0' && status.n == 0 ) - { - /* Early input error */ - return EOF; - } - /* Matching error */ - return status.n; - } - else - { - ++status.s; - ++status.i; - } - } - ++format; - } - else - { - /* NULL return code indicates error */ - if ( rc == NULL ) - { - if ( ( *status.s == '\n' ) && ( status.n == 0 ) ) - { - status.n = EOF; - } - break; - } - /* Continue parsing after conversion specifier */ - format = rc; - } - } - va_end( status.arg ); - return status.n; -} - -#endif - -#ifdef TEST -#define _PDCLIB_FILEID "stdio/vsscanf.c" -#define _PDCLIB_STRINGIO - -#include "_PDCLIB_test.h" - -static int testscanf( char const * stream, char const * format, ... ) -{ - va_list ap; - va_start( ap, format ); - int result = vsscanf( stream, format, ap ); - va_end( ap ); - return result; -} - -int main( void ) -{ - char source[100]; -#include "scanf_testcases.h" - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdlib/_Exit.c b/waterbox/libc/functions/stdlib/_Exit.c deleted file mode 100644 index 5a43ee2379..0000000000 --- a/waterbox/libc/functions/stdlib/_Exit.c +++ /dev/null @@ -1,34 +0,0 @@ -/* _Exit( int ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#include - -#ifndef REGTEST -#include "_PDCLIB_glue.h" - -void _Exit( int status ) -{ - /* TODO: Flush and close open streams. Remove tmpfile() files. Make this - called on process termination automatically. - */ - _PDCLIB_Exit( status ); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - int UNEXPECTED_RETURN = 0; - _Exit( 0 ); - TESTCASE( UNEXPECTED_RETURN ); - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdlib/abort.c b/waterbox/libc/functions/stdlib/abort.c deleted file mode 100644 index 0c3428340c..0000000000 --- a/waterbox/libc/functions/stdlib/abort.c +++ /dev/null @@ -1,39 +0,0 @@ -/* abort( void ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#include - -#ifndef REGTEST - -void abort( void ) -{ - raise( SIGABRT ); - exit( EXIT_FAILURE ); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -#include - -static void aborthandler( int sig ) -{ - exit( 0 ); -} - -int main( void ) -{ - int UNEXPECTED_RETURN_FROM_ABORT = 0; - TESTCASE( signal( SIGABRT, &aborthandler ) != SIG_ERR ); - abort(); - TESTCASE( UNEXPECTED_RETURN_FROM_ABORT ); - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdlib/abs.c b/waterbox/libc/functions/stdlib/abs.c deleted file mode 100644 index 4e8302bdb2..0000000000 --- a/waterbox/libc/functions/stdlib/abs.c +++ /dev/null @@ -1,30 +0,0 @@ -/* abs( int ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -int abs( int j ) -{ - return ( j >= 0 ) ? j : -j; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" -#include - -int main( void ) -{ - TESTCASE( abs( 0 ) == 0 ); - TESTCASE( abs( INT_MAX ) == INT_MAX ); - TESTCASE( abs( INT_MIN + 1 ) == -( INT_MIN + 1 ) ); - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdlib/at_quick_exit.c b/waterbox/libc/functions/stdlib/at_quick_exit.c deleted file mode 100644 index 47dc38dc8c..0000000000 --- a/waterbox/libc/functions/stdlib/at_quick_exit.c +++ /dev/null @@ -1,60 +0,0 @@ -/* atexit( void (*)( void ) ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -extern void (*_PDCLIB_quickexitstack[])( void ); -extern size_t _PDCLIB_quickexitptr; - -int at_quick_exit( void (*func)( void ) ) -{ - if ( _PDCLIB_quickexitptr == 0 ) - { - return -1; - } - else - { - _PDCLIB_quickexitstack[ --_PDCLIB_quickexitptr ] = func; - return 0; - } -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" -#include - -static int flags[ 32 ]; - -static void counthandler( void ) -{ - static int count = 0; - flags[ count ] = count; - ++count; -} - -static void checkhandler( void ) -{ - for ( int i = 0; i < 31; ++i ) - { - assert( flags[ i ] == i ); - } -} - -int main( void ) -{ - TESTCASE( at_quick_exit( &checkhandler ) == 0 ); - for ( int i = 0; i < 31; ++i ) - { - TESTCASE( at_quick_exit( &counthandler ) == 0 ); - } - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdlib/atexit.c b/waterbox/libc/functions/stdlib/atexit.c deleted file mode 100644 index 808bcb1176..0000000000 --- a/waterbox/libc/functions/stdlib/atexit.c +++ /dev/null @@ -1,60 +0,0 @@ -/* atexit( void (*)( void ) ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -extern void (*_PDCLIB_exitstack[])( void ); -extern size_t _PDCLIB_exitptr; - -int atexit( void (*func)( void ) ) -{ - if ( _PDCLIB_exitptr == 0 ) - { - return -1; - } - else - { - _PDCLIB_exitstack[ --_PDCLIB_exitptr ] = func; - return 0; - } -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" -#include - -static int flags[ 32 ]; - -static void counthandler( void ) -{ - static int count = 0; - flags[ count ] = count; - ++count; -} - -static void checkhandler( void ) -{ - for ( int i = 0; i < 31; ++i ) - { - assert( flags[ i ] == i ); - } -} - -int main( void ) -{ - TESTCASE( atexit( &checkhandler ) == 0 ); - for ( int i = 0; i < 31; ++i ) - { - TESTCASE( atexit( &counthandler ) == 0 ); - } - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdlib/atoi.c b/waterbox/libc/functions/stdlib/atoi.c deleted file mode 100644 index eac0e1652c..0000000000 --- a/waterbox/libc/functions/stdlib/atoi.c +++ /dev/null @@ -1,27 +0,0 @@ -/* atoi( const char * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -int atoi( const char * s ) -{ - return (int) _PDCLIB_atomax( s ); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - /* no tests for a simple wrapper */ - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdlib/atol.c b/waterbox/libc/functions/stdlib/atol.c deleted file mode 100644 index fb5e512142..0000000000 --- a/waterbox/libc/functions/stdlib/atol.c +++ /dev/null @@ -1,27 +0,0 @@ -/* atol( const char * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -long int atol( const char * s ) -{ - return (long int) _PDCLIB_atomax( s ); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - /* no tests for a simple wrapper */ - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdlib/atoll.c b/waterbox/libc/functions/stdlib/atoll.c deleted file mode 100644 index f7fa824402..0000000000 --- a/waterbox/libc/functions/stdlib/atoll.c +++ /dev/null @@ -1,27 +0,0 @@ -/* atoll( const char * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -long long int atoll( const char * s ) -{ - return (long long int) _PDCLIB_atomax( s ); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - /* no tests for a simple wrapper */ - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdlib/bsearch.c b/waterbox/libc/functions/stdlib/bsearch.c deleted file mode 100644 index 835407f5ee..0000000000 --- a/waterbox/libc/functions/stdlib/bsearch.c +++ /dev/null @@ -1,60 +0,0 @@ -/* bsearch( const void *, const void *, size_t, size_t, int(*)( const void *, const void * ) ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -void * bsearch( const void * key, const void * base, size_t nmemb, size_t size, int (*compar)( const void *, const void * ) ) -{ - const void * pivot; - int rc; - size_t corr; - while ( nmemb ) - { - /* algorithm needs -1 correction if remaining elements are an even number. */ - corr = nmemb % 2; - nmemb /= 2; - pivot = (const char *)base + (nmemb * size); - rc = compar( key, pivot ); - if ( rc > 0 ) - { - base = (const char *)pivot + size; - /* applying correction */ - nmemb -= ( 1 - corr ); - } - else if ( rc == 0 ) - { - return (void *)pivot; - } - } - return NULL; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -static int compare( const void * left, const void * right ) -{ - return *( (unsigned char *)left ) - *( (unsigned char *)right ); -} - -int main( void ) -{ - TESTCASE( bsearch( "e", abcde, 4, 1, compare ) == NULL ); - TESTCASE( bsearch( "e", abcde, 5, 1, compare ) == &abcde[4] ); - TESTCASE( bsearch( "a", abcde + 1, 4, 1, compare ) == NULL ); - TESTCASE( bsearch( "0", abcde, 1, 1, compare ) == NULL ); - TESTCASE( bsearch( "a", abcde, 1, 1, compare ) == &abcde[0] ); - TESTCASE( bsearch( "a", abcde, 0, 1, compare ) == NULL ); - TESTCASE( bsearch( "e", abcde, 3, 2, compare ) == &abcde[4] ); - TESTCASE( bsearch( "b", abcde, 3, 2, compare ) == NULL ); - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdlib/div.c b/waterbox/libc/functions/stdlib/div.c deleted file mode 100644 index 8aabad6dd6..0000000000 --- a/waterbox/libc/functions/stdlib/div.c +++ /dev/null @@ -1,39 +0,0 @@ -/* div( int, int ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -div_t div( int numer, int denom ) -{ - div_t rc; - rc.quot = numer / denom; - rc.rem = numer % denom; - /* TODO: pre-C99 compilers might require modulus corrections */ - return rc; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - div_t result; - result = div( 5, 2 ); - TESTCASE( result.quot == 2 && result.rem == 1 ); - result = div( -5, 2 ); - TESTCASE( result.quot == -2 && result.rem == -1 ); - result = div( 5, -2 ); - TESTCASE( result.quot == -2 && result.rem == 1 ); - TESTCASE( sizeof( result.quot ) == sizeof( int ) ); - TESTCASE( sizeof( result.rem ) == sizeof( int ) ); - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdlib/exit.c b/waterbox/libc/functions/stdlib/exit.c deleted file mode 100644 index fa91ade187..0000000000 --- a/waterbox/libc/functions/stdlib/exit.c +++ /dev/null @@ -1,44 +0,0 @@ -/* exit( int ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST -#include "_PDCLIB_io.h" - -/* TODO - "except that a function is called after any previously registered - functions that had already been called at the time it was registered. -*/ - -/* TODO: 32 is guaranteed. This should be dynamic but ATM gives problems - with my malloc. -*/ -#define NUMBER_OF_SLOTS 40 - -void (*_PDCLIB_exitstack[ NUMBER_OF_SLOTS ])( void ) = { _PDCLIB_closeall }; -size_t _PDCLIB_exitptr = NUMBER_OF_SLOTS; - -void exit( int status ) -{ - while ( _PDCLIB_exitptr < NUMBER_OF_SLOTS ) - { - _PDCLIB_exitstack[ _PDCLIB_exitptr++ ](); - } - _Exit( status ); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - /* Unwinding of regstack tested in atexit(). */ - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdlib/getenv.c b/waterbox/libc/functions/stdlib/getenv.c deleted file mode 100644 index f07481d3b4..0000000000 --- a/waterbox/libc/functions/stdlib/getenv.c +++ /dev/null @@ -1,30 +0,0 @@ -/* getenv( const char * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -/* This is a stub implementation of getenv -*/ - -#include -#include - -#ifndef REGTEST - -char * getenv( const char * name ) -{ - return NULL; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdlib/labs.c b/waterbox/libc/functions/stdlib/labs.c deleted file mode 100644 index 2888928f8e..0000000000 --- a/waterbox/libc/functions/stdlib/labs.c +++ /dev/null @@ -1,30 +0,0 @@ -/* labs( long int ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -long int labs( long int j ) -{ - return ( j >= 0 ) ? j : -j; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" -#include - -int main( void ) -{ - TESTCASE( labs( 0 ) == 0 ); - TESTCASE( labs( LONG_MAX ) == LONG_MAX ); - TESTCASE( labs( LONG_MIN + 1 ) == -( LONG_MIN + 1 ) ); - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdlib/ldiv.c b/waterbox/libc/functions/stdlib/ldiv.c deleted file mode 100644 index cf579fb383..0000000000 --- a/waterbox/libc/functions/stdlib/ldiv.c +++ /dev/null @@ -1,39 +0,0 @@ -/* ldiv( long int, long int ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -ldiv_t ldiv( long int numer, long int denom ) -{ - ldiv_t rc; - rc.quot = numer / denom; - rc.rem = numer % denom; - /* TODO: pre-C99 compilers might require modulus corrections */ - return rc; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - ldiv_t result; - result = ldiv( 5, 2 ); - TESTCASE( result.quot == 2 && result.rem == 1 ); - result = ldiv( -5, 2 ); - TESTCASE( result.quot == -2 && result.rem == -1 ); - result = ldiv( 5, -2 ); - TESTCASE( result.quot == -2 && result.rem == 1 ); - TESTCASE( sizeof( result.quot ) == sizeof( long ) ); - TESTCASE( sizeof( result.rem ) == sizeof( long ) ); - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdlib/llabs.c b/waterbox/libc/functions/stdlib/llabs.c deleted file mode 100644 index 78a56c3009..0000000000 --- a/waterbox/libc/functions/stdlib/llabs.c +++ /dev/null @@ -1,30 +0,0 @@ -/* llabs( long int ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -long long int llabs( long long int j ) -{ - return ( j >= 0 ) ? j : -j; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" -#include - -int main( void ) -{ - TESTCASE( llabs( 0ll ) == 0 ); - TESTCASE( llabs( LLONG_MAX ) == LLONG_MAX ); - TESTCASE( llabs( LLONG_MIN + 1 ) == -( LLONG_MIN + 1 ) ); - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdlib/lldiv.c b/waterbox/libc/functions/stdlib/lldiv.c deleted file mode 100644 index e6552c3447..0000000000 --- a/waterbox/libc/functions/stdlib/lldiv.c +++ /dev/null @@ -1,39 +0,0 @@ -/* lldiv( long long int, long long int ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -lldiv_t lldiv( long long int numer, long long int denom ) -{ - lldiv_t rc; - rc.quot = numer / denom; - rc.rem = numer % denom; - /* TODO: pre-C99 compilers might require modulus corrections */ - return rc; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - lldiv_t result; - result = lldiv( 5ll, 2ll ); - TESTCASE( result.quot == 2 && result.rem == 1 ); - result = lldiv( -5ll, 2ll ); - TESTCASE( result.quot == -2 && result.rem == -1 ); - result = lldiv( 5ll, -2ll ); - TESTCASE( result.quot == -2 && result.rem == 1 ); - TESTCASE( sizeof( result.quot ) == sizeof( long long ) ); - TESTCASE( sizeof( result.rem ) == sizeof( long long ) ); - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdlib/qsort.c b/waterbox/libc/functions/stdlib/qsort.c deleted file mode 100644 index 757cae0f28..0000000000 --- a/waterbox/libc/functions/stdlib/qsort.c +++ /dev/null @@ -1,164 +0,0 @@ -/* qsort( void *, size_t, size_t, int(*)( const void *, const void * ) ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -/* This implementation is taken from Paul Edward's PDPCLIB. - - Original code is credited to Raymond Gardner, Englewood CO. - Minor mods are credited to Paul Edwards. - Some reformatting and simplification done by Martin Baute. - All code is still Public Domain. -*/ - -/* Wrapper for _PDCLIB_memswp protects against multiple argument evaluation. */ -static inline void memswp( char * i, char * j, size_t size ) -{ - _PDCLIB_memswp( i, j, size ); -} - -/* For small sets, insertion sort is faster than quicksort. - T is the threshold below which insertion sort will be used. - Must be 3 or larger. -*/ -#define T 7 - -/* Macros for handling the QSort stack */ -#define PREPARE_STACK char * stack[STACKSIZE]; char * * stackptr = stack -#define PUSH( base, limit ) stackptr[0] = base; stackptr[1] = limit; stackptr += 2 -#define POP( base, limit ) stackptr -= 2; base = stackptr[0]; limit = stackptr[1] -/* TODO: Stack usage is log2( nmemb ) (minus what T shaves off the worst case). - Worst-case nmemb is platform dependent and should probably be - configured through _PDCLIB_config.h. -*/ -#define STACKSIZE 64 - -void qsort( void * base, size_t nmemb, size_t size, int (*compar)( const void *, const void * ) ) -{ - char * i; - char * j; - _PDCLIB_size_t thresh = T * size; - char * base_ = (char *)base; - char * limit = base_ + nmemb * size; - PREPARE_STACK; - - for ( ;; ) - { - if ( (size_t)( limit - base_ ) > thresh ) /* QSort for more than T elements. */ - { - /* We work from second to last - first will be pivot element. */ - i = base_ + size; - j = limit - size; - /* We swap first with middle element, then sort that with second - and last element so that eventually first element is the median - of the three - avoiding pathological pivots. - TODO: Instead of middle element, chose one randomly. - */ - memswp( ( ( ( (size_t)( limit - base_ ) ) / size ) / 2 ) * size + base_, base_, size ); - if ( compar( i, j ) > 0 ) memswp( i, j, size ); - if ( compar( base_, j ) > 0 ) memswp( base_, j, size ); - if ( compar( i, base_ ) > 0 ) memswp( i, base_, size ); - /* Now we have the median for pivot element, entering main Quicksort. */ - for ( ;; ) - { - do - { - /* move i right until *i >= pivot */ - i += size; - } while ( compar( i, base_ ) < 0 ); - do - { - /* move j left until *j <= pivot */ - j -= size; - } while ( compar( j, base_ ) > 0 ); - if ( i > j ) - { - /* break loop if pointers crossed */ - break; - } - /* else swap elements, keep scanning */ - memswp( i, j, size ); - } - /* move pivot into correct place */ - memswp( base_, j, size ); - /* larger subfile base / limit to stack, sort smaller */ - if ( j - base_ > limit - i ) - { - /* left is larger */ - PUSH( base_, j ); - base_ = i; - } - else - { - /* right is larger */ - PUSH( i, limit ); - limit = j; - } - } - else /* insertion sort for less than T elements */ - { - for ( j = base_, i = j + size; i < limit; j = i, i += size ) - { - for ( ; compar( j, j + size ) > 0; j -= size ) - { - memswp( j, j + size, size ); - if ( j == base_ ) - { - break; - } - } - } - if ( stackptr != stack ) /* if any entries on stack */ - { - POP( base_, limit ); - } - else /* else stack empty, done */ - { - break; - } - } - } -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" -#include -#include - -static int compare( const void * left, const void * right ) -{ - return *( (unsigned char *)left ) - *( (unsigned char *)right ); -} - -int main( void ) -{ - char presort[] = { "shreicnyjqpvozxmbt" }; - char sorted1[] = { "bcehijmnopqrstvxyz" }; - char sorted2[] = { "bticjqnyozpvreshxm" }; - char s[19]; - strcpy( s, presort ); - qsort( s, 18, 1, compare ); - TESTCASE( strcmp( s, sorted1 ) == 0 ); - strcpy( s, presort ); - qsort( s, 9, 2, compare ); - TESTCASE( strcmp( s, sorted2 ) == 0 ); - strcpy( s, presort ); - qsort( s, 1, 1, compare ); - TESTCASE( strcmp( s, presort ) == 0 ); -#if defined(REGTEST) && (__BSD_VISIBLE || __APPLE__) - puts( "qsort.c: Skipping test #4 for BSD as it goes into endless loop here." ); -#else - qsort( s, 100, 0, compare ); - TESTCASE( strcmp( s, presort ) == 0 ); -#endif - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdlib/quick_exit.c b/waterbox/libc/functions/stdlib/quick_exit.c deleted file mode 100644 index 2420e67383..0000000000 --- a/waterbox/libc/functions/stdlib/quick_exit.c +++ /dev/null @@ -1,44 +0,0 @@ -/* quick_exit( int ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST -#include "_PDCLIB_io.h" - -/* TODO - "except that a function is called after any previously registered - functions that had already been called at the time it was registered. -*/ - -/* TODO: 32 is guaranteed. This should be dynamic but ATM gives problems - with my malloc. -*/ -#define NUMBER_OF_SLOTS 40 - -void (*_PDCLIB_quickexitstack[ NUMBER_OF_SLOTS ])( void ) = { 0 }; -size_t _PDCLIB_quickexitptr = NUMBER_OF_SLOTS; - -void quick_exit( int status ) -{ - while ( _PDCLIB_quickexitptr < NUMBER_OF_SLOTS ) - { - _PDCLIB_quickexitstack[ _PDCLIB_quickexitptr++ ](); - } - _Exit( status ); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - /* Unwinding of regstack tested in at_quick_exit(). */ - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdlib/rand.c b/waterbox/libc/functions/stdlib/rand.c deleted file mode 100644 index 1e8f3cd789..0000000000 --- a/waterbox/libc/functions/stdlib/rand.c +++ /dev/null @@ -1,33 +0,0 @@ -/* rand( void ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -int rand( void ) -{ - _PDCLIB_seed = _PDCLIB_seed * 1103515245 + 12345; - return (int)( _PDCLIB_seed / 65536 ) % 32768; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - int rnd1, rnd2; - TESTCASE( ( rnd1 = rand() ) < RAND_MAX ); - TESTCASE( ( rnd2 = rand() ) < RAND_MAX ); - srand( 1 ); - TESTCASE( rand() == rnd1 ); - TESTCASE( rand() == rnd2 ); - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdlib/srand.c b/waterbox/libc/functions/stdlib/srand.c deleted file mode 100644 index 3478cb09df..0000000000 --- a/waterbox/libc/functions/stdlib/srand.c +++ /dev/null @@ -1,27 +0,0 @@ -/* srand( unsigned int ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -void srand( unsigned int seed ) -{ - _PDCLIB_seed = seed; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - /* tested in rand.c */ - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdlib/strtol.c b/waterbox/libc/functions/stdlib/strtol.c deleted file mode 100644 index ce75539e42..0000000000 --- a/waterbox/libc/functions/stdlib/strtol.c +++ /dev/null @@ -1,128 +0,0 @@ -/* strtol( const char *, char * *, int ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#include - -#ifndef REGTEST - -#include - -long int strtol( const char * s, char ** endptr, int base ) -{ - long int rc; - char sign = '+'; - const char * p = _PDCLIB_strtox_prelim( s, &sign, &base ); - if ( base < 2 || base > 36 ) return 0; - if ( sign == '+' ) - { - rc = (long int)_PDCLIB_strtox_main( &p, (unsigned)base, (uintmax_t)LONG_MAX, (uintmax_t)( LONG_MAX / base ), (int)( LONG_MAX % base ), &sign ); - } - else - { - rc = (long int)_PDCLIB_strtox_main( &p, (unsigned)base, (uintmax_t)LONG_MIN, (uintmax_t)( LONG_MIN / -base ), (int)( -( LONG_MIN % base ) ), &sign ); - } - if ( endptr != NULL ) *endptr = ( p != NULL ) ? (char *) p : (char *) s; - return ( sign == '+' ) ? rc : -rc; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -#include - -int main( void ) -{ - char * endptr; - /* this, to base 36, overflows even a 256 bit integer */ - char overflow[] = "-ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ_"; - /* tricky border case */ - char tricky[] = "+0xz"; - errno = 0; - /* basic functionality */ - TESTCASE( strtol( "123", NULL, 10 ) == 123 ); - /* proper detecting of default base 10 */ - TESTCASE( strtol( "456", NULL, 0 ) == 456 ); - /* proper functioning to smaller base */ - TESTCASE( strtol( "14", NULL, 8 ) == 12 ); - /* proper autodetecting of octal */ - TESTCASE( strtol( "016", NULL, 0 ) == 14 ); - /* proper autodetecting of hexadecimal, lowercase 'x' */ - TESTCASE( strtol( "0xFF", NULL, 0 ) == 255 ); - /* proper autodetecting of hexadecimal, uppercase 'X' */ - TESTCASE( strtol( "0Xa1", NULL, 0 ) == 161 ); - /* proper handling of border case: 0x followed by non-hexdigit */ - TESTCASE( strtol( tricky, &endptr, 0 ) == 0 ); - TESTCASE( endptr == tricky + 2 ); - /* proper handling of border case: 0 followed by non-octdigit */ - TESTCASE( strtol( tricky, &endptr, 8 ) == 0 ); - TESTCASE( endptr == tricky + 2 ); - /* errno should still be 0 */ - TESTCASE( errno == 0 ); - /* overflowing subject sequence must still return proper endptr */ - TESTCASE( strtol( overflow, &endptr, 36 ) == LONG_MIN ); - TESTCASE( errno == ERANGE ); - TESTCASE( ( endptr - overflow ) == 53 ); - /* same for positive */ - errno = 0; - TESTCASE( strtol( overflow + 1, &endptr, 36 ) == LONG_MAX ); - TESTCASE( errno == ERANGE ); - TESTCASE( ( endptr - overflow ) == 53 ); - /* testing skipping of leading whitespace */ - TESTCASE( strtol( " \n\v\t\f789", NULL, 0 ) == 789 ); - /* testing conversion failure */ - TESTCASE( strtol( overflow, &endptr, 10 ) == 0 ); - TESTCASE( endptr == overflow ); - endptr = NULL; - TESTCASE( strtol( overflow, &endptr, 0 ) == 0 ); - TESTCASE( endptr == overflow ); - /* TODO: These tests assume two-complement, but conversion should work */ - /* for one-complement and signed magnitude just as well. Anyone having */ - /* a platform to test this on? */ - errno = 0; -#if LONG_MAX >> 30 == 1 - /* testing "even" overflow, i.e. base is power of two */ - TESTCASE( strtol( "2147483647", NULL, 0 ) == 0x7fffffff ); - TESTCASE( errno == 0 ); - errno = 0; - TESTCASE( strtol( "2147483648", NULL, 0 ) == LONG_MAX ); - TESTCASE( errno == ERANGE ); - errno = 0; - TESTCASE( strtol( "-2147483647", NULL, 0 ) == (long)0x80000001 ); - TESTCASE( errno == 0 ); - errno = 0; - TESTCASE( strtol( "-2147483648", NULL, 0 ) == LONG_MIN ); - TESTCASE( errno == 0 ); - errno = 0; - TESTCASE( strtol( "-2147483649", NULL, 0 ) == LONG_MIN ); - TESTCASE( errno == ERANGE ); - /* TODO: test "odd" overflow, i.e. base is not power of two */ -#elif LONG_MAX >> 62 == 1 - /* testing "even" overflow, i.e. base is power of two */ - TESTCASE( strtol( "9223372036854775807", NULL, 0 ) == 0x7fffffffffffffff ); - TESTCASE( errno == 0 ); - errno = 0; - TESTCASE( strtol( "9223372036854775808", NULL, 0 ) == LONG_MAX ); - TESTCASE( errno == ERANGE ); - errno = 0; - TESTCASE( strtol( "-9223372036854775807", NULL, 0 ) == (long)0x8000000000000001 ); - TESTCASE( errno == 0 ); - errno = 0; - TESTCASE( strtol( "-9223372036854775808", NULL, 0 ) == LONG_MIN ); - TESTCASE( errno == 0 ); - errno = 0; - TESTCASE( strtol( "-9223372036854775809", NULL, 0 ) == LONG_MIN ); - TESTCASE( errno == ERANGE ); - /* TODO: test "odd" overflow, i.e. base is not power of two */ -#else -#error Unsupported width of 'long' (neither 32 nor 64 bit). -#endif - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdlib/strtoll.c b/waterbox/libc/functions/stdlib/strtoll.c deleted file mode 100644 index de71194298..0000000000 --- a/waterbox/libc/functions/stdlib/strtoll.c +++ /dev/null @@ -1,122 +0,0 @@ -/* strtoll( const char *, char * *, int ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#include - -#ifndef REGTEST - -#include - -long long int strtoll( const char * s, char ** endptr, int base ) -{ - long long int rc; - char sign = '+'; - const char * p = _PDCLIB_strtox_prelim( s, &sign, &base ); - if ( base < 2 || base > 36 ) return 0; - if ( sign == '+' ) - { - rc = (long long int)_PDCLIB_strtox_main( &p, (unsigned)base, (uintmax_t)LLONG_MAX, (uintmax_t)( LLONG_MAX / base ), (int)( LLONG_MAX % base ), &sign ); - } - else - { - rc = (long long int)_PDCLIB_strtox_main( &p, (unsigned)base, (uintmax_t)LLONG_MIN, (uintmax_t)( LLONG_MIN / -base ), (int)( -( LLONG_MIN % base ) ), &sign ); - } - if ( endptr != NULL ) *endptr = ( p != NULL ) ? (char *) p : (char *) s; - return ( sign == '+' ) ? rc : -rc; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -#include - -int main( void ) -{ - char * endptr; - /* this, to base 36, overflows even a 256 bit integer */ - char overflow[] = "-ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ_"; - /* tricky border case */ - char tricky[] = "+0xz"; - errno = 0; - /* basic functionality */ - TESTCASE( strtoll( "123", NULL, 10 ) == 123 ); - /* proper detecting of default base 10 */ - TESTCASE( strtoll( "456", NULL, 0 ) == 456 ); - /* proper functioning to smaller base */ - TESTCASE( strtoll( "14", NULL, 8 ) == 12 ); - /* proper autodetecting of octal */ - TESTCASE( strtoll( "016", NULL, 0 ) == 14 ); - /* proper autodetecting of hexadecimal, lowercase 'x' */ - TESTCASE( strtoll( "0xFF", NULL, 0 ) == 255 ); - /* proper autodetecting of hexadecimal, uppercase 'X' */ - TESTCASE( strtoll( "0Xa1", NULL, 0 ) == 161 ); - /* proper handling of border case: 0x followed by non-hexdigit */ - TESTCASE( strtoll( tricky, &endptr, 0 ) == 0 ); - TESTCASE( endptr == tricky + 2 ); - /* proper handling of border case: 0 followed by non-octdigit */ - TESTCASE( strtoll( tricky, &endptr, 8 ) == 0 ); - TESTCASE( endptr == tricky + 2 ); - /* errno should still be 0 */ - TESTCASE( errno == 0 ); - /* overflowing subject sequence must still return proper endptr */ - TESTCASE( strtoll( overflow, &endptr, 36 ) == LLONG_MIN ); - TESTCASE( errno == ERANGE ); - TESTCASE( ( endptr - overflow ) == 53 ); - /* same for positive */ - errno = 0; - TESTCASE( strtoll( overflow + 1, &endptr, 36 ) == LLONG_MAX ); - TESTCASE( errno == ERANGE ); - TESTCASE( ( endptr - overflow ) == 53 ); - /* testing skipping of leading whitespace */ - TESTCASE( strtoll( " \n\v\t\f789", NULL, 0 ) == 789 ); - /* testing conversion failure */ - TESTCASE( strtoll( overflow, &endptr, 10 ) == 0 ); - TESTCASE( endptr == overflow ); - endptr = NULL; - TESTCASE( strtoll( overflow, &endptr, 0 ) == 0 ); - TESTCASE( endptr == overflow ); - /* TODO: These tests assume two-complement, but conversion should work */ - /* for one-complement and signed magnitude just as well. Anyone having */ - /* a platform to test this on? */ - errno = 0; -#if LLONG_MAX >> 62 == 1 - /* testing "even" overflow, i.e. base is power of two */ - TESTCASE( strtoll( "9223372036854775807", NULL, 0 ) == 0x7fffffffffffffff ); - TESTCASE( errno == 0 ); - TESTCASE( strtoll( "9223372036854775808", NULL, 0 ) == LLONG_MAX ); - TESTCASE( errno == ERANGE ); - errno = 0; - TESTCASE( strtoll( "-9223372036854775807", NULL, 0 ) == (long long)0x8000000000000001 ); - TESTCASE( errno == 0 ); - TESTCASE( strtoll( "-9223372036854775808", NULL, 0 ) == LLONG_MIN ); - TESTCASE( errno == 0 ); - TESTCASE( strtoll( "-9223372036854775809", NULL, 0 ) == LLONG_MIN ); - TESTCASE( errno == ERANGE ); - /* TODO: test "odd" overflow, i.e. base is not power of two */ -#elif LLONG_MAX >> 126 == 1 - /* testing "even" overflow, i.e. base is power of two */ - TESTCASE( strtoll( "170141183460469231731687303715884105728", NULL, 0 ) == 0x7fffffffffffffffffffffffffffffff ); - TESTCASE( errno == 0 ); - TESTCASE( strtoll( "170141183460469231731687303715884105729", NULL, 0 ) == LLONG_MAX ); - TESTCASE( errno == ERANGE ); - errno = 0; - TESTCASE( strtoll( "-170141183460469231731687303715884105728", NULL, 0 ) == -0x80000000000000000000000000000001 ); - TESTCASE( errno == 0 ); - TESTCASE( strtoll( "-170141183460469231731687303715884105729", NULL, 0 ) == LLONG_MIN ); - TESTCASE( errno == 0 ); - TESTCASE( strtoll( "-170141183460469231731687303715884105730", NULL, 0 ) == LLONG_MIN ); - TESTCASE( errno == ERANGE ); - /* TODO: test "odd" overflow, i.e. base is not power of two */ -#else -#error Unsupported width of 'long long' (neither 64 nor 128 bit). -#endif - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdlib/strtoul.c b/waterbox/libc/functions/stdlib/strtoul.c deleted file mode 100644 index 0bcb7dd2b6..0000000000 --- a/waterbox/libc/functions/stdlib/strtoul.c +++ /dev/null @@ -1,104 +0,0 @@ -/* strtoul( const char *, char * *, int ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#include - -#ifndef REGTEST - -#include - -unsigned long int strtoul( const char * s, char ** endptr, int base ) -{ - unsigned long int rc; - char sign = '+'; - const char * p = _PDCLIB_strtox_prelim( s, &sign, &base ); - if ( base < 2 || base > 36 ) return 0; - rc = (unsigned long int)_PDCLIB_strtox_main( &p, (unsigned)base, (uintmax_t)ULONG_MAX, (uintmax_t)( ULONG_MAX / base ), (int)( ULONG_MAX % base ), &sign ); - if ( endptr != NULL ) *endptr = ( p != NULL ) ? (char *) p : (char *) s; - return ( sign == '+' ) ? rc : -rc; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" -#include - -int main( void ) -{ - char * endptr; - /* this, to base 36, overflows even a 256 bit integer */ - char overflow[] = "-ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ_"; - /* tricky border case */ - char tricky[] = "+0xz"; - errno = 0; - /* basic functionality */ - TESTCASE( strtoul( "123", NULL, 10 ) == 123 ); - /* proper detecting of default base 10 */ - TESTCASE( strtoul( "456", NULL, 0 ) == 456 ); - /* proper functioning to smaller base */ - TESTCASE( strtoul( "14", NULL, 8 ) == 12 ); - /* proper autodetecting of octal */ - TESTCASE( strtoul( "016", NULL, 0 ) == 14 ); - /* proper autodetecting of hexadecimal, lowercase 'x' */ - TESTCASE( strtoul( "0xFF", NULL, 0 ) == 255 ); - /* proper autodetecting of hexadecimal, uppercase 'X' */ - TESTCASE( strtoul( "0Xa1", NULL, 0 ) == 161 ); - /* proper handling of border case: 0x followed by non-hexdigit */ - TESTCASE( strtoul( tricky, &endptr, 0 ) == 0 ); - TESTCASE( endptr == tricky + 2 ); - /* proper handling of border case: 0 followed by non-octdigit */ - TESTCASE( strtoul( tricky, &endptr, 8 ) == 0 ); - TESTCASE( endptr == tricky + 2 ); - /* errno should still be 0 */ - TESTCASE( errno == 0 ); - /* overflowing subject sequence must still return proper endptr */ - TESTCASE( strtoul( overflow, &endptr, 36 ) == ULONG_MAX ); - TESTCASE( errno == ERANGE ); - TESTCASE( ( endptr - overflow ) == 53 ); - /* same for positive */ - errno = 0; - TESTCASE( strtoul( overflow + 1, &endptr, 36 ) == ULONG_MAX ); - TESTCASE( errno == ERANGE ); - TESTCASE( ( endptr - overflow ) == 53 ); - /* testing skipping of leading whitespace */ - TESTCASE( strtoul( " \n\v\t\f789", NULL, 0 ) == 789 ); - /* testing conversion failure */ - TESTCASE( strtoul( overflow, &endptr, 10 ) == 0 ); - TESTCASE( endptr == overflow ); - endptr = NULL; - TESTCASE( strtoul( overflow, &endptr, 0 ) == 0 ); - TESTCASE( endptr == overflow ); - /* TODO: These tests assume two-complement, but conversion should work */ - /* for one-complement and signed magnitude just as well. Anyone having */ - /* a platform to test this on? */ - errno = 0; -/* long -> 32 bit */ -#if ULONG_MAX >> 31 == 1 - /* testing "even" overflow, i.e. base is power of two */ - TESTCASE( strtoul( "4294967295", NULL, 0 ) == ULONG_MAX ); - TESTCASE( errno == 0 ); - errno = 0; - TESTCASE( strtoul( "4294967296", NULL, 0 ) == ULONG_MAX ); - TESTCASE( errno == ERANGE ); - /* TODO: test "odd" overflow, i.e. base is not power of two */ -/* long -> 64 bit */ -#elif ULONG_MAX >> 63 == 1 - /* testing "even" overflow, i.e. base is power of two */ - TESTCASE( strtoul( "18446744073709551615", NULL, 0 ) == ULONG_MAX ); - TESTCASE( errno == 0 ); - errno = 0; - TESTCASE( strtoul( "18446744073709551616", NULL, 0 ) == ULONG_MAX ); - TESTCASE( errno == ERANGE ); - /* TODO: test "odd" overflow, i.e. base is not power of two */ -#else -#error Unsupported width of 'long' (neither 32 nor 64 bit). -#endif - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdlib/strtoull.c b/waterbox/libc/functions/stdlib/strtoull.c deleted file mode 100644 index 17d283fd69..0000000000 --- a/waterbox/libc/functions/stdlib/strtoull.c +++ /dev/null @@ -1,99 +0,0 @@ -/* strtoull( const char *, char * *, int ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#include - -#ifndef REGTEST - -#include - -unsigned long long int strtoull( const char * s, char ** endptr, int base ) -{ - unsigned long long int rc; - char sign = '+'; - const char * p = _PDCLIB_strtox_prelim( s, &sign, &base ); - if ( base < 2 || base > 36 ) return 0; - rc = _PDCLIB_strtox_main( &p, (unsigned)base, (uintmax_t)ULLONG_MAX, (uintmax_t)( ULLONG_MAX / base ), (int)( ULLONG_MAX % base ), &sign ); - if ( endptr != NULL ) *endptr = ( p != NULL ) ? (char *) p : (char *) s; - return ( sign == '+' ) ? rc : -rc; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" -#include - -int main( void ) -{ - char * endptr; - /* this, to base 36, overflows even a 256 bit integer */ - char overflow[] = "-ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ_"; - /* tricky border case */ - char tricky[] = "+0xz"; - errno = 0; - /* basic functionality */ - TESTCASE( strtoull( "123", NULL, 10 ) == 123 ); - /* proper detecting of default base 10 */ - TESTCASE( strtoull( "456", NULL, 0 ) == 456 ); - /* proper functioning to smaller base */ - TESTCASE( strtoull( "14", NULL, 8 ) == 12 ); - /* proper autodetecting of octal */ - TESTCASE( strtoull( "016", NULL, 0 ) == 14 ); - /* proper autodetecting of hexadecimal, lowercase 'x' */ - TESTCASE( strtoull( "0xFF", NULL, 0 ) == 255 ); - /* proper autodetecting of hexadecimal, uppercase 'X' */ - TESTCASE( strtoull( "0Xa1", NULL, 0 ) == 161 ); - /* proper handling of border case: 0x followed by non-hexdigit */ - TESTCASE( strtoull( tricky, &endptr, 0 ) == 0 ); - TESTCASE( endptr == tricky + 2 ); - /* proper handling of border case: 0 followed by non-octdigit */ - TESTCASE( strtoull( tricky, &endptr, 8 ) == 0 ); - TESTCASE( endptr == tricky + 2 ); - /* errno should still be 0 */ - TESTCASE( errno == 0 ); - /* overflowing subject sequence must still return proper endptr */ - TESTCASE( strtoull( overflow, &endptr, 36 ) == ULLONG_MAX ); - TESTCASE( errno == ERANGE ); - TESTCASE( ( endptr - overflow ) == 53 ); - /* same for positive */ - errno = 0; - TESTCASE( strtoull( overflow + 1, &endptr, 36 ) == ULLONG_MAX ); - TESTCASE( errno == ERANGE ); - TESTCASE( ( endptr - overflow ) == 53 ); - /* testing skipping of leading whitespace */ - TESTCASE( strtoull( " \n\v\t\f789", NULL, 0 ) == 789 ); - /* testing conversion failure */ - TESTCASE( strtoull( overflow, &endptr, 10 ) == 0 ); - TESTCASE( endptr == overflow ); - endptr = NULL; - TESTCASE( strtoull( overflow, &endptr, 0 ) == 0 ); - TESTCASE( endptr == overflow ); - errno = 0; -/* long long -> 64 bit */ -#if ULLONG_MAX >> 63 == 1 - /* testing "even" overflow, i.e. base is power of two */ - TESTCASE( strtoull( "18446744073709551615", NULL, 0 ) == ULLONG_MAX ); - TESTCASE( errno == 0 ); - TESTCASE( strtoull( "18446744073709551616", NULL, 0 ) == ULLONG_MAX ); - TESTCASE( errno == ERANGE ); - /* TODO: test "odd" overflow, i.e. base is not power of two */ -/* long long -> 128 bit */ -#elif ULLONG_MAX >> 127 == 1 - /* testing "even" overflow, i.e. base is power of two */ - TESTCASE( strtoull( "340282366920938463463374607431768211455", NULL, 0 ) == ULLONG_MAX ); - TESTCASE( errno == 0 ); - TESTCASE( strtoull( "340282366920938463463374607431768211456", NULL, 0 ) == ULLONG_MAX ); - TESTCASE( errno == ERANGE ); - /* TODO: test "odd" overflow, i.e. base is not power of two */ -#else -#error Unsupported width of 'long long' (neither 64 nor 128 bit). -#endif - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/stdlib/system.c b/waterbox/libc/functions/stdlib/system.c deleted file mode 100644 index 6c0f6a7e9b..0000000000 --- a/waterbox/libc/functions/stdlib/system.c +++ /dev/null @@ -1,25 +0,0 @@ -/* system( const char * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -/* This is a stub implementation of getenv -*/ - -int system( const char * string ) -{ - return -1; -} - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/string/memchr.c b/waterbox/libc/functions/string/memchr.c deleted file mode 100644 index 9701b94314..0000000000 --- a/waterbox/libc/functions/string/memchr.c +++ /dev/null @@ -1,40 +0,0 @@ -/* memchr( const void *, int, size_t ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -void * memchr( const void * s, int c, size_t n ) -{ - const unsigned char * p = (const unsigned char *) s; - while ( n-- ) - { - if ( *p == (unsigned char) c ) - { - return (void *) p; - } - ++p; - } - return NULL; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE( memchr( abcde, 'c', 5 ) == &abcde[2] ); - TESTCASE( memchr( abcde, 'a', 1 ) == &abcde[0] ); - TESTCASE( memchr( abcde, 'a', 0 ) == NULL ); - TESTCASE( memchr( abcde, '\0', 5 ) == NULL ); - TESTCASE( memchr( abcde, '\0', 6 ) == &abcde[5] ); - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/string/memcmp.c b/waterbox/libc/functions/string/memcmp.c deleted file mode 100644 index 323c5862db..0000000000 --- a/waterbox/libc/functions/string/memcmp.c +++ /dev/null @@ -1,41 +0,0 @@ -/* memcmp( const void *, const void *, size_t ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -int memcmp( const void * s1, const void * s2, size_t n ) -{ - const unsigned char * p1 = (const unsigned char *) s1; - const unsigned char * p2 = (const unsigned char *) s2; - while ( n-- ) - { - if ( *p1 != *p2 ) - { - return *p1 - *p2; - } - ++p1; - ++p2; - } - return 0; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - char const xxxxx[] = "xxxxx"; - TESTCASE( memcmp( abcde, abcdx, 5 ) < 0 ); - TESTCASE( memcmp( abcde, abcdx, 4 ) == 0 ); - TESTCASE( memcmp( abcde, xxxxx, 0 ) == 0 ); - TESTCASE( memcmp( xxxxx, abcde, 1 ) > 0 ); - return 0; -} -#endif diff --git a/waterbox/libc/functions/string/memcpy.c b/waterbox/libc/functions/string/memcpy.c deleted file mode 100644 index ded60b1901..0000000000 --- a/waterbox/libc/functions/string/memcpy.c +++ /dev/null @@ -1,38 +0,0 @@ -/* memcpy( void *, const void *, size_t ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -void * memcpy( void * _PDCLIB_restrict s1, const void * _PDCLIB_restrict s2, size_t n ) -{ - char * dest = (char *) s1; - const char * src = (const char *) s2; - while ( n-- ) - { - *dest++ = *src++; - } - return s1; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - char s[] = "xxxxxxxxxxx"; - TESTCASE( memcpy( s, abcde, 6 ) == s ); - TESTCASE( s[4] == 'e' ); - TESTCASE( s[5] == '\0' ); - TESTCASE( memcpy( s + 5, abcde, 5 ) == s + 5 ); - TESTCASE( s[9] == 'e' ); - TESTCASE( s[10] == 'x' ); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/string/memmove.c b/waterbox/libc/functions/string/memmove.c deleted file mode 100644 index f83a1abede..0000000000 --- a/waterbox/libc/functions/string/memmove.c +++ /dev/null @@ -1,50 +0,0 @@ -/* memmove( void *, const void *, size_t ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -void * memmove( void * s1, const void * s2, size_t n ) -{ - char * dest = (char *) s1; - const char * src = (const char *) s2; - if ( dest <= src ) - { - while ( n-- ) - { - *dest++ = *src++; - } - } - else - { - src += n; - dest += n; - while ( n-- ) - { - *--dest = *--src; - } - } - return s1; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - char s[] = "xxxxabcde"; - TESTCASE( memmove( s, s + 4, 5 ) == s ); - TESTCASE( s[0] == 'a' ); - TESTCASE( s[4] == 'e' ); - TESTCASE( s[5] == 'b' ); - TESTCASE( memmove( s + 4, s, 5 ) == s + 4 ); - TESTCASE( s[4] == 'a' ); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/string/memset.c b/waterbox/libc/functions/string/memset.c deleted file mode 100644 index 4946ec4878..0000000000 --- a/waterbox/libc/functions/string/memset.c +++ /dev/null @@ -1,38 +0,0 @@ -/* memset( void *, int, size_t ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -void * memset( void * s, int c, size_t n ) -{ - unsigned char * p = (unsigned char *) s; - while ( n-- ) - { - *p++ = (unsigned char) c; - } - return s; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - char s[] = "xxxxxxxxx"; - TESTCASE( memset( s, 'o', 10 ) == s ); - TESTCASE( s[9] == 'o' ); - TESTCASE( memset( s, '_', 0 ) == s ); - TESTCASE( s[0] == 'o' ); - TESTCASE( memset( s, '_', 1 ) == s ); - TESTCASE( s[0] == '_' ); - TESTCASE( s[1] == 'o' ); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/string/strcat.c b/waterbox/libc/functions/string/strcat.c deleted file mode 100644 index 50d66ee089..0000000000 --- a/waterbox/libc/functions/string/strcat.c +++ /dev/null @@ -1,44 +0,0 @@ -/* strcat( char *, const char * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -char * strcat( char * _PDCLIB_restrict s1, const char * _PDCLIB_restrict s2 ) -{ - char * rc = s1; - if ( *s1 ) - { - while ( *++s1 ); - } - while ( (*s1++ = *s2++) ); - return rc; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - char s[] = "xx\0xxxxxx"; - TESTCASE( strcat( s, abcde ) == s ); - TESTCASE( s[2] == 'a' ); - TESTCASE( s[6] == 'e' ); - TESTCASE( s[7] == '\0' ); - TESTCASE( s[8] == 'x' ); - s[0] = '\0'; - TESTCASE( strcat( s, abcdx ) == s ); - TESTCASE( s[4] == 'x' ); - TESTCASE( s[5] == '\0' ); - TESTCASE( strcat( s, "\0" ) == s ); - TESTCASE( s[5] == '\0' ); - TESTCASE( s[6] == 'e' ); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/string/strchr.c b/waterbox/libc/functions/string/strchr.c deleted file mode 100644 index 8c6e8a42ff..0000000000 --- a/waterbox/libc/functions/string/strchr.c +++ /dev/null @@ -1,38 +0,0 @@ -/* strchr( const char *, int ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -char * strchr( const char * s, int c ) -{ - do - { - if ( *s == (char) c ) - { - return (char *) s; - } - } while ( *s++ ); - return NULL; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - char abccd[] = "abccd"; - TESTCASE( strchr( abccd, 'x' ) == NULL ); - TESTCASE( strchr( abccd, 'a' ) == &abccd[0] ); - TESTCASE( strchr( abccd, 'd' ) == &abccd[4] ); - TESTCASE( strchr( abccd, '\0' ) == &abccd[5] ); - TESTCASE( strchr( abccd, 'c' ) == &abccd[2] ); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/string/strcmp.c b/waterbox/libc/functions/string/strcmp.c deleted file mode 100644 index 483260cf39..0000000000 --- a/waterbox/libc/functions/string/strcmp.c +++ /dev/null @@ -1,39 +0,0 @@ -/* strcmp( const char *, const char * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -int strcmp( const char * s1, const char * s2 ) -{ - while ( ( *s1 ) && ( *s1 == *s2 ) ) - { - ++s1; - ++s2; - } - return ( *(unsigned char *)s1 - *(unsigned char *)s2 ); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - char cmpabcde[] = "abcde"; - char cmpabcd_[] = "abcd\xfc"; - char empty[] = ""; - TESTCASE( strcmp( abcde, cmpabcde ) == 0 ); - TESTCASE( strcmp( abcde, abcdx ) < 0 ); - TESTCASE( strcmp( abcdx, abcde ) > 0 ); - TESTCASE( strcmp( empty, abcde ) < 0 ); - TESTCASE( strcmp( abcde, empty ) > 0 ); - TESTCASE( strcmp( abcde, cmpabcd_ ) < 0 ); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/string/strcoll.c b/waterbox/libc/functions/string/strcoll.c deleted file mode 100644 index 09ada0445b..0000000000 --- a/waterbox/libc/functions/string/strcoll.c +++ /dev/null @@ -1,41 +0,0 @@ -/* strcoll( const char *, const char * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -#include "_PDCLIB_locale.h" - -int strcoll( const char * s1, const char * s2 ) -{ - const _PDCLIB_ctype_t * ctype = _PDCLIB_threadlocale()->_CType; - - while ( ( *s1 ) && ( ctype[(unsigned char)*s1].collation == ctype[(unsigned char)*s2].collation ) ) - { - ++s1; - ++s2; - } - return ( ctype[(unsigned char)*s1].collation == ctype[(unsigned char)*s2].collation ); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - char cmpabcde[] = "abcde"; - char empty[] = ""; - TESTCASE( strcmp( abcde, cmpabcde ) == 0 ); - TESTCASE( strcmp( abcde, abcdx ) < 0 ); - TESTCASE( strcmp( abcdx, abcde ) > 0 ); - TESTCASE( strcmp( empty, abcde ) < 0 ); - TESTCASE( strcmp( abcde, empty ) > 0 ); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/string/strcpy.c b/waterbox/libc/functions/string/strcpy.c deleted file mode 100644 index d66cbaba5e..0000000000 --- a/waterbox/libc/functions/string/strcpy.c +++ /dev/null @@ -1,35 +0,0 @@ -/* strcpy( char *, const char * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -char * strcpy( char * _PDCLIB_restrict s1, const char * _PDCLIB_restrict s2 ) -{ - char * rc = s1; - while ( ( *s1++ = *s2++ ) ); - return rc; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - char s[] = "xxxxx"; - TESTCASE( strcpy( s, "" ) == s ); - TESTCASE( s[0] == '\0' ); - TESTCASE( s[1] == 'x' ); - TESTCASE( strcpy( s, abcde ) == s ); - TESTCASE( s[0] == 'a' ); - TESTCASE( s[4] == 'e' ); - TESTCASE( s[5] == '\0' ); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/string/strcspn.c b/waterbox/libc/functions/string/strcspn.c deleted file mode 100644 index baf8fc799a..0000000000 --- a/waterbox/libc/functions/string/strcspn.c +++ /dev/null @@ -1,48 +0,0 @@ -/* strcspn( const char *, const char * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -size_t strcspn( const char * s1, const char * s2 ) -{ - size_t len = 0; - const char * p; - while ( s1[len] ) - { - p = s2; - while ( *p ) - { - if ( s1[len] == *p++ ) - { - return len; - } - } - ++len; - } - return len; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE( strcspn( abcde, "x" ) == 5 ); - TESTCASE( strcspn( abcde, "xyz" ) == 5 ); - TESTCASE( strcspn( abcde, "zyx" ) == 5 ); - TESTCASE( strcspn( abcdx, "x" ) == 4 ); - TESTCASE( strcspn( abcdx, "xyz" ) == 4 ); - TESTCASE( strcspn( abcdx, "zyx" ) == 4 ); - TESTCASE( strcspn( abcde, "a" ) == 0 ); - TESTCASE( strcspn( abcde, "abc" ) == 0 ); - TESTCASE( strcspn( abcde, "cba" ) == 0 ); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/string/strdup.c b/waterbox/libc/functions/string/strdup.c deleted file mode 100644 index 78dd01d4f6..0000000000 --- a/waterbox/libc/functions/string/strdup.c +++ /dev/null @@ -1,49 +0,0 @@ -/* [XSI] char * strdup( const char * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#ifdef REGTEST -#define _POSIX_C_SOURCE 200809L -#endif - -#include -#include - -#ifndef REGTEST - -char *strdup(const char *s) -{ - char* ns = NULL; - if(s) { - size_t len = strlen(s) + 1; - ns = malloc(len); - if(ns) - strncpy(ns, s, len); - } - return ns; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - const char *teststr = "Hello, world"; - const char *teststr2 = "An alternative test string with non-7-bit characters \xFE\x8C\n"; - char *testres, *testres2; - - TESTCASE((testres = strdup(teststr)) != NULL); - TESTCASE((testres2 = strdup(teststr2)) != NULL); - TESTCASE(strcmp(testres, teststr) == 0); - TESTCASE(strcmp(testres2, teststr2) == 0); - free(testres); - free(testres2); - - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/string/strerror.c b/waterbox/libc/functions/string/strerror.c deleted file mode 100644 index 5c7bf23bb6..0000000000 --- a/waterbox/libc/functions/string/strerror.c +++ /dev/null @@ -1,39 +0,0 @@ -/* strerror( int ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -#include "_PDCLIB_locale.h" - -/* TODO: Doing this via a static array is not the way to do it. */ -char * strerror( int errnum ) -{ - if ( errnum >= _PDCLIB_ERRNO_MAX ) - { - return (char *)"Unknown error"; - } - else - { - return (char *)_PDCLIB_threadlocale()->_ErrnoStr[errnum]; - } -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -#include -#include - -int main( void ) -{ - TESTCASE( strerror( ERANGE ) != strerror( EDOM ) ); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/string/strlcat.c b/waterbox/libc/functions/string/strlcat.c deleted file mode 100644 index 7348702490..0000000000 --- a/waterbox/libc/functions/string/strlcat.c +++ /dev/null @@ -1,57 +0,0 @@ -/* strlcat( char *, const char *, size_t ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -#pragma weak strlcat = _PDCLIB_strlcat -size_t _PDCLIB_strlcat( - char *restrict dst, - const char *restrict src, - size_t dstsize); - -size_t _PDCLIB_strlcat( - char *restrict dst, - const char *restrict src, - size_t dstsize) -{ - size_t needed = 0; - size_t j = 0; - - while(dst[needed]) needed++; - - while(needed < dstsize && (dst[needed] = src[j])) - needed++, j++; - - while(src[j++]) needed++; - needed++; - - if (needed > dstsize && dstsize) - dst[dstsize - 1] = 0; - - return needed; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - char dstbuf[16]; - - strcpy(dstbuf, "hi"); - TESTCASE_NOREG( strlcat(dstbuf, "", 16) == 3 ); - TESTCASE_NOREG( strlcat(dstbuf, "hi", 16) == 5 ); - TESTCASE_NOREG( strlcat(dstbuf, "hello, world", 16) == 17 ); - TESTCASE_NOREG( strlcat(dstbuf, "hi", 16) == 18 ); - TESTCASE_NOREG( strcmp(dstbuf, "hihihello, worl") == 0); - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/string/strlcpy.c b/waterbox/libc/functions/string/strlcpy.c deleted file mode 100644 index bf8421a238..0000000000 --- a/waterbox/libc/functions/string/strlcpy.c +++ /dev/null @@ -1,52 +0,0 @@ -/* strlcpy( char *, const char *, size_t ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -#pragma weak strlcpy = _PDCLIB_strlcpy -size_t _PDCLIB_strlcpy( - char *restrict dst, - const char *restrict src, - size_t dstsize); - -size_t _PDCLIB_strlcpy( - char *restrict dst, - const char *restrict src, - size_t dstsize) -{ - size_t needed = 0; - while(needed < dstsize && (dst[needed] = src[needed])) - needed++; - - while(src[needed++]); - - if (needed > dstsize && dstsize) - dst[dstsize - 1] = 0; - - return needed; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ -#ifndef REGTEST - char destbuf[10]; -#endif - TESTCASE_NOREG( strlcpy(NULL, "a", 0) == 2 ); - TESTCASE_NOREG( strlcpy(destbuf, "a", 10) == 2 ); - TESTCASE_NOREG( strcmp(destbuf, "a") == 0 ); - TESTCASE_NOREG( strlcpy(destbuf, "helloworld", 10) == 11 ); - TESTCASE_NOREG( strcmp(destbuf, "helloworl") == 0 ); - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/string/strlen.c b/waterbox/libc/functions/string/strlen.c deleted file mode 100644 index 042582abbd..0000000000 --- a/waterbox/libc/functions/string/strlen.c +++ /dev/null @@ -1,32 +0,0 @@ -/* strlen( const char * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -size_t strlen( const char * s ) -{ - size_t rc = 0; - while ( s[rc] ) - { - ++rc; - } - return rc; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE( strlen( abcde ) == 5 ); - TESTCASE( strlen( "" ) == 0 ); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/string/strncat.c b/waterbox/libc/functions/string/strncat.c deleted file mode 100644 index 18d8ed596e..0000000000 --- a/waterbox/libc/functions/string/strncat.c +++ /dev/null @@ -1,58 +0,0 @@ -/* strncat( char *, const char *, size_t ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -char * strncat( char * _PDCLIB_restrict s1, const char * _PDCLIB_restrict s2, size_t n ) -{ - char * rc = s1; - while ( *s1 ) - { - ++s1; - } - while ( n && ( *s1++ = *s2++ ) ) - { - --n; - } - if ( n == 0 ) - { - *s1 = '\0'; - } - return rc; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - char s[] = "xx\0xxxxxx"; - TESTCASE( strncat( s, abcde, 10 ) == s ); - TESTCASE( s[2] == 'a' ); - TESTCASE( s[6] == 'e' ); - TESTCASE( s[7] == '\0' ); - TESTCASE( s[8] == 'x' ); - s[0] = '\0'; - TESTCASE( strncat( s, abcdx, 10 ) == s ); - TESTCASE( s[4] == 'x' ); - TESTCASE( s[5] == '\0' ); - TESTCASE( strncat( s, "\0", 10 ) == s ); - TESTCASE( s[5] == '\0' ); - TESTCASE( s[6] == 'e' ); - TESTCASE( strncat( s, abcde, 0 ) == s ); - TESTCASE( s[5] == '\0' ); - TESTCASE( s[6] == 'e' ); - TESTCASE( strncat( s, abcde, 3 ) == s ); - TESTCASE( s[5] == 'a' ); - TESTCASE( s[7] == 'c' ); - TESTCASE( s[8] == '\0' ); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/string/strncmp.c b/waterbox/libc/functions/string/strncmp.c deleted file mode 100644 index e1ec0de66e..0000000000 --- a/waterbox/libc/functions/string/strncmp.c +++ /dev/null @@ -1,52 +0,0 @@ -/* strncmp( const char *, const char *, size_t ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -int strncmp( const char * s1, const char * s2, size_t n ) -{ - while ( *s1 && n && ( *s1 == *s2 ) ) - { - ++s1; - ++s2; - --n; - } - if ( n == 0 ) - { - return 0; - } - else - { - return ( *(unsigned char *)s1 - *(unsigned char *)s2 ); - } -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - char cmpabcde[] = "abcde\0f"; - char cmpabcd_[] = "abcde\xfc"; - char empty[] = ""; - char x[] = "x"; - TESTCASE( strncmp( abcde, cmpabcde, 5 ) == 0 ); - TESTCASE( strncmp( abcde, cmpabcde, 10 ) == 0 ); - TESTCASE( strncmp( abcde, abcdx, 5 ) < 0 ); - TESTCASE( strncmp( abcdx, abcde, 5 ) > 0 ); - TESTCASE( strncmp( empty, abcde, 5 ) < 0 ); - TESTCASE( strncmp( abcde, empty, 5 ) > 0 ); - TESTCASE( strncmp( abcde, abcdx, 4 ) == 0 ); - TESTCASE( strncmp( abcde, x, 0 ) == 0 ); - TESTCASE( strncmp( abcde, x, 1 ) < 0 ); - TESTCASE( strncmp( abcde, cmpabcd_, 10 ) < 0 ); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/string/strncpy.c b/waterbox/libc/functions/string/strncpy.c deleted file mode 100644 index 2c58d538fb..0000000000 --- a/waterbox/libc/functions/string/strncpy.c +++ /dev/null @@ -1,54 +0,0 @@ -/* strncpy( char *, const char *, size_t ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -char * strncpy( char * _PDCLIB_restrict s1, const char * _PDCLIB_restrict s2, size_t n ) -{ - char * rc = s1; - while ( ( n > 0 ) && ( *s1++ = *s2++ ) ) - { - /* Cannot do "n--" in the conditional as size_t is unsigned and we have - to check it again for >0 in the next loop below, so we must not risk - underflow. - */ - --n; - } - /* Checking against 1 as we missed the last --n in the loop above. */ - while ( n-- > 1 ) - { - *s1++ = '\0'; - } - return rc; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - char s[] = "xxxxxxx"; - TESTCASE( strncpy( s, "", 1 ) == s ); - TESTCASE( s[0] == '\0' ); - TESTCASE( s[1] == 'x' ); - TESTCASE( strncpy( s, abcde, 6 ) == s ); - TESTCASE( s[0] == 'a' ); - TESTCASE( s[4] == 'e' ); - TESTCASE( s[5] == '\0' ); - TESTCASE( s[6] == 'x' ); - TESTCASE( strncpy( s, abcde, 7 ) == s ); - TESTCASE( s[6] == '\0' ); - TESTCASE( strncpy( s, "xxxx", 3 ) == s ); - TESTCASE( s[0] == 'x' ); - TESTCASE( s[2] == 'x' ); - TESTCASE( s[3] == 'd' ); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/string/strndup.c b/waterbox/libc/functions/string/strndup.c deleted file mode 100644 index b7baca2cc5..0000000000 --- a/waterbox/libc/functions/string/strndup.c +++ /dev/null @@ -1,63 +0,0 @@ -/* [XSI] char * strndup( const char *, size_t ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#ifdef REGTEST -#define _POSIX_C_SOURCE 200809L -#endif - -#include -#include - -#ifndef REGTEST - -char *strndup( const char * s, size_t len ) -{ - char* ns = NULL; - if(s) { - ns = malloc(len + 1); - if(ns) { - ns[len] = 0; - // strncpy to be pedantic about modification in multithreaded - // applications - return strncpy(ns, s, len); - } - } - return ns; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ -#ifndef REGTEST - /* Missing on Windows. Maybe use conditionals? */ - const char *teststr = "Hello, world"; - const char *teststr2 = "\xFE\x8C\n"; - char *testres, *testres2; - - TESTCASE((testres = strndup(teststr, 5)) != NULL); - TESTCASE((testres2 = strndup(teststr2, 1)) != NULL); - TESTCASE(strcmp(testres, teststr) != 0); - TESTCASE(strncmp(testres, teststr, 5) == 0); - TESTCASE(strcmp(testres2, teststr2) != 0); - TESTCASE(strncmp(testres2, teststr2, 1) == 0); - free(testres); - free(testres2); - TESTCASE((testres = strndup(teststr, 20)) != NULL); - TESTCASE((testres2 = strndup(teststr2, 5)) != NULL); - TESTCASE(strcmp(testres, teststr) == 0); - TESTCASE(strcmp(testres2, teststr2) == 0); - free(testres); - free(testres2); -#endif - - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/string/strnlen.c b/waterbox/libc/functions/string/strnlen.c deleted file mode 100644 index 915fa76c07..0000000000 --- a/waterbox/libc/functions/string/strnlen.c +++ /dev/null @@ -1,36 +0,0 @@ -/* strnlen( const char *, size_t len ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#include - -#ifndef REGTEST - -size_t strnlen( const char * s, size_t maxlen ) -{ - for( size_t len = 0; len != maxlen; len++ ) - { - if(s[len] == '\0') - return len; - } - return maxlen; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ -#ifndef REGTEST - TESTCASE( strnlen( abcde, 5 ) == 5 ); - TESTCASE( strnlen( abcde, 3 ) == 3 ) - TESTCASE( strnlen( "", SIZE_MAX ) == 0 ); -#endif - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/string/strpbrk.c b/waterbox/libc/functions/string/strpbrk.c deleted file mode 100644 index 1615ce3ff9..0000000000 --- a/waterbox/libc/functions/string/strpbrk.c +++ /dev/null @@ -1,47 +0,0 @@ -/* strpbrk( const char *, const char * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -char * strpbrk( const char * s1, const char * s2 ) -{ - const char * p1 = s1; - const char * p2; - while ( *p1 ) - { - p2 = s2; - while ( *p2 ) - { - if ( *p1 == *p2++ ) - { - return (char *) p1; - } - } - ++p1; - } - return NULL; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE( strpbrk( abcde, "x" ) == NULL ); - TESTCASE( strpbrk( abcde, "xyz" ) == NULL ); - TESTCASE( strpbrk( abcdx, "x" ) == &abcdx[4] ); - TESTCASE( strpbrk( abcdx, "xyz" ) == &abcdx[4] ); - TESTCASE( strpbrk( abcdx, "zyx" ) == &abcdx[4] ); - TESTCASE( strpbrk( abcde, "a" ) == &abcde[0] ); - TESTCASE( strpbrk( abcde, "abc" ) == &abcde[0] ); - TESTCASE( strpbrk( abcde, "cba" ) == &abcde[0] ); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/string/strrchr.c b/waterbox/libc/functions/string/strrchr.c deleted file mode 100644 index 2a41874b64..0000000000 --- a/waterbox/libc/functions/string/strrchr.c +++ /dev/null @@ -1,39 +0,0 @@ -/* strrchr( const char *, int c ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -char * strrchr( const char * s, int c ) -{ - size_t i = 0; - while ( s[i++] ); - do - { - if ( s[--i] == (char) c ) - { - return (char *) s + i; - } - } while ( i ); - return NULL; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - char abccd[] = "abccd"; - TESTCASE( strrchr( abcde, '\0' ) == &abcde[5] ); - TESTCASE( strrchr( abcde, 'e' ) == &abcde[4] ); - TESTCASE( strrchr( abcde, 'a' ) == &abcde[0] ); - TESTCASE( strrchr( abccd, 'c' ) == &abccd[3] ); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/string/strspn.c b/waterbox/libc/functions/string/strspn.c deleted file mode 100644 index 8869a84683..0000000000 --- a/waterbox/libc/functions/string/strspn.c +++ /dev/null @@ -1,47 +0,0 @@ -/* strspn( const char *, const char * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -size_t strspn( const char * s1, const char * s2 ) -{ - size_t len = 0; - const char * p; - while ( s1[ len ] ) - { - p = s2; - while ( *p ) - { - if ( s1[len] == *p ) - { - break; - } - ++p; - } - if ( ! *p ) - { - return len; - } - ++len; - } - return len; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE( strspn( abcde, "abc" ) == 3 ); - TESTCASE( strspn( abcde, "b" ) == 0 ); - TESTCASE( strspn( abcde, abcde ) == 5 ); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/string/strstr.c b/waterbox/libc/functions/string/strstr.c deleted file mode 100644 index 5c97a750c0..0000000000 --- a/waterbox/libc/functions/string/strstr.c +++ /dev/null @@ -1,49 +0,0 @@ -/* strstr( const char *, const char * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -char * strstr( const char * s1, const char * s2 ) -{ - const char * p1 = s1; - const char * p2; - while ( *s1 ) - { - p2 = s2; - while ( *p2 && ( *p1 == *p2 ) ) - { - ++p1; - ++p2; - } - if ( ! *p2 ) - { - return (char *) s1; - } - ++s1; - p1 = s1; - } - return NULL; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - char s[] = "abcabcabcdabcde"; - TESTCASE( strstr( s, "x" ) == NULL ); - TESTCASE( strstr( s, "xyz" ) == NULL ); - TESTCASE( strstr( s, "a" ) == &s[0] ); - TESTCASE( strstr( s, "abc" ) == &s[0] ); - TESTCASE( strstr( s, "abcd" ) == &s[6] ); - TESTCASE( strstr( s, "abcde" ) == &s[10] ); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/string/strtok.c b/waterbox/libc/functions/string/strtok.c deleted file mode 100644 index 3c427c549c..0000000000 --- a/waterbox/libc/functions/string/strtok.c +++ /dev/null @@ -1,105 +0,0 @@ -/* strtok( char *, const char * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -char * strtok( char * _PDCLIB_restrict s1, const char * _PDCLIB_restrict s2 ) -{ - static char * tmp = NULL; - const char * p = s2; - - if ( s1 != NULL ) - { - /* new string */ - tmp = s1; - } - else - { - /* old string continued */ - if ( tmp == NULL ) - { - /* No old string, no new string, nothing to do */ - return NULL; - } - s1 = tmp; - } - - /* skipping leading s2 characters */ - while ( *p && *s1 ) - { - if ( *s1 == *p ) - { - /* found seperator; skip and start over */ - ++s1; - p = s2; - continue; - } - ++p; - } - - if ( ! *s1 ) - { - /* no more to parse */ - return ( tmp = NULL ); - } - - /* skipping non-s2 characters */ - tmp = s1; - while ( *tmp ) - { - p = s2; - while ( *p ) - { - if ( *tmp == *p++ ) - { - /* found seperator; overwrite with '\0', position tmp, return */ - *tmp++ = '\0'; - return s1; - } - } - ++tmp; - } - - /* parsed to end of string */ - tmp = NULL; - return s1; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - char s[] = "_a_bc__d_"; - TESTCASE( strtok( s, "_" ) == &s[1] ); - TESTCASE( s[1] == 'a' ); - TESTCASE( s[2] == '\0' ); - TESTCASE( strtok( NULL, "_" ) == &s[3] ); - TESTCASE( s[3] == 'b' ); - TESTCASE( s[4] == 'c' ); - TESTCASE( s[5] == '\0' ); - TESTCASE( strtok( NULL, "_" ) == &s[7] ); - TESTCASE( s[6] == '_' ); - TESTCASE( s[7] == 'd' ); - TESTCASE( s[8] == '\0' ); - TESTCASE( strtok( NULL, "_" ) == NULL ); - strcpy( s, "ab_cd" ); - TESTCASE( strtok( s, "_" ) == &s[0] ); - TESTCASE( s[0] == 'a' ); - TESTCASE( s[1] == 'b' ); - TESTCASE( s[2] == '\0' ); - TESTCASE( strtok( NULL, "_" ) == &s[3] ); - TESTCASE( s[3] == 'c' ); - TESTCASE( s[4] == 'd' ); - TESTCASE( s[5] == '\0' ); - TESTCASE( strtok( NULL, "_" ) == NULL ); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/string/strxfrm.c b/waterbox/libc/functions/string/strxfrm.c deleted file mode 100644 index 3692257b23..0000000000 --- a/waterbox/libc/functions/string/strxfrm.c +++ /dev/null @@ -1,48 +0,0 @@ -/* strxfrm( char *, const char *, size_t ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -#include "_PDCLIB_locale.h" - -size_t strxfrm( char * _PDCLIB_restrict s1, const char * _PDCLIB_restrict s2, size_t n ) -{ - const _PDCLIB_ctype_t *ctype = _PDCLIB_threadlocale()->_CType; - size_t len = strlen( s2 ); - if ( len < n ) - { - /* Cannot use strncpy() here as the filling of s1 with '\0' is not part - of the spec. - */ - while ( n-- && ( *s1++ = ctype[(unsigned char)*s2++].collation ) ); - } - return len; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - char s[] = "xxxxxxxxxxx"; - TESTCASE( strxfrm( NULL, "123456789012", 0 ) == 12 ); - TESTCASE( strxfrm( s, "123456789012", 12 ) == 12 ); - /* - The following test case is true in *this* implementation, but doesn't have to. - TESTCASE( s[0] == 'x' ); - */ - TESTCASE( strxfrm( s, "1234567890", 11 ) == 10 ); - TESTCASE( s[0] == '1' ); - TESTCASE( s[9] == '0' ); - TESTCASE( s[10] == '\0' ); - return TEST_RESULTS; -} -#endif - diff --git a/waterbox/libc/functions/time/clock.c b/waterbox/libc/functions/time/clock.c deleted file mode 100644 index e3add98b53..0000000000 --- a/waterbox/libc/functions/time/clock.c +++ /dev/null @@ -1,28 +0,0 @@ -/* clock( void ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -clock_t clock( void ) -{ - /* TODO: Placeholder implementation (valid but useless) */ - return -1; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE( NO_TESTDRIVER ); - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/time/time.c b/waterbox/libc/functions/time/time.c deleted file mode 100644 index 6bbf4c76c6..0000000000 --- a/waterbox/libc/functions/time/time.c +++ /dev/null @@ -1,19 +0,0 @@ -#include - -#ifndef REGTEST -time_t time(time_t* t) -{ - if(t) *t = -1; - return -1; -} -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/time/timespec_get.c b/waterbox/libc/functions/time/timespec_get.c deleted file mode 100644 index 04acf61ac9..0000000000 --- a/waterbox/libc/functions/time/timespec_get.c +++ /dev/null @@ -1,18 +0,0 @@ -#include -#ifndef REGTEST - -int timespec_get( struct timespec *ts, int base ) -{ - return 0; -} -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/uchar/_PDCLIB_c16slen.c b/waterbox/libc/functions/uchar/_PDCLIB_c16slen.c deleted file mode 100644 index 1a0c3e504d..0000000000 --- a/waterbox/libc/functions/uchar/_PDCLIB_c16slen.c +++ /dev/null @@ -1,28 +0,0 @@ -/* _PDCLIB_c16slen( const char16_t * ); - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#ifndef REGTEST -#include - -size_t _PDCLIB_c16slen( const char16_t * str ) -{ - size_t n = 0; - while(*(str++)) n++; - return n; -} - - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/uchar/_PDCLIB_c32slen.c b/waterbox/libc/functions/uchar/_PDCLIB_c32slen.c deleted file mode 100644 index 4c4df058f7..0000000000 --- a/waterbox/libc/functions/uchar/_PDCLIB_c32slen.c +++ /dev/null @@ -1,28 +0,0 @@ -/* _PDCLIB_c32slen( const char32_t * ); - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#ifndef REGTEST -#include - -size_t _PDCLIB_c32slen( const char32_t * str ) -{ - size_t n = 0; - while(*(str++)) n++; - return n; -} - - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/uchar/_PDCLIB_c32srtombs.c b/waterbox/libc/functions/uchar/_PDCLIB_c32srtombs.c deleted file mode 100644 index a45ba98879..0000000000 --- a/waterbox/libc/functions/uchar/_PDCLIB_c32srtombs.c +++ /dev/null @@ -1,57 +0,0 @@ -/* _PDCLIB_c32srtombs( char *, const char32_t * *, size_t, mbstate_t * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#ifndef REGTEST -#include -#include -#include -#include "_PDCLIB_encoding.h" -#include "_PDCLIB_locale.h" - -static size_t _PDCLIB_c32srtombs_l( - char *restrict dst, - const char32_t **restrict src, - size_t len, - mbstate_t *restrict ps, - _PDCLIB_locale_t restrict l) -{ - char *restrict *restrict dstp = dst ? &dst : NULL; - len = dst ? len : SIZE_MAX; - - size_t srclen = _PDCLIB_c32slen(*src); - size_t dstlen = len; - - if(l->_Codec->__c32stombs(dstp, &dstlen, src, &srclen, ps)) { - // Successful conversion - return len - dstlen; - } else { - // Failed conversion - errno = EILSEQ; - return (size_t) -1; - } -} - -size_t _PDCLIB_c32srtombs( - char *restrict dst, - const char32_t **restrict src, - size_t len, - mbstate_t *restrict ps -) -{ - return _PDCLIB_c32srtombs_l(dst, src, len, ps, _PDCLIB_threadlocale()); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE( NO_TESTDRIVER ); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/uchar/_PDCLIB_mbsrtoc32s.c b/waterbox/libc/functions/uchar/_PDCLIB_mbsrtoc32s.c deleted file mode 100644 index 85ea099f4c..0000000000 --- a/waterbox/libc/functions/uchar/_PDCLIB_mbsrtoc32s.c +++ /dev/null @@ -1,56 +0,0 @@ -/* _PDCLIB_mbsrtoc32s( char32_t *, const char * *, size_t, mbstate_t * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#ifndef REGTEST -#include -#include -#include -#include -#include "_PDCLIB_encoding.h" -#include "_PDCLIB_locale.h" - -static size_t _PDCLIB_mbsrtoc32s_l -( - char32_t *restrict dst, - const char **restrict src, - size_t len, - mbstate_t *restrict ps, - locale_t restrict l -) -{ - size_t dstlen = len = dst ? len : SIZE_MAX; - char32_t *restrict *restrict dstp = dst ? &dst : NULL; - - size_t srclen = strlen(*src); - if(l->_Codec->__mbstoc32s(dstp, &dstlen, src, &srclen, ps)) { - return len - dstlen; - } else { - errno = EILSEQ; - return (size_t) -1; - } -} - -size_t _PDCLIB_mbsrtoc32s( - char32_t *restrict dst, - const char **restrict src, - size_t len, - mbstate_t *restrict ps -) -{ - return _PDCLIB_mbsrtoc32s_l(dst, src, len, ps, _PDCLIB_threadlocale()); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE( NO_TESTDRIVER ); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/uchar/c16rtomb.c b/waterbox/libc/functions/uchar/c16rtomb.c deleted file mode 100644 index 5070e28f86..0000000000 --- a/waterbox/libc/functions/uchar/c16rtomb.c +++ /dev/null @@ -1,104 +0,0 @@ -/* c16rtomb( char *, char16_t, mbstate_t * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#ifndef REGTEST -#include -#include -#include -#include -#include -#include "_PDCLIB_encoding.h" -#include "_PDCLIB_locale.h" - -size_t c16rtomb_l( - char *restrict s, - char16_t c16, - mbstate_t *restrict ps, - locale_t restrict l -) -{ - const char16_t *restrict psrc = &c16; - char buf[s ? 0 : MB_CUR_MAX]; - s = s ? s : buf; - - if(!l->_Codec->__c16stombs) { - // Codec doesn't support direct conversion - translate via UCS-4 - if(ps->_Surrogate == 0) { - // No pending surrogate - if((c16 & 0xF800) == 0xD800) { - // Surrogate range - if((c16 & 0x0400) == 0) { - // 0xD800 -> 0xDBFF leading surrogate - ps->_Surrogate = c16; - - // Need more data - // Return 0 - we haven't output anything yet - - /* STD: ISO/IEC 9899:2011 is very implcifit about this being - * the correct return value. N1040, from which the - * function was adopted, is explicit about 0 being a - * valid return. - */ - return (size_t) 0; - } else { - // 0xDC00 -> 0xDFFF trailing surrogate - errno = EILSEQ; - return (size_t) -1; - } - } else { - // BMP range - UTF16 == UCS-4, pass through to c32rtomb_l - return c32rtomb_l(s, c16, ps, l); - } - } else { - // We have a stored surrogate - if((c16 & 0xFC00) == 0xDC00) { - // Trailing surrogate - char32_t c32 = (ps->_Surrogate & 0x3FF) << 10 | (c16 & 0x3FF); - ps->_Surrogate = 0; - return c32rtomb_l(s, c32, ps, l); - } else { - // Not a trailing surrogate - encoding error - errno = EILSEQ; - return (size_t) -1; - } - - } - } else { - // Codec supports direct conversion - size_t srcsz = 1; - size_t dstsz = MB_CUR_MAX; - size_t dstrem = dstsz; - - if(l->_Codec->__c16stombs(&s, &dstrem, &psrc, &srcsz, ps)) { - // Successful conversion - return dstsz - dstrem; - } else { - errno = EILSEQ; - return (size_t) -1; - } - } -} - -size_t c16rtomb( - char *restrict s, - char16_t c16, - mbstate_t *restrict ps -) -{ - return c16rtomb_l(s, c16, ps, _PDCLIB_threadlocale()); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE( NO_TESTDRIVER ); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/uchar/c32rtomb.c b/waterbox/libc/functions/uchar/c32rtomb.c deleted file mode 100644 index 19f65f1094..0000000000 --- a/waterbox/libc/functions/uchar/c32rtomb.c +++ /dev/null @@ -1,59 +0,0 @@ -/* c32rtomb( char *, char32_t, mbstate_t * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#ifndef REGTEST -#include -#include -#include -#include -#include -#include "_PDCLIB_encoding.h" -#include "_PDCLIB_locale.h" - -size_t c32rtomb_l( - char *restrict s, - char32_t c32, - mbstate_t *restrict ps, - locale_t restrict l -) -{ - char buf[s ? 0 : MB_CUR_MAX]; - s = s ? s : buf; - - const char32_t *restrict psrc = &c32; - size_t srcsz = 1; - size_t dstsz = MB_CUR_MAX; - size_t dstrem = dstsz; - - if(l->_Codec->__c32stombs(&s, &dstrem, &psrc, &srcsz, ps)) { - // Successful conversion - return dstsz - dstrem; - } else { - errno = EILSEQ; - return (size_t) -1; - } -} - -size_t c32rtomb( - char *restrict s, - char32_t c32, - mbstate_t *restrict ps -) -{ - return c32rtomb_l(s, c32, ps, _PDCLIB_threadlocale()); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE( NO_TESTDRIVER ); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/uchar/mbrtoc16.c b/waterbox/libc/functions/uchar/mbrtoc16.c deleted file mode 100644 index c44c165c9f..0000000000 --- a/waterbox/libc/functions/uchar/mbrtoc16.c +++ /dev/null @@ -1,95 +0,0 @@ -/* size_t mbrtoc16( char16_t *, const char *, size_t, mbstate_t * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#ifndef REGTEST -#include -#include -#include -#include -#include "_PDCLIB_encoding.h" -#include "_PDCLIB_locale.h" - -size_t mbrtoc16_l( - char16_t *restrict pc16, - const char *restrict s, - size_t n, - mbstate_t *restrict ps, - locale_t restrict l -) -{ - size_t dstlen = 1; - size_t nr = n; - - if(!l->_Codec->__mbstoc16s) { - // No UTF-16 support in codec. Must synthesize on top of UCS-4 support. - - if(ps->_Surrogate) { - // If a pending surrogate is stored in the state - *pc16 = ps->_Surrogate; - ps->_Surrogate = 0; - return (size_t) -3; - } - - char32_t c32; - size_t res = mbrtoc32_l(&c32, s, n, ps, l); - if(res != (size_t) -1) { - // Conversion was successful. Check for surrogates - if(c32 <= 0xFFFF) { - // BMP char - *pc16 = c32; - } else { - // Supplementary char - *pc16 = 0xD800 | (c32 >> 10); - ps->_Surrogate = 0xDC00 | (c32 & 0x3FF); - } - } - return res; - } else if(l->_Codec->__mbstoc16s(&pc16, &dstlen, &s, &nr, ps)) { - // Successful conversion - if(dstlen == 0) { - // A character was output - if(nr == n) { - // The output character resulted entirely from stored state - return (size_t) -3; - } else if(pc16[-1] == 0) { - // Was null character - return 0; - } else { - // Count of processed characters - return n - nr; - } - } else { - assert(nr == 0 && "Must have processed whole input"); - return (size_t) -2; - } - } else { - // Failed conversion - errno = EILSEQ; - return (size_t) -1; - } -} - -size_t mbrtoc16( - char16_t *restrict pc16, - const char *restrict s, - size_t n, - mbstate_t *restrict ps -) -{ - return mbrtoc16_l(pc16, s, n, ps, _PDCLIB_threadlocale()); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE( NO_TESTDRIVER ); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/uchar/mbrtoc32.c b/waterbox/libc/functions/uchar/mbrtoc32.c deleted file mode 100644 index 0209b36a94..0000000000 --- a/waterbox/libc/functions/uchar/mbrtoc32.c +++ /dev/null @@ -1,72 +0,0 @@ -/* size_t mbrtoc32( char32_t *, const char *, size_t, mbstate_t * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#ifndef REGTEST -#include -#include -#include -#include -#include "_PDCLIB_encoding.h" -#include "_PDCLIB_locale.h" - -size_t mbrtoc32_l( - char32_t *restrict pc32, - const char *restrict s, - size_t n, - mbstate_t *restrict ps, - locale_t restrict l -) -{ - size_t dstlen = 1; - size_t nr = n; - - if(l->_Codec->__mbstoc32s(&pc32, &dstlen, &s, &nr, ps)) { - // Successful conversion - if(dstlen == 0) { - // A character was output - if(nr == n) { - // The output character resulted entirely from stored state - // With UTF-32, this shouldn't be possible? - return (size_t) -3; - } else if(pc32[-1] == 0) { - // Was null character - return 0; - } else { - // Count of processed characters - return n - nr; - } - } else { - assert(nr == 0 && "Must have processed whole input"); - return (size_t) -2; - } - } else { - // Failed conversion - errno = EILSEQ; - return (size_t) -1; - } -} - -size_t mbrtoc32( - char32_t *restrict pc32, - const char *restrict s, - size_t n, - mbstate_t *restrict ps -) -{ - return mbrtoc32_l(pc32, s, n, ps, _PDCLIB_threadlocale()); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE( NO_TESTDRIVER ); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/wchar/mbrtowc.c b/waterbox/libc/functions/wchar/mbrtowc.c deleted file mode 100644 index 31be656a43..0000000000 --- a/waterbox/libc/functions/wchar/mbrtowc.c +++ /dev/null @@ -1,92 +0,0 @@ -/* mbrtowc( wchar_t * pwc, const char * s, size_t n, mbstate_t * ps ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#ifndef REGTEST -#include -#include -#include -#include "_PDCLIB_encoding.h" -#include "_PDCLIB_locale.h" - -static size_t mbrtowc_l( - wchar_t *restrict pwc, - const char *restrict s, - size_t n, - mbstate_t *restrict ps, - locale_t restrict l -) -{ - size_t res; - - if(s == NULL) { - s = ""; - n = 1; - } - - if(ps->_PendState == _PendPrefix) { - res = _PDCLIB_mbrtocwc_l(pwc, &ps->_PendChar, 1, ps, l); - switch(res) { - case 0: - // Converted the NUL character - ps->_PendState = _PendClear; - return 0; - - case 1: - // Successful conversion - ps->_PendChar = *s; - return 1; - - case (size_t) -1: - // Illegal sequence. mbrtocwc has already set errno. - return (size_t) -1; - - case (size_t) -3: - assert(!"Codec had buffered two characters"); - _PDCLIB_UNREACHABLE; - return 0; - - case (size_t) -2: - // Incomplete character, continue - break; - } - } - - // _PendClear state - res = _PDCLIB_mbrtocwc_l(pwc, s, n, ps, l); - switch(res) { - case (size_t) -3: - // Converted entirely from internal state - ps->_PendChar = *s; - ps->_PendState = _PendPrefix; - return 1; - default: - return res; - } -} - -size_t mbrtowc( - wchar_t *restrict pwc, - const char *restrict s, - size_t n, - mbstate_t *restrict ps -) -{ - static mbstate_t st; - return mbrtowc_l(pwc, s, n, ps ? ps : &st, _PDCLIB_threadlocale()); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE( NO_TESTDRIVER ); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/wchar/mbsinit.c b/waterbox/libc/functions/wchar/mbsinit.c deleted file mode 100644 index 0e6d7d3264..0000000000 --- a/waterbox/libc/functions/wchar/mbsinit.c +++ /dev/null @@ -1,53 +0,0 @@ -/* mbsinit( mbstate_t * ps ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#ifndef REGTEST -#include "_PDCLIB_encoding.h" -#include "_PDCLIB_locale.h" - -static int _PDCLIB_mbsinit_l( const mbstate_t *ps, locale_t l ) -{ - if( ps ) { - return ps->_Surrogate == 0 - && ps->_PendState == 0 - && l->_Codec->__mbsinit(ps); - } else return 1; -} - -int mbsinit( const mbstate_t * ps ) -{ - return _PDCLIB_mbsinit_l(ps, _PDCLIB_threadlocale()); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - mbstate_t mbs; - memset(&mbs, 0, sizeof mbs); - - TESTCASE(mbsinit(NULL) != 0); - TESTCASE(mbsinit(&mbs) != 0); - -#ifndef REGTEST - // Surrogate pending - mbs._Surrogate = 0xFEED; - TESTCASE(mbsinit(&mbs) == 0); - - mbs._Surrogate = 0; - mbs._PendState = 1; - TESTCASE(mbsinit(&mbs) == 0); -#endif - return TEST_RESULTS; -} -#endif - - - diff --git a/waterbox/libc/functions/wchar/wcrtomb.c b/waterbox/libc/functions/wchar/wcrtomb.c deleted file mode 100644 index d6ed4248a4..0000000000 --- a/waterbox/libc/functions/wchar/wcrtomb.c +++ /dev/null @@ -1,52 +0,0 @@ -/* wcrtomb( char * s, wchar_t wc, mbstate_t * ps ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#ifndef REGTEST -#include -#include -#include -#include -#include -#include "_PDCLIB_encoding.h" -#include "_PDCLIB_locale.h" - -#if 0 -/* - TODO: Other conversion functions call static ..._l helpers, but this one - does not, making this function "defined but not used". -*/ -static size_t wcrtomb_l( - char *restrict s, - wchar_t wc, - mbstate_t *restrict ps, - locale_t restrict l -) -{ - return _PDCLIB_cwcrtomb_l(s, wc, ps, l); -} -#endif - -size_t wcrtomb( - char *restrict s, - wchar_t wc, - mbstate_t *restrict ps -) -{ - static mbstate_t st; - return _PDCLIB_cwcrtomb(s, wc, ps ? ps : &st); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE( NO_TESTDRIVER ); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/wchar/wcscat.c b/waterbox/libc/functions/wchar/wcscat.c deleted file mode 100644 index c467af0ef0..0000000000 --- a/waterbox/libc/functions/wchar/wcscat.c +++ /dev/null @@ -1,45 +0,0 @@ -/* wcscat( wchar_t *, const wchar_t * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -wchar_t * wcscat( wchar_t * _PDCLIB_restrict s1, - const wchar_t * _PDCLIB_restrict s2 ) -{ - wchar_t * rc = s1; - if ( *s1 ) - { - while ( *++s1 ); - } - while ( (*s1++ = *s2++) ); - return rc; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - wchar_t s[] = L"xx\0xxxxxx"; - TESTCASE( wcscat( s, wabcde ) == s ); - TESTCASE( s[2] == L'a' ); - TESTCASE( s[6] == L'e' ); - TESTCASE( s[7] == L'\0' ); - TESTCASE( s[8] == L'x' ); - s[0] = L'\0'; - TESTCASE( wcscat( s, wabcdx ) == s ); - TESTCASE( s[4] == L'x' ); - TESTCASE( s[5] == L'\0' ); - TESTCASE( wcscat( s, L"\0" ) == s ); - TESTCASE( s[5] == L'\0' ); - TESTCASE( s[6] == L'e' ); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/wchar/wcschr.c b/waterbox/libc/functions/wchar/wcschr.c deleted file mode 100644 index 5629aa6fdc..0000000000 --- a/waterbox/libc/functions/wchar/wcschr.c +++ /dev/null @@ -1,32 +0,0 @@ -/* wcschr( const wchar_t *, wchar_t ); - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#include - -#ifndef REGTEST - -wchar_t *wcschr(const wchar_t * haystack, wchar_t needle) -{ - while(*haystack) { - if(*haystack == needle) return (wchar_t*) haystack; - haystack++; - } - return NULL; -} - - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/wchar/wcscmp.c b/waterbox/libc/functions/wchar/wcscmp.c deleted file mode 100644 index b338b5d30b..0000000000 --- a/waterbox/libc/functions/wchar/wcscmp.c +++ /dev/null @@ -1,39 +0,0 @@ -/* wcscmp( const wchar_t *, const wchar_t * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -int wcscmp( const wchar_t * s1, const wchar_t * s2 ) -{ - while ( ( *s1 ) && ( *s1 == *s2 ) ) - { - ++s1; - ++s2; - } - return ( *(wchar_t *)s1 - *(wchar_t *)s2 ); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - wchar_t cmpabcde[] = L"abcde"; - wchar_t cmpabcd_[] = L"abcd\xfc"; - wchar_t empty[] = L""; - TESTCASE( wcscmp( wabcde, cmpabcde ) == 0 ); - TESTCASE( wcscmp( wabcde, wabcdx ) < 0 ); - TESTCASE( wcscmp( wabcdx, wabcde ) > 0 ); - TESTCASE( wcscmp( empty, wabcde ) < 0 ); - TESTCASE( wcscmp( wabcde, empty ) > 0 ); - TESTCASE( wcscmp( wabcde, cmpabcd_ ) < 0 ); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/wchar/wcscoll.c b/waterbox/libc/functions/wchar/wcscoll.c deleted file mode 100644 index 9c7c2a6035..0000000000 --- a/waterbox/libc/functions/wchar/wcscoll.c +++ /dev/null @@ -1,36 +0,0 @@ -/* wcscoll( const wchar_t *, const wchar_t * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -/* I did much searching as to how various people implement this. - * - * OpenBSD, NetBSD and Musl libc for Linux implement this as a call to wcscmp - * and have various "todo" notices on this function, and on the other hand - * glibc implements it as a 500 line function. FreeBSD has an implementation - * which kind of uses their single byte character strcoll data for the first - * 256 characters, but looks incredibly fragile and likely to break. - * - * TL;DR: Nobody uses this, and this will probably work perfectly fine for you. - */ - -int wcscoll( const wchar_t * s1, const wchar_t * s2 ) -{ - return wcscmp(s1, s2); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/wchar/wcscpy.c b/waterbox/libc/functions/wchar/wcscpy.c deleted file mode 100644 index 62a52663a5..0000000000 --- a/waterbox/libc/functions/wchar/wcscpy.c +++ /dev/null @@ -1,33 +0,0 @@ -/* wchar_t * wcscpy( wchar_t *, const wchar_t * ); - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -wchar_t *wcscpy( wchar_t * _PDCLIB_restrict dest, - const wchar_t * _PDCLIB_restrict src) -{ - wchar_t * rv = dest; - while(*src) { - *(dest++) = *(src++); - } - - return rv; -} - - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/wchar/wcscspn.c b/waterbox/libc/functions/wchar/wcscspn.c deleted file mode 100644 index 248c20072b..0000000000 --- a/waterbox/libc/functions/wchar/wcscspn.c +++ /dev/null @@ -1,48 +0,0 @@ -/* wcscspn( const wchar_t *, const wchar_t * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -size_t wcscspn( const wchar_t * s1, const wchar_t * s2 ) -{ - size_t len = 0; - const wchar_t * p; - while ( s1[len] ) - { - p = s2; - while ( *p ) - { - if ( s1[len] == *p++ ) - { - return len; - } - } - ++len; - } - return len; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE( wcscspn( wabcde, L"x" ) == 5 ); - TESTCASE( wcscspn( wabcde, L"xyz" ) == 5 ); - TESTCASE( wcscspn( wabcde, L"zyx" ) == 5 ); - TESTCASE( wcscspn( wabcdx, L"x" ) == 4 ); - TESTCASE( wcscspn( wabcdx, L"xyz" ) == 4 ); - TESTCASE( wcscspn( wabcdx, L"zyx" ) == 4 ); - TESTCASE( wcscspn( wabcde, L"a" ) == 0 ); - TESTCASE( wcscspn( wabcde, L"abc" ) == 0 ); - TESTCASE( wcscspn( wabcde, L"cba" ) == 0 ); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/wchar/wcslen.c b/waterbox/libc/functions/wchar/wcslen.c deleted file mode 100644 index 00e3ca5500..0000000000 --- a/waterbox/libc/functions/wchar/wcslen.c +++ /dev/null @@ -1,29 +0,0 @@ -/* wcslen( const wchar_t * ); - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -size_t wcslen( const wchar_t * str ) -{ - size_t n = 0; - while(*(str++)) n++; - return n; -} - - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/wchar/wcsncat.c b/waterbox/libc/functions/wchar/wcsncat.c deleted file mode 100644 index 633e54df64..0000000000 --- a/waterbox/libc/functions/wchar/wcsncat.c +++ /dev/null @@ -1,60 +0,0 @@ -/* wcsncat( wchar_t *, const wchar_t *, size_t ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -wchar_t * wcsncat( wchar_t * _PDCLIB_restrict s1, - const wchar_t * _PDCLIB_restrict s2, - size_t n ) -{ - wchar_t * rc = s1; - while ( *s1 ) - { - ++s1; - } - while ( n && ( *s1++ = *s2++ ) ) - { - --n; - } - if ( n == 0 ) - { - *s1 = '\0'; - } - return rc; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - wchar_t s[] = L"xx\0xxxxxx"; - TESTCASE( wcsncat( s, wabcde, 10 ) == s ); - TESTCASE( s[2] == L'a' ); - TESTCASE( s[6] == L'e' ); - TESTCASE( s[7] == L'\0' ); - TESTCASE( s[8] == L'x' ); - s[0] = L'\0'; - TESTCASE( wcsncat( s, wabcdx, 10 ) == s ); - TESTCASE( s[4] == L'x' ); - TESTCASE( s[5] == L'\0' ); - TESTCASE( wcsncat( s, L"\0", 10 ) == s ); - TESTCASE( s[5] == L'\0' ); - TESTCASE( s[6] == L'e' ); - TESTCASE( wcsncat( s, wabcde, 0 ) == s ); - TESTCASE( s[5] == L'\0' ); - TESTCASE( s[6] == L'e' ); - TESTCASE( wcsncat( s, wabcde, 3 ) == s ); - TESTCASE( s[5] == L'a' ); - TESTCASE( s[7] == L'c' ); - TESTCASE( s[8] == L'\0' ); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/wchar/wcsncmp.c b/waterbox/libc/functions/wchar/wcsncmp.c deleted file mode 100644 index d857d7c3af..0000000000 --- a/waterbox/libc/functions/wchar/wcsncmp.c +++ /dev/null @@ -1,52 +0,0 @@ -/* wcsncmp( const wchar_t *, const wchar_t *, size_t ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -int wcsncmp( const wchar_t * s1, const wchar_t * s2, size_t n ) -{ - while ( *s1 && n && ( *s1 == *s2 ) ) - { - ++s1; - ++s2; - --n; - } - if ( n == 0 ) - { - return 0; - } - else - { - return ( *(wchar_t *)s1 - *(wchar_t *)s2 ); - } -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - wchar_t cmpabcde[] = L"abcde\0f"; - wchar_t cmpabcd_[] = L"abcde\xfc"; - wchar_t empty[] = L""; - wchar_t x[] = L"x"; - TESTCASE( wcsncmp( wabcde, cmpabcde, 5 ) == 0 ); - TESTCASE( wcsncmp( wabcde, cmpabcde, 10 ) == 0 ); - TESTCASE( wcsncmp( wabcde, wabcdx, 5 ) < 0 ); - TESTCASE( wcsncmp( wabcdx, wabcde, 5 ) > 0 ); - TESTCASE( wcsncmp( empty, wabcde, 5 ) < 0 ); - TESTCASE( wcsncmp( wabcde, empty, 5 ) > 0 ); - TESTCASE( wcsncmp( wabcde, wabcdx, 4 ) == 0 ); - TESTCASE( wcsncmp( wabcde, x, 0 ) == 0 ); - TESTCASE( wcsncmp( wabcde, x, 1 ) < 0 ); - TESTCASE( wcsncmp( wabcde, cmpabcd_, 10 ) < 0 ); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/wchar/wcsncpy.c b/waterbox/libc/functions/wchar/wcsncpy.c deleted file mode 100644 index 2734fdd690..0000000000 --- a/waterbox/libc/functions/wchar/wcsncpy.c +++ /dev/null @@ -1,43 +0,0 @@ -/* wchar_t * wcsncpy( wchar_t *, const wchar_t * , size_t ); - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -wchar_t *wcsncpy( wchar_t * _PDCLIB_restrict s1, - const wchar_t * _PDCLIB_restrict s2, - size_t n ) -{ - wchar_t * rc = s1; - while ( ( n > 0 ) && ( *s1++ = *s2++ ) ) - { - /* Cannot do "n--" in the conditional as size_t is unsigned and we have - to check it again for >0 in the next loop below, so we must not risk - underflow. - */ - --n; - } - /* Checking against 1 as we missed the last --n in the loop above. */ - while ( n-- > 1 ) - { - *s1++ = '\0'; - } - return rc; -} - - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/wchar/wcspbrk.c b/waterbox/libc/functions/wchar/wcspbrk.c deleted file mode 100644 index 6503a85429..0000000000 --- a/waterbox/libc/functions/wchar/wcspbrk.c +++ /dev/null @@ -1,47 +0,0 @@ -/* wcspbrk( const wchar_t *, const wchar_t * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -wchar_t * wcspbrk( const wchar_t * s1, const wchar_t * s2 ) -{ - const wchar_t * p1 = s1; - const wchar_t * p2; - while ( *p1 ) - { - p2 = s2; - while ( *p2 ) - { - if ( *p1 == *p2++ ) - { - return (wchar_t *) p1; - } - } - ++p1; - } - return NULL; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE( wcspbrk( wabcde, L"x" ) == NULL ); - TESTCASE( wcspbrk( wabcde, L"xyz" ) == NULL ); - TESTCASE( wcspbrk( wabcdx, L"x" ) == &wabcdx[4] ); - TESTCASE( wcspbrk( wabcdx, L"xyz" ) == &wabcdx[4] ); - TESTCASE( wcspbrk( wabcdx, L"zyx" ) == &wabcdx[4] ); - TESTCASE( wcspbrk( wabcde, L"a" ) == &wabcde[0] ); - TESTCASE( wcspbrk( wabcde, L"abc" ) == &wabcde[0] ); - TESTCASE( wcspbrk( wabcde, L"cba" ) == &wabcde[0] ); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/wchar/wcsrchr.c b/waterbox/libc/functions/wchar/wcsrchr.c deleted file mode 100644 index 5f2a66daa0..0000000000 --- a/waterbox/libc/functions/wchar/wcsrchr.c +++ /dev/null @@ -1,33 +0,0 @@ -/* wcsrchr( const wchar_t *, wchar_t ); - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#include - -#ifndef REGTEST - -wchar_t *wcsrchr(const wchar_t * haystack, wchar_t needle) -{ - wchar_t *found = NULL; - while(*haystack) { - if(*haystack == needle) found = (wchar_t*) haystack; - haystack++; - } - return found; -} - - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/wchar/wcsspn.c b/waterbox/libc/functions/wchar/wcsspn.c deleted file mode 100644 index dbdf522c71..0000000000 --- a/waterbox/libc/functions/wchar/wcsspn.c +++ /dev/null @@ -1,47 +0,0 @@ -/* wcsspn( const wchar_t *, const wchar_t * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -size_t wcsspn( const wchar_t * s1, const wchar_t * s2 ) -{ - size_t len = 0; - const wchar_t * p; - while ( s1[ len ] ) - { - p = s2; - while ( *p ) - { - if ( s1[len] == *p ) - { - break; - } - ++p; - } - if ( ! *p ) - { - return len; - } - ++len; - } - return len; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE( wcsspn( wabcde, L"abc" ) == 3 ); - TESTCASE( wcsspn( wabcde, L"b" ) == 0 ); - TESTCASE( wcsspn( wabcde, wabcde ) == 5 ); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/wchar/wcsstr.c b/waterbox/libc/functions/wchar/wcsstr.c deleted file mode 100644 index 1427a8a573..0000000000 --- a/waterbox/libc/functions/wchar/wcsstr.c +++ /dev/null @@ -1,49 +0,0 @@ -/* wcsstr( const wchar_t *, const wchar_t * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -wchar_t * wcsstr( const wchar_t * s1, const wchar_t * s2 ) -{ - const wchar_t * p1 = s1; - const wchar_t * p2; - while ( *s1 ) - { - p2 = s2; - while ( *p2 && ( *p1 == *p2 ) ) - { - ++p1; - ++p2; - } - if ( ! *p2 ) - { - return (wchar_t *) s1; - } - ++s1; - p1 = s1; - } - return NULL; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - wchar_t s[] = L"abcabcabcdabcde"; - TESTCASE( wcsstr( s, L"x" ) == NULL ); - TESTCASE( wcsstr( s, L"xyz" ) == NULL ); - TESTCASE( wcsstr( s, L"a" ) == &s[0] ); - TESTCASE( wcsstr( s, L"abc" ) == &s[0] ); - TESTCASE( wcsstr( s, L"abcd" ) == &s[6] ); - TESTCASE( wcsstr( s, L"abcde" ) == &s[10] ); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/wchar/wcstok.c b/waterbox/libc/functions/wchar/wcstok.c deleted file mode 100644 index b8bcf14184..0000000000 --- a/waterbox/libc/functions/wchar/wcstok.c +++ /dev/null @@ -1,113 +0,0 @@ -/* wcstok( wchar_t *, const wchar_t * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -wchar_t * wcstok( wchar_t * _PDCLIB_restrict s1, - const wchar_t * _PDCLIB_restrict s2, - wchar_t ** _PDCLIB_restrict ptr ) -{ - const wchar_t * p = s2; - - if ( s1 != NULL ) - { - /* new string */ - *ptr = s1; - } - else - { - /* old string continued */ - if ( *ptr == NULL ) - { - /* No old string, no new string, nothing to do */ - return NULL; - } - s1 = *ptr; - } - - /* skipping leading s2 characters */ - while ( *p && *s1 ) - { - if ( *s1 == *p ) - { - /* found seperator; skip and start over */ - ++s1; - p = s2; - continue; - } - ++p; - } - - if ( ! *s1 ) - { - /* no more to parse */ - return ( *ptr = NULL ); - } - - /* skipping non-s2 characters */ - *ptr = s1; - while ( **ptr ) - { - p = s2; - while ( *p ) - { - if ( **ptr == *p++ ) - { - /* found seperator; overwrite with '\0', position *ptr, return */ - *(*ptr)++ = L'\0'; - return s1; - } - } - ++(*ptr); - } - - /* parsed to end of string */ - *ptr = NULL; - return s1; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - // MinGW at least has a very nonconforming (different signature!) variety - // of wcstok -#ifndef REGTEST - wchar_t s[] = L"_a_bc__d_"; - wchar_t* state = NULL; - wchar_t* tokres; - - TESTCASE( ( tokres = wcstok( s, L"_", &state ) ) == &s[1] ); - TESTCASE( s[1] == L'a' ); - TESTCASE( s[2] == L'\0' ); - TESTCASE( ( tokres = wcstok( NULL, L"_", &state ) ) == &s[3] ); - TESTCASE( s[3] == L'b' ); - TESTCASE( s[4] == L'c' ); - TESTCASE( s[5] == L'\0' ); - TESTCASE( ( tokres = wcstok( NULL, L"_", &state ) ) == &s[7] ); - TESTCASE( s[6] == L'_' ); - TESTCASE( s[7] == L'd' ); - TESTCASE( s[8] == L'\0' ); - TESTCASE( ( tokres = wcstok( NULL, L"_", &state ) ) == NULL ); - wcscpy( s, L"ab_cd" ); - TESTCASE( ( tokres = wcstok( s, L"_", &state ) ) == &s[0] ); - TESTCASE( s[0] == L'a' ); - TESTCASE( s[1] == L'b' ); - TESTCASE( s[2] == L'\0' ); - TESTCASE( ( tokres = wcstok( NULL, L"_", &state ) ) == &s[3] ); - TESTCASE( s[3] == L'c' ); - TESTCASE( s[4] == L'd' ); - TESTCASE( s[5] == L'\0' ); - TESTCASE( ( tokres = wcstok( NULL, L"_", &state ) ) == NULL ); -#endif - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/wchar/wcsxfrm.c b/waterbox/libc/functions/wchar/wcsxfrm.c deleted file mode 100644 index 6d1bd37d76..0000000000 --- a/waterbox/libc/functions/wchar/wcsxfrm.c +++ /dev/null @@ -1,28 +0,0 @@ -/* wcsxfrm( char *, const char *, size_t ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -/* See notes on wcscoll. */ -size_t wcsxfrm( wchar_t * _PDCLIB_restrict s1, const wchar_t * _PDCLIB_restrict s2, size_t n ) -{ - wcsncpy(s1, s2, n); - return wcslen(s2); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - return TEST_RESULTS; -} -#endif - diff --git a/waterbox/libc/functions/wchar/wmemchr.c b/waterbox/libc/functions/wchar/wmemchr.c deleted file mode 100644 index 75b010d4c2..0000000000 --- a/waterbox/libc/functions/wchar/wmemchr.c +++ /dev/null @@ -1,39 +0,0 @@ -/* wmemchr( const void *, int, size_t ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -wchar_t * wmemchr( const wchar_t * p, wchar_t c, size_t n ) -{ - while ( n-- ) - { - if ( *p == c ) - { - return (wchar_t*) p; - } - ++p; - } - return NULL; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE( wmemchr( wabcde, L'c', 5 ) == &wabcde[2] ); - TESTCASE( wmemchr( wabcde, L'a', 1 ) == &wabcde[0] ); - TESTCASE( wmemchr( wabcde, L'a', 0 ) == NULL ); - TESTCASE( wmemchr( wabcde, L'\0', 5 ) == NULL ); - TESTCASE( wmemchr( wabcde, L'\0', 6 ) == &wabcde[5] ); - return TEST_RESULTS; -} - -#endif diff --git a/waterbox/libc/functions/wchar/wmemcmp.c b/waterbox/libc/functions/wchar/wmemcmp.c deleted file mode 100644 index de5d49afd2..0000000000 --- a/waterbox/libc/functions/wchar/wmemcmp.c +++ /dev/null @@ -1,39 +0,0 @@ -/* wmemcmp( const wchar_t *, const wchar_t *, size_t ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -int wmemcmp( const wchar_t * p1, const wchar_t * p2, size_t n ) -{ - while ( n-- ) - { - if ( *p1 != *p2 ) - { - return *p1 - *p2; - } - ++p1; - ++p2; - } - return 0; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - wchar_t const xxxxx[] = L"xxxxx"; - TESTCASE( wmemcmp( wabcde, wabcdx, 5 ) < 0 ); - TESTCASE( wmemcmp( wabcde, wabcdx, 4 ) == 0 ); - TESTCASE( wmemcmp( wabcde, xxxxx, 0 ) == 0 ); - TESTCASE( wmemcmp( xxxxx, wabcde, 1 ) > 0 ); - return 0; -} -#endif diff --git a/waterbox/libc/functions/wchar/wmemcpy.c b/waterbox/libc/functions/wchar/wmemcpy.c deleted file mode 100644 index 2f3bdac335..0000000000 --- a/waterbox/libc/functions/wchar/wmemcpy.c +++ /dev/null @@ -1,39 +0,0 @@ -/* wmemcpy( wchar_t *, const wchar_t *, size_t ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -wchar_t * wmemcpy( wchar_t * _PDCLIB_restrict dest, - const wchar_t * _PDCLIB_restrict src, - size_t n ) -{ - wchar_t* rv = dest; - while ( n-- ) - { - *dest++ = *src++; - } - return rv; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - wchar_t s[] = L"xxxxxxxxxxx"; - TESTCASE( wmemcpy( s, wabcde, 6 ) == s ); - TESTCASE( s[4] == L'e' ); - TESTCASE( s[5] == L'\0' ); - TESTCASE( wmemcpy( s + 5, wabcde, 5 ) == s + 5 ); - TESTCASE( s[9] == L'e' ); - TESTCASE( s[10] == L'x' ); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/wchar/wmemmove.c b/waterbox/libc/functions/wchar/wmemmove.c deleted file mode 100644 index a5288f40cb..0000000000 --- a/waterbox/libc/functions/wchar/wmemmove.c +++ /dev/null @@ -1,49 +0,0 @@ -/* wmemmove( wchar_t *, const wchar_t *, size_t ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include - -#ifndef REGTEST - -wchar_t * wmemmove( wchar_t * dest, const wchar_t * src, size_t n ) -{ - wchar_t* rv = dest; - if ( dest <= src ) - { - while ( n-- ) - { - *dest++ = *src++; - } - } - else - { - src += n; - dest += n; - while ( n-- ) - { - *--dest = *--src; - } - } - return rv; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - wchar_t s[] = L"xxxxabcde"; - TESTCASE( wmemmove( s, s + 4, 5 ) == s ); - TESTCASE( s[0] == L'a' ); - TESTCASE( s[4] == L'e' ); - TESTCASE( s[5] == L'b' ); - TESTCASE( wmemmove( s + 4, s, 5 ) == s + 4 ); - TESTCASE( s[4] == L'a' ); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/wctype/iswalnum.c b/waterbox/libc/functions/wctype/iswalnum.c deleted file mode 100644 index df5dbb2ae9..0000000000 --- a/waterbox/libc/functions/wctype/iswalnum.c +++ /dev/null @@ -1,30 +0,0 @@ -/* iswalnum( wint_t ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#ifndef REGTEST -#include "_PDCLIB_locale.h" - -int iswalnum( wint_t wc ) -{ - return iswctype( wc, _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_DIGIT ); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE(iswalnum(L'a')); - TESTCASE(iswalnum(L'z')); - TESTCASE(iswalnum(L'E')); - TESTCASE(iswalnum(L'3')); - TESTCASE(!iswalnum(L';')); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/wctype/iswalpha.c b/waterbox/libc/functions/wctype/iswalpha.c deleted file mode 100644 index 9cf5cfaa06..0000000000 --- a/waterbox/libc/functions/wctype/iswalpha.c +++ /dev/null @@ -1,30 +0,0 @@ -/* iswalpha( wint_t ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#ifndef REGTEST -#include "_PDCLIB_locale.h" - -int iswalpha( wint_t wc ) -{ - return iswctype( wc, _PDCLIB_CTYPE_ALPHA ); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE(iswalpha(L'a')); - TESTCASE(iswalpha(L'z')); - TESTCASE(iswalpha(L'E')); - TESTCASE(!iswalpha(L'3')); - TESTCASE(!iswalpha(L';')); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/wctype/iswblank.c b/waterbox/libc/functions/wctype/iswblank.c deleted file mode 100644 index a73b9f63ce..0000000000 --- a/waterbox/libc/functions/wctype/iswblank.c +++ /dev/null @@ -1,29 +0,0 @@ -/* iswblank( wint_t ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#ifndef REGTEST -#include "_PDCLIB_locale.h" - -int iswblank( wint_t wc ) -{ - return iswctype( wc, _PDCLIB_CTYPE_BLANK ); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE(iswblank(L' ')); - TESTCASE(iswblank(L'\t')); - TESTCASE(!iswblank(L'\n')); - TESTCASE(!iswblank(L'a')); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/wctype/iswcntrl.c b/waterbox/libc/functions/wctype/iswcntrl.c deleted file mode 100644 index 1c81c54437..0000000000 --- a/waterbox/libc/functions/wctype/iswcntrl.c +++ /dev/null @@ -1,30 +0,0 @@ -/* iswcntrl( wint_t ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#ifndef REGTEST -#include "_PDCLIB_locale.h" - -int iswcntrl( wint_t wc ) -{ - return iswctype( wc, _PDCLIB_CTYPE_CNTRL ); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE(iswcntrl(L'\0')); - TESTCASE(iswcntrl(L'\n')); - TESTCASE(iswcntrl(L'\v')); - TESTCASE(!iswcntrl(L'\t')); - TESTCASE(!iswcntrl(L'a')); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/wctype/iswctype.c b/waterbox/libc/functions/wctype/iswctype.c deleted file mode 100644 index cac41150ac..0000000000 --- a/waterbox/libc/functions/wctype/iswctype.c +++ /dev/null @@ -1,135 +0,0 @@ -/* iswctype( wint_t, wctype_t ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#ifndef REGTEST -#include "_PDCLIB_locale.h" - -int _PDCLIB_iswctype_l( wint_t wc, wctype_t desc, locale_t l ) -{ - wc = _PDCLIB_unpackwint( wc ); - - _PDCLIB_wcinfo_t *info = _PDCLIB_wcgetinfo( l, wc ); - - if(!info) return 0; - - return info->flags & desc; -} - -int iswctype( wint_t wc, wctype_t desc ) -{ - return _PDCLIB_iswctype_l( wc, desc, _PDCLIB_threadlocale() ); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE( iswctype(L'a', wctype("alpha"))); - TESTCASE( iswctype(L'z', wctype("alpha"))); - TESTCASE( iswctype(L'E', wctype("alpha"))); - TESTCASE(!iswctype(L'3', wctype("alpha"))); - TESTCASE(!iswctype(L';', wctype("alpha"))); - - TESTCASE( iswctype(L'a', wctype("alnum"))); - TESTCASE( iswctype(L'3', wctype("alnum"))); - TESTCASE(!iswctype(L';', wctype("alnum"))); - - TESTCASE( iswctype(L' ', wctype("blank"))); - TESTCASE( iswctype(L'\t', wctype("blank"))); - TESTCASE(!iswctype(L'\n', wctype("blank"))); - TESTCASE(!iswctype(L';', wctype("blank"))); - - TESTCASE( iswctype(L'\0', wctype("cntrl"))); - TESTCASE( iswctype(L'\n', wctype("cntrl"))); - TESTCASE( iswctype(L'\v', wctype("cntrl"))); - TESTCASE(!iswctype(L'\t', wctype("cntrl"))); - TESTCASE(!iswctype(L'a', wctype("cntrl"))); - - TESTCASE( iswctype(L'0', wctype("digit"))); - TESTCASE( iswctype(L'1', wctype("digit"))); - TESTCASE( iswctype(L'2', wctype("digit"))); - TESTCASE( iswctype(L'3', wctype("digit"))); - TESTCASE( iswctype(L'4', wctype("digit"))); - TESTCASE( iswctype(L'5', wctype("digit"))); - TESTCASE( iswctype(L'6', wctype("digit"))); - TESTCASE( iswctype(L'7', wctype("digit"))); - TESTCASE( iswctype(L'8', wctype("digit"))); - TESTCASE( iswctype(L'9', wctype("digit"))); - TESTCASE(!iswctype(L'X', wctype("digit"))); - TESTCASE(!iswctype(L'?', wctype("digit"))); - - TESTCASE( iswctype(L'a', wctype("graph"))); - TESTCASE( iswctype(L'z', wctype("graph"))); - TESTCASE( iswctype(L'E', wctype("graph"))); - TESTCASE( iswctype(L'E', wctype("graph"))); - TESTCASE(!iswctype(L' ', wctype("graph"))); - TESTCASE(!iswctype(L'\t', wctype("graph"))); - TESTCASE(!iswctype(L'\n', wctype("graph"))); - - TESTCASE( iswctype(L'a', wctype("lower"))); - TESTCASE( iswctype(L'e', wctype("lower"))); - TESTCASE( iswctype(L'z', wctype("lower"))); - TESTCASE(!iswctype(L'A', wctype("lower"))); - TESTCASE(!iswctype(L'E', wctype("lower"))); - TESTCASE(!iswctype(L'Z', wctype("lower"))); - - TESTCASE(!iswctype(L'a', wctype("upper"))); - TESTCASE(!iswctype(L'e', wctype("upper"))); - TESTCASE(!iswctype(L'z', wctype("upper"))); - TESTCASE( iswctype(L'A', wctype("upper"))); - TESTCASE( iswctype(L'E', wctype("upper"))); - TESTCASE( iswctype(L'Z', wctype("upper"))); - - TESTCASE( iswctype(L'Z', wctype("print"))); - TESTCASE( iswctype(L'a', wctype("print"))); - TESTCASE( iswctype(L';', wctype("print"))); - TESTCASE( iswctype(L'\t', wctype("print"))); - TESTCASE(!iswctype(L'\0', wctype("print"))); - - TESTCASE( iswctype(L';', wctype("punct"))); - TESTCASE( iswctype(L'.', wctype("punct"))); - TESTCASE( iswctype(L'?', wctype("punct"))); - TESTCASE(!iswctype(L' ', wctype("punct"))); - TESTCASE(!iswctype(L'Z', wctype("punct"))); - - TESTCASE( iswctype(L' ', wctype("space"))); - TESTCASE( iswctype(L'\t', wctype("space"))); - - TESTCASE( iswctype(L'0', wctype("xdigit"))); - TESTCASE( iswctype(L'1', wctype("xdigit"))); - TESTCASE( iswctype(L'2', wctype("xdigit"))); - TESTCASE( iswctype(L'3', wctype("xdigit"))); - TESTCASE( iswctype(L'4', wctype("xdigit"))); - TESTCASE( iswctype(L'5', wctype("xdigit"))); - TESTCASE( iswctype(L'6', wctype("xdigit"))); - TESTCASE( iswctype(L'7', wctype("xdigit"))); - TESTCASE( iswctype(L'8', wctype("xdigit"))); - TESTCASE( iswctype(L'9', wctype("xdigit"))); - TESTCASE( iswctype(L'a', wctype("xdigit"))); - TESTCASE( iswctype(L'b', wctype("xdigit"))); - TESTCASE( iswctype(L'c', wctype("xdigit"))); - TESTCASE( iswctype(L'd', wctype("xdigit"))); - TESTCASE( iswctype(L'e', wctype("xdigit"))); - TESTCASE( iswctype(L'f', wctype("xdigit"))); - TESTCASE( iswctype(L'A', wctype("xdigit"))); - TESTCASE( iswctype(L'B', wctype("xdigit"))); - TESTCASE( iswctype(L'C', wctype("xdigit"))); - TESTCASE( iswctype(L'D', wctype("xdigit"))); - TESTCASE( iswctype(L'E', wctype("xdigit"))); - TESTCASE( iswctype(L'F', wctype("xdigit"))); - TESTCASE(!iswctype(L'g', wctype("xdigit"))); - TESTCASE(!iswctype(L'G', wctype("xdigit"))); - TESTCASE(!iswctype(L'x', wctype("xdigit"))); - TESTCASE(!iswctype(L'X', wctype("xdigit"))); - TESTCASE(!iswctype(L' ', wctype("xdigit"))); - - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/wctype/iswdigit.c b/waterbox/libc/functions/wctype/iswdigit.c deleted file mode 100644 index 31300cc214..0000000000 --- a/waterbox/libc/functions/wctype/iswdigit.c +++ /dev/null @@ -1,52 +0,0 @@ -/* iswdigit( wint_t ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#ifndef REGTEST -#include "_PDCLIB_locale.h" - -int iswdigit( wint_t wc ) -{ - return iswctype( wc, _PDCLIB_CTYPE_DIGIT ); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE(iswdigit(L'0')); - TESTCASE(iswdigit(L'1')); - TESTCASE(iswdigit(L'2')); - TESTCASE(iswdigit(L'3')); - TESTCASE(iswdigit(L'4')); - TESTCASE(iswdigit(L'5')); - TESTCASE(iswdigit(L'6')); - TESTCASE(iswdigit(L'7')); - TESTCASE(iswdigit(L'8')); - TESTCASE(iswdigit(L'9')); - TESTCASE(!iswdigit(L'a')); - TESTCASE(!iswdigit(L'b')); - TESTCASE(!iswdigit(L'c')); - TESTCASE(!iswdigit(L'd')); - TESTCASE(!iswdigit(L'e')); - TESTCASE(!iswdigit(L'f')); - TESTCASE(!iswdigit(L'A')); - TESTCASE(!iswdigit(L'B')); - TESTCASE(!iswdigit(L'C')); - TESTCASE(!iswdigit(L'D')); - TESTCASE(!iswdigit(L'E')); - TESTCASE(!iswdigit(L'F')); - TESTCASE(!iswdigit(L'g')); - TESTCASE(!iswdigit(L'G')); - TESTCASE(!iswdigit(L'x')); - TESTCASE(!iswdigit(L'X')); - TESTCASE(!iswdigit(L' ')); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/wctype/iswgraph.c b/waterbox/libc/functions/wctype/iswgraph.c deleted file mode 100644 index 954844a2a5..0000000000 --- a/waterbox/libc/functions/wctype/iswgraph.c +++ /dev/null @@ -1,31 +0,0 @@ -/* iswgraph( wint_t ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#ifndef REGTEST -#include "_PDCLIB_locale.h" - -int iswgraph( wint_t wc ) -{ - return iswctype( wc, _PDCLIB_CTYPE_GRAPH ); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE(iswgraph(L'a')); - TESTCASE(iswgraph(L'z')); - TESTCASE(iswgraph(L'E')); - TESTCASE(!iswgraph(L' ')); - TESTCASE(!iswgraph(L'\t')); - TESTCASE(!iswgraph(L'\n')); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/wctype/iswlower.c b/waterbox/libc/functions/wctype/iswlower.c deleted file mode 100644 index 628ae64010..0000000000 --- a/waterbox/libc/functions/wctype/iswlower.c +++ /dev/null @@ -1,31 +0,0 @@ -/* iswalnum( wint_t ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#ifndef REGTEST -#include "_PDCLIB_locale.h" - -int iswlower( wint_t wc ) -{ - return iswctype( wc, _PDCLIB_CTYPE_LOWER ); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE(iswlower(L'a')); - TESTCASE(iswlower(L'e')); - TESTCASE(iswlower(L'z')); - TESTCASE(!iswlower(L'A')); - TESTCASE(!iswlower(L'E')); - TESTCASE(!iswlower(L'Z')); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/wctype/iswprint.c b/waterbox/libc/functions/wctype/iswprint.c deleted file mode 100644 index 395eb635af..0000000000 --- a/waterbox/libc/functions/wctype/iswprint.c +++ /dev/null @@ -1,26 +0,0 @@ -/* iswprint( wint_t ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#ifndef REGTEST -#include "_PDCLIB_locale.h" - -int iswprint( wint_t wc ) -{ - return iswctype( wc, _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_SPACE ); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/wctype/iswpunct.c b/waterbox/libc/functions/wctype/iswpunct.c deleted file mode 100644 index c59672c44b..0000000000 --- a/waterbox/libc/functions/wctype/iswpunct.c +++ /dev/null @@ -1,31 +0,0 @@ -/* iswpunct( wint_t ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#ifndef REGTEST -#include "_PDCLIB_locale.h" - -int iswpunct( wint_t wc ) -{ - return iswctype( wc, _PDCLIB_CTYPE_PUNCT ); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE(iswpunct(L';')); - TESTCASE(iswpunct(L'?')); - TESTCASE(iswpunct(L'.')); - TESTCASE(!iswpunct(L' ')); - TESTCASE(!iswpunct(L'Z')); - - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/wctype/iswspace.c b/waterbox/libc/functions/wctype/iswspace.c deleted file mode 100644 index 501a30139f..0000000000 --- a/waterbox/libc/functions/wctype/iswspace.c +++ /dev/null @@ -1,28 +0,0 @@ -/* iswspace( wint_t ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#ifndef REGTEST -#include "_PDCLIB_locale.h" - -int iswspace( wint_t wc ) -{ - return iswctype( wc, _PDCLIB_CTYPE_SPACE ); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE(iswspace(L' ')); - TESTCASE(iswspace(L'\t')); - TESTCASE(!iswspace(L'a')); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/wctype/iswupper.c b/waterbox/libc/functions/wctype/iswupper.c deleted file mode 100644 index 4806a281b5..0000000000 --- a/waterbox/libc/functions/wctype/iswupper.c +++ /dev/null @@ -1,31 +0,0 @@ -/* iswupper( wint_t ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#ifndef REGTEST -#include "_PDCLIB_locale.h" - -int iswupper( wint_t wc ) -{ - return iswctype( wc, _PDCLIB_CTYPE_UPPER ); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE(!iswupper(L'a')); - TESTCASE(!iswupper(L'e')); - TESTCASE(!iswupper(L'z')); - TESTCASE(iswupper(L'A')); - TESTCASE(iswupper(L'E')); - TESTCASE(iswupper(L'Z')); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/wctype/iswxdigit.c b/waterbox/libc/functions/wctype/iswxdigit.c deleted file mode 100644 index 3f51ae81bf..0000000000 --- a/waterbox/libc/functions/wctype/iswxdigit.c +++ /dev/null @@ -1,52 +0,0 @@ -/* iswxdigit( wint_t ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#ifndef REGTEST -#include "_PDCLIB_locale.h" - -int iswxdigit( wint_t wc ) -{ - return iswctype( wc, _PDCLIB_CTYPE_XDIGT ); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE(iswxdigit(L'0')); - TESTCASE(iswxdigit(L'1')); - TESTCASE(iswxdigit(L'2')); - TESTCASE(iswxdigit(L'3')); - TESTCASE(iswxdigit(L'4')); - TESTCASE(iswxdigit(L'5')); - TESTCASE(iswxdigit(L'6')); - TESTCASE(iswxdigit(L'7')); - TESTCASE(iswxdigit(L'8')); - TESTCASE(iswxdigit(L'9')); - TESTCASE(iswxdigit(L'a')); - TESTCASE(iswxdigit(L'b')); - TESTCASE(iswxdigit(L'c')); - TESTCASE(iswxdigit(L'd')); - TESTCASE(iswxdigit(L'e')); - TESTCASE(iswxdigit(L'f')); - TESTCASE(iswxdigit(L'A')); - TESTCASE(iswxdigit(L'B')); - TESTCASE(iswxdigit(L'C')); - TESTCASE(iswxdigit(L'D')); - TESTCASE(iswxdigit(L'E')); - TESTCASE(iswxdigit(L'F')); - TESTCASE(!iswxdigit(L'g')); - TESTCASE(!iswxdigit(L'G')); - TESTCASE(!iswxdigit(L'x')); - TESTCASE(!iswxdigit(L'X')); - TESTCASE(!iswxdigit(L' ')); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/wctype/towctrans.c b/waterbox/libc/functions/wctype/towctrans.c deleted file mode 100644 index 1ecb2ff2b7..0000000000 --- a/waterbox/libc/functions/wctype/towctrans.c +++ /dev/null @@ -1,42 +0,0 @@ -/* towctrans( wint_t, wctrans_t ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#ifndef REGTEST -#include -#include "_PDCLIB_locale.h" - -wint_t _PDCLIB_towctrans_l( wint_t wc, wctrans_t trans, locale_t l ) -{ - switch( trans ) { - case 0: return wc; - case _PDCLIB_WCTRANS_TOLOWER: return _PDCLIB_towlower_l( wc, l ); - case _PDCLIB_WCTRANS_TOUPPER: return _PDCLIB_towupper_l( wc, l ); - default: abort(); - } -} - -wint_t towctrans( wint_t wc, wctrans_t trans ) -{ - return _PDCLIB_towctrans_l( wc, trans, _PDCLIB_threadlocale() ); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE(towctrans(L'a', wctrans("toupper")) == L'A'); - TESTCASE(towctrans(L'B', wctrans("toupper")) == L'B'); - TESTCASE(towctrans(L'a', wctrans("tolower")) == L'a'); - TESTCASE(towctrans(L'B', wctrans("tolower")) == L'b'); - TESTCASE(towctrans(L'B', wctrans("invalid")) == L'B'); - TESTCASE(towctrans(L'B', 0) == L'B'); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/wctype/towlower.c b/waterbox/libc/functions/wctype/towlower.c deleted file mode 100644 index b81e7579ca..0000000000 --- a/waterbox/libc/functions/wctype/towlower.c +++ /dev/null @@ -1,41 +0,0 @@ -/* towlower( wint_t ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#ifndef REGTEST -#include "_PDCLIB_locale.h" - -wint_t _PDCLIB_towlower_l( wint_t wc, locale_t l ) -{ - wint_t uwc = _PDCLIB_unpackwint( wc ); - _PDCLIB_wcinfo_t *info = _PDCLIB_wcgetinfo( l, uwc ); - if( info ) - { - uwc += info->lower_delta; - } - return uwc; -} - -wint_t towlower( wint_t wc ) -{ - return _PDCLIB_towlower_l( wc, _PDCLIB_threadlocale() ); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE(towlower(0) == 0); - TESTCASE(towlower(L'a') == L'a'); - TESTCASE(towlower(L'B') == L'b'); - TESTCASE(towlower(L'0') == L'0'); - - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/wctype/towupper.c b/waterbox/libc/functions/wctype/towupper.c deleted file mode 100644 index 368ca2cdb5..0000000000 --- a/waterbox/libc/functions/wctype/towupper.c +++ /dev/null @@ -1,41 +0,0 @@ -/* towupper( wint_t ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#ifndef REGTEST -#include "_PDCLIB_locale.h" - -wint_t _PDCLIB_towupper_l( wint_t wc, locale_t l ) -{ - wint_t uwc = _PDCLIB_unpackwint( wc ); - _PDCLIB_wcinfo_t *info = _PDCLIB_wcgetinfo( l, uwc ); - if( info ) - { - uwc += info->upper_delta; - } - return uwc; -} - -wint_t towupper( wint_t wc ) -{ - return _PDCLIB_towupper_l( wc, _PDCLIB_threadlocale() ); -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE(towupper(0) == 0); - TESTCASE(towupper(L'a') == L'A'); - TESTCASE(towupper(L'B') == L'B'); - TESTCASE(towupper(L'0') == L'0'); - - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/wctype/wctrans.c b/waterbox/libc/functions/wctype/wctrans.c deleted file mode 100644 index c15bde085c..0000000000 --- a/waterbox/libc/functions/wctype/wctrans.c +++ /dev/null @@ -1,38 +0,0 @@ -/* wctrans( const char * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#ifndef REGTEST -#include -#include "_PDCLIB_locale.h" - -wctrans_t wctrans( const char * property ) -{ - if(!property) { - return 0; - } else if(strcmp(property, "tolower") == 0) { - return _PDCLIB_WCTRANS_TOLOWER; - } else if(strcmp(property, "toupper") == 0) { - return _PDCLIB_WCTRANS_TOUPPER; - } else { - return 0; - } -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE(wctrans("") == 0); - TESTCASE(wctrans("invalid") == 0); - TESTCASE(wctrans("toupper") != 0); - TESTCASE(wctrans("tolower") != 0); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/functions/wctype/wctype.c b/waterbox/libc/functions/wctype/wctype.c deleted file mode 100644 index 3e8aa1f123..0000000000 --- a/waterbox/libc/functions/wctype/wctype.c +++ /dev/null @@ -1,110 +0,0 @@ -/* wctype( const char * ) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#ifndef REGTEST -#include -#include "_PDCLIB_locale.h" - -wctype_t wctype( const char * property ) -{ - if(property) switch(property[0]) - { - case 'a': - if(strcmp(property, "alpha") == 0) { - return _PDCLIB_CTYPE_ALPHA; - } else if(strcmp(property, "alnum") == 0) { - return _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_DIGIT; - } else return 0; - - case 'b': - if(strcmp(property, "blank") == 0) { - return _PDCLIB_CTYPE_BLANK; - } else return 0; - - case 'c': - if(strcmp(property, "cntrl") == 0) { - return _PDCLIB_CTYPE_CNTRL; - } else return 0; - - case 'd': - if(strcmp(property, "digit") == 0) { - return _PDCLIB_CTYPE_DIGIT; - } else return 0; - - case 'g': - if(strcmp(property, "graph") == 0) { - return _PDCLIB_CTYPE_GRAPH; - } else return 0; - - case 'l': - if(strcmp(property, "lower") == 0) { - return _PDCLIB_CTYPE_LOWER; - } else return 0; - - case 'p': - if(strcmp(property, "print") == 0) { - return _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_SPACE; - } else if(strcmp(property, "punct") == 0) { - return _PDCLIB_CTYPE_PUNCT; - } else return 0; - - case 's': - if(strcmp(property, "space") == 0) { - return _PDCLIB_CTYPE_SPACE; - } else return 0; - - case 'u': - if(strcmp(property, "upper") == 0) { - return _PDCLIB_CTYPE_UPPER; - } else return 0; - - case 'x': - if(strcmp(property, "xdigit") == 0) { - return _PDCLIB_CTYPE_XDIGT; - } else return 0; - } - return 0; -} - -#endif - -#ifdef TEST -#include "_PDCLIB_test.h" - -int main( void ) -{ - TESTCASE(wctype("") == 0); - TESTCASE_NOREG(wctype(NULL) == 0); // mingw libc crashes on this - - TESTCASE(wctype("alpha") != 0); - TESTCASE(wctype("alnum") != 0); - TESTCASE(wctype("blank") != 0); - TESTCASE(wctype("cntrl") != 0); - TESTCASE(wctype("digit") != 0); - TESTCASE(wctype("graph") != 0); - TESTCASE(wctype("lower") != 0); - TESTCASE(wctype("print") != 0); - TESTCASE(wctype("punct") != 0); - TESTCASE(wctype("space") != 0); - TESTCASE(wctype("upper") != 0); - TESTCASE(wctype("xdigit") != 0); - - TESTCASE_NOREG(wctype("alpha") == _PDCLIB_CTYPE_ALPHA); - TESTCASE_NOREG(wctype("alnum") == (_PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_DIGIT)); - TESTCASE_NOREG(wctype("blank") == _PDCLIB_CTYPE_BLANK); - TESTCASE_NOREG(wctype("cntrl") == _PDCLIB_CTYPE_CNTRL); - TESTCASE_NOREG(wctype("digit") == _PDCLIB_CTYPE_DIGIT); - TESTCASE_NOREG(wctype("graph") == _PDCLIB_CTYPE_GRAPH); - TESTCASE_NOREG(wctype("lower") == _PDCLIB_CTYPE_LOWER); - TESTCASE_NOREG(wctype("print") == (_PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_SPACE)); - TESTCASE_NOREG(wctype("punct") == _PDCLIB_CTYPE_PUNCT); - TESTCASE_NOREG(wctype("space") == _PDCLIB_CTYPE_SPACE); - TESTCASE_NOREG(wctype("upper") == _PDCLIB_CTYPE_UPPER); - TESTCASE_NOREG(wctype("xdigit") == _PDCLIB_CTYPE_XDIGT); - return TEST_RESULTS; -} -#endif diff --git a/waterbox/libc/includes/assert.h b/waterbox/libc/includes/assert.h deleted file mode 100644 index a1af59f6aa..0000000000 --- a/waterbox/libc/includes/assert.h +++ /dev/null @@ -1,74 +0,0 @@ -/* Diagnostics - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include "_PDCLIB_aux.h" -#include "_PDCLIB_config.h" - -/* - Defines a macro assert() that, depending on the value of the preprocessor - symbol NDEBUG, does - * evaluate to a void expression if NDEBUG is set OR the parameter expression - evaluates to true; - * print an error message and terminates the program if NDEBUG is not set AND - the parameter expression evaluates to false. - The error message contains the parameter expression, name of the source file - (__FILE__), line number (__LINE__), and (from C99 onward) name of the function - (__func__). - The header can be included MULTIPLE times, and redefines the macro depending - on the current setting of NDEBUG. -*/ - -#ifndef _PDCLIB_ASSERT_H -#define _PDCLIB_ASSERT_H _PDCLIB_ASSERT_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Functions _NOT_ tagged noreturn as this hampers debugging */ -void _PDCLIB_assert99( char const * const, char const * const, char const * const ); -void _PDCLIB_assert89( char const * const ); - -#ifdef __cplusplus -} -#endif - -#if _PDCLIB_C_VERSION >= 2011 -#define static_assert _Static_assert -#else -#define static_assert( e, m ) -#endif - -#endif - -/* If NDEBUG is set, assert() is a null operation. */ -#undef assert - -#ifdef NDEBUG -#define assert( ignore ) ( (void) 0 ) -#elif _PDCLIB_C_MIN(99) -#define assert(expression) \ - do { if(!(expression)) { \ - _PDCLIB_assert99("Assertion failed: " _PDCLIB_symbol2string(expression)\ - ", function ", __func__, \ - ", file " __FILE__ \ - ", line " _PDCLIB_symbol2string( __LINE__ ) \ - "." _PDCLIB_endl ); \ - _PDCLIB_UNREACHABLE; \ - } \ - } while(0) - -#else -#define assert(expression) \ - do { if(!(expression)) { \ - _PDCLIB_assert89("Assertion failed: " _PDCLIB_symbol2string(expression)\ - ", file " __FILE__ \ - ", line " _PDCLIB_symbol2string( __LINE__ ) \ - "." _PDCLIB_endl ); \ - _PDCLIB_UNREACHABLE; \ - } \ - } while(0) -#endif diff --git a/waterbox/libc/includes/bits/alltypes.h b/waterbox/libc/includes/bits/alltypes.h deleted file mode 100644 index b918fdefd9..0000000000 --- a/waterbox/libc/includes/bits/alltypes.h +++ /dev/null @@ -1,5 +0,0 @@ -#ifndef _ALLTYPES_H -#define _ALLTYPES_H -typedef double double_t; -typedef float float_t; -#endif diff --git a/waterbox/libc/includes/bits/endian.h b/waterbox/libc/includes/bits/endian.h deleted file mode 100644 index 172c338f50..0000000000 --- a/waterbox/libc/includes/bits/endian.h +++ /dev/null @@ -1 +0,0 @@ -#define __BYTE_ORDER __LITTLE_ENDIAN diff --git a/waterbox/libc/includes/bits/fenv.h b/waterbox/libc/includes/bits/fenv.h deleted file mode 100644 index 24df0417f2..0000000000 --- a/waterbox/libc/includes/bits/fenv.h +++ /dev/null @@ -1,34 +0,0 @@ -#define FE_INVALID 1 -#define __FE_DENORM 2 -#define FE_DIVBYZERO 4 -#define FE_OVERFLOW 8 -#define FE_UNDERFLOW 16 -#define FE_INEXACT 32 - -#define FE_ALL_EXCEPT 63 - -#define FE_TONEAREST 0 -#define FE_DOWNWARD 0x400 -#define FE_UPWARD 0x800 -#define FE_TOWARDZERO 0xc00 - -typedef unsigned short fexcept_t; - -typedef struct { - unsigned short __control_word; - unsigned short __unused1; - unsigned short __status_word; - unsigned short __unused2; - unsigned short __tags; - unsigned short __unused3; - unsigned int __eip; - unsigned short __cs_selector; - unsigned int __opcode:11; - unsigned int __unused4:5; - unsigned int __data_offset; - unsigned short __data_selector; - unsigned short __unused5; - unsigned int __mxcsr; -} fenv_t; - -#define FE_DFL_ENV ((const fenv_t *) -1) diff --git a/waterbox/libc/includes/complex.h b/waterbox/libc/includes/complex.h deleted file mode 100644 index 008b3c7e3b..0000000000 --- a/waterbox/libc/includes/complex.h +++ /dev/null @@ -1,133 +0,0 @@ -#ifndef _COMPLEX_H -#define _COMPLEX_H - -#ifdef __cplusplus -extern "C" { -#endif - -#define complex _Complex -#ifdef __GNUC__ -#define _Complex_I (__extension__ (0.0f+1.0fi)) -#else -#define _Complex_I (0.0f+1.0fi) -#endif -#define I _Complex_I - -double complex cacos(double complex); -float complex cacosf(float complex); -long double complex cacosl(long double complex); - -double complex casin(double complex); -float complex casinf(float complex); -long double complex casinl(long double complex); - -double complex catan(double complex); -float complex catanf(float complex); -long double complex catanl(long double complex); - -double complex ccos(double complex); -float complex ccosf(float complex); -long double complex ccosl(long double complex); - -double complex csin(double complex); -float complex csinf(float complex); -long double complex csinl(long double complex); - -double complex ctan(double complex); -float complex ctanf(float complex); -long double complex ctanl(long double complex); - -double complex cacosh(double complex); -float complex cacoshf(float complex); -long double complex cacoshl(long double complex); - -double complex casinh(double complex); -float complex casinhf(float complex); -long double complex casinhl(long double complex); - -double complex catanh(double complex); -float complex catanhf(float complex); -long double complex catanhl(long double complex); - -double complex ccosh(double complex); -float complex ccoshf(float complex); -long double complex ccoshl(long double complex); - -double complex csinh(double complex); -float complex csinhf(float complex); -long double complex csinhl(long double complex); - -double complex ctanh(double complex); -float complex ctanhf(float complex); -long double complex ctanhl(long double complex); - -double complex cexp(double complex); -float complex cexpf(float complex); -long double complex cexpl(long double complex); - -double complex clog(double complex); -float complex clogf(float complex); -long double complex clogl(long double complex); - -double cabs(double complex); -float cabsf(float complex); -long double cabsl(long double complex); - -double complex cpow(double complex, double complex); -float complex cpowf(float complex, float complex); -long double complex cpowl(long double complex, long double complex); - -double complex csqrt(double complex); -float complex csqrtf(float complex); -long double complex csqrtl(long double complex); - -double carg(double complex); -float cargf(float complex); -long double cargl(long double complex); - -double cimag(double complex); -float cimagf(float complex); -long double cimagl(long double complex); - -double complex conj(double complex); -float complex conjf(float complex); -long double complex conjl(long double complex); - -double complex cproj(double complex); -float complex cprojf(float complex); -long double complex cprojl(long double complex); - -double creal(double complex); -float crealf(float complex); -long double creall(long double complex); - -#ifndef __cplusplus -#define __CIMAG(x, t) \ - (+(union { _Complex t __z; t __xy[2]; }){(_Complex t)(x)}.__xy[1]) - -#define creal(x) ((double)(x)) -#define crealf(x) ((float)(x)) -#define creall(x) ((long double)(x)) - -#define cimag(x) __CIMAG(x, double) -#define cimagf(x) __CIMAG(x, float) -#define cimagl(x) __CIMAG(x, long double) -#endif - -#if __STDC_VERSION__ >= 201112L -#if defined(_Imaginary_I) -#define __CMPLX(x, y, t) ((t)(x) + _Imaginary_I*(t)(y)) -#elif defined(__clang__) -#define __CMPLX(x, y, t) (+(_Complex t){ (t)(x), (t)(y) }) -#else -#define __CMPLX(x, y, t) (__builtin_complex((t)(x), (t)(y))) -#endif -#define CMPLX(x, y) __CMPLX(x, y, double) -#define CMPLXF(x, y) __CMPLX(x, y, float) -#define CMPLXL(x, y) __CMPLX(x, y, long double) -#endif - -#ifdef __cplusplus -} -#endif -#endif diff --git a/waterbox/libc/includes/ctype.h b/waterbox/libc/includes/ctype.h deleted file mode 100644 index 57fb451fa4..0000000000 --- a/waterbox/libc/includes/ctype.h +++ /dev/null @@ -1,103 +0,0 @@ -/* Character handling - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#ifndef _PDCLIB_CTYPE_H -#define _PDCLIB_CTYPE_H _PDCLIB_CTYPE_H -#include "_PDCLIB_int.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Character classification functions */ - -/* Note that there is a difference between "whitespace" (any printing, non- - graph character, like horizontal and vertical tab), and "blank" (the literal - ' ' space character). - - There will be masking macros for each of these later on, but right now I - focus on the functions only. -*/ - -/* Returns isalpha( c ) || isdigit( c ) */ -int isalnum( int c ) _PDCLIB_nothrow; - -/* Returns isupper( c ) || islower( c ) in the "C" locale. - In any other locale, also returns true for a locale-specific set of - alphabetic characters which are neither control characters, digits, - punctation, or whitespace. -*/ -int isalpha( int c ) _PDCLIB_nothrow; - -/* Returns true if the character isspace() and used for seperating words within - a line of text. In the "C" locale, only ' ' and '\t' are considered blanks. -*/ -int isblank( int c ) _PDCLIB_nothrow; - -/* Returns true if the character is a control character. */ -int iscntrl( int c ) _PDCLIB_nothrow; - -/* Returns true if the character is a decimal digit. Locale-independent. */ -int isdigit( int c ) _PDCLIB_nothrow; - -/* Returns true for every printing character except space (' '). */ -int isgraph( int c ) _PDCLIB_nothrow; - -/* Returns true for lowercase letters in the "C" locale. - In any other locale, also returns true for a locale-specific set of - characters which are neither control characters, digits, punctation, or - space (' '). In a locale other than the "C" locale, a character might test - true for both islower() and isupper(). -*/ -int islower( int c ) _PDCLIB_nothrow; - -/* Returns true for every printing character including space (' '). */ -int isprint( int c ) _PDCLIB_nothrow; - -/* Returns true for every printing character that is neither whitespace - nor alphanumeric in the "C" locale. In any other locale, there might be - characters that are printing characters, but neither whitespace nor - alphanumeric. -*/ -int ispunct( int c ) _PDCLIB_nothrow; - -/* Returns true for every standard whitespace character (' ', '\f', '\n', '\r', - '\t', '\v') in the "C" locale. In any other locale, also returns true for a - locale-specific set of characters for which isalnum() is false. -*/ -int isspace( int c ) _PDCLIB_nothrow; - -/* Returns true for uppercase letters in the "C" locale. - In any other locale, also returns true for a locale-specific set of - characters which are neither control characters, digits, punctation, or - space (' '). In a locale other than the "C" locale, a character might test - true for both islower() and isupper(). -*/ -int isupper( int c ) _PDCLIB_nothrow; - -/* Returns true for any hexadecimal-digit character. Locale-independent. */ -int isxdigit( int c ) _PDCLIB_nothrow; - -/* Character case mapping functions */ - -/* Converts an uppercase letter to a corresponding lowercase letter. Input that - is not an uppercase letter remains unchanged. -*/ -int tolower( int c ) _PDCLIB_nothrow; - -/* Converts a lowercase letter to a corresponding uppercase letter. Input that - is not a lowercase letter remains unchanged. -*/ -int toupper( int c ) _PDCLIB_nothrow; - -/* returns true for c in [0, 127] */ -int isascii(int c) _PDCLIB_nothrow; - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/waterbox/libc/includes/endian.h b/waterbox/libc/includes/endian.h deleted file mode 100644 index 1bd444518a..0000000000 --- a/waterbox/libc/includes/endian.h +++ /dev/null @@ -1,82 +0,0 @@ -#ifndef _ENDIAN_H -#define _ENDIAN_H - -#include - -#define __LITTLE_ENDIAN 1234 -#define __BIG_ENDIAN 4321 -#define __PDP_ENDIAN 3412 - -#if defined(__GNUC__) && defined(__BYTE_ORDER__) -#define __BYTE_ORDER __BYTE_ORDER__ -#else -#include -#endif - -#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) - -#define BIG_ENDIAN __BIG_ENDIAN -#define LITTLE_ENDIAN __LITTLE_ENDIAN -#define PDP_ENDIAN __PDP_ENDIAN -#define BYTE_ORDER __BYTE_ORDER - -#include - -static __inline uint16_t __bswap16(uint16_t __x) -{ - return __x<<8 | __x>>8; -} - -static __inline uint32_t __bswap32(uint32_t __x) -{ - return __x>>24 | __x>>8&0xff00 | __x<<8&0xff0000 | __x<<24; -} - -static __inline uint64_t __bswap64(uint64_t __x) -{ - return __bswap32(__x)+0ULL<<32 | __bswap32(__x>>32); -} - -#if __BYTE_ORDER == __LITTLE_ENDIAN -#define htobe16(x) __bswap16(x) -#define be16toh(x) __bswap16(x) -#define betoh16(x) __bswap16(x) -#define htobe32(x) __bswap32(x) -#define be32toh(x) __bswap32(x) -#define betoh32(x) __bswap32(x) -#define htobe64(x) __bswap64(x) -#define be64toh(x) __bswap64(x) -#define betoh64(x) __bswap64(x) -#define htole16(x) (uint16_t)(x) -#define le16toh(x) (uint16_t)(x) -#define letoh16(x) (uint16_t)(x) -#define htole32(x) (uint32_t)(x) -#define le32toh(x) (uint32_t)(x) -#define letoh32(x) (uint32_t)(x) -#define htole64(x) (uint64_t)(x) -#define le64toh(x) (uint64_t)(x) -#define letoh64(x) (uint64_t)(x) -#else -#define htobe16(x) (uint16_t)(x) -#define be16toh(x) (uint16_t)(x) -#define betoh16(x) (uint16_t)(x) -#define htobe32(x) (uint32_t)(x) -#define be32toh(x) (uint32_t)(x) -#define betoh32(x) (uint32_t)(x) -#define htobe64(x) (uint64_t)(x) -#define be64toh(x) (uint64_t)(x) -#define betoh64(x) (uint64_t)(x) -#define htole16(x) __bswap16(x) -#define le16toh(x) __bswap16(x) -#define letoh16(x) __bswap16(x) -#define htole32(x) __bswap32(x) -#define le32toh(x) __bswap32(x) -#define letoh32(x) __bswap32(x) -#define htole64(x) __bswap64(x) -#define le64toh(x) __bswap64(x) -#define letoh64(x) __bswap64(x) -#endif - -#endif - -#endif diff --git a/waterbox/libc/includes/errno.h b/waterbox/libc/includes/errno.h deleted file mode 100644 index 1e712136b7..0000000000 --- a/waterbox/libc/includes/errno.h +++ /dev/null @@ -1,105 +0,0 @@ -/* Errors - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#ifndef _PDCLIB_ERRNO_H -#define _PDCLIB_ERRNO_H _PDCLIB_ERRNO_H - -#include "_PDCLIB_int.h" - -#ifdef __cplusplus -extern "C" { -#endif - -extern int * _PDCLIB_errno_func( void ); -#define errno (*_PDCLIB_errno_func()) - -/* C only requires the following three */ -#define ERANGE _PDCLIB_ERANGE -#define EDOM _PDCLIB_EDOM -#define EILSEQ _PDCLIB_EILSEQ - -/* C++11 additionally requires the following (taken from POSIX) */ -#define E2BIG _PDCLIB_E2BIG -#define EACCES _PDCLIB_EACCES -#define EADDRINUSE _PDCLIB_EADDRINUSE -#define EADDRNOTAVAIL _PDCLIB_EADDRNOTAVAIL -#define EAFNOSUPPORT _PDCLIB_EAFNOSUPPORT -#define EAGAIN _PDCLIB_EAGAIN -#define EALREADY _PDCLIB_EALREADY -#define EBADF _PDCLIB_EBADF -#define EBADMSG _PDCLIB_EBADMSG -#define EBUSY _PDCLIB_EBUSY -#define ECANCELED _PDCLIB_ECANCELED -#define ECHILD _PDCLIB_ECHILD -#define ECONNABORTED _PDCLIB_ECONNABORTED -#define ECONNREFUSED _PDCLIB_ECONNREFUSED -#define ECONNRESET _PDCLIB_ECONNRESET -#define EDEADLK _PDCLIB_EDEADLK -#define EDESTADDRREQ _PDCLIB_EDESTADDRREQ -#define EEXIST _PDCLIB_EEXIST -#define EFAULT _PDCLIB_EFAULT -#define EFBIG _PDCLIB_EFBIG -#define EHOSTUNREACH _PDCLIB_EHOSTUNREACH -#define EIDRM _PDCLIB_EIDRM -#define EINPROGRESS _PDCLIB_EINPROGRESS -#define EINTR _PDCLIB_EINTR -#define EINVAL _PDCLIB_EINVAL -#define EIO _PDCLIB_EIO -#define EISCONN _PDCLIB_EISCONN -#define EISDIR _PDCLIB_EISDIR -#define ELOOP _PDCLIB_ELOOP -#define EMFILE _PDCLIB_EMFILE -#define EMLINK _PDCLIB_EMLINK -#define EMSGSIZE _PDCLIB_EMSGSIZE -#define ENAMETOOLONG _PDCLIB_ENAMETOOLONG -#define ENETDOWN _PDCLIB_ENETDOWN -#define ENETRESET _PDCLIB_ENETRESET -#define ENETUNREACH _PDCLIB_ENETUNREACH -#define ENFILE _PDCLIB_ENFILE -#define ENOBUFS _PDCLIB_ENOBUFS -#define ENODATA _PDCLIB_ENODATA -#define ENODEV _PDCLIB_ENODEV -#define ENOENT _PDCLIB_ENOENT -#define ENOEXEC _PDCLIB_ENOEXEC -#define ENOLCK _PDCLIB_ENOLCK -#define ENOLINK _PDCLIB_ENOLINK -#define ENOMEM _PDCLIB_ENOMEM -#define ENOMSG _PDCLIB_ENOMSG -#define ENOPROTOOPT _PDCLIB_ENOPROTOOPT -#define ENOSPC _PDCLIB_ENOSPC -#define ENOSR _PDCLIB_ENOSR -#define ENOSTR _PDCLIB_ENOSTR -#define ENOSYS _PDCLIB_ENOSYS -#define ENOTCONN _PDCLIB_ENOTCONN -#define ENOTDIR _PDCLIB_ENOTDIR -#define ENOTEMPTY _PDCLIB_ENOTEMPTY -#define ENOTRECOVERABLE _PDCLIB_ENOTRECOVERABLE -#define ENOTSOCK _PDCLIB_ENOTSOCK -#define ENOTSUP _PDCLIB_ENOTSUP -#define ENOTTY _PDCLIB_ENOTTY -#define ENXIO _PDCLIB_ENXIO -#define EOPNOTSUPP _PDCLIB_EOPNOTSUPP -#define EOVERFLOW _PDCLIB_EOVERFLOW -#define EOWNERDEAD _PDCLIB_EOWNERDEAD -#define EPERM _PDCLIB_EPERM -#define EPIPE _PDCLIB_EPIPE -#define EPROTO _PDCLIB_EPROTO -#define EPROTONOSUPPORT _PDCLIB_EPROTONOSUPPORT -#define EPROTOTYPE _PDCLIB_EPROTOTYPE -#define EROFS _PDCLIB_EROFS -#define ESPIPE _PDCLIB_ESPIPE -#define ESRCH _PDCLIB_ESRCH -#define ETIME _PDCLIB_ETIME -#define ETIMEDOUT _PDCLIB_ETIMEDOUT -#define ETXTBSY _PDCLIB_ETXTBSY -#define EWOULDBLOCK _PDCLIB_EWOULDBLOCK -#define EXDEV _PDCLIB_EXDEV - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/waterbox/libc/includes/features.h b/waterbox/libc/includes/features.h deleted file mode 100644 index 3cc3e57933..0000000000 --- a/waterbox/libc/includes/features.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef _FEATURES_H -#define _FEATURES_H - -#if defined(_ALL_SOURCE) && !defined(_GNU_SOURCE) -#define _GNU_SOURCE 1 -#endif - -#if defined(_DEFAULT_SOURCE) && !defined(_BSD_SOURCE) -#define _BSD_SOURCE 1 -#endif - -#if !defined(_POSIX_SOURCE) && !defined(_POSIX_C_SOURCE) \ - && !defined(_XOPEN_SOURCE) && !defined(_GNU_SOURCE) \ - && !defined(_BSD_SOURCE) && !defined(__STRICT_ANSI__) -#define _BSD_SOURCE 1 -#define _XOPEN_SOURCE 700 -#endif - -#if __STDC_VERSION__ >= 199901L -#define __restrict restrict -#elif !defined(__GNUC__) -#define __restrict -#endif - -#if __STDC_VERSION__ >= 199901L || defined(__cplusplus) -#define __inline inline -#endif - -#if __STDC_VERSION__ >= 201112L -#elif defined(__GNUC__) -#define _Noreturn __attribute__((__noreturn__)) -#else -#define _Noreturn -#endif - -#endif diff --git a/waterbox/libc/includes/fenv.h b/waterbox/libc/includes/fenv.h deleted file mode 100644 index 05de990c0b..0000000000 --- a/waterbox/libc/includes/fenv.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef _FENV_H -#define _FENV_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -int feclearexcept(int); -int fegetexceptflag(fexcept_t *, int); -int feraiseexcept(int); -int fesetexceptflag(const fexcept_t *, int); -int fetestexcept(int); - -int fegetround(void); -int fesetround(int); - -int fegetenv(fenv_t *); -int feholdexcept(fenv_t *); -int fesetenv(const fenv_t *); -int feupdateenv(const fenv_t *); - -#ifdef __cplusplus -} -#endif -#endif - diff --git a/waterbox/libc/includes/float.h b/waterbox/libc/includes/float.h deleted file mode 100644 index 1d6f89dc3b..0000000000 --- a/waterbox/libc/includes/float.h +++ /dev/null @@ -1,101 +0,0 @@ -/* Characteristics of floating types - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#ifndef _PDCLIB_FLOAT_H -#define _PDCLIB_FLOAT_H _PDCLIB_FLOAT_H -#include "_PDCLIB_float.h" - -#define FLT_ROUNDS _PDCLIB_FLT_ROUNDS -#define FLT_EVAL_METHOD _PDCLIB_FLT_EVAL_METHOD -#define DECIMAL_DIG _PDCLIB_DECIMAL_DIG - -/* Radix of exponent representation */ -#define FLT_RADIX _PDCLIB_FLT_RADIX - -/* Number of base-FLT_RADIX digits in the significand of a float */ -#define FLT_MANT_DIG _PDCLIB_FLT_MANT_DIG - -/* Number of decimal digits of precision in a float */ -#define FLT_DIG _PDCLIB_FLT_DIG - -/* Difference between 1.0 and the minimum float greater than 1.0 */ -#define FLT_EPSILON _PDCLIB_FLT_EPSILON - -/* Minimum int x such that FLT_RADIX**(x-1) is a normalised float */ -#define FLT_MIN_EXP _PDCLIB_FLT_MIN_EXP - -/* Minimum normalised float */ -#define FLT_MIN _PDCLIB_FLT_MIN - -/* Minimum int x such that 10**x is a normalised float */ -#define FLT_MIN_10_EXP _PDCLIB_FLT_MIN_10_EXP - -/* Maximum int x such that FLT_RADIX**(x-1) is a representable float */ -#define FLT_MAX_EXP _PDCLIB_FLT_MAX_EXP - -/* Maximum float */ -#define FLT_MAX _PDCLIB_FLT_MAX - -/* Maximum int x such that 10**x is a representable float */ -#define FLT_MAX_10_EXP _PDCLIB_FLT_MAX_10_EXP - - -/* Number of base-FLT_RADIX digits in the significand of a double */ -#define DBL_MANT_DIG _PDCLIB_DBL_MANT_DIG - -/* Number of decimal digits of precision in a double */ -#define DBL_DIG _PDCLIB_DBL_DIG - -/* Difference between 1.0 and the minimum double greater than 1.0 */ -#define DBL_EPSILON _PDCLIB_DBL_EPSILON - -/* Minimum int x such that FLT_RADIX**(x-1) is a normalised double */ -#define DBL_MIN_EXP _PDCLIB_DBL_MIN_EXP - -/* Minimum normalised double */ -#define DBL_MIN _PDCLIB_DBL_MIN - -/* Minimum int x such that 10**x is a normalised double */ -#define DBL_MIN_10_EXP _PDCLIB_DBL_MIN_10_EXP - -/* Maximum int x such that FLT_RADIX**(x-1) is a representable double */ -#define DBL_MAX_EXP _PDCLIB_DBL_MAX_EXP - -/* Maximum double */ -#define DBL_MAX _PDCLIB_DBL_MAX - -/* Maximum int x such that 10**x is a representable double */ -#define DBL_MAX_10_EXP _PDCLIB_DBL_MAX_10_EXP - - -/* Number of base-FLT_RADIX digits in the significand of a long double */ -#define LDBL_MANT_DIG _PDCLIB_LDBL_MANT_DIG - -/* Number of decimal digits of precision in a long double */ -#define LDBL_DIG _PDCLIB_LDBL_DIG - -/* Difference between 1.0 and the minimum long double greater than 1.0 */ -#define LDBL_EPSILON _PDCLIB_LDBL_EPSILON - -/* Minimum int x such that FLT_RADIX**(x-1) is a normalised long double */ -#define LDBL_MIN_EXP _PDCLIB_LDBL_MIN_EXP - -/* Minimum normalised long double */ -#define LDBL_MIN _PDCLIB_LDBL_MIN - -/* Minimum int x such that 10**x is a normalised long double */ -#define LDBL_MIN_10_EXP _PDCLIB_LDBL_MIN_10_EXP - -/* Maximum int x such that FLT_RADIX**(x-1) is a representable long double */ -#define LDBL_MAX_EXP _PDCLIB_LDBL_MAX_EXP - -/* Maximum long double */ -#define LDBL_MAX _PDCLIB_LDBL_MAX - -/* Maximum int x such that 10**x is a representable long double */ -#define LDBL_MAX_10_EXP _PDCLIB_LDBL_MAX_10_EXP - -#endif diff --git a/waterbox/libc/includes/inttypes.h b/waterbox/libc/includes/inttypes.h deleted file mode 100644 index f13db1bf8d..0000000000 --- a/waterbox/libc/includes/inttypes.h +++ /dev/null @@ -1,268 +0,0 @@ -/* Format conversion of integer types - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#ifndef _PDCLIB_INTTYPES_H -#define _PDCLIB_INTTYPES_H _PDCLIB_INTTYPES_H -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* This structure has a member quot and a member rem, of type intmax_t. - The order of the members is platform-defined to allow the imaxdiv() - function below to be implemented efficiently. -*/ -typedef struct _PDCLIB_imaxdiv_t imaxdiv_t; - -#define PRId8 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_8_CONV, d ) ) -#define PRId16 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_16_CONV, d ) ) -#define PRId32 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_32_CONV, d ) ) -#define PRId64 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_64_CONV, d ) ) - -#define PRIdLEAST8 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_8_CONV, d ) ) -#define PRIdLEAST16 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_16_CONV, d ) ) -#define PRIdLEAST32 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_32_CONV, d ) ) -#define PRIdLEAST64 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_64_CONV, d ) ) - -#define PRIdFAST8 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_FAST8_CONV, d ) ) -#define PRIdFAST16 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_FAST16_CONV, d ) ) -#define PRIdFAST32 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_FAST32_CONV, d ) ) -#define PRIdFAST64 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_FAST64_CONV, d ) ) - -#define PRIdMAX _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_MAX_CONV, d ) ) -#define PRIdPTR _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_PTR_CONV, d ) ) - -#define PRIi8 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_8_CONV, i ) ) -#define PRIi16 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_16_CONV, i ) ) -#define PRIi32 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_32_CONV, i ) ) -#define PRIi64 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_64_CONV, i ) ) - -#define PRIiLEAST8 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_8_CONV, i ) ) -#define PRIiLEAST16 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_16_CONV, i ) ) -#define PRIiLEAST32 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_32_CONV, i ) ) -#define PRIiLEAST64 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_64_CONV, i ) ) - -#define PRIiFAST8 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_FAST8_CONV, i ) ) -#define PRIiFAST16 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_FAST16_CONV, i ) ) -#define PRIiFAST32 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_FAST32_CONV, i ) ) -#define PRIiFAST64 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_FAST64_CONV, i ) ) - -#define PRIiMAX _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_MAX_CONV, i ) ) -#define PRIiPTR _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_PTR_CONV, i ) ) - -#define PRIo8 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_8_CONV, o ) ) -#define PRIo16 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_16_CONV, o ) ) -#define PRIo32 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_32_CONV, o ) ) -#define PRIo64 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_64_CONV, o ) ) - -#define PRIoLEAST8 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_8_CONV, o ) ) -#define PRIoLEAST16 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_16_CONV, o ) ) -#define PRIoLEAST32 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_32_CONV, o ) ) -#define PRIoLEAST64 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_64_CONV, o ) ) - -#define PRIoFAST8 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_FAST8_CONV, o ) ) -#define PRIoFAST16 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_FAST16_CONV, o ) ) -#define PRIoFAST32 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_FAST32_CONV, o ) ) -#define PRIoFAST64 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_FAST64_CONV, o ) ) - -#define PRIoMAX _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_MAX_CONV, o ) ) -#define PRIoPTR _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_PTR_CONV, o ) ) - -#define PRIu8 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_8_CONV, u ) ) -#define PRIu16 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_16_CONV, u ) ) -#define PRIu32 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_32_CONV, u ) ) -#define PRIu64 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_64_CONV, u ) ) - -#define PRIuLEAST8 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_8_CONV, u ) ) -#define PRIuLEAST16 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_16_CONV, u ) ) -#define PRIuLEAST32 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_32_CONV, u ) ) -#define PRIuLEAST64 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_64_CONV, u ) ) - -#define PRIuFAST8 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_FAST8_CONV, u ) ) -#define PRIuFAST16 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_FAST16_CONV, u ) ) -#define PRIuFAST32 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_FAST32_CONV, u ) ) -#define PRIuFAST64 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_FAST64_CONV, u ) ) - -#define PRIuMAX _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_MAX_CONV, u ) ) -#define PRIuPTR _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_PTR_CONV, u ) ) - -#define PRIx8 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_8_CONV, x ) ) -#define PRIx16 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_16_CONV, x ) ) -#define PRIx32 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_32_CONV, x ) ) -#define PRIx64 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_64_CONV, x ) ) - -#define PRIxLEAST8 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_8_CONV, x ) ) -#define PRIxLEAST16 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_16_CONV, x ) ) -#define PRIxLEAST32 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_32_CONV, x ) ) -#define PRIxLEAST64 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_64_CONV, x ) ) - -#define PRIxFAST8 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_FAST8_CONV, x ) ) -#define PRIxFAST16 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_FAST16_CONV, x ) ) -#define PRIxFAST32 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_FAST32_CONV, x ) ) -#define PRIxFAST64 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_FAST64_CONV, x ) ) - -#define PRIxMAX _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_MAX_CONV, x ) ) -#define PRIxPTR _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_PTR_CONV, x ) ) - -#define PRIX8 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_8_CONV, X ) ) -#define PRIX16 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_16_CONV, X ) ) -#define PRIX32 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_32_CONV, X ) ) -#define PRIX64 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_64_CONV, X ) ) - -#define PRIXLEAST8 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_8_CONV, X ) ) -#define PRIXLEAST16 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_16_CONV, X ) ) -#define PRIXLEAST32 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_32_CONV, X ) ) -#define PRIXLEAST64 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_64_CONV, X ) ) - -#define PRIXFAST8 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_FAST8_CONV, X ) ) -#define PRIXFAST16 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_FAST16_CONV, X ) ) -#define PRIXFAST32 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_FAST32_CONV, X ) ) -#define PRIXFAST64 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_FAST64_CONV, X ) ) - -#define PRIXMAX _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_MAX_CONV, X ) ) -#define PRIXPTR _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_PTR_CONV, X ) ) - -#define SCNd8 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_8_CONV, d ) ) -#define SCNd16 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_16_CONV, d ) ) -#define SCNd32 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_32_CONV, d ) ) -#define SCNd64 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_64_CONV, d ) ) - -#define SCNdLEAST8 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_8_CONV, d ) ) -#define SCNdLEAST16 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_16_CONV, d ) ) -#define SCNdLEAST32 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_32_CONV, d ) ) -#define SCNdLEAST64 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_64_CONV, d ) ) - -#define SCNdFAST8 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_FAST8_CONV, d ) ) -#define SCNdFAST16 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_FAST16_CONV, d ) ) -#define SCNdFAST32 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_FAST32_CONV, d ) ) -#define SCNdFAST64 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_FAST64_CONV, d ) ) - -#define SCNdMAX _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_MAX_CONV, d ) ) -#define SCNdPTR _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_PTR_CONV, d ) ) - -#define SCNi8 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_8_CONV, i ) ) -#define SCNi16 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_16_CONV, i ) ) -#define SCNi32 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_32_CONV, i ) ) -#define SCNi64 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_64_CONV, i ) ) - -#define SCNiLEAST8 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_8_CONV, i ) ) -#define SCNiLEAST16 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_16_CONV, i ) ) -#define SCNiLEAST32 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_32_CONV, i ) ) -#define SCNiLEAST64 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_64_CONV, i ) ) - -#define SCNiFAST8 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_FAST8_CONV, i ) ) -#define SCNiFAST16 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_FAST16_CONV, i ) ) -#define SCNiFAST32 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_FAST32_CONV, i ) ) -#define SCNiFAST64 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_FAST64_CONV, i ) ) - -#define SCNiMAX _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_MAX_CONV, i ) ) -#define SCNiPTR _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_PTR_CONV, i ) ) - -#define SCNo8 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_8_CONV, o ) ) -#define SCNo16 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_16_CONV, o ) ) -#define SCNo32 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_32_CONV, o ) ) -#define SCNo64 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_64_CONV, o ) ) - -#define SCNoLEAST8 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_8_CONV, o ) ) -#define SCNoLEAST16 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_16_CONV, o ) ) -#define SCNoLEAST32 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_32_CONV, o ) ) -#define SCNoLEAST64 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_64_CONV, o ) ) - -#define SCNoFAST8 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_FAST8_CONV, o ) ) -#define SCNoFAST16 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_FAST16_CONV, o ) ) -#define SCNoFAST32 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_FAST32_CONV, o ) ) -#define SCNoFAST64 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_FAST64_CONV, o ) ) - -#define SCNoMAX _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_MAX_CONV, o ) ) -#define SCNoPTR _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_PTR_CONV, o ) ) - -#define SCNu8 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_8_CONV, u ) ) -#define SCNu16 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_16_CONV, u ) ) -#define SCNu32 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_32_CONV, u ) ) -#define SCNu64 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_64_CONV, u ) ) - -#define SCNuLEAST8 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_8_CONV, u ) ) -#define SCNuLEAST16 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_16_CONV, u ) ) -#define SCNuLEAST32 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_32_CONV, u ) ) -#define SCNuLEAST64 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_64_CONV, u ) ) - -#define SCNuFAST8 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_FAST8_CONV, u ) ) -#define SCNuFAST16 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_FAST16_CONV, u ) ) -#define SCNuFAST32 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_FAST32_CONV, u ) ) -#define SCNuFAST64 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_FAST64_CONV, u ) ) - -#define SCNuMAX _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_MAX_CONV, u ) ) -#define SCNuPTR _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_PTR_CONV, u ) ) - -#define SCNx8 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_8_CONV, x ) ) -#define SCNx16 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_16_CONV, x ) ) -#define SCNx32 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_32_CONV, x ) ) -#define SCNx64 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_64_CONV, x ) ) - -#define SCNxLEAST8 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_8_CONV, x ) ) -#define SCNxLEAST16 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_16_CONV, x ) ) -#define SCNxLEAST32 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_32_CONV, x ) ) -#define SCNxLEAST64 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_64_CONV, x ) ) - -#define SCNxFAST8 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_FAST8_CONV, x ) ) -#define SCNxFAST16 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_FAST16_CONV, x ) ) -#define SCNxFAST32 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_FAST32_CONV, x ) ) -#define SCNxFAST64 _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_FAST64_CONV, x ) ) - -#define SCNxMAX _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_MAX_CONV, x ) ) -#define SCNxPTR _PDCLIB_symbol2string( _PDCLIB_concat( _PDCLIB_PTR_CONV, x ) ) - -/* Functions for greatest-width integer types */ - -/* Calculate the absolute value of j */ -intmax_t imaxabs( intmax_t j ) _PDCLIB_nothrow; - -/* Return quotient (quot) and remainder (rem) of an integer division in the - imaxdiv_t struct. -*/ -imaxdiv_t imaxdiv( intmax_t numer, intmax_t denom ) _PDCLIB_nothrow; - -/* Seperate the character array nptr into three parts: A (possibly empty) - sequence of whitespace characters, a character representation of an integer - to the given base, and trailing invalid characters (including the terminating - null character). If base is 0, assume it to be 10, unless the integer - representation starts with 0x / 0X (setting base to 16) or 0 (setting base to - 8). If given, base can be anything from 0 to 36, using the 26 letters of the - base alphabet (both lowercase and uppercase) as digits 10 through 35. - The integer representation is then converted into the return type of the - function. It can start with a '+' or '-' sign. If the sign is '-', the result - of the conversion is negated. - If the conversion is successful, the converted value is returned. If endptr - is not a NULL pointer, a pointer to the first trailing invalid character is - returned in *endptr. - If no conversion could be performed, zero is returned (and nptr in *endptr, - if endptr is not a NULL pointer). If the converted value does not fit into - the return type, the functions return INTMAX_MIN, INTMAX_MAX, or UINTMAX_MAX, - respectively, depending on the sign of the integer representation and the - return type, and errno is set to ERANGE. -*/ - -/* These functions are equivalent to strtol() / strtoul() in , but on - the potentially larger type. -*/ -intmax_t strtoimax( const char * _PDCLIB_restrict nptr, char * * _PDCLIB_restrict endptr, int base ) _PDCLIB_nothrow; -uintmax_t strtoumax( const char * _PDCLIB_restrict nptr, char * * _PDCLIB_restrict endptr, int base ) _PDCLIB_nothrow; - -/* These functions are equivalent to wcstol() / wcstoul() in , but on - the potentially larger type. -*/ -/* TODO: Not _PDCLIB_nothrow? */ -/* -intmax_t wcstoimax( const _PDCLIB_wchar_t * _PDCLIB_restrict nptr, _PDCLIB_wchar_t * * _PDCLIB_restrict endptr, int base ); -uintmax_t wcstoumax( const _PDCLIB_wchar_t * _PDCLIB_restrict nptr, _PDCLIB_wchar_t * * _PDCLIB_restrict endptr, int base ); -*/ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/waterbox/libc/includes/iso646.h b/waterbox/libc/includes/iso646.h deleted file mode 100644 index 3ad9f5ce48..0000000000 --- a/waterbox/libc/includes/iso646.h +++ /dev/null @@ -1,24 +0,0 @@ -/* Alternative spellings - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#ifndef _PDCLIB_ISO646_H -#define _PDCLIB_ISO646_H _PDCLIB_ISO646_H - -#ifndef __cplusplus -#define and && -#define and_eq &= -#define bitand & -#define bitor | -#define compl ~ -#define not ! -#define not_eq != -#define or || -#define or_eq |= -#define xor ^ -#define xor_eq ^= -#endif - -#endif diff --git a/waterbox/libc/includes/limits.h b/waterbox/libc/includes/limits.h deleted file mode 100644 index 79fc6f607a..0000000000 --- a/waterbox/libc/includes/limits.h +++ /dev/null @@ -1,39 +0,0 @@ -/* Sizes of integer types - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#ifndef _PDCLIB_LIMITS_H -#define _PDCLIB_LIMITS_H _PDCLIB_LIMITS_H -#include "_PDCLIB_int.h" - -/* MSVC 2010 defines this to 5, which is enough for UTF-8 but might rule out - stateful encodings (like ISO/IEC 2022). GCC 5.3 defines this to 16, which - is meant to ensure future compatibility. For the same reason, we go along - with GCC's definition. - http://lists.gnu.org/archive/html/bug-gnulib/2015-05/msg00001.html -*/ -#define MB_LEN_MAX 16 - -#define LLONG_MIN _PDCLIB_LLONG_MIN -#define LLONG_MAX _PDCLIB_LLONG_MAX -#define ULLONG_MAX _PDCLIB_ULLONG_MAX - -#define CHAR_BIT _PDCLIB_CHAR_BIT -#define CHAR_MAX _PDCLIB_CHAR_MAX -#define CHAR_MIN _PDCLIB_CHAR_MIN -#define SCHAR_MAX _PDCLIB_SCHAR_MAX -#define SCHAR_MIN _PDCLIB_SCHAR_MIN -#define UCHAR_MAX _PDCLIB_UCHAR_MAX -#define SHRT_MAX _PDCLIB_SHRT_MAX -#define SHRT_MIN _PDCLIB_SHRT_MIN -#define INT_MAX _PDCLIB_INT_MAX -#define INT_MIN _PDCLIB_INT_MIN -#define LONG_MAX _PDCLIB_LONG_MAX -#define LONG_MIN _PDCLIB_LONG_MIN -#define USHRT_MAX _PDCLIB_USHRT_MAX -#define UINT_MAX _PDCLIB_UINT_MAX -#define ULONG_MAX _PDCLIB_ULONG_MAX - -#endif diff --git a/waterbox/libc/includes/locale.h b/waterbox/libc/includes/locale.h deleted file mode 100644 index ac04cd11d1..0000000000 --- a/waterbox/libc/includes/locale.h +++ /dev/null @@ -1,147 +0,0 @@ -/* Localization - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#ifndef _PDCLIB_LOCALE_H -#define _PDCLIB_LOCALE_H _PDCLIB_LOCALE_H -#include "_PDCLIB_int.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef _PDCLIB_NULL_DEFINED -#define _PDCLIB_NULL_DEFINED _PDCLIB_NULL_DEFINED -#define NULL _PDCLIB_NULL -#endif - -/* The structure returned by localeconv(). - - The values for *_sep_by_space: - 0 - no space - 1 - if symbol and sign are adjacent, a space seperates them from the value; - otherwise a space seperates the symbol from the value - 2 - if symbol and sign are adjacent, a space seperates them; otherwise a - space seperates the sign from the value - - The values for *_sign_posn: - 0 - Parentheses surround value and symbol - 1 - sign precedes value and symbol - 2 - sign succeeds value and symbol - 3 - sign immediately precedes symbol - 4 - sign immediately succeeds symbol -*/ -struct lconv -{ - char * decimal_point; /* decimal point character */ - char * thousands_sep; /* character for seperating groups of digits */ - char * grouping; /* string indicating the size of digit groups */ - char * mon_decimal_point; /* decimal point for monetary quantities */ - char * mon_thousands_sep; /* thousands_sep for monetary quantities */ - char * mon_grouping; /* grouping for monetary quantities */ - char * positive_sign; /* string indicating nonnegative mty. qty. */ - char * negative_sign; /* string indicating negative mty. qty. */ - char * currency_symbol; /* local currency symbol (e.g. '$') */ - char * int_curr_symbol; /* international currency symbol (e.g. "USD" */ - char frac_digits; /* fractional digits in local monetary qty. */ - char p_cs_precedes; /* if currency_symbol precedes positive qty. */ - char n_cs_precedes; /* if currency_symbol precedes negative qty. */ - char p_sep_by_space; /* if it is seperated by space from pos. qty. */ - char n_sep_by_space; /* if it is seperated by space from neg. qty. */ - char p_sign_posn; /* positioning of positive_sign for mon. qty. */ - char n_sign_posn; /* positioning of negative_sign for mon. qty. */ - char int_frac_digits; /* Same as above, for international format */ - char int_p_cs_precedes; /* Same as above, for international format */ - char int_n_cs_precedes; /* Same as above, for international format */ - char int_p_sep_by_space; /* Same as above, for international format */ - char int_n_sep_by_space; /* Same as above, for international format */ - char int_p_sign_posn; /* Same as above, for international format */ - char int_n_sign_posn; /* Same as above, for international format */ -}; - -/* First arguments to setlocale(). - TODO: Beware, values might change before v0.6 is released. -*/ -/* Entire locale */ -#define LC_ALL -1 -/* Collation (strcoll(), strxfrm()) */ -#define LC_COLLATE 0 -/* Character types () */ -#define LC_CTYPE 1 -/* Monetary formatting (as returned by localeconv) */ -#define LC_MONETARY 2 -/* Decimal-point character (for printf() / scanf() functions), string - conversions, nonmonetary formatting as returned by localeconv */ -#define LC_NUMERIC 3 -/* Time formats (strftime(), wcsftime()) */ -#define LC_TIME 4 - -/* not supported! */ -#define LC_MESSAGES 5 - -/* The category parameter can be any of the LC_* macros to specify if the call - to setlocale() shall affect the entire locale or only a portion thereof. - The category locale specifies which locale should be switched to, with "C" - being the minimal default locale, and "" being the locale-specific native - environment. A NULL pointer makes setlocale() return the *current* setting. - Otherwise, returns a pointer to a string associated with the specified - category for the new locale. -*/ -char * setlocale( int category, const char * locale ) _PDCLIB_nothrow; - -/* Returns a struct lconv initialized to the values appropriate for the current - locale setting. -*/ -struct lconv * localeconv( void ) _PDCLIB_nothrow; - -#if _PDCLIB_POSIX_MIN(2008) -#define LC_COLLATE_MASK (1 << LC_COLLATE) -#define LC_CTYPE_MASK (1 << LC_CTYPE) -#define LC_MONETARY_MASK (1 << LC_MONETARY) -#define LC_NUMERIC_MASK (1 << LC_NUMERIC) -#define LC_TIME_MASK (1 << LC_TIME) -#define LC_MESSAGES_MASK (1 << LC_MESSAGES) -#define LC_ALL_MASK (LC_COLLATE_MASK | LC_CTYPE_MASK | LC_MONETARY_MASK | \ - LC_NUMERIC_MASK | LC_TIME_MASK | LC_MESSAGES_MASK) - - -/* POSIX locale type */ -typedef _PDCLIB_locale_t locale_t; - -/* Global locale */ -extern struct _PDCLIB_locale _PDCLIB_global_locale; -#define LC_GLOBAL_LOCALE (&_PDCLIB_global_locale) - -#ifdef _PDCLIB_LOCALE_METHOD - -locale_t newlocale(int category_mask, const char *locale, locale_t base); - -/* Set the thread locale to newlocale - * - * If newlocale is (locale_t)0, then doesn't change the locale and just returns - * the existing locale. - * - * If newlocale is LC_GLOBAL_LOCALE, resets the thread's locale to use the - * global locale. - * - * Returns the previous thread locale. If the thread had no previous locale, - * returns the global locale. - */ -locale_t uselocale( locale_t newlocale ); - -/* Returns a copy of loc */ -locale_t duplocale( locale_t loc ); - -/* Frees the passed locale object */ -void freelocale( locale_t loc ); -#endif - -#endif - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/waterbox/libc/includes/math.h b/waterbox/libc/includes/math.h deleted file mode 100644 index 6ac91da24f..0000000000 --- a/waterbox/libc/includes/math.h +++ /dev/null @@ -1,430 +0,0 @@ -#ifndef _MATH_H -#define _MATH_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -#define __NEED_float_t -#define __NEED_double_t -#include - -#if 100*__GNUC__+__GNUC_MINOR__ >= 303 -#define NAN __builtin_nanf("") -#define INFINITY __builtin_inff() -#else -#define NAN (0.0f/0.0f) -#define INFINITY 1e5000f -#endif - -#define HUGE_VALF INFINITY -#define HUGE_VAL ((double)INFINITY) -#define HUGE_VALL ((long double)INFINITY) - -#define MATH_ERRNO 1 -#define MATH_ERREXCEPT 2 -#define math_errhandling 2 - -#define FP_ILOGBNAN (-1-(int)(((unsigned)-1)>>1)) -#define FP_ILOGB0 FP_ILOGBNAN - -#define FP_NAN 0 -#define FP_INFINITE 1 -#define FP_ZERO 2 -#define FP_SUBNORMAL 3 -#define FP_NORMAL 4 - -int __fpclassify(double); -int __fpclassifyf(float); -int __fpclassifyl(long double); - -static __inline unsigned __FLOAT_BITS(float __f) -{ - union {float __f; unsigned __i;} __u; - __u.__f = __f; - return __u.__i; -} -static __inline unsigned long long __DOUBLE_BITS(double __f) -{ - union {double __f; unsigned long long __i;} __u; - __u.__f = __f; - return __u.__i; -} - -#define fpclassify(x) ( \ - sizeof(x) == sizeof(float) ? __fpclassifyf(x) : \ - sizeof(x) == sizeof(double) ? __fpclassify(x) : \ - __fpclassifyl(x) ) - -#define isinf(x) ( \ - sizeof(x) == sizeof(float) ? (__FLOAT_BITS(x) & 0x7fffffff) == 0x7f800000 : \ - sizeof(x) == sizeof(double) ? (__DOUBLE_BITS(x) & -1ULL>>1) == 0x7ffULL<<52 : \ - __fpclassifyl(x) == FP_INFINITE) - -#define isnan(x) ( \ - sizeof(x) == sizeof(float) ? (__FLOAT_BITS(x) & 0x7fffffff) > 0x7f800000 : \ - sizeof(x) == sizeof(double) ? (__DOUBLE_BITS(x) & -1ULL>>1) > 0x7ffULL<<52 : \ - __fpclassifyl(x) == FP_NAN) - -#define isnormal(x) ( \ - sizeof(x) == sizeof(float) ? ((__FLOAT_BITS(x)+0x00800000) & 0x7fffffff) >= 0x01000000 : \ - sizeof(x) == sizeof(double) ? ((__DOUBLE_BITS(x)+(1ULL<<52)) & -1ULL>>1) >= 1ULL<<53 : \ - __fpclassifyl(x) == FP_NORMAL) - -#define isfinite(x) ( \ - sizeof(x) == sizeof(float) ? (__FLOAT_BITS(x) & 0x7fffffff) < 0x7f800000 : \ - sizeof(x) == sizeof(double) ? (__DOUBLE_BITS(x) & -1ULL>>1) < 0x7ffULL<<52 : \ - __fpclassifyl(x) > FP_INFINITE) - -int __signbit(double); -int __signbitf(float); -int __signbitl(long double); - -#define signbit(x) ( \ - sizeof(x) == sizeof(float) ? (int)(__FLOAT_BITS(x)>>31) : \ - sizeof(x) == sizeof(double) ? (int)(__DOUBLE_BITS(x)>>63) : \ - __signbitl(x) ) - -#define isunordered(x,y) (isnan((x)) ? ((void)(y),1) : isnan((y))) - -#define __ISREL_DEF(rel, op, type) \ -static __inline int __is##rel(type __x, type __y) \ -{ return !isunordered(__x,__y) && __x op __y; } - -__ISREL_DEF(lessf, <, float_t) -__ISREL_DEF(less, <, double_t) -__ISREL_DEF(lessl, <, long double) -__ISREL_DEF(lessequalf, <=, float_t) -__ISREL_DEF(lessequal, <=, double_t) -__ISREL_DEF(lessequall, <=, long double) -__ISREL_DEF(lessgreaterf, !=, float_t) -__ISREL_DEF(lessgreater, !=, double_t) -__ISREL_DEF(lessgreaterl, !=, long double) -__ISREL_DEF(greaterf, >, float_t) -__ISREL_DEF(greater, >, double_t) -__ISREL_DEF(greaterl, >, long double) -__ISREL_DEF(greaterequalf, >=, float_t) -__ISREL_DEF(greaterequal, >=, double_t) -__ISREL_DEF(greaterequall, >=, long double) - -#define __tg_pred_2(x, y, p) ( \ - sizeof((x)+(y)) == sizeof(float) ? p##f(x, y) : \ - sizeof((x)+(y)) == sizeof(double) ? p(x, y) : \ - p##l(x, y) ) - -#define isless(x, y) __tg_pred_2(x, y, __isless) -#define islessequal(x, y) __tg_pred_2(x, y, __islessequal) -#define islessgreater(x, y) __tg_pred_2(x, y, __islessgreater) -#define isgreater(x, y) __tg_pred_2(x, y, __isgreater) -#define isgreaterequal(x, y) __tg_pred_2(x, y, __isgreaterequal) - -double acos(double); -float acosf(float); -long double acosl(long double); - -double acosh(double); -float acoshf(float); -long double acoshl(long double); - -double asin(double); -float asinf(float); -long double asinl(long double); - -double asinh(double); -float asinhf(float); -long double asinhl(long double); - -double atan(double); -float atanf(float); -long double atanl(long double); - -double atan2(double, double); -float atan2f(float, float); -long double atan2l(long double, long double); - -double atanh(double); -float atanhf(float); -long double atanhl(long double); - -double cbrt(double); -float cbrtf(float); -long double cbrtl(long double); - -double ceil(double); -float ceilf(float); -long double ceill(long double); - -double copysign(double, double); -float copysignf(float, float); -long double copysignl(long double, long double); - -double cos(double); -float cosf(float); -long double cosl(long double); - -double cosh(double); -float coshf(float); -long double coshl(long double); - -double erf(double); -float erff(float); -long double erfl(long double); - -double erfc(double); -float erfcf(float); -long double erfcl(long double); - -double exp(double); -float expf(float); -long double expl(long double); - -double exp2(double); -float exp2f(float); -long double exp2l(long double); - -double expm1(double); -float expm1f(float); -long double expm1l(long double); - -double fabs(double); -float fabsf(float); -long double fabsl(long double); - -double fdim(double, double); -float fdimf(float, float); -long double fdiml(long double, long double); - -double floor(double); -float floorf(float); -long double floorl(long double); - -double fma(double, double, double); -float fmaf(float, float, float); -long double fmal(long double, long double, long double); - -double fmax(double, double); -float fmaxf(float, float); -long double fmaxl(long double, long double); - -double fmin(double, double); -float fminf(float, float); -long double fminl(long double, long double); - -double fmod(double, double); -float fmodf(float, float); -long double fmodl(long double, long double); - -double frexp(double, int *); -float frexpf(float, int *); -long double frexpl(long double, int *); - -double hypot(double, double); -float hypotf(float, float); -long double hypotl(long double, long double); - -int ilogb(double); -int ilogbf(float); -int ilogbl(long double); - -double ldexp(double, int); -float ldexpf(float, int); -long double ldexpl(long double, int); - -double lgamma(double); -float lgammaf(float); -long double lgammal(long double); - -long long llrint(double); -long long llrintf(float); -long long llrintl(long double); - -long long llround(double); -long long llroundf(float); -long long llroundl(long double); - -double log(double); -float logf(float); -long double logl(long double); - -double log10(double); -float log10f(float); -long double log10l(long double); - -double log1p(double); -float log1pf(float); -long double log1pl(long double); - -double log2(double); -float log2f(float); -long double log2l(long double); - -double logb(double); -float logbf(float); -long double logbl(long double); - -long lrint(double); -long lrintf(float); -long lrintl(long double); - -long lround(double); -long lroundf(float); -long lroundl(long double); - -double modf(double, double *); -float modff(float, float *); -long double modfl(long double, long double *); - -double nan(const char *); -float nanf(const char *); -long double nanl(const char *); - -double nearbyint(double); -float nearbyintf(float); -long double nearbyintl(long double); - -double nextafter(double, double); -float nextafterf(float, float); -long double nextafterl(long double, long double); - -double nexttoward(double, long double); -float nexttowardf(float, long double); -long double nexttowardl(long double, long double); - -double pow(double, double); -float powf(float, float); -long double powl(long double, long double); - -double remainder(double, double); -float remainderf(float, float); -long double remainderl(long double, long double); - -double remquo(double, double, int *); -float remquof(float, float, int *); -long double remquol(long double, long double, int *); - -double rint(double); -float rintf(float); -long double rintl(long double); - -double round(double); -float roundf(float); -long double roundl(long double); - -double scalbln(double, long); -float scalblnf(float, long); -long double scalblnl(long double, long); - -double scalbn(double, int); -float scalbnf(float, int); -long double scalbnl(long double, int); - -double sin(double); -float sinf(float); -long double sinl(long double); - -double sinh(double); -float sinhf(float); -long double sinhl(long double); - -double sqrt(double); -float sqrtf(float); -long double sqrtl(long double); - -double tan(double); -float tanf(float); -long double tanl(long double); - -double tanh(double); -float tanhf(float); -long double tanhl(long double); - -double tgamma(double); -float tgammaf(float); -long double tgammal(long double); - -double trunc(double); -float truncf(float); -long double truncl(long double); - - -#if defined(_XOPEN_SOURCE) || defined(_BSD_SOURCE) -#undef MAXFLOAT -#define MAXFLOAT 3.40282346638528859812e+38F -#endif - -#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE) -#define M_E 2.7182818284590452354 /* e */ -#define M_LOG2E 1.4426950408889634074 /* log_2 e */ -#define M_LOG10E 0.43429448190325182765 /* log_10 e */ -#define M_LN2 0.69314718055994530942 /* log_e 2 */ -#define M_LN10 2.30258509299404568402 /* log_e 10 */ -#define M_PI 3.14159265358979323846 /* pi */ -#define M_PI_2 1.57079632679489661923 /* pi/2 */ -#define M_PI_4 0.78539816339744830962 /* pi/4 */ -#define M_1_PI 0.31830988618379067154 /* 1/pi */ -#define M_2_PI 0.63661977236758134308 /* 2/pi */ -#define M_2_SQRTPI 1.12837916709551257390 /* 2/sqrt(pi) */ -#define M_SQRT2 1.41421356237309504880 /* sqrt(2) */ -#define M_SQRT1_2 0.70710678118654752440 /* 1/sqrt(2) */ - -extern int signgam; - -double j0(double); -double j1(double); -double jn(int, double); - -double y0(double); -double y1(double); -double yn(int, double); -#endif - -#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) -#define HUGE 3.40282346638528859812e+38F - -double drem(double, double); -float dremf(float, float); - -int finite(double); -int finitef(float); - -double scalb(double, double); -float scalbf(float, float); - -double significand(double); -float significandf(float); - -double lgamma_r(double, int*); -float lgammaf_r(float, int*); - -float j0f(float); -float j1f(float); -float jnf(int, float); - -float y0f(float); -float y1f(float); -float ynf(int, float); -#endif - -#ifdef _GNU_SOURCE -long double lgammal_r(long double, int*); - -void sincos(double, double*, double*); -void sincosf(float, float*, float*); -void sincosl(long double, long double*, long double*); - -double exp10(double); -float exp10f(float); -long double exp10l(long double); - -double pow10(double); -float pow10f(float); -long double pow10l(long double); -#endif - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/waterbox/libc/includes/setjmp.h b/waterbox/libc/includes/setjmp.h deleted file mode 100644 index 89ea066039..0000000000 --- a/waterbox/libc/includes/setjmp.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef _SETJMP_H -#define _SETJMP_H - -#ifdef __cplusplus -extern "C" { -#endif - -#define _JBTYPE long long -#define _JBLEN 8 -typedef _JBTYPE jmp_buf[_JBLEN]; - -int setjmp (jmp_buf env); -void longjmp (jmp_buf env, int val); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/waterbox/libc/includes/signal.h b/waterbox/libc/includes/signal.h deleted file mode 100644 index dbcf28c10c..0000000000 --- a/waterbox/libc/includes/signal.h +++ /dev/null @@ -1,84 +0,0 @@ -/* Signal handling - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#ifndef _PDCLIB_SIGNAL_H -#define _PDCLIB_SIGNAL_H _PDCLIB_SIGNAL_H -#include "_PDCLIB_config.h" - -/* Signals ------------------------------------------------------------------ */ - -/* A word on signals, to the people using PDCLib in their OS projects. - - The definitions of the C standard leave about everything that *could* be - useful to be "implementation defined". Without additional, non-standard - arrangements, it is not possible to turn them into a useful tool. - - This example implementation chose to "not generate any of these signals, - except as a result of explicit calls to the raise function", which is - allowed by the standard but of course does nothing for the usefulness of - . - - A useful signal handling would: - 1) make signal() a system call that registers the signal handler with the OS - 2) make raise() a system call triggering an OS signal to the running process - 3) make provisions that further signals of the same type are blocked until - the signal handler returns (optional for SIGILL) -*/ - -/* These are the values used by Linux. */ - -/* Abnormal termination / abort() */ -#define SIGABRT 6 -/* Arithmetic exception / division by zero / overflow */ -#define SIGFPE 8 -/* Illegal instruction */ -#define SIGILL 4 -/* Interactive attention signal */ -#define SIGINT 2 -/* Invalid memory access */ -#define SIGSEGV 11 -/* Termination request */ -#define SIGTERM 15 - -/* The following should be defined to pointer values that could NEVER point to - a valid signal handler function. (They are used as special arguments to - signal().) Again, these are the values used by Linux. -*/ -#define SIG_DFL (void (*)( int ))0 -#define SIG_ERR (void (*)( int ))-1 -#define SIG_IGN (void (*)( int ))1 - -typedef _PDCLIB_sig_atomic sig_atomic_t; - -/* Installs a signal handler "func" for the given signal. - A signal handler is a function that takes an integer as argument (the signal - number) and returns void. - - Note that a signal handler can do very little else than: - 1) assign a value to a static object of type "volatile sig_atomic_t", - 2) call signal() with the value of sig equal to the signal received, - 3) call _Exit(), - 4) call abort(). - Virtually everything else is undefind. - - The signal() function returns the previous installed signal handler, which - at program start may be SIG_DFL or SIG_ILL. (This implementation uses - SIG_DFL for all handlers.) If the request cannot be honored, SIG_ERR is - returned and errno is set to an unspecified positive value. -*/ -void (*signal( int sig, void (*func)( int ) ) )( int ); - -/* Raises the given signal (executing the registered signal handler with the - given signal number as parameter). - This implementation does not prevent further signals of the same time from - occuring, but executes signal( sig, SIG_DFL ) before entering the signal - handler (i.e., a second signal before the signal handler re-registers itself - or SIG_IGN will end the program). - Returns zero if successful, nonzero otherwise. */ -int raise( int sig ); - -#endif - diff --git a/waterbox/libc/includes/stdalign.h b/waterbox/libc/includes/stdalign.h deleted file mode 100644 index 0bc20f67cf..0000000000 --- a/waterbox/libc/includes/stdalign.h +++ /dev/null @@ -1,17 +0,0 @@ -/* Alignmend - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#ifndef _PDCLIB_STDALIGN_H -#define _PDCLIB_ALIGN_H _PDCLIB_ALIGN_H - -#define alignas _Alignas -#define alignof _Alignof - -#define __alignas_is_defined 1 -#define __alignof_is_defined 1 - -#endif - diff --git a/waterbox/libc/includes/stdarg.h b/waterbox/libc/includes/stdarg.h deleted file mode 100644 index 1ebf3fba28..0000000000 --- a/waterbox/libc/includes/stdarg.h +++ /dev/null @@ -1,27 +0,0 @@ -/* Variable arguments - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#ifndef _PDCLIB_STDARG_H -#define _PDCLIB_STDARG_H _PDCLIB_STDARG_H -#include "_PDCLIB_aux.h" -#include "_PDCLIB_config.h" - -#ifdef __cplusplus -extern "C" { -#endif - -typedef _PDCLIB_va_list va_list; - -#define va_arg( ap, type ) _PDCLIB_va_arg( ap, type ) -#define va_copy( dest, src ) _PDCLIB_va_copy( dest, src ) -#define va_end( ap ) _PDCLIB_va_end( ap ) -#define va_start( ap, parmN ) _PDCLIB_va_start( ap, parmN ) - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/waterbox/libc/includes/stdbool.h b/waterbox/libc/includes/stdbool.h deleted file mode 100644 index daec901e45..0000000000 --- a/waterbox/libc/includes/stdbool.h +++ /dev/null @@ -1,18 +0,0 @@ -/* Boolean type and values - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#ifndef _PDCLIB_STDBOOL_H -#define _PDCLIB_STDBOOL_H _PDCLIB_STDBOOL_H - -#ifndef __cplusplus -#define bool _Bool -#define true 1 -#define false 0 -#endif - -#define __bool_true_false_are_defined 1 - -#endif diff --git a/waterbox/libc/includes/stddef.h b/waterbox/libc/includes/stddef.h deleted file mode 100644 index 600731bdca..0000000000 --- a/waterbox/libc/includes/stddef.h +++ /dev/null @@ -1,41 +0,0 @@ -/* Common definitions - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#ifndef _PDCLIB_STDDEF_H -#define _PDCLIB_STDDEF_H _PDCLIB_STDDEF_H -#include "_PDCLIB_config.h" -#include "_PDCLIB_int.h" - -#ifdef __cplusplus -extern "C" { -#endif - -typedef _PDCLIB_ptrdiff_t ptrdiff_t; - -#ifndef _PDCLIB_SIZE_T_DEFINED -#define _PDCLIB_SIZE_T_DEFINED _PDCLIB_SIZE_T_DEFINED -typedef _PDCLIB_size_t size_t; -#endif - -#ifndef __cplusplus -#ifndef _PDCLIB_WCHAR_T_DEFINED -#define _PDCLIB_WCHAR_T_DEFINED _PDCLIB_WCHAR_T_DEFINED -typedef _PDCLIB_wchar_t wchar_t; -#endif -#endif - -#ifndef _PDCLIB_NULL_DEFINED -#define _PDCLIB_NULL_DEFINED _PDCLIB_NULL_DEFINED -#define NULL _PDCLIB_NULL -#endif - -#define offsetof( type, member ) _PDCLIB_offsetof( type, member ) - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/waterbox/libc/includes/stdint.h b/waterbox/libc/includes/stdint.h deleted file mode 100644 index 69a6dc5a7b..0000000000 --- a/waterbox/libc/includes/stdint.h +++ /dev/null @@ -1,209 +0,0 @@ -/* Integer types - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#ifndef _PDCLIB_STDINT_H -#define _PDCLIB_STDINT_H _PDCLIB_STDINT_H -#include "_PDCLIB_int.h" - -/* Exact-width integer types. */ - -typedef _PDCLIB_int8_t int8_t; -typedef _PDCLIB_int16_t int16_t; -typedef _PDCLIB_int32_t int32_t; -typedef _PDCLIB_int64_t int64_t; - -typedef _PDCLIB_uint8_t uint8_t; -typedef _PDCLIB_uint16_t uint16_t; -typedef _PDCLIB_uint32_t uint32_t; -typedef _PDCLIB_uint64_t uint64_t; - -/* Minimum-width integer types */ - -/* You are allowed to add more types here, e.g. int_least24_t. For the standard - types, int_leastN_t is equivalent to the corresponding exact type intN_t by - definition. -*/ - -typedef _PDCLIB_int8_t int_least8_t; -typedef _PDCLIB_int16_t int_least16_t; -typedef _PDCLIB_int32_t int_least32_t; -typedef _PDCLIB_int64_t int_least64_t; - -typedef _PDCLIB_uint8_t uint_least8_t; -typedef _PDCLIB_uint16_t uint_least16_t; -typedef _PDCLIB_uint32_t uint_least32_t; -typedef _PDCLIB_uint64_t uint_least64_t; - -/* Fastest minimum-width integer types */ - -/* You are allowed to add more types here, e.g. int_fast24_t. */ - -typedef _PDCLIB_int_fast8_t int_fast8_t; -typedef _PDCLIB_int_fast16_t int_fast16_t; -typedef _PDCLIB_int_fast32_t int_fast32_t; -typedef _PDCLIB_int_fast64_t int_fast64_t; - -typedef _PDCLIB_uint_fast8_t uint_fast8_t; -typedef _PDCLIB_uint_fast16_t uint_fast16_t; -typedef _PDCLIB_uint_fast32_t uint_fast32_t; -typedef _PDCLIB_uint_fast64_t uint_fast64_t; - -/* Integer types capable of holding object pointers */ - -typedef _PDCLIB_intptr_t intptr_t; -typedef _PDCLIB_uintptr_t uintptr_t; - -/* Greatest-width integer types */ - -typedef _PDCLIB_intmax_t intmax_t; -typedef _PDCLIB_uintmax_t uintmax_t; - -/* Limits of specified-width integer types */ - -#ifdef __cplusplus -#ifndef __STDC_LIMIT_MACROS -#define _PDCLIB_NO_LIMIT_MACROS -#endif -#endif - -#ifndef _PDCLIB_NO_LIMIT_MACROS - -/* Limits of exact-width integer types */ - -#define INT8_MIN _PDCLIB_INT8_MIN -#define INT8_MAX _PDCLIB_INT8_MAX -#define UINT8_MAX _PDCLIB_UINT8_MAX - -#define INT16_MIN _PDCLIB_INT16_MIN -#define INT16_MAX _PDCLIB_INT16_MAX -#define UINT16_MAX _PDCLIB_UINT16_MAX - -#define INT32_MIN _PDCLIB_INT32_MIN -#define INT32_MAX _PDCLIB_INT32_MAX -#define UINT32_MAX _PDCLIB_UINT32_MAX - -#define INT64_MIN _PDCLIB_INT64_MIN -#define INT64_MAX _PDCLIB_INT64_MAX -#define UINT64_MAX _PDCLIB_UINT64_MAX - -/* Limits of minimum-width integer types */ - -/* For the standard widths, least and exact types are equivalent. - You are allowed to add more types here, e.g. int_least24_t. -*/ - -#define INT_LEAST8_MIN INT8_MIN -#define INT_LEAST8_MAX INT8_MAX -#define UINT_LEAST8_MAX UINT8_MAX - -#define INT_LEAST16_MIN INT16_MIN -#define INT_LEAST16_MAX INT16_MAX -#define UINT_LEAST16_MAX UINT16_MAX - -#define INT_LEAST32_MIN INT32_MIN -#define INT_LEAST32_MAX INT32_MAX -#define UINT_LEAST32_MAX UINT32_MAX - -#define INT_LEAST64_MIN INT64_MIN -#define INT_LEAST64_MAX INT64_MAX -#define UINT_LEAST64_MAX UINT64_MAX - -/* Limits of fastest minimum-width integer types */ - -#define INT_FAST8_MIN _PDCLIB_INT_FAST8_MIN -#define INT_FAST8_MAX _PDCLIB_INT_FAST8_MAX -#define UINT_FAST8_MAX _PDCLIB_UINT_FAST8_MAX - -#define INT_FAST16_MIN _PDCLIB_INT_FAST16_MIN -#define INT_FAST16_MAX _PDCLIB_INT_FAST16_MAX -#define UINT_FAST16_MAX _PDCLIB_UINT_FAST16_MAX - -#define INT_FAST32_MIN _PDCLIB_INT_FAST32_MIN -#define INT_FAST32_MAX _PDCLIB_INT_FAST32_MAX -#define UINT_FAST32_MAX _PDCLIB_UINT_FAST32_MAX - -#define INT_FAST64_MIN _PDCLIB_INT_FAST64_MIN -#define INT_FAST64_MAX _PDCLIB_INT_FAST64_MAX -#define UINT_FAST64_MAX _PDCLIB_UINT_FAST64_MAX - -/* Limits of integer types capable of holding object pointers */ - -#define INTPTR_MIN _PDCLIB_INTPTR_MIN -#define INTPTR_MAX _PDCLIB_INTPTR_MAX -#define UINTPTR_MAX _PDCLIB_UINTPTR_MAX - -/* Limits of greatest-width integer types */ - -#define INTMAX_MIN _PDCLIB_INTMAX_MIN -#define INTMAX_MAX _PDCLIB_INTMAX_MAX -#define UINTMAX_MAX _PDCLIB_UINTMAX_MAX - -/* Limits of other integer types */ - -#define PTRDIFF_MIN _PDCLIB_PTRDIFF_MIN -#define PTRDIFF_MAX _PDCLIB_PTRDIFF_MAX - -#define SIG_ATOMIC_MIN _PDCLIB_SIG_ATOMIC_MIN -#define SIG_ATOMIC_MAX _PDCLIB_SIG_ATOMIC_MAX - -#define SIZE_MAX _PDCLIB_SIZE_MAX - -#ifndef _PDCLIB_WCHAR_MIN_MAX_DEFINED -#define _PDCLIB_WCHAR_MIN_MAX_DEFINED -#define WCHAR_MIN _PDCLIB_WCHAR_MIN -#define WCHAR_MAX _PDCLIB_WCHAR_MAX -#endif - -#define WINT_MIN _PDCLIB_WINT_MIN -#define WINT_MAX _PDCLIB_WINT_MAX - -#endif - -/* Macros for integer constants */ - -#ifdef __cplusplus -#ifndef __STDC_CONSTANT_MACROS -#define _PDCLIB_NO_CONSTANT_MACROS -#endif -#endif - -#ifndef _PDCLIB_NO_CONSTANT_MACROS - -/* Macros for minimum-width integer constants */ - -/* As the minimum-width types - for the required widths of 8, 16, 32, and 64 - bits - are expressed in terms of the exact-width types, the mechanism for - these macros is to append the literal of that exact-width type to the macro - parameter. - This is considered a hack, as the author is not sure his understanding of - the requirements of this macro is correct. Any input appreciated. -*/ - -/* Expand to an integer constant of specified value and type int_leastN_t */ - -#define INT8_C( value ) value -#define INT16_C( value ) value -#define INT32_C( value ) _PDCLIB_concat( value, _PDCLIB_INT32_LITERAL ) -#define INT64_C( value ) _PDCLIB_concat( value, _PDCLIB_INT64_LITERAL ) - -/* Expand to an integer constant of specified value and type uint_leastN_t */ - -#define UINT8_C( value ) value -#define UINT16_C( value ) value -#define UINT32_C( value ) _PDCLIB_concat( value, _PDCLIB_UINT32_LITERAL ) -#define UINT64_C( value ) _PDCLIB_concat( value, _PDCLIB_UINT64_LITERAL ) - -/* Macros for greatest-width integer constants */ - -/* Expand to an integer constant of specified value and type intmax_t */ -#define INTMAX_C( value ) _PDCLIB_INTMAX_C( value ) - -/* Expand to an integer constant of specified value and type uintmax_t */ -#define UINTMAX_C( value ) _PDCLIB_UINTMAX_C( value ) - -#endif - -#endif diff --git a/waterbox/libc/includes/stdio.h b/waterbox/libc/includes/stdio.h deleted file mode 100644 index c70ad2f502..0000000000 --- a/waterbox/libc/includes/stdio.h +++ /dev/null @@ -1,913 +0,0 @@ -/* Input/output - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#ifndef _PDCLIB_STDIO_H -#define _PDCLIB_STDIO_H _PDCLIB_STDIO_H -#include "_PDCLIB_int.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef _PDCLIB_SIZE_T_DEFINED -#define _PDCLIB_SIZE_T_DEFINED _PDCLIB_SIZE_T_DEFINED -typedef _PDCLIB_size_t size_t; -#endif - -#ifndef _PDCLIB_NULL_DEFINED -#define _PDCLIB_NULL_DEFINED _PDCLIB_NULL_DEFINED -#define NULL _PDCLIB_NULL -#endif - -/* See setvbuf(), third argument */ -#define _IOFBF 1 -#define _IOLBF 2 -#define _IONBF 4 - -/* The following are platform-dependant, and defined in _PDCLIB_config.h. */ -typedef _PDCLIB_fpos_t fpos_t; -typedef _PDCLIB_file_t FILE; -#define EOF -1 -#define BUFSIZ _PDCLIB_BUFSIZ -#define FOPEN_MAX _PDCLIB_FOPEN_MAX -#define FILENAME_MAX _PDCLIB_FILENAME_MAX -#define L_tmpnam _PDCLIB_L_tmpnam -#define TMP_MAX _PDCLIB_TMP_MAX - -/* See fseek(), third argument - * - * Some system headers (e.g. windows) also define the SEEK_* values. Check for - * this and validate that they're the same value - */ -#if !defined(SEEK_CUR) - #define SEEK_CUR _PDCLIB_SEEK_CUR -#elif SEEK_CUR != _PDCLIB_SEEK_CUR - #error SEEK_CUR != _PDCLIB_SEEK_CUR -#endif - -#if !defined(SEEK_END) - #define SEEK_END _PDCLIB_SEEK_END -#elif SEEK_END != _PDCLIB_SEEK_END - #error SEEK_END != _PDCLIB_SEEK_END -#endif - -#if !defined(SEEK_SET) - #define SEEK_SET _PDCLIB_SEEK_SET -#elif SEEK_SET != _PDCLIB_SEEK_SET - #error SEEK_SET != _PDCLIB_SEEK_SET -#endif - -extern FILE * stdin; -extern FILE * stdout; -extern FILE * stderr; - -/* Operations on files */ - -/* Remove the given file. - Returns zero if successful, non-zero otherwise. - This implementation does detect if a file of that name is currently open, - and fails the remove in this case. This does not detect two distinct names - that merely result in the same file (e.g. "/home/user/foo" vs. "~/foo"). -*/ -int remove( const char * filename ) _PDCLIB_nothrow; - -/* Rename the given old file to the given new name. - Returns zero if successful, non-zero otherwise. - This implementation does detect if the old filename corresponds to an open - file, and fails the rename in this case. - If there already is a file with the new filename, behaviour is defined by - the glue code (see functions/_PDCLIB/rename.c). -*/ -int rename( const char * old, const char * newn ) _PDCLIB_nothrow; - -/* Open a temporary file with mode "wb+", i.e. binary-update. Remove the file - automatically if it is closed or the program exits normally (by returning - from main() or calling exit()). - Returns a pointer to a FILE handle for this file. - This implementation does not remove temporary files if the process aborts - abnormally (e.g. abort()). -*/ -FILE * tmpfile( void ) _PDCLIB_nothrow; - -/* Generate a file name that is not equal to any existing filename AT THE TIME - OF GENERATION. Generate a different name each time it is called. - Returns a pointer to an internal static buffer containing the filename if s - is a NULL pointer. (This is not thread-safe!) - Returns s if it is not a NULL pointer (s is then assumed to point to an array - of at least L_tmpnam characters). - Returns NULL if unable to generate a suitable name (because all possible - names already exist, or the function has been called TMP_MAX times already). - Note that this implementation cannot guarantee a file of the name generated - is not generated between the call to this function and a subsequent fopen(). -*/ -char * tmpnam( char * s ) _PDCLIB_nothrow; - -/* File access functions */ - -/* Close the file associated with the given stream (after flushing its buffers). - Returns zero if successful, EOF if any errors occur. -*/ -int fclose( FILE * stream ) _PDCLIB_nothrow; - -/* Flush the buffers of the given output stream. If the stream is an input - stream, or an update stream with the last operation being an input operation, - behaviour is undefined. - If stream is a NULL pointer, perform the buffer flushing for all applicable - streams. - Returns zero if successful, EOF if a write error occurs. - Sets the error indicator of the stream if a write error occurs. -*/ -int fflush( FILE * stream ) _PDCLIB_nothrow; - -/* Open the file with the given filename in the given mode, and return a stream - handle for it in which error and end-of-file indicator are cleared. Defined - values for mode are: - - READ MODES - text files binary files - without update "r" "rb" - with update "r+" "rb+" or "r+b" - - Opening in read mode fails if no file with the given filename exists, or if - cannot be read. - - WRITE MODES - text files binary files - without update "w" "wb" - with update "w+" "wb+" or "w+b" - - With write modes, if a file with the given filename already exists, it is - truncated to zero length. - - APPEND MODES - text files binary files - without update "a" "ab" - with update "a+" "ab+" or "a+b" - - With update modes, if a file with the given filename already exists, it is - not truncated to zero length, but all writes are forced to end-of-file (this - regardless to fseek() calls). Note that binary files opened in append mode - might have their end-of-file padded with '\0' characters. - - Update modes mean that both input and output functions can be performed on - the stream, but output must be terminated with a call to either fflush(), - fseek(), fsetpos(), or rewind() before input is performed, and input must - be terminated with a call to either fseek(), fsetpos(), or rewind() before - output is performed, unless input encountered end-of-file. - - If a text file is opened with update mode, the implementation is at liberty - to open a binary stream instead. This implementation honors the exact mode - given. - - The stream is fully buffered if and only if it can be determined not to - refer to an interactive device. - - If the mode string begins with but is longer than one of the above sequences - the implementation is at liberty to ignore the additional characters, or do - implementation-defined things. This implementation only accepts the exact - modes above. - - Returns a pointer to the stream handle if successfull, NULL otherwise. -*/ -FILE * fopen( const char * _PDCLIB_restrict filename, - const char * _PDCLIB_restrict mode ) _PDCLIB_nothrow; - -/* Creates a stream connected to the file descriptor \p fd with mode \p mode. - Mode must match the mode with which the file descriptor was opened. -*/ -FILE * _PDCLIB_fvopen( _PDCLIB_fd_t fd, const _PDCLIB_fileops_t * ops, - int mode, const char * filename ) _PDCLIB_nothrow; - -/* Close any file currently associated with the given stream. Open the file - identified by the given filename with the given mode (equivalent to fopen()), - and associate it with the given stream. If filename is a NULL pointer, - attempt to change the mode of the given stream. - This implementation allows any mode changes on "real" files, and associating - of the standard streams with files. It does *not* support mode changes on - standard streams. - (Primary use of this function is to redirect stdin, stdout, and stderr.) -*/ -FILE * freopen( const char * _PDCLIB_restrict filename, const char * _PDCLIB_restrict mode, FILE * _PDCLIB_restrict stream ) _PDCLIB_nothrow; - -/* If buf is a NULL pointer, call setvbuf( stream, NULL, _IONBF, BUFSIZ ). - If buf is not a NULL pointer, call setvbuf( stream, buf, _IOFBF, BUFSIZ ). -*/ -void setbuf( FILE * _PDCLIB_restrict stream, char * _PDCLIB_restrict buf ) _PDCLIB_nothrow; - -/* Set the given stream to the given buffering mode. If buf is not a NULL - pointer, use buf as file buffer (of given size). If buf is a NULL pointer, - use a buffer of given size allocated internally. _IONBF causes unbuffered - behaviour, _IOLBF causes line-buffered behaviour, _IOFBF causes fully - buffered behaviour. Calling this function is only valid right after a file is - opened, and before any other operation (except for any unsuccessful calls to - setvbuf()) has been performed. - Returns zero if successful, nonzero otherwise. -*/ -int setvbuf( FILE * _PDCLIB_restrict stream, char * _PDCLIB_restrict buf, int mode, size_t size ) _PDCLIB_nothrow; - -/* Formatted input/output functions */ - -/* - Write output to the given stream, as defined by the given format string and - 0..n subsequent arguments (the argument stack). - - The format string is written to the given stream verbatim, except for any - conversion specifiers included, which start with the letter '%' and are - documented below. If the given conversion specifiers require more arguments - from the argument stack than provided, behaviour is undefined. Additional - arguments not required by conversion specifiers are evaluated but otherwise - ignored. - - (The standard specifies the format string is allowed to contain multibyte - character sequences as long as it starts and ends in initial shift state, - but this is not yet supported by this implementation, which interprets the - format string as sequence of char.) - TODO: Add multibyte support to printf() functions. - - A conversion specifier consists of: - - Zero or more flags (one of the characters "-+ #0"). - - Optional minimum field width as decimal integer. Default is padding to the - left, using spaces. Note that 0 is taken as a flag, not the beginning of a - field width. Note also that a small field width will not result in the - truncation of a value. - - Optional precision (given as ".#" with # being a decimal integer), - specifying: - - the min. number of digits to appear (diouxX), - - the max. number of digits after the decimal point (aAeEfF), - - the max. number of significant digits (gG), - - the max. number of bytes to be written (s). - - behaviour with other conversion specifiers is undefined. - - Optional length modifier specifying the size of the argument (one of "hh", - "ll", or one of the characters "hljztL"). - - Conversion specifier character specifying the type of conversion to be - applied (and the type of the next argument from the argument stack). One - of the characters "diouxXfFeEgGaAcspn%". - - Minimum field width and/or precision may be given as asterisk ('*') instead - of a decimal integer. In this case, the next argument from the argument - stack is assumed to be an int value specifying the width / precision. A - negative field width is interpreted as flag '-' followed by a positive field - width. A negative precision is interpreted as if no precision was given. - - FLAGS - - Left-justify the conversion result within its field width. - + Prefix a '+' on positive signed conversion results. Prefix a '-' on - floating conversions resulting in negative zero, or negative values - rounding to zero. - space Prefix a space on positive signed conversion results, or if a signed - conversion results in no characters. If both '+' and ' ' are given, - ' ' is ignored. - # Use an "alternative form" for - - 'o' conversion, increasing precision until the first digit of the - result is a zero; - - 'x' or 'X' conversion, prefixing "0x" or "0X" to nonzero results; - - "aAeEfF" conversions, always printing a decimal point even if no - digits are following; - - 'g' or 'G' conversions, always printing a decimal point even if no - digits are following, and not removing trailing zeroes. - - behaviour for other conversions is unspecified. - 0 Use leading zeroes instead of spaces for field width padding. If both - '-' and '0' are given, '0' is ignored. If a precision is specified for - any of the "diouxX" conversions, '0' is ignored. Behaviour is only - defined for "diouxXaAeEfFgG". - - LENGTH MODIFIERS - hh For "diouxX" conversions, the argument from the argument stack is - assumed to be of char width. (It will have been subject to integer - promotion but will be converted back.) For 'n' conversions, the argument - is assumed to be a pointer to signed char. - h For "diouxX" conversions, the argument from the argument stack is - assumed to be of short int width. (It will have been subject to integer - promotion but will be converted back.) For 'n' conversions, the argument - is assumed to be a pointer to short int. - l For "diouxX" conversions, the argument from the argument stack is - assumed to be of long int width. For 'n' conversions, the argument is - assumed to be a pointer to short int. For 'c' conversions, the argument - is assumed to be a wint_t. For 's' conversions, the argument is assumed - to be a pointer to wchar_t. No effect on "aAeEfFgG" conversions. - ll For "diouxX" conversions, the argument from the argument stack is - assumed to be of long long int width. For 'n' conversions, the argument - is assumed to be a pointer to long long int. - j For "diouxX" conversions, the argument from the argument stack is - assumed to be of intmax_t width. For 'n' conversions, the argument is - assumed to be a pointer to intmax_t. - z For "diouxX" conversions, the argument from the argument stack is - assumed to be of size_t width. For 'n' conversions, the argument is - assumed to be a pointer to size_t. - t For "diouxX" conversions, the argument from the argument stack is - assumed to be of ptrdiff_t width. For 'n' conversions, the argument is - assumed to be a pointer to ptrdiff_t. - L For "aAeEfFgG" conversions, the argument from the argument stack is - assumed to be a long double. - Length modifiers appearing for any conversions not mentioned above will have - undefined behaviour. - If a length modifier appears with any conversion specifier other than as - specified above, the behavior is undefined. - - CONVERSION SPECIFIERS - d,i The argument from the argument stack is assumed to be of type int, and - is converted to a signed decimal value with a minimum number of digits - as specified by the precision (default 1), padded with leading zeroes. - A zero value converted with precision zero yields no output. - o The argument from the argument stack is assumed to be of type unsigned - int, and is converted to an unsigned octal value, other behaviour being - as above. - u The argument from the argument stack is assumed to be of type unsigned - int, and converted to an unsigned decimal value, other behaviour being - as above. - x,X The argument from the argument stack is assumed to be of type unsigned - int, and converted to an unsigned hexadecimal value, using lowercase - "abcdef" for 'x' and uppercase "ABCDEF" for 'X' conversion, other - behaviour being as above. - f,F The argument from the argument stack is assumed to be of type double, - and converted to a decimal floating point in decimal-point notation, - with the number of digits after the decimal point as specified by the - precision (default 6) and the value being rounded appropriately. If - precision is zero (and the '#' flag is not given), no decimal point is - printed. At least one digit is always printed before the decimal point. - For 'f' conversions, an infinity value is printed as either [-]inf or - [-]infinity (, depending on the configuration of this implementation. A - NaN value is printed as [-]nan. For 'F' conversions uppercase characters - are used for these special values. The flags '-', '+' and ' ' apply as - usual to these special values, '#' and '0' have no effect. - e,E The argument from the argument stack is assumed to be of type double, - and converted to a decimal floating point in normalized exponential - notation ([?]d.ddd edd). "Normalized" means one nonzero digit before - the decimal point, unless the value is zero. The number of digits after - the decimal point is specified by the precision (default 6), the value - being rounded appropriately. If precision is zero (and the '#' flag is - not given), no decimal point is printed. The exponent has at least two - digits, and not more than necessary to represent the exponent. If the - value is zero, the exponent is zero. The 'e' written to indicate the - exponend is uppercase for 'E' conversions. - Infinity or NaN values are represented as for 'f' and 'F' conversions, - respectively. - g,G The argument from the argument stack is assumed to be of type double, - and converted according to either 'f' or 'e' format for 'g' conversions, - or 'F' or 'E' format for 'G' conversions, respectively, with the actual - conversion chosen depending on the value. 'e' / 'E' conversion is chosen - if the resulting exponent is < -4 or >= the precision (default 1). - Trailing zeroes are removed (unless the '#' flag is given). A decimal - point appears only if followed by a digit. - Infinity or NaN values are represented as for 'f' and 'F' conversions, - respectively. - a,A The argument from the argument stack is assumed to be of type double, - and converted to a floating point hexadecimal notation ([?]0xh.hhhh pd) - with one hexadecimal digit (being nonzero if the value is normalized, - and otherwise unspecified) before the decimal point, and the number of - digits after the decimal point being specified by the precision. If no - precision is given, the default is to print as many digits as nevessary - to give an exact representation of the value (if FLT_RADIX is a power of - 2). If no precision is given and FLT_RADIX is not a power of 2, the - default is to print as many digits to distinguish values of type double - (possibly omitting trailing zeroes). (A precision p is sufficient to - distinguish values of the source type if 16^p-1 > b^n where b is - FLT_RADIX and n is the number of digits in the significand (to base b) - of the source type. A smaller p might suffice depending on the - implementation's scheme for determining the digit to the left of the - decimal point.) The error has the correct sign for the current rounding - direction. - Unless the '#' flag is given, no decimal-point is given for zero - precision. - The 'a' conversion uses lowercase "abcdef", "0x" and 'p', the 'A' - conversion uppercase "ABCDEF", "0X" and 'P'. - The exponent always has at least one digit, and not more than necessary - to represent the decimal exponent of 2. If the value is zero, the - exponent is zero. - Infinity or NaN values are represented as for 'f' and 'F' conversions, - respectively. - Binary implementations are at liberty to chose the hexadecimal digit to - the left of the decimal point so that subsequent digits align to nibble - boundaries. - c The argument from the argument stack is assumed to be of type int, and - converted to a character after the value has been cast to unsigned char. - If the 'l' length modifier is given, the argument is assumed to be of - type wint_t, and converted as by a "%ls" conversion with no precision - and a pointer to a two-element wchar_t array, with the first element - being the wint_t argument and the second a '\0' wide character. - s The argument from the argument stack is assumed to be a char array (i.e. - pointer to char). Characters from that array are printed until a zero - byte is encountered or as many bytes as specified by a given precision - have been written. - If the l length modifier is given, the argument from the argument stack - is assumed to be a wchar_t array (i.e. pointer to wchar_t). Wide - characters from that array are converted to multibyte characters as by - calls to wcrtomb() (using a mbstate_t object initialized to zero prior - to the first conversion), up to and including the terminating null wide - character. The resulting multibyte character sequence is then printed up - to but not including the terminating null character. If a precision is - given, it specifies the maximum number of bytes to be written (including - shift sequences). If the given precision would require access to a wide - character one past the end of the array, the array shall contain a '\0' - wide character. In no case is a partial multibyte character written. - Redundant shift sequences may result if the multibyte characters have a - state-dependent encoding. - TODO: Clarify these statements regarding %ls. - p The argument from the argument stack is assumed to be a void pointer, - and converted to a sequence of printing characters in an implementation- - defined manner. - This implementation casts the pointer to type intptr_t, and prints the - value as if a %#x conversion specifier was given. - n The argument from the argument stack is assumed to be a pointer to a - signed integer, into which the number of characters written so far by - this call to fprintf is stored. The behaviour, should any flags, field - widths, or precisions be given is undefined. - % A verbatim '%' character is written. No argument is taken from the - argument stack. - - Returns the number of characters written if successful, a negative value - otherwise. -*/ -int fprintf( FILE * _PDCLIB_restrict stream, const char * _PDCLIB_restrict format, ... ) _PDCLIB_nothrow; - -/* TODO: fscanf() documentation */ -/* - Read input from a given stream, as defined by the given format string, and - store converted input in the objects pointed to by 0..n subsequent arguments - (the argument stack). - - The format string contains a sequence of directives that are expected to - match the input. If such a directive fails to match, the function returns - (matching error). It also returns if an input error occurs (input error). - - Directives can be: - - one or more whitespaces, matching any number of whitespaces in the input; - - printing characters, matching the input verbatim; - - conversion specifications, which convert an input sequence into a value as - defined by the individual specifier, and store that value in a memory - location pointed to by the next pointer on the argument stack. Details are - documented below. If there is an insufficient number of pointers on the - argument stack, behaviour is undefined. Additional arguments not required - by any conversion specifications are evaluated, but otherwise ignored. - - (The standard specifies the format string is allowed to contain multibyte - character sequences as long as it starts and ends in initial shift state, - but this is not yet supported by this implementation, which interprets the - format string as sequence of char.) - TODO: Add multibyte support to scanf() functions. - - A conversion specifier consists of: - - Optional assignment-suppressing character ('*') that makes the conversion - read input as usual, but does not assign the conversion result. - - Optional maximum field width as decimal integer. - - Optional length modifier specifying the size of the argument (one of "hh", - "ll", or one of the characters "hljztL"). - - Conversion specifier character specifying the type of conversion to be - applied (and the type of the next argument from the argument stack). One - of the characters "diouxXaAeEfFgGcs[pn%". - - LENGTH MODIFIERS - hh For "diouxXn" conversions, the next pointer from the argument stack is - assumed to point to a variable of of char width. - h For "diouxXn" conversions, the next pointer from the argument stack is - assumed to point to a variable of short int width. - l For "diouxXn" conversions, the next pointer from the argument stack is - assumed to point to a variable of long int width. - For "aAeEfFgG" conversions, it is assumed to point to a variable of type - double. - For "cs[" conversions, it is assumed to point to a variable of type - wchar_t. - ll For "diouxXn" conversions, the next pointer from the argument stack is - assumed to point to a variable of long long int width. - j For "diouxXn" conversions, the next pointer from the argument stack is - assumed to point to a variable of intmax_t width. - z For "diouxXn" conversions, the next pointer from the argument stack is - assumed to point to a variable of size_t width. - t For "diouxXn" conversions, the next pointer from the argument stack is - assumed to point to a variable of ptrdiff_t width. - L For "aAeEfFgG" conversions, the next pointer from the argument stack is - assumed to point to a variable of type long double. - Length modifiers appearing for any conversions not mentioned above will have - undefined behaviour. - If a length modifier appears with any conversion specifier other than as - specified above, the behavior is undefined. - - CONVERSION SPECIFIERS - d Matches an (optionally signed) decimal integer of the format expected - by strtol() with base 10. The next pointer from the argument stack is - assumed to point to a signed integer. - i Matches an (optionally signed) integer of the format expected by - strtol() with base 0. The next pointer from the argument stack is - assumed to point to a signed integer. - o Matches an (optionally signed) octal integer of the format expected by - strtoul() with base 8. The next pointer from the argument stack is - assumed to point to an unsigned integer. - u Matches an (optionally signed) decimal integer of the format expected - by strtoul() with base 10. The next pointer from the argument stack is - assumed to point to an unsigned integer. - x Matches an (optionally signed) hexadecimal integer of the format - expected by strtoul() with base 16. The next pointer from the argument - stack is assumed to point to an unsigned integer. - aefg Matches an (optionally signed) floating point number, infinity, or not- - a-number-value of the format expected by strtod(). The next pointer - from the argument stack is assumed to point to a float. - c Matches a number of characters as specified by the field width (default - 1). The next pointer from the argument stack is assumed to point to a - character array large enough to hold that many characters. - If the 'l' length modifier is given, the input is assumed to match a - sequence of multibyte characters (starting in the initial shift state), - which will be converted to a wide character sequence as by successive - calls to mbrtowc() with a mbstate_t object initialized to zero prior to - the first conversion. The next pointer from the argument stack is - assumed to point to a wchar_t array large enough to hold that many - characters. - In either case, note that no '\0' character is added to terminate the - sequence. - s Matches a sequence of non-white-space characters. The next pointer from - the argument stack is assumed to point to a character array large - enough to hold the sequence including terminating '\0' character. - If the 'l' length modifier is given, the input is assumed to match a - sequence of multibyte characters (starting in the initial shift state), - which will be converted to a wide character sequence as by a call to - mbrtowc() with a mbstate_t object initialized to zero prior to the - first conversion. The next pointer from the argument stack is assumed - to point to a wchar_t array large enough to hold the sequence including - terminating '\0' character. - [ Matches a nonempty sequence consisting of any of those characters - specified between itself and a corresponding closing bracket (']'). - If the first character in the list is a circumflex ('^'), this matches - a nonempty sequence consisting of any characters NOT specified. If the - closing bracket appears as the first character in the scanset ("[]" or - "[^]", it is assumed to belong to the scanset, which then ends with the - NEXT closing bracket. - If there is a '-' character in the scanset which is not the first after - the opening bracket (or the circumflex, see above) or the last in the - scanset, behaviour is implementation-defined. This implementation - handles this character like any other. - - The extend of the input field is determined byte-by-byte for the above - conversions ('c', 's', '['), with no special provisions being made for - multibyte characters. The resulting field is nevertheless a multibyte - sequence begining in intial shift state. - - p Matches a sequence of characters as produced by the printf() "%p" - conversion. The next pointer from the argument stack is assumed to - point to a void pointer, which will be filled with the same location - as the pointer used in the printf() statement. Note that behaviour is - undefined if the input value is not the result of an earlier printf() - call. - n Does not read input. The next pointer from the argument stack is - assumed to point to a signed integer, into which the number of - characters read from input so far by this call to fscanf() is stored. - This does not affect the return value of fscanf(). The behaviour, - should an assignment-supressing character of field width be given, - is undefined. - This can be used to test the success of literal matches and suppressed - assignments. - % Matches a single, verbatim '%' character. - - A, E, F, G and X are valid, and equivalent to their lowercase counterparts. - - All conversions except [, c, or n imply that whitespace characters from the - input stream are consumed until a non-whitespace character is encountered. - Such whitespaces do not count against a maximum field width. - - Conversions push at most one character back into the input stream. That - implies that some character sequences converted by the strtol() and strtod() - function families are not converted identically by the scnaf() function - family. - - Returns the number of input items successfully assigned. This can be zero if - an early mismatch occurs. Returns EOF if an input failure occurs before the - first conversion. -*/ -int fscanf( FILE * _PDCLIB_restrict stream, const char * _PDCLIB_restrict format, ... ) _PDCLIB_nothrow; - -/* Equivalent to fprintf( stdout, format, ... ). */ -int printf( const char * _PDCLIB_restrict format, ... ) _PDCLIB_nothrow; - -/* Equivalent to fscanf( stdin, format, ... ). */ -int scanf( const char * _PDCLIB_restrict format, ... ) _PDCLIB_nothrow; - -/* Equivalent to fprintf( stdout, format, ... ), except that the result is - written into the buffer pointed to by s, instead of stdout, and that any - characters beyond the (n-1)th are discarded. The (n)th character is - replaced by a '\0' character in this case. - Returns the number of characters that would have been written (not counting - the terminating '\0' character) if n had been sufficiently large, if - successful, and a negative number if an encoding error ocurred. -*/ -int snprintf( char * _PDCLIB_restrict s, size_t n, const char * _PDCLIB_restrict format, ... ) _PDCLIB_nothrow; - -/* Equivalent to fprintf( stdout, format, ... ), except that the result is - written into the buffer pointed to by s, instead of stdout. -*/ -int sprintf( char * _PDCLIB_restrict s, const char * _PDCLIB_restrict format, ... ) _PDCLIB_nothrow; - -/* Equivalent to fscanf( stdin, format, ... ), except that the input is read - from the buffer pointed to by s, instead of stdin. -*/ -int sscanf( const char * _PDCLIB_restrict s, const char * _PDCLIB_restrict format, ... ) _PDCLIB_nothrow; - -/* Equivalent to fprintf( stream, format, ... ), except that the argument stack - is passed as va_list parameter. Note that va_list is not declared by - . -*/ -int vfprintf( FILE * _PDCLIB_restrict stream, const char * _PDCLIB_restrict format, _PDCLIB_va_list arg ) _PDCLIB_nothrow; - -/* Equivalent to fscanf( stream, format, ... ), except that the argument stack - is passed as va_list parameter. Note that va_list is not declared by - . -*/ -int vfscanf( FILE * _PDCLIB_restrict stream, const char * _PDCLIB_restrict format, _PDCLIB_va_list arg ) _PDCLIB_nothrow; - -/* Equivalent to fprintf( stdout, format, ... ), except that the argument stack - is passed as va_list parameter. Note that va_list is not declared by - . -*/ -int vprintf( const char * _PDCLIB_restrict format, _PDCLIB_va_list arg ) _PDCLIB_nothrow; - -/* Equivalent to fscanf( stdin, format, ... ), except that the argument stack - is passed as va_list parameter. Note that va_list is not declared by - . -*/ -int vscanf( const char * _PDCLIB_restrict format, _PDCLIB_va_list arg ) _PDCLIB_nothrow; - -/* Equivalent to snprintf( s, n, format, ... ), except that the argument stack - is passed as va_list parameter. Note that va_list is not declared by - . - */ -int vsnprintf( char * _PDCLIB_restrict s, size_t n, const char * _PDCLIB_restrict format, _PDCLIB_va_list arg ) _PDCLIB_nothrow; - -/* Equivalent to fprintf( stdout, format, ... ), except that the argument stack - is passed as va_list parameter, and the result is written to the buffer - pointed to by s, instead of stdout. Note that va_list is not declared by - . -*/ -int vsprintf( char * _PDCLIB_restrict s, const char * _PDCLIB_restrict format, _PDCLIB_va_list arg ) _PDCLIB_nothrow; - -/* Equivalent to fscanf( stdin, format, ... ), except that the argument stack - is passed as va_list parameter, and the input is read from the buffer - pointed to by s, instead of stdin. Note that va_list is not declared by - . -*/ -int vsscanf( const char * _PDCLIB_restrict s, const char * _PDCLIB_restrict format, _PDCLIB_va_list arg ) _PDCLIB_nothrow; - -int asprintf(char **strp, const char * _PDCLIB_restrict fmt, ...) _PDCLIB_nothrow; -int vasprintf(char **strp, const char * _PDCLIB_restrict fmt, _PDCLIB_va_list arg) _PDCLIB_nothrow; - -/* Character input/output functions */ - -/* Retrieve the next character from given stream. - Returns the character, EOF otherwise. - If end-of-file is reached, the EOF indicator of the stream is set. - If a read error occurs, the error indicator of the stream is set. -*/ -int fgetc( FILE * stream ) _PDCLIB_nothrow; - -/* Read at most n-1 characters from given stream into the array s, stopping at - \n or EOF. Terminate the read string with \n. If EOF is encountered before - any characters are read, leave the contents of s unchanged. - Returns s if successful, NULL otherwise. - If a read error occurs, the error indicator of the stream is set. In this - case, the contents of s are indeterminate. -*/ -char * fgets( char * _PDCLIB_restrict s, int n, FILE * _PDCLIB_restrict stream ) _PDCLIB_nothrow; - -/* Write the value c (cast to unsigned char) to the given stream. - Returns c if successful, EOF otherwise. - If a write error occurs, sets the error indicator of the stream is set. -*/ -int fputc( int c, FILE * stream ) _PDCLIB_nothrow; - -/* Write the string s (not including the terminating \0) to the given stream. - Returns a value >=0 if successful, EOF otherwise. - This implementation does set the error indicator of the stream if a write - error occurs. -*/ -int fputs( const char * _PDCLIB_restrict s, FILE * _PDCLIB_restrict stream ) _PDCLIB_nothrow; - -/* Equivalent to fgetc( stream ), but may be overloaded by a macro that - evaluates its parameter more than once. -*/ -int getc( FILE * stream ) _PDCLIB_nothrow; - -/* Equivalent to fgetc( stdin ). */ -int getchar( void ) _PDCLIB_nothrow; - -#if _PDCLIB_C_MAX(1999) -/* Read characters from given stream into the array s, stopping at \n or EOF. - The string read is terminated with \0. Returns s if successful. If EOF is - encountered before any characters are read, the contents of s are unchanged, - and NULL is returned. If a read error occurs, the contents of s are indeter- - minate, and NULL is returned. - - This function is dangerous and has been a great source of security - vulnerabilities. Do not use it. It was removed by C11. -*/ -char * gets( char * s ) _PDCLIB_DEPRECATED _PDCLIB_nothrow; -#endif - -/* Equivalent to fputc( c, stream ), but may be overloaded by a macro that - evaluates its parameter more than once. -*/ -int putc( int c, FILE * stream ) _PDCLIB_nothrow; - -/* Equivalent to fputc( c, stdout ), but may be overloaded by a macro that - evaluates its parameter more than once. -*/ -int putchar( int c ) _PDCLIB_nothrow; - -/* Write the string s (not including the terminating \0) to stdout, and append - a newline to the output. Returns a value >= 0 when successful, EOF if a - write error occurred. -*/ -int puts( const char * s ) _PDCLIB_nothrow; - -/* Push the value c (cast to unsigned char) back onto the given (input) stream. - A character pushed back in this way will be delivered by subsequent read - operations (and skipped by subsequent file positioning operations) as if it - has not been read. The external representation of the stream is unaffected - by this pushback (it is a buffer operation). One character of pushback is - guaranteed, further pushbacks may fail. EOF as value for c does not change - the input stream and results in failure of the function. - For text files, the file position indicator is indeterminate until all - pushed-back characters are read. For binary files, the file position - indicator is decremented by each successful call of ungetc(). If the file - position indicator for a binary file was zero before the call of ungetc(), - behaviour is undefined. (Older versions of the library allowed such a call.) - Returns the pushed-back character if successful, EOF if it fails. -*/ -int ungetc( int c, FILE * stream ) _PDCLIB_nothrow; - -/* Direct input/output functions */ - -/* Read up to nmemb elements of given size from given stream into the buffer - pointed to by ptr. Returns the number of elements successfully read, which - may be less than nmemb if a read error or EOF is encountered. If a read - error is encountered, the value of the file position indicator is - indeterminate. If a partial element is read, its value is indeterminate. - If size or nmemb are zero, the function does nothing and returns zero. -*/ -size_t fread( void * _PDCLIB_restrict ptr, size_t size, size_t nmemb, FILE * _PDCLIB_restrict stream ) _PDCLIB_nothrow; - -/* Write up to nmemb elements of given size from buffer pointed to by ptr to - the given stream. Returns the number of elements successfully written, which - will be less than nmemb only if a write error is encountered. If a write - error is encountered, the value of the file position indicator is - indeterminate. If size or nmemb are zero, the function does nothing and - returns zero. -*/ -size_t fwrite( const void * _PDCLIB_restrict ptr, size_t size, size_t nmemb, FILE * _PDCLIB_restrict stream ) _PDCLIB_nothrow; - -/* File positioning functions */ - -/* Store the current position indicator (and, where appropriate, the current - mbstate_t status object) for the given stream into the given pos object. The - actual contents of the object are unspecified, but it can be used as second - parameter to fsetpos() to reposition the stream to the exact position and - parse state at the time fgetpos() was called. - Returns zero if successful, nonzero otherwise. - TODO: Implementation-defined errno setting for fgetpos(). -*/ -int fgetpos( FILE * _PDCLIB_restrict stream, fpos_t * _PDCLIB_restrict pos ) _PDCLIB_nothrow; - -/* Set the position indicator for the given stream to the given offset from: - - the beginning of the file if whence is SEEK_SET, - - the current value of the position indicator if whence is SEEK_CUR, - - end-of-file if whence is SEEK_END. - On text streams, non-zero offsets are only allowed with SEEK_SET, and must - have been returned by ftell() for the same file. - Any characters buffered by ungetc() are dropped, the end-of-file indicator - for the stream is cleared. If the given stream is an update stream, the next - operation after a successful fseek() may be either input or output. - Returns zero if successful, nonzero otherwise. If a read/write error occurs, - the error indicator for the given stream is set. -*/ -int fseek( FILE * stream, long int offset, int whence ) _PDCLIB_nothrow; - -/* Set the position indicator (and, where appropriate the mbstate_t status - object) for the given stream to the given pos object (created by an earlier - call to fgetpos() on the same file). - Any characters buffered by ungetc() are dropped, the end-of-file indicator - for the stream is cleared. If the given stream is an update stream, the next - operation after a successful fsetpos() may be either input or output. - Returns zero if successful, nonzero otherwise. If a read/write error occurs, - the error indicator for the given stream is set. - TODO: Implementation-defined errno setting for fsetpos(). -*/ -int fsetpos( FILE * stream, const fpos_t * pos ) _PDCLIB_nothrow; - -/* Return the current offset of the given stream from the beginning of the - associated file. For text streams, the exact value returned is unspecified - (and may not be equal to the number of characters), but may be used in - subsequent calls to fseek(). - Returns -1L if unsuccessful. - TODO: Implementation-defined errno setting for ftell(). -*/ -long int ftell( FILE * stream ) _PDCLIB_nothrow; - -/* Equivalent to (void)fseek( stream, 0L, SEEK_SET ), except that the error - indicator for the stream is also cleared. -*/ -void rewind( FILE * stream ) _PDCLIB_nothrow; - -/* Error-handling functions */ - -/* Clear the end-of-file and error indicators for the given stream. */ -void clearerr( FILE * stream ) _PDCLIB_nothrow; - -/* Return zero if the end-of-file indicator for the given stream is not set, - nonzero otherwise. -*/ -int feof( FILE * stream ) _PDCLIB_nothrow; - -/* Return zero if the error indicator for the given stream is not set, nonzero - otherwise. -*/ -int ferror( FILE * stream ) _PDCLIB_nothrow; - -/* If s is neither a NULL pointer nor an empty string, print the string to - stderr (with appended colon (':') and a space) first. In any case, print an - error message depending on the current value of errno (being the same as if - strerror( errno ) had been called). -*/ -void perror( const char * s ) _PDCLIB_nothrow; - -/* Unlocked I/O - * - * Since threading was introduced in C11, FILE objects have had implicit locks - * to prevent data races and inconsistent output. - * - * PDCLib provides these functions from POSIX as an extension in order to enable - * users to access the underlying unlocked functions. - * - * For each function defined in C11 where an _unlocked variant is defined below, - * the behaviour of the _unlocked variant is the same except that it will not - * take the lock associated with the stream. - * - * flockfile, ftrylockfile and funlockfile can be used to manually manipulate - * the stream locks. The behaviour of the _unlocked functions if called when the - * stream isn't locked by the calling thread is implementation defined. - */ -#if _PDCLIB_POSIX_MIN(200112L) || _PDCLIB_BSD_SOURCE || _PDCLIB_SVID_SOURCE -void flockfile(FILE *file) _PDCLIB_nothrow; -int ftrylockfile(FILE *file) _PDCLIB_nothrow; -void funlockfile(FILE *file) _PDCLIB_nothrow; - -int getc_unlocked(FILE *stream) _PDCLIB_nothrow; -int getchar_unlocked(void) _PDCLIB_nothrow; -int putc_unlocked(int c, FILE *stream) _PDCLIB_nothrow; -int putchar_unlocked(int c) _PDCLIB_nothrow; -#endif - -#if _PDCLIB_BSD_SOURCE || _PDCLIB_SVID_SOURCE -void clearerr_unlocked(FILE *stream) _PDCLIB_nothrow; -int feof_unlocked(FILE *stream) _PDCLIB_nothrow; -int ferror_unlocked(FILE *stream) _PDCLIB_nothrow; -int fflush_unlocked(FILE *stream) _PDCLIB_nothrow; -int fgetc_unlocked(FILE *stream) _PDCLIB_nothrow; -int fputc_unlocked(int c, FILE *stream) _PDCLIB_nothrow; -size_t fread_unlocked(void *ptr, size_t size, size_t n, FILE *stream) _PDCLIB_nothrow; -size_t fwrite_unlocked(const void *ptr, size_t size, size_t n, FILE *stream) _PDCLIB_nothrow; -#endif - -#if _PDCLIB_GNU_SOURCE -char *fgets_unlocked(char *s, int n, FILE *stream) _PDCLIB_nothrow; -int fputs_unlocked(const char *s, FILE *stream) _PDCLIB_nothrow; -#endif - -#if _PDCLIB_EXTENSIONS -int _vcbprintf( - void *p, - _PDCLIB_size_t ( *cb ) ( void *p, const char *buf, _PDCLIB_size_t size ), - const char *format, - _PDCLIB_va_list arg ); - -int _cbprintf( - void *p, - size_t ( *cb ) ( void *p, const char *buf, size_t size ), - const char *format, - ... ); - -int fgetpos_unlocked( FILE * _PDCLIB_restrict stream, fpos_t * _PDCLIB_restrict pos ) _PDCLIB_nothrow; -int fsetpos_unlocked( FILE * stream, const fpos_t * pos ) _PDCLIB_nothrow; -long int ftell_unlocked( FILE * stream ) _PDCLIB_nothrow; -int fseek_unlocked( FILE * stream, long int offset, int whence ) _PDCLIB_nothrow; -void rewind_unlocked( FILE * stream ) _PDCLIB_nothrow; - -int puts_unlocked( const char * s ) _PDCLIB_nothrow; -int ungetc_unlocked( int c, FILE * stream ) _PDCLIB_nothrow; - -int printf_unlocked( const char * _PDCLIB_restrict format, ... ) _PDCLIB_nothrow; -int vprintf_unlocked( const char * _PDCLIB_restrict format, _PDCLIB_va_list arg ) _PDCLIB_nothrow; -int fprintf_unlocked( FILE * _PDCLIB_restrict stream, const char * _PDCLIB_restrict format, ... ) _PDCLIB_nothrow; -int vfprintf_unlocked( FILE * _PDCLIB_restrict stream, const char * _PDCLIB_restrict format, _PDCLIB_va_list arg ) _PDCLIB_nothrow; -int scanf_unlocked( const char * _PDCLIB_restrict format, ... ) _PDCLIB_nothrow; -int vscanf_unlocked( const char * _PDCLIB_restrict format, _PDCLIB_va_list arg ) _PDCLIB_nothrow; -int fscanf_unlocked( FILE * _PDCLIB_restrict stream, const char * _PDCLIB_restrict format, ... ) _PDCLIB_nothrow; -int vfscanf_unlocked( FILE * _PDCLIB_restrict stream, const char * _PDCLIB_restrict format, _PDCLIB_va_list arg ) _PDCLIB_nothrow; - -// Todo: remove prefix? -_PDCLIB_uint_fast64_t _PDCLIB_ftell64( FILE * stream ) _PDCLIB_nothrow; -_PDCLIB_uint_fast64_t _PDCLIB_ftell64_unlocked( FILE * stream ) _PDCLIB_nothrow; -#endif - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/waterbox/libc/includes/stdlib.h b/waterbox/libc/includes/stdlib.h deleted file mode 100644 index b3a92bd461..0000000000 --- a/waterbox/libc/includes/stdlib.h +++ /dev/null @@ -1,351 +0,0 @@ -/* General utilities - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#ifndef _PDCLIB_STDLIB_H -#define _PDCLIB_STDLIB_H _PDCLIB_STDLIB_H -#include "_PDCLIB_int.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef _PDCLIB_SIZE_T_DEFINED -#define _PDCLIB_SIZE_T_DEFINED _PDCLIB_SIZE_T_DEFINED -typedef _PDCLIB_size_t size_t; -#endif - -#ifndef _PDCLIB_NULL_DEFINED -#define _PDCLIB_NULL_DEFINED _PDCLIB_NULL_DEFINED -#define NULL _PDCLIB_NULL -#endif - -#ifndef __cplusplus - -#ifndef _PDCLIB_WCHAR_T_DEFINED -#define _PDCLIB_WCHAR_T_DEFINED _PDCLIB_WCHAR_T_DEFINED -typedef _PDCLIB_wchar_t wchar_t; -#endif - -#endif - -#ifndef _PDCLIB_MB_CUR_MAX_DEFINED -#define _PDCLIB_MB_CUR_MAX_DEFINED -#define MB_CUR_MAX (_PDCLIB_mb_cur_max()) -#endif - -/* Numeric conversion functions */ - -/* TODO: atof(), strtof(), strtod(), strtold() */ - -double atof( const char * nptr ) _PDCLIB_nothrow; -double strtod( const char * _PDCLIB_restrict nptr, char * * _PDCLIB_restrict endptr ) _PDCLIB_nothrow; -float strtof( const char * _PDCLIB_restrict nptr, char * * _PDCLIB_restrict endptr ) _PDCLIB_nothrow; -long double strtold( const char * _PDCLIB_restrict nptr, char * * _PDCLIB_restrict endptr ) _PDCLIB_nothrow; - -/* Seperate the character array nptr into three parts: A (possibly empty) - sequence of whitespace characters, a character representation of an integer - to the given base, and trailing invalid characters (including the terminating - null character). If base is 0, assume it to be 10, unless the integer - representation starts with 0x / 0X (setting base to 16) or 0 (setting base to - 8). If given, base can be anything from 0 to 36, using the 26 letters of the - base alphabet (both lowercase and uppercase) as digits 10 through 35. - The integer representation is then converted into the return type of the - function. It can start with a '+' or '-' sign. If the sign is '-', the result - of the conversion is negated. - If the conversion is successful, the converted value is returned. If endptr - is not a NULL pointer, a pointer to the first trailing invalid character is - returned in *endptr. - If no conversion could be performed, zero is returned (and nptr in *endptr, - if endptr is not a NULL pointer). If the converted value does not fit into - the return type, the functions return LONG_MIN, LONG_MAX, ULONG_MAX, - LLONG_MIN, LLONG_MAX, or ULLONG_MAX respectively, depending on the sign of - the integer representation and the return type, and errno is set to ERANGE. -*/ -/* There is strtoimax() and strtoumax() in operating on intmax_t / - uintmax_t, if the long long versions do not suit your needs. -*/ -long int strtol( const char * _PDCLIB_restrict nptr, char * * _PDCLIB_restrict endptr, int base ) _PDCLIB_nothrow; -long long int strtoll( const char * _PDCLIB_restrict nptr, char * * _PDCLIB_restrict endptr, int base ) _PDCLIB_nothrow; -unsigned long int strtoul( const char * _PDCLIB_restrict nptr, char * * _PDCLIB_restrict endptr, int base ) _PDCLIB_nothrow; -unsigned long long int strtoull( const char * _PDCLIB_restrict nptr, char * * _PDCLIB_restrict endptr, int base ) _PDCLIB_nothrow; - -/* These functions are the equivalent of (int)strtol( nptr, NULL, 10 ), - strtol( nptr, NULL, 10 ) and strtoll(nptr, NULL, 10 ) respectively, with the - exception that they do not have to handle overflow situations in any defined - way. - (PDCLib does not simply forward these to their strtox() equivalents, but - provides a simpler atox() function that saves a couple of tests and simply - continues with the conversion in case of overflow.) -*/ -int atoi( const char * nptr ) _PDCLIB_nothrow; -long int atol( const char * nptr ) _PDCLIB_nothrow; -long long int atoll( const char * nptr ) _PDCLIB_nothrow; - -/* Pseudo-random sequence generation functions */ - -extern unsigned long int _PDCLIB_seed; - -#define RAND_MAX 32767 - -/* Returns the next number in a pseudo-random sequence, which is between 0 and - RAND_MAX. - (PDCLib uses the implementation suggested by the standard document, which is - next = next * 1103515245 + 12345; return (unsigned int)(next/65536) % 32768;) -*/ -int rand( void ) _PDCLIB_nothrow; - -/* Initialize a new pseudo-random sequence with the starting seed. Same seeds - result in the same pseudo-random sequence. The default seed is 1. -*/ -void srand( unsigned int seed ) _PDCLIB_nothrow; - -/* Memory management functions */ - -/* Allocate a chunk of memory of given size. If request could not be - satisfied, return NULL. Otherwise, return a pointer to the allocated - memory. Memory contents are undefined. -*/ -void * malloc( size_t size ) _PDCLIB_nothrow; - -/* Allocate a chunk of memory that is large enough to hold nmemb elements of - the given size, and zero-initialize that memory. If request could not be - satisfied, return NULL. Otherwise, return a pointer to the allocated - memory. -*/ -void * calloc( size_t nmemb, size_t size ) _PDCLIB_nothrow; - -/* Allocate a chunk of memory of given size, with specified alignment (which - must be a power of two; if it is not, the next greater power of two is - used). If request could not be satisfied, return NULL. Otherwise, return - a pointer to the allocated memory. -*/ -void * aligned_alloc( size_t alignment, size_t size ) _PDCLIB_nothrow; - -/* De-allocate a chunk of heap memory previously allocated using malloc(), - calloc(), or realloc(), and pointed to by ptr. If ptr does not match a - pointer previously returned by the mentioned allocation functions, or - free() has already been called for this ptr, behaviour is undefined. -*/ -void free( void * ptr ) _PDCLIB_nothrow; - -/* Resize a chunk of memory previously allocated with malloc() and pointed to - by ptr to the given size (which might be larger or smaller than the original - size). Returns a pointer to the reallocated memory, or NULL if the request - could not be satisfied. Note that the resizing might include a memcpy() - from the original location to a different one, so the return value might or - might not equal ptr. If size is larger than the original size, the value of - memory beyond the original size is undefined. If ptr is NULL, realloc() - behaves like malloc(). -*/ -void * realloc( void * ptr, size_t size ) _PDCLIB_nothrow; - -/* Communication with the environment */ - -/* These two can be passed to exit() or _Exit() as status values, to signal - successful and unsuccessful program termination, respectively. EXIT_SUCCESS - can be replaced by 0. How successful or unsuccessful program termination are - signaled to the environment, and what happens if exit() or _Exit() are being - called with a value that is neither of the three, is defined by the hosting - OS and its glue function. -*/ -#define EXIT_SUCCESS _PDCLIB_SUCCESS -#define EXIT_FAILURE _PDCLIB_FAILURE - -/* Initiate abnormal process termination, unless programm catches SIGABRT and - does not return from the signal handler. - This implementantion flushes all streams, closes all files, and removes any - temporary files before exiting with EXIT_FAILURE. - abort() does not return. -*/ -_PDCLIB_noreturn void abort( void ) _PDCLIB_nothrow; - -/* Register a function that will be called on exit(), or when main() returns. - At least 32 functions can be registered this way, and will be called in - reverse order of registration (last-in, first-out). - Returns zero if registration is successfull, nonzero if it failed. -*/ -int atexit( void (*func)( void ) ) _PDCLIB_nothrow; - -/* Register a function that will be called on quick_exit(), or when main() returns. - At least 32 functions can be registered this way, and will be called in - reverse order of registration (last-in, first-out). - Returns zero if registration is successfull, nonzero if it failed. -*/ -int at_quick_exit( void (*func)( void ) ) _PDCLIB_nothrow; - -/* Normal process termination. Functions registered by atexit() (see above) are - called, streams flushed, files closed and temporary files removed before the - program is terminated with the given status. (See comment for EXIT_SUCCESS - and EXIT_FAILURE above.) - exit() does not return. -*/ -_PDCLIB_noreturn void exit( int status ) _PDCLIB_nothrow; - -/* Normal process termination. Functions registered by atexit() (see above) are - NOT CALLED. This implementation DOES flush streams, close files and removes - temporary files before the program is teminated with the given status. (See - comment for EXIT_SUCCESS and EXIT_FAILURE above.) - _Exit() does not return. -*/ -_PDCLIB_noreturn void _Exit( int status ) _PDCLIB_nothrow; - -/* Quick process termination. Functions registered by at_quick_exit() (see - above) are called, and the process terminated. No functions registered - with atexit() (see above) or signal handlers are called. - quick_exit() does not return. -*/ -_PDCLIB_noreturn void quick_exit( int status ); - -/* Search an environment-provided key-value map for the given key name, and - return a pointer to the associated value string (or NULL if key name cannot - be found). The value string pointed to might be overwritten by a subsequent - call to getenv(). The library never calls getenv() itself. - Details on the provided keys and how to set / change them are determined by - the hosting OS and its glue function. -*/ -char * getenv( const char * name ) _PDCLIB_nothrow; - -/* If string is a NULL pointer, system() returns nonzero if a command processor - is available, and zero otherwise. If string is not a NULL pointer, it is - passed to the command processor. If system() returns, it does so with a - value that is determined by the hosting OS and its glue function. -*/ -int system( const char * string ) _PDCLIB_nothrow; - -/* Searching and sorting */ - -/* Do a binary search for a given key in the array with a given base pointer, - which consists of nmemb elements that are of the given size each. To compare - the given key with an element from the array, the given function compar is - called (with key as first parameter and a pointer to the array member as - second parameter); the function should return a value less than, equal to, - or greater than 0 if the key is considered to be less than, equal to, or - greater than the array element, respectively. - The function returns a pointer to the first matching element found, or NULL - if no match is found. - - ** May throw ** -*/ -void * bsearch( const void * key, const void * base, size_t nmemb, size_t size, int (*compar)( const void *, const void * ) ); - -/* Do a quicksort on an array with a given base pointer, which consists of - nmemb elements that are of the given size each. To compare two elements from - the array, the given function compar is called, which should return a value - less than, equal to, or greater than 0 if the first argument is considered - to be less than, equal to, or greater than the second argument, respectively. - If two elements are compared equal, their order in the sorted array is not - specified. - - ** May throw ** -*/ -void qsort( void * base, size_t nmemb, size_t size, int (*compar)( const void *, const void * ) ); - -/* Integer arithmetic functions */ - -/* Return the absolute value of the argument. Note that on machines using two- - complement's notation (most modern CPUs), the largest negative value cannot - be represented as positive value. In this case, behaviour is unspecified. -*/ -int abs( int j ) _PDCLIB_nothrow; -long int labs( long int j ) _PDCLIB_nothrow; -long long int llabs( long long int j ) _PDCLIB_nothrow; - -/* These structures each have a member quot and a member rem, of type int (for - div_t), long int (for ldiv_t) and long long it (for lldiv_t) respectively. - The order of the members is platform-defined to allow the div() functions - below to be implemented efficiently. -*/ -typedef struct _PDCLIB_div_t div_t; -typedef struct _PDCLIB_ldiv_t ldiv_t; -typedef struct _PDCLIB_lldiv_t lldiv_t; - -/* Return quotient (quot) and remainder (rem) of an integer division in one of - the structs above. -*/ -div_t div( int numer, int denom ) _PDCLIB_nothrow; -ldiv_t ldiv( long int numer, long int denom ) _PDCLIB_nothrow; -lldiv_t lldiv( long long int numer, long long int denom ) _PDCLIB_nothrow; - -/* Multibyte / wide character conversion functions */ - -/* Affected by LC_CTYPE of the current locale. For state-dependent encoding, - each function is placed into its initial conversion state at program - startup, and can be returned to that state by a call with its character - pointer argument s being a null pointer. - Changing LC_CTYPE causes the conversion state to become indeterminate. -*/ - -/* If s is not a null pointer, returns the number of bytes contained in the - multibyte character pointed to by s (if the next n or fewer bytes form a - valid multibyte character); -1, if they don't; or 0, if s points to the - null character. - If s is a null pointer, returns nonzero if multibyte encodings in the - current locale are stateful, and zero otherwise. -*/ -int mblen( const char * s, size_t n ); - -/* If s is not a null pointer, and the next n bytes (maximum) form a valid - multibyte character sequence (possibly including shift sequences), the - corresponding wide character is stored in pwc (unless that is a null - pointer). If the wide character is the null character, the function is - left in the initial conversion state. - Returns the number of bytes in the consumed multibyte character sequence; - or 0, if the resulting wide character is the null character. If the next - n bytes do not form a valid sequence, returns -1. - In no case will the returned value be greater than n or MB_CUR_MAX. - If s is a null pointer, returns nonzero if multibyte encodings in the - current locale are stateful, and zero otherwise. -*/ -int mbtowc( wchar_t * _PDCLIB_restrict pwc, const char * _PDCLIB_restrict s, size_t n ); - -/* Converts the wide character wc into the corresponding multibyte character - sequence (including shift sequences). If s is not a null pointer, the - multibyte sequence (at most MB_CUR_MAX characters) is stored at that - location. If wc is a null character, a null byte is stored, preceded by - any shift sequence needed to restore the initial shift state, and the - function is left in the initial conversion state. - Returns the number of bytes in the generated multibyte character sequence. - If wc does not correspond to a valid multibyte character, returns -1. - In no case will the returned value be greater than MB_CUR_MAX. - If s is a null pointer, returns nonzero if multibyte encodings in the - current locale are stateful, and zero otherwise. -*/ -int wctomb( char * s, wchar_t wc ); - -/* Convert a sequence of multibyte characters beginning in the initial shift - state from the array pointed to by s into the corresponding wide character - sequence, storing no more than n wide characters into pwcs. A null - character is converted into a null wide character, and marks the end of - the multibyte character sequence. - If copying takes place between objects that overlap, behaviour is - undefined. - Returns (size_t)-1 if an invalid multibyte sequence is encountered. - Otherwise, returns the number of array elements modified, not including - a terminating null wide character, if any. (Target string will not be - null terminated if the return value equals n.) -*/ -size_t mbstowcs( wchar_t * _PDCLIB_restrict pwcs, const char * _PDCLIB_restrict s, size_t n ); - -/* Convert a sequence of wide characters from the array pointed to by pwcs - into a sequence of corresponding multibyte characters, beginning in the - initial shift state, storing them in the array pointed to by s, stopping - if the next multibyte character would exceed the limit of n total bytes - or a null character is stored. - If copying takes place between objects that overlap, behaviour is - undefined. - Returns (size_t)-1 if a wide character is encountered that does not - correspond to a valid multibyte character. Otherwise, returns the number - of array elements modified, not including a terminating null character, - if any. (Target string will not be null terminated if the return value - equals n.) -*/ -size_t wcstombs( char * _PDCLIB_restrict s, const wchar_t * _PDCLIB_restrict pwcs, size_t n ); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/waterbox/libc/includes/stdnoreturn.h b/waterbox/libc/includes/stdnoreturn.h deleted file mode 100644 index 8c1814328f..0000000000 --- a/waterbox/libc/includes/stdnoreturn.h +++ /dev/null @@ -1,12 +0,0 @@ -/* _Noreturn - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#ifndef _PDCLIB_STDNORETURN_H -#define _PDCLIB_STDNORETURN_H _PDCLIB_STDNORETURN_H - -#define noreturn _Noreturn - -#endif diff --git a/waterbox/libc/includes/string.h b/waterbox/libc/includes/string.h deleted file mode 100644 index 8e4db1e282..0000000000 --- a/waterbox/libc/includes/string.h +++ /dev/null @@ -1,216 +0,0 @@ -/* String handling - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#ifndef _PDCLIB_STRING_H -#define _PDCLIB_STRING_H _PDCLIB_STRING_H -#include "_PDCLIB_int.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef _PDCLIB_SIZE_T_DEFINED -#define _PDCLIB_SIZE_T_DEFINED _PDCLIB_SIZE_T_DEFINED -typedef _PDCLIB_size_t size_t; -#endif - -#ifndef _PDCLIB_NULL_DEFINED -#define _PDCLIB_NULL_DEFINED _PDCLIB_NULL_DEFINED -#define NULL _PDCLIB_NULL -#endif - -/* String function conventions */ - -/* - In any of the following functions taking a size_t n to specify the length of - an array or size of a memory region, n may be 0, but the pointer arguments to - the call shall still be valid unless otherwise stated. -*/ - -/* Copying functions */ - -/* Copy a number of n characters from the memory area pointed to by s2 to the - area pointed to by s1. If the two areas overlap, behaviour is undefined. - Returns the value of s1. -*/ -void * memcpy( void * _PDCLIB_restrict s1, const void * _PDCLIB_restrict s2, size_t n ) _PDCLIB_nothrow; - -/* Copy a number of n characters from the memory area pointed to by s2 to the - area pointed to by s1. The two areas may overlap. - Returns the value of s1. -*/ -void * memmove( void * s1, const void * , size_t n ) _PDCLIB_nothrow; - -/* Copy the character array s2 (including terminating '\0' byte) into the - character array s1. - Returns the value of s1. -*/ -char * strcpy( char * _PDCLIB_restrict s1, const char * _PDCLIB_restrict s2 ) _PDCLIB_nothrow; - -/* Copy a maximum of n characters from the character array s2 into the character - array s1. If s2 is shorter than n characters, '\0' bytes will be appended to - the copy in s1 until n characters have been written. If s2 is longer than n - characters, NO terminating '\0' will be written to s1. If the arrays overlap, - behaviour is undefined. - Returns the value of s1. -*/ -char * strncpy( char * _PDCLIB_restrict s1, const char * _PDCLIB_restrict s2, size_t n ) _PDCLIB_nothrow; - -/* Concatenation functions */ - -/* Append the contents of the character array s2 (including terminating '\0') to - the character array s1 (first character of s2 overwriting the '\0' of s1). If - the arrays overlap, behaviour is undefined. - Returns the value of s1. -*/ -char * strcat( char * _PDCLIB_restrict s1, const char * _PDCLIB_restrict s2 ) _PDCLIB_nothrow; - -/* Append a maximum of n characters from the character array s1 to the character - array s1 (first character of s2 overwriting the '\0' of s1). A terminating - '\0' is ALWAYS appended, even if the full n characters have already been - written. If the arrays overlap, behaviour is undefined. - Returns the value of s1. -*/ -char * strncat( char * _PDCLIB_restrict s1, const char * _PDCLIB_restrict s2, size_t n ) _PDCLIB_nothrow; - -/* Comparison functions */ - -/* Compare the first n characters of the memory areas pointed to by s1 and s2. - Returns 0 if s1 == s2, a negative number if s1 < s2, and a positive number if - s1 > s2. -*/ -int memcmp( const void * s1, const void * s2, size_t n ) _PDCLIB_nothrow; - -/* Compare the character arrays s1 and s2. - Returns 0 if s1 == s2, a negative number if s1 < s2, and a positive number if - s1 > s2. -*/ -int strcmp( const char * s1, const char * s2 ) _PDCLIB_nothrow; - -/* Compare the character arrays s1 and s2, interpreted as specified by the - LC_COLLATE category of the current locale. - Returns 0 if s1 == s2, a negative number if s1 < s2, and a positive number if - s1 > s2. - TODO: Currently a dummy wrapper for strcmp() as PDCLib does not yet support - locales. -*/ -int strcoll( const char * s1, const char * s2 ) _PDCLIB_nothrow; - -/* Compare no more than the first n characters of the character arrays s1 and - s2. - Returns 0 if s1 == s2, a negative number if s1 < s2, and a positive number if - s1 > s2. -*/ -int strncmp( const char * s1, const char * s2, size_t n ) _PDCLIB_nothrow; - -/* Transform the character array s2 as appropriate for the LC_COLLATE setting of - the current locale. If length of resulting string is less than n, store it in - the character array pointed to by s1. Return the length of the resulting - string. -*/ -size_t strxfrm( char * _PDCLIB_restrict s1, const char * _PDCLIB_restrict s2, size_t n ) _PDCLIB_nothrow; - -/* Search functions */ - -/* Search the first n characters in the memory area pointed to by s for the - character c (interpreted as unsigned char). - Returns a pointer to the first instance found, or NULL. -*/ -void * memchr( const void * s, int c, size_t n ) _PDCLIB_nothrow; - -/* Search the character array s (including terminating '\0') for the character c - (interpreted as char). - Returns a pointer to the first instance found, or NULL. -*/ -char * strchr( const char * s, int c ) _PDCLIB_nothrow; - -/* Determine the length of the initial substring of character array s1 which - consists only of characters not from the character array s2. - Returns the length of that substring. -*/ -size_t strcspn( const char * s1, const char * s2 ) _PDCLIB_nothrow; - -/* Search the character array s1 for any character from the character array s2. - Returns a pointer to the first occurrence, or NULL. -*/ -char * strpbrk( const char * s1, const char * s2 ) _PDCLIB_nothrow; - -/* Search the character array s (including terminating '\0') for the character c - (interpreted as char). - Returns a pointer to the last instance found, or NULL. -*/ -char * strrchr( const char * s, int c ) _PDCLIB_nothrow; - -/* Determine the length of the initial substring of character array s1 which - consists only of characters from the character array s2. - Returns the length of that substring. -*/ -size_t strspn( const char * s1, const char * s2 ) _PDCLIB_nothrow; - -/* Search the character array s1 for the substring in character array s2. - Returns a pointer to that sbstring, or NULL. If s2 is of length zero, - returns s1. -*/ -char * strstr( const char * s1, const char * s2 ) _PDCLIB_nothrow; - -/* In a series of subsequent calls, parse a C string into tokens. - On the first call to strtok(), the first argument is a pointer to the to-be- - parsed C string. On subsequent calls, the first argument is NULL unless you - want to start parsing a new string. s2 holds an array of seperator characters - which can differ from call to call. Leading seperators are skipped, the first - trailing seperator overwritten with '\0'. - Returns a pointer to the next token. - WARNING: This function uses static storage, and as such is not reentrant. -*/ -char * strtok( char * _PDCLIB_restrict s1, const char * _PDCLIB_restrict s2 ) _PDCLIB_nothrow; - -/* Miscellaneous functions */ - -/* Write the character c (interpreted as unsigned char) to the first n - characters of the memory area pointed to by s. - Returns s. -*/ -void * memset( void * s, int c, size_t n ) _PDCLIB_nothrow; - -/* Map an error number to a (locale-specific) error message string. Error - numbers are typically errno values, but any number is mapped to a message. - TODO: PDCLib does not yet support locales. -*/ -char * strerror( int errnum ) _PDCLIB_nothrow; - -/* Returns the length of the string s (excluding terminating '\0'). -*/ -size_t strlen( const char * s ) _PDCLIB_nothrow; - -#if _PDCLIB_POSIX_MIN(2008098L) -/* Returns the length of the string s (excluding terminating '\0') or maxlen if - * no terminating '\0' is found in the first maxlen characters. - */ -size_t strnlen( const char * s, size_t maxlen ) _PDCLIB_nothrow; -#endif - -#if _PDCLIB_POSIX_MIN(2008098L) || _PDCLIB_XOPEN_MIN(0) -char * strdup( const char* src ) _PDCLIB_nothrow; -char * strndup( const char* src, size_t n ) _PDCLIB_nothrow; -#endif - -#if _PDCLIB_BSD_SOURCE -size_t strlcpy( - char *_PDCLIB_restrict _Dst, - const char *_PDCLIB_restrict _Src, - size_t _DstSize) _PDCLIB_nothrow; - -size_t strlcat( - char *_PDCLIB_restrict _Dst, - const char *_PDCLIB_restrict _Src, - size_t _DstSize) _PDCLIB_nothrow; -#endif - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/waterbox/libc/includes/threads.h b/waterbox/libc/includes/threads.h deleted file mode 100644 index d3786a2326..0000000000 --- a/waterbox/libc/includes/threads.h +++ /dev/null @@ -1,116 +0,0 @@ -/* Threads - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#ifndef _PDCLIB_THREADS_H -#define _PDCLIB_THREADS_H _PDCLIB_THREADS_H -#include "_PDCLIB_int.h" -#include "_PDCLIB_threadconfig.h" - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#define thread_local _Thread_local - -typedef _PDCLIB_once_flag once_flag; - -enum -{ - mtx_plain = 0, - mtx_recursive = (1 << 0), - mtx_timed = (1 << 1), - - _PDCLIB_mtx_valid_mask = mtx_recursive | mtx_timed -}; - -enum -{ - thrd_success = 0, - thrd_timeout = 1, - thrd_busy = 2, - thrd_error = 3, - thrd_nomem = 4, -}; - -#define ONCE_FLAG_INIT _PDCLIB_ONCE_FLAG_INIT -#ifdef _PDCLIB_ONCE_FLAG_IS_DONE -static inline void call_once( once_flag * flag, void (*func)( void ) ) -{ - if ( ! _PDCLIB_ONCE_FLAG_IS_DONE( flag ) ) - { - _PDCLIB_call_once( flag, func ); - } -} -#else -void call_once( once_flag * flag, void (*func)( void ) ); -#endif - -#ifdef _PDCLIB_MTX_T -typedef _PDCLIB_MTX_T mtx_t; -void mtx_destroy( mtx_t * mtx ) _PDCLIB_nothrow; -int mtx_init( mtx_t * mtx, int type ) _PDCLIB_nothrow; -int mtx_lock( mtx_t * mtx ) _PDCLIB_nothrow; -int mtx_timedlock( mtx_t * _PDCLIB_restrict mtx, const struct timespec * _PDCLIB_restrict ts ) _PDCLIB_nothrow; -int mtx_trylock( mtx_t * mtx ) _PDCLIB_nothrow; -int mtx_unlock( mtx_t * mtx ) _PDCLIB_nothrow; -#endif - -#ifdef _PDCLIB_CND_T -typedef _PDCLIB_CND_T cnd_t; -int cnd_broadcast( cnd_t * cond ) _PDCLIB_nothrow; -void cnd_destroy( cnd_t * cond ) _PDCLIB_nothrow; -int cnd_init( cnd_t * cond ) _PDCLIB_nothrow; -int cnd_signal( cnd_t * cond ) _PDCLIB_nothrow; -int cnd_timedwait( cnd_t *_PDCLIB_restrict cond, mtx_t * _PDCLIB_restrict mtx, const struct timespec * _PDCLIB_restrict ts ) _PDCLIB_nothrow; -int cnd_wait( cnd_t * cond, mtx_t * mtx ) _PDCLIB_nothrow; -#endif - -#ifdef _PDCLIB_THRD_T -#define _PDCLIB_THRD_HAVE_MISC -typedef _PDCLIB_THRD_T thrd_t; -typedef int (*thrd_start_t)( void * ); - -int thrd_create( thrd_t * thr, thrd_start_t func, void * arg ) _PDCLIB_nothrow; -thrd_t thrd_current( void ) _PDCLIB_nothrow; -int thrd_detach( thrd_t thr ) _PDCLIB_nothrow; -int thrd_equal( thrd_t thr0, thrd_t thr1 ) _PDCLIB_nothrow; - -/* Not nothrow: systems may use exceptions at thread exit */ -_PDCLIB_noreturn void thrd_exit( int res ); -/* Not nothrow: systems may potentially propogate exceptions out of thrd_join? */ -int thrd_join( thrd_t thr, int * res ); -#endif - -#ifdef _PDCLIB_THRD_HAVE_MISC -int thrd_sleep( const struct timespec * duration, struct timespec * remaining ) _PDCLIB_nothrow; -void thrd_yield( void ) _PDCLIB_nothrow; -#endif - -/* The behaviour of tss_t is woefully underspecified in the C11 standard. In - particular, it never specifies where/when/if destructors are called. - - In lieu of any clarification, we assume the behaviour of POSIX pthread_key_t -*/ - -#ifdef _PDCLIB_TSS_T -#define TSS_DTOR_ITERATIONS _PDCLIB_TSS_DTOR_ITERATIONS - -typedef _PDCLIB_TSS_T tss_t; -typedef void (*tss_dtor_t)( void * ); - -int tss_create( tss_t * key, tss_dtor_t dtor ) _PDCLIB_nothrow; -void tss_delete( tss_t key ) _PDCLIB_nothrow; -void * tss_get( tss_t key ) _PDCLIB_nothrow; -int tss_set( tss_t key, void * val ) _PDCLIB_nothrow; -#endif - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/waterbox/libc/includes/time.h b/waterbox/libc/includes/time.h deleted file mode 100644 index a2b659688c..0000000000 --- a/waterbox/libc/includes/time.h +++ /dev/null @@ -1,81 +0,0 @@ -/* Date and time - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#ifndef _PDCLIB_TIME_H -#define _PDCLIB_TIME_H _PDCLIB_TIME_H -#include "_PDCLIB_aux.h" -#include "_PDCLIB_int.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef _PDCLIB_SIZE_T_DEFINED -#define _PDCLIB_SIZE_T_DEFINED _PDCLIB_SIZE_T_DEFINED -typedef _PDCLIB_size_t size_t; -#endif - -#ifndef _PDCLIB_NULL_DEFINED -#define _PDCLIB_NULL_DEFINED _PDCLIB_NULL_DEFINED -#define NULL _PDCLIB_NULL -#endif - -typedef _PDCLIB_time_t time_t; -typedef _PDCLIB_clock_t clock_t; - -#define CLOCKS_PER_SEC _PDCLIB_CLOCKS_PER_SEC -#define TIME_UTC _PDCLIB_TIME_UTC - -struct timespec -{ - time_t tv_sec; - long tv_nsec; -}; - -struct tm -{ - int tm_sec; /* 0-60 */ - int tm_min; /* 0-59 */ - int tm_hour; /* 0-23 */ - int tm_mday; /* 1-31 */ - int tm_mon; /* 0-11 */ - int tm_year; /* years since 1900 */ - int tm_wday; /* 0-6 */ - int tm_yday; /* 0-365 */ - int tm_isdst; /* >0 DST, 0 no DST, <0 information unavailable */ -}; - -/* Returns the number of "clocks" in processor time since the invocation - of the program. Divide by CLOCKS_PER_SEC to get the value in seconds. - Returns -1 if the value cannot be represented in the return type or is - not available. -*/ -clock_t clock( void ) _PDCLIB_nothrow; - -/* Returns the difference between two calendar times in seconds. */ -double difftime( time_t time1, time_t time0 ) _PDCLIB_nothrow; - -time_t mktime( struct tm * timeptr ) _PDCLIB_nothrow; - -time_t time( time_t * timer ) _PDCLIB_nothrow; - -int timespec_get( struct timespec * ts, int base ) _PDCLIB_nothrow; - -char * asctime( const struct tm * timeptr ) _PDCLIB_nothrow; - -char * ctime( const time_t * timer ) _PDCLIB_nothrow; - -struct tm * gmtime( const time_t * timer ) _PDCLIB_nothrow; - -struct tm * localtime( const time_t * timer ) _PDCLIB_nothrow; - -size_t strftime( char * _PDCLIB_restrict s, size_t maxsize, const char * _PDCLIB_restrict format, const struct tm * _PDCLIB_restrict timeptr ); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/waterbox/libc/includes/uchar.h b/waterbox/libc/includes/uchar.h deleted file mode 100644 index c061113e08..0000000000 --- a/waterbox/libc/includes/uchar.h +++ /dev/null @@ -1,68 +0,0 @@ -/* Unicode utilities - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#ifndef _PDCLIB_UCHAR_H -#define _PDCLIB_UCHAR_H _PDCLIB_UCHAR_H -#include "_PDCLIB_int.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef _PDCLIB_SIZE_T_DEFINED -#define _PDCLIB_SIZE_T_DEFINED _PDCLIB_SIZE_T_DEFINED -typedef _PDCLIB_size_t size_t; -#endif - -#ifndef _PDCLIB_MBSTATE_T_DEFINED -#define _PDCLIB_MBSTATE_T_DEFINED _PDCLIB_MBSTATE_T_DEFINED -typedef _PDCLIB_mbstate_t mbstate_t; -#endif - -#ifndef __cplusplus - -/* These are built-in types in C++ */ - -#ifndef _PDCLIB_CHAR16_T_DEFINED -#define _PDCLIB_CHAR16_T_DEFINED _PDCLIB_CHAR16_T_DEFINED -typedef _PDCLIB_uint_least16_t char16_t; -#endif - -#ifndef _PDCLIB_CHAR32_T_DEFINED -#define _PDCLIB_CHAR32_T_DEFINED _PDCLIB_CHAR32_T_DEFINED -typedef _PDCLIB_uint_least32_t char32_t; -#endif - -#endif - -size_t mbrtoc16( char16_t * _PDCLIB_restrict pc16, const char * _PDCLIB_restrict s, size_t n, mbstate_t * _PDCLIB_restrict ps ); - -size_t c16rtomb( char * _PDCLIB_restrict s, char16_t c16, mbstate_t * _PDCLIB_restrict ps ); - -size_t mbrtoc32( char32_t * _PDCLIB_restrict pc32, const char * _PDCLIB_restrict s, size_t n, mbstate_t * _PDCLIB_restrict ps); - -size_t c32rtomb( char * _PDCLIB_restrict s, char32_t c32, mbstate_t * _PDCLIB_restrict ps); - -#if defined(_PDCLIB_EXTENSIONS) - -/* Analogous to strlen() / wcslen() */ - -size_t _PDCLIB_c16slen( const char16_t * str ); - -size_t _PDCLIB_c32slen( const char32_t * str ); - -/* String generalizations of the above functions */ - -size_t _PDCLIB_mbsrtoc16s( char16_t * _PDCLIB_restrict dst, const char * * _PDCLIB_restrict src, size_t len, mbstate_t * _PDCLIB_restrict ps ); - -size_t _PDCLIB_mbsrtoc32s( char32_t * _PDCLIB_restrict dst, const char * * _PDCLIB_restrict src, size_t len, mbstate_t * _PDCLIB_restrict ps ); - -size_t _PDCLIB_c16srtombs( char * _PDCLIB_restrict dst, const char16_t * * _PDCLIB_restrict src, size_t len, mbstate_t * _PDCLIB_restrict ps ); - -size_t _PDCLIB_c32srtombs( char * _PDCLIB_restrict dst, const char32_t * * _PDCLIB_restrict src, size_t len, mbstate_t * _PDCLIB_restrict ps ); -#endif - -#endif diff --git a/waterbox/libc/includes/wchar.h b/waterbox/libc/includes/wchar.h deleted file mode 100644 index ea6a34b774..0000000000 --- a/waterbox/libc/includes/wchar.h +++ /dev/null @@ -1,144 +0,0 @@ -/* Extended multibyte and wide character utilities - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#ifndef _PDCLIB_WCHAR_H -#define _PDCLIB_WCHAR_H _PDCLIB_WCHAR_H -#include "_PDCLIB_int.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef _PDCLIB_SIZE_T_DEFINED -#define _PDCLIB_SIZE_T_DEFINED _PDCLIB_SIZE_T_DEFINED -typedef _PDCLIB_size_t size_t; -#endif - -#ifndef __cplusplus - -#ifndef _PDCLIB_WCHAR_T_DEFINED -#define _PDCLIB_WCHAR_T_DEFINED _PDCLIB_WCHAR_T_DEFINED -typedef _PDCLIB_wchar_t wchar_t; -#endif - -#endif - -#ifndef _PDCLIB_WINT_T_DEFINED -#define _PDCLIB_WINT_T_DEFINED _PDCLIB_WINT_T_DEFINED -typedef _PDCLIB_wint_t wint_t; -#endif - -#ifndef _PDCLIB_MBSTATE_T_DEFINED -#define _PDCLIB_MBSTATE_T_DEFINED _PDCLIB_MBSTATE_T_DEFINED -typedef _PDCLIB_mbstate_t mbstate_t; -#endif - -struct tm; - -#ifndef _PDCLIB_NULL_DEFINED -#define _PDCLIB_NULL_DEFINED _PDCLIB_NULL_DEFINED -#define NULL _PDCLIB_NULL -#endif - -#ifndef _PDCLIB_WCHAR_MIN_MAX_DEFINED -#define _PDCLIB_WCHAR_MIN_MAX_DEFINED _PDCLIB_WCHAR_MIN_MAX_DEFINED -#define WCHAR_MIN _PDCLIB_WCHAR_MIN -#define WCHAR_MAX _PDCLIB_WCHAR_MAX -#endif - -#ifndef _PDCLIB_WEOF_DEFINED -#define _PDCLIB_WEOF_DEFINED _PDCLIB_WEOF_DEFINED -#define WEOF _PDCLIB_WEOF -#endif - -/* Wide character string handling */ -wchar_t * wcscpy( wchar_t * _PDCLIB_restrict s1, const wchar_t * _PDCLIB_restrict s2 ); -wchar_t * wcsncpy( wchar_t * _PDCLIB_restrict s1, const wchar_t * _PDCLIB_restrict s2, size_t n ); -wchar_t * wmemcpy( wchar_t * _PDCLIB_restrict s1, const wchar_t * _PDCLIB_restrict s2, size_t n ); -wchar_t * wmemmove( wchar_t * s1, const wchar_t * s2, size_t n ); -wchar_t * wcscat( wchar_t * _PDCLIB_restrict s1, const wchar_t * _PDCLIB_restrict s2 ); -wchar_t * wcsncat( wchar_t * _PDCLIB_restrict s1, const wchar_t * _PDCLIB_restrict s2, size_t n ); -int wcscmp( const wchar_t * s1, const wchar_t * s2 ); -int wcscoll( const wchar_t * s1, const wchar_t * s2 ); -int wcsncmp( const wchar_t * s1, const wchar_t * s2, size_t n ); -size_t wcsxfrm( wchar_t * _PDCLIB_restrict s1, const wchar_t * _PDCLIB_restrict s2, size_t n ); -int wmemcmp( const wchar_t * s1, const wchar_t * s2, size_t n ); -wchar_t * wcschr( const wchar_t * s, wchar_t c ); -size_t wcscspn( const wchar_t * s1, const wchar_t * s2 ); -wchar_t * wcspbrk( const wchar_t * s1, const wchar_t * s2 ); -wchar_t * wcsrchr( const wchar_t * s, wchar_t c ); -size_t wcsspn( const wchar_t * s1, const wchar_t * s2 ); -wchar_t * wcsstr( const wchar_t * s1, const wchar_t * s2 ); -wchar_t * wcstok( wchar_t * _PDCLIB_restrict s1, const wchar_t * _PDCLIB_restrict s2, wchar_t * * _PDCLIB_restrict ptr ); -wchar_t * wmemchr( const wchar_t * s, wchar_t c, size_t n ); -size_t wcslen( const wchar_t * s ); -wchar_t * wmemset( wchar_t * s, wchar_t c, size_t n ); - -size_t wcsftime( wchar_t * _PDCLIB_restrict s, size_t maxsize, const wchar_t * _PDCLIB_restrict format, const struct tm * _PDCLIB_restrict timeptr ); - -/* Wide character I/O */ -int fwprintf( _PDCLIB_file_t * _PDCLIB_restrict stream, const wchar_t * _PDCLIB_restrict format, ... ); -int fwscanf( _PDCLIB_file_t * _PDCLIB_restrict stream, const wchar_t * _PDCLIB_restrict format, ... ); -int swprintf( wchar_t * _PDCLIB_restrict s, size_t n, const wchar_t * _PDCLIB_restrict format, ... ); -int swscanf( const wchar_t * _PDCLIB_restrict s, const wchar_t * _PDCLIB_restrict format, ... ); -int vfwprintf( _PDCLIB_file_t * _PDCLIB_restrict stream, const wchar_t * _PDCLIB_restrict format, _PDCLIB_va_list arg ); -int vfwscanf( _PDCLIB_file_t * _PDCLIB_restrict stream, const wchar_t * _PDCLIB_restrict format, _PDCLIB_va_list arg ); -int vswprintf( wchar_t * _PDCLIB_restrict s, size_t n, const wchar_t * _PDCLIB_restrict format, _PDCLIB_va_list arg ); -int vswscanf( const wchar_t * _PDCLIB_restrict s, const wchar_t * _PDCLIB_restrict format, _PDCLIB_va_list arg ); -int vwprintf( const wchar_t * _PDCLIB_restrict format, _PDCLIB_va_list arg ); -int vwscanf( const wchar_t * _PDCLIB_restrict format, _PDCLIB_va_list arg ); -int wprintf( const wchar_t * _PDCLIB_restrict format, ... ); -int wscanf( const wchar_t * _PDCLIB_restrict format, ... ); -wint_t fgetwc( _PDCLIB_file_t * stream ); -wchar_t * fgetws( wchar_t * _PDCLIB_restrict s, int n, _PDCLIB_file_t * _PDCLIB_restrict stream ); -wint_t fputwc( wchar_t c, _PDCLIB_file_t * stream ); -int fputws( const wchar_t * _PDCLIB_restrict s, _PDCLIB_file_t * _PDCLIB_restrict stream ); -int fwide( _PDCLIB_file_t * stream, int mode ); -wint_t getwc( _PDCLIB_file_t * stream ); -wint_t getwchar( void ); -wint_t putwc( wchar_t c, _PDCLIB_file_t * stream ); -wint_t putwchar( wchar_t c ); -wint_t ungetwc( wint_t c, _PDCLIB_file_t * stream ); - -#if _PDCLIB_GNU_SOURCE -wint_t getwc_unlocked( _PDCLIB_file_t * stream ); -wint_t getwchar_unlocked( void ); -wint_t fgetwc_unlocked( _PDCLIB_file_t * stream ); -wint_t fputwc_unlocked( wchar_t wc, _PDCLIB_file_t * stream ); -wint_t putwc_unlocked( wchar_t wc, _PDCLIB_file_t * stream ); -wint_t putwchar_unlocked( wchar_t wc ); -wchar_t * fgetws_unlocked( wchar_t * ws, int n, _PDCLIB_file_t * stream ); -int fputws_unlocked( const wchar_t * ws, _PDCLIB_file_t * stream ); -#endif - -/* Wide character <-> Numeric conversions */ - -double wcstod( const wchar_t * _PDCLIB_restrict nptr, wchar_t * * _PDCLIB_restrict endptr ); -float wcstof( const wchar_t * _PDCLIB_restrict nptr, wchar_t * * _PDCLIB_restrict endptr ); -long double wcstold( const wchar_t * _PDCLIB_restrict nptr, wchar_t * * _PDCLIB_restrict endptr ); - -long int wcstol( const wchar_t * _PDCLIB_restrict nptr, wchar_t * * _PDCLIB_restrict endptr, int base ); -long long int wcstoll( const wchar_t * _PDCLIB_restrict nptr, wchar_t * * _PDCLIB_restrict endptr, int base ); -unsigned long int wcstoul( const wchar_t * _PDCLIB_restrict nptr, wchar_t * * _PDCLIB_restrict endptr, int base ); -unsigned long long int wcstoull( const wchar_t * _PDCLIB_restrict nptr, wchar_t * * _PDCLIB_restrict endptr, int base ); - -/* Character set conversion */ -wint_t btowc( int c ); -int wctob( wint_t c ); -int mbsinit( const mbstate_t * ps ); -size_t mbrlen( const char * _PDCLIB_restrict s, size_t n, mbstate_t * _PDCLIB_restrict ps ); -size_t mbrtowc( wchar_t * _PDCLIB_restrict pwc, const char * _PDCLIB_restrict s, size_t n, mbstate_t * _PDCLIB_restrict ps ); -size_t wcrtomb( char * _PDCLIB_restrict s, wchar_t wc, mbstate_t * _PDCLIB_restrict ps ); -size_t mbsrtowcs( wchar_t * _PDCLIB_restrict dst, const char * * _PDCLIB_restrict src, size_t len, mbstate_t * _PDCLIB_restrict ps ); -size_t mbsnrtowcs( wchar_t * _PDCLIB_restrict dst, const char * * _PDCLIB_restrict src, size_t nms, size_t len, mbstate_t * _PDCLIB_restrict ps ); // NYI -size_t wcsrtombs( char * _PDCLIB_restrict dst, const wchar_t * * _PDCLIB_restrict src, size_t len, mbstate_t * _PDCLIB_restrict ps ); -size_t wcsnrtombs( char * _PDCLIB_restrict dst, const wchar_t * * _PDCLIB_restrict src, size_t nwc, size_t len, mbstate_t * _PDCLIB_restrict ps ); // NYI - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/waterbox/libc/includes/wctype.h b/waterbox/libc/includes/wctype.h deleted file mode 100644 index 9a71e16af9..0000000000 --- a/waterbox/libc/includes/wctype.h +++ /dev/null @@ -1,65 +0,0 @@ -/* Wide character classification and mapping utilities - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#ifndef _PDCLIB_WCTYPE_H -#define _PDCLIB_WCTYPE_H _PDCLIB_WCTYPE_H -#include "_PDCLIB_int.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef _PDCLIB_WINT_T_DEFINED -#define _PDCLIB_WINT_T_DEFINED _PDCLIB_WINT_T_DEFINED -typedef _PDCLIB_wint_t wint_t; -#endif - -#ifndef _PDCLIB_WEOF_DEFINED -#define _PDCLIB_WEOF_DEFINED _PDCLIB_WEOF_DEFINED -#define WEOF _PDCLIB_WEOF -#endif - -/* Scalar type representing locale-specific character mappings */ -typedef int wctrans_t; - -/* Scalar type representing locale-specific character classifications */ -typedef int wctype_t; - -/* Character classification functions */ - -int iswalnum( wint_t _Wc ); -int iswalpha( wint_t _Wc ); -int iswblank( wint_t _Wc ); -int iswcntrl( wint_t _Wc ); -int iswdigit( wint_t _Wc ); -int iswgraph( wint_t _Wc ); -int iswlower( wint_t _Wc ); -int iswprint( wint_t _Wc ); -int iswpunct( wint_t _Wc ); -int iswspace( wint_t _Wc ); -int iswupper( wint_t _Wc ); -int iswxdigit( wint_t _Wc ); - -/* Extensible character classification functions */ - -int iswctype( wint_t _Wc, wctype_t _Desc ); -wctype_t wctype( const char * _Property ); - -/* Wide character case mapping utilities */ - -wint_t towlower( wint_t _Wc ); -wint_t towupper( wint_t _Wc ); - -/* Extensible wide character case mapping functions */ - -wint_t towctrans( wint_t _Wc, wctrans_t _Desc ); -wctrans_t wctrans( const char * _Property ); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/waterbox/libc/internals/_PDCLIB_aux.h b/waterbox/libc/internals/_PDCLIB_aux.h deleted file mode 100644 index 8f1cb7fee6..0000000000 --- a/waterbox/libc/internals/_PDCLIB_aux.h +++ /dev/null @@ -1,381 +0,0 @@ -/* Auxiliary PDCLib code <_PDCLIB_aux.h> - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#ifndef __PDCLIB_AUX_H -#define __PDCLIB_AUX_H __PDCLIB_AUX_H - -/* -------------------------------------------------------------------------- */ -/* You should not have to edit anything in this file; if you DO have to, it */ -/* would be considered a bug / missing feature: notify the author(s). */ -/* -------------------------------------------------------------------------- */ - -/* -------------------------------------------------------------------------- */ -/* Standard Version */ -/* -------------------------------------------------------------------------- */ - -/* Many a compiler gets this wrong, so you might have to hardcode it instead. */ - -#if __STDC__ != 1 -#error Compiler does not define _ _STDC_ _ to 1 (not standard-compliant)! -#endif - -#if defined(_PDCLIB_C_VERSION) - /* Pass - conditional simplification case */ -#elif !defined(__STDC_VERSION__) - #define _PDCLIB_C_VERSION 1990 -#elif __STDC_VERSION__ == 199409L - #define _PDCLIB_C_VERSION 1995 -#elif __STDC_VERSION__ == 199901L - #define _PDCLIB_C_VERSION 1999 -#elif __STDC_VERSION__ == 201112L - #define _PDCLIB_C_VERSION 2011 -#else - #error Unsupported _ _STDC_VERSION_ _ (__STDC_VERSION__) (supported: ISO/IEC 9899:1990, 9899/AMD1:1995, 9899:1999, 9899:2011). -#endif - -#if !defined(__cplusplus) || defined(_PDCLIB_CXX_VERSION) - #define _PDCLIB_CXX_VERSION 0 -#elif __cplusplus == 201103L - #define _PDCLIB_CXX_VERSION 2011 - /* TODO: Do we want this? */ - #if _PDCLIB_C_VERSION < 2011 - #undef _PDCLIB_C_VERSION - #define _PDCLIB_C_VERSION 2011 - #endif -#elif __cplusplus == 199711L - #define _PDCLIB_CXX_VERSION 1997 -#else - #error Unsupported _ _cplusplus (__cplusplus) (supported: ISO/IEC 14882:1997, ISO/IEC 14882:2011). -#endif - -#ifndef __STDC_HOSTED__ - #error Compiler does not define _ _STDC_HOSTED_ _ (not standard-compliant)! -#elif __STDC_HOSTED__ == 0 - #define _PDCLIB_HOSTED 0 -#elif __STDC_HOSTED__ == 1 - #define _PDCLIB_HOSTED 1 -#else - #error Compiler does not define _ _STDC_HOSTED_ _ to 0 or 1 (not standard-compliant)! -#endif - -#ifdef __cplusplus - typedef bool _PDCLIB_bool; -#else - typedef _Bool _PDCLIB_bool; -#endif - -/* Clang style feature detection macros - * Note: It is common to #define __has_feature(0) if undefined so the presence - * of this macro does not guarantee it to be working - */ - -#ifdef __has_feature - #define _PDCLIB_HAS_FEATURE(x) __has_feature(x) -#else - #define _PDCLIB_HAS_FEATURE(x) (0) -#endif - -#ifdef __has_extension - #define _PDCLIB_HAS_EXTENSION(x) __has_extension(x) -#else - // Older versions of Clang use __has_feature instead - #define _PDCLIB_HAS_EXTENSION(x) _PDCLIB_HAS_FEATURE(x) -#endif - -#ifdef __has_builtin - #define _PDCLIB_HAS_BUILTIN(x) __has_builtin(x) -#else - #define _PDCLIB_HAS_BUILTIN(x) (0) -#endif - -#ifdef __has_attribute - #define _PDCLIB_HAS_ATTRIBUTE(x) __has_attribute(x) -#else - #define _PDCLIB_HAS_ATTRIBUTE(x) (0) -#endif - -/* GCC feature detection macros */ - -#if defined(__GNUC__) - #define _PDCLIB_GCC_MIN(maj, min) \ - ((__GNUC__ > maj) || (__GNUC__ == maj && __GNUC_MINOR__ >= min)) -#else - #define _PDCLIB_GCC_MIN(maj, min) (0) -#endif - -/* Hybrid GCC/Clang feature detection macros */ -#define _PDCLIB_GCC_FEATURE(x, gccmaj, gccmin) \ - (_PDCLIB_HAS_FEATURE(x) || _PDCLIB_GCC_MIN(gccmin, gccmaj)) - -#define _PDCLIB_GCC_EXTENSION(x, gccmaj, gccmin) \ - (_PDCLIB_HAS_EXTENSION(x) || _PDCLIB_GCC_MIN(gccmin, gccmaj)) - -#define _PDCLIB_GCC_BUILTIN(x, gccmaj, gccmin) \ - (_PDCLIB_HAS_BUILTIN(x) || _PDCLIB_GCC_MIN(gccmin, gccmaj)) - -#define _PDCLIB_GCC_ATTRIBUTE(x, gccmaj, gccmin) \ - (_PDCLIB_HAS_ATTRIBUTE(x) || _PDCLIB_GCC_MIN(gccmin, gccmaj)) - -/* Extension & Language feature detection */ - -#if _PDCLIB_C_VERSION >= 1999 || defined(__cplusplus) - #ifndef __cplusplus - #define _PDCLIB_restrict restrict - #endif - #define _PDCLIB_inline inline -#endif - -#if _PDCLIB_CXX_VERSION >= 2011 - #define _PDCLIB_nothrow noexcept - #define _PDCLIB_noexcept(x) noexcept(x) -#elif _PDCLIB_CXX_VERSION - #define _PDCLIB_nothrow throw() - #define _PDCLIB_noexcept -#endif - -#if _PDCLIB_CXX_VERSION >= 2011 && _PDCLIB_GCC_FEATURE(cxx_attributes, 4, 8) - #define _PDCLIB_noreturn [[noreturn]] -#elif _PDCLIB_C_VERSION >= 2011 && _PDCLIB_GCC_FEATURE(c_noreturn, 4, 7) - #define _PDCLIB_noreturn _Noreturn -#endif - -#ifdef _WIN32 - #define _PDCLIB_EXPORT __declspec(dllexport) - #define _PDCLIB_IMPORT __declspec(dllimport) -#endif - -#if !defined(_PDCLIB_EXPORT) && _PDCLIB_GCC_ATTRIBUTE(__visibility__, 4, 0) - #define _PDCLIB_EXPORT __attribute__((__visibility__("protected"))) -#endif - -#if !defined(_PDCLIB_HIDDEN) && _PDCLIB_GCC_ATTRIBUTE(__visibility__, 4, 0) - #define _PDCLIB_HIDDEN __attribute__((__visibility__("hidden"))) -#endif - -#if !defined(_PDCLIB_nothrow) && _PDCLIB_GCC_ATTRIBUTE(__nothrow__, 4, 0) - #define _PDCLIB_nothrow __attribute__((__nothrow__)) - #define _PDCLIB_noexcept -#endif - -#if !defined(_PDCLIB_restrict) && _PDCLIB_GCC_MIN(3, 0) - #define _PDCLIB_restrict __restrict -#endif - -#if !defined(_PDCLIB_inline) && _PDCLIB_GCC_MIN(3, 0) - #define _PDCLIB_inline __inline -#endif - -#if !defined(_PDCLIB_noreturn) && _PDCLIB_GCC_ATTRIBUTE(__noreturn__, 3, 0) - /* If you don't use __noreturn__, then stdnoreturn.h will break things! */ - #define _PDCLIB_noreturn __attribute__((__noreturn__)) -#endif - -#if !defined(_PDCLIB_DEPRECATED) && _PDCLIB_GCC_ATTRIBUTE(__deprecated__, 3, 0) - #define _PDCLIB_DEPRECATED __attribute__ ((__deprecated__)) -#endif - -#if !defined(_PDCLIB_UNREACHABLE) && _PDCLIB_GCC_BUILTIN(__builtin_unreachable, 4, 0) - #define _PDCLIB_UNREACHABLE __builtin_unreachable() -#endif - -#if !defined(_PDCLIB_UNDEFINED) && defined(__GNUC__) - #define _PDCLIB_UNDEFINED(_var) \ - do { __asm__("" : "=X"(_var)); } while(0) -#endif - -/* No-op fallbacks */ - -#ifndef _PDCLIB_nothrow - #define _PDCLIB_nothrow - #define _PDCLIB_noexcept -#endif - -#ifndef _PDCLIB_EXPORT - #define _PDCLIB_EXPORT -#endif -#ifndef _PDCLIB_IMPORT - #define _PDCLIB_IMPORT -#endif -#ifndef _PDCLIB_HIDDEN - #define _PDCLIB_HIDDEN -#endif - -#if defined(_PDCLIB_SHARED) - #if defined(_PDCLIB_BUILD) - #define _PDCLIB_API _PDCLIB_EXPORT - #else - #define _PDCLIB_API _PDCLIB_IMPORT - #endif -#else - #define _PDCLIB_API -#endif - -#ifndef _PDCLIB_restrict - #define _PDCLIB_restrict -#endif - -#ifndef _PDCLIB_inline - #define _PDCLIB_inline -#endif - -#ifndef _PDCLIB_noreturn - #define _PDCLIB_noreturn -#endif - -#ifndef _PDCLIB_DEPRECATED - #define _PDCLIB_DEPRECATED -#endif - -#ifndef _PDCLIB_UNREACHABLE - #define _PDCLIB_UNREACHABLE do {} while(0) -#endif - -#ifndef _PDCLIB_UNDEFINED - #define _PDCLIB_UNDEFINED(_var) do {} while(0) -#endif - -/*#if _PDCLIB_C_VERSION != 1999 -#error PDCLib might not be fully conforming to either C89 or C95 prior to v2.x. -#endif*/ - -/* -------------------------------------------------------------------------- */ -/* Helper macros: */ -/* _PDCLIB_cc( x, y ) concatenates two preprocessor tokens without extending */ -/* _PDCLIB_concat( x, y ) concatenates two preprocessor tokens with extending */ -/* _PDCLIB_concat3( x, y, z ) is the same for three tokens */ -/* _PDCLIB_static_assert( x ) provides a compile-time check mechanism */ -/* -------------------------------------------------------------------------- */ - -#define _PDCLIB_cc( x, y ) x ## y -#define _PDCLIB_concat( x, y ) _PDCLIB_cc( x, y ) -#define _PDCLIB_concat3( x, y, z ) _PDCLIB_concat( _PDCLIB_concat( x, y ), z ) -#if _PDCLIB_C_VERSION >= 2011 -#define _PDCLIB_static_assert _Static_assert -#else -#define _PDCLIB_static_assert( e, m ) ;enum { _PDCLIB_concat( _PDCLIB_assert_, __LINE__ ) = 1 / ( !!( e ) ) } -#endif - -#define _PDCLIB_symbol2value( x ) #x -#define _PDCLIB_symbol2string( x ) _PDCLIB_symbol2value( x ) - -/* Feature test macros - * - * All of the feature test macros come in the following forms - * _PDCLIB_*_MIN(min): Available in versions >= min - * _PDCLIB_*_MINMAX(min, max): Available in versions >= min <= max - * _PDCLIB_*_MAX(max): Availabel in versions <= max - * - * The defined tests are: - * C: C standard versions - * 1990, 1995, 1999, 2011 - * CXX: C++ standard versions - * 1997, 2011 - * POSIX: POSIX extension versions. - * 1 (POSIX.2), 2 (POSIX.2), 199309L (POSIX.1b), - * 199506L (POSIX.1c), 200112L (2001), 200809L (2008) - * XOPEN: X/Open System Interface (XSI)/Single Unix Specification - * 0 (XPG4), 500 (SUSv2/UNIX98), 600 (SUSv3/UNIX03), 700 (SUSv4) - * - * Additionally, the macros - * _BSD_SOURCE, _SVID_SOURCE and _GNU_SOURCE - * are adhered to. If _GNU_SOURCE is defined, _XOPEN_SOURCE and - * _POSIX_C_SOURCE are defined to their most recent values to match glibc - * behaviour - * - * The intention of supporting these feature test macros is to ease - * application portability from these systems to PDCLib systems; in addition, - * it eases support for these standards by systems supporting them which are - * using PDCLib as their default C library. - * - * Applications targetting purely PDClib/PDCLib based platforms may define - * just _PDCLIB_EXTENSIONS, which will enable all supported extensions, plus - * all features from all supported versions of C and C++. - * - */ -#define _PDCLIB_C_MIN(min) _PDCLIB_C_MINMAX(min, 3000) -#define _PDCLIB_CXX_MIN(min) _PDCLIB_CXX_MINMAX(min, 3000) -#define _PDCLIB_XOPEN_MIN(min) _PDCLIB_XOPEN_MINMAX(min, 30000000) -#define _PDCLIB_POSIX_MIN(min) _PDCLIB_POSIX_MINMAX(min, 30000000) -#define _PDCLIB_C_MAX(max) _PDCLIB_C_MINMAX(0, max) -#define _PDCLIB_CXX_MAX(max) _PDCLIB_CXX_MINMAX(0, max) -#define _PDCLIB_XOPEN_MAX(max) _PDCLIB_XOPEN_MINMAX(0, max) -#define _PDCLIB_POSIX_MAX(max) _PDCLIB_POSIX_MINMAX(0, max) -#if defined(_PDCLIB_EXTENSIONS) || defined(_PDCLIB_BUILD) - #define _PDCLIB_C_MINMAX(min, max) 1 - #define _PDCLIB_CXX_MINMAX(min, max) 1 - #define _PDCLIB_POSIX_MINMAX(min, max) 1 - #define _PDCLIB_XOPEN_MINMAX(min, max) 1 - - #undef _PDCLIB_EXTENSIONS - #undef _PDCLIB_BSD_SOURCE - #undef _PDCLIB_SVID_SOURCE - #undef _PDCLIB_GNU_SOURCE - - #define _PDCLIB_EXTENSIONS 1 - #define _PDCLIB_BSD_SOURCE 1 - #define _PDCLIB_SVID_SOURCE 1 - #define _PDCLIB_GNU_SOURCE 1 -#else - #define _PDCLIB_C_MINMAX(min, max) \ - (_PDCLIB_C_VERSION >= (min) && _PDCLIB_C_VERSION <= (max)) - #define _PDCLIB_CXX_MINMAX(min, max) \ - (_PDCLIB_CXX_VERSION >= (min) && _PDCLIB_CXX_VERSION <= (max)) - #define _PDCLIB_XOPEN_MINMAX(min, max) \ - (defined(_XOPEN_SOURCE) \ - && _XOPEN_SOURCE >= (min) && _XOPEN_SOURCE <= (max)) - #define _PDCLIB_POSIX_MINMAX(min, max) \ - (defined(_POSIX_C_SOURCE) \ - && _POSIX_C_SOURCE >= (min) && _POSIX_C_SOURCE <= (max)) - - #if defined(_XOPEN_SOURCE) && (_XOPEN_SOURCE-1 == -1) - /* If _XOPEN_SOURCE is defined as empty, redefine here as zero */ - #undef _XOPEN_SOURCE - #define _XOPEN_SOURCE 0 - #endif - - #if defined(_GNU_SOURCE) - #define _PDCLIB_GNU_SOURCE 1 - #define _PDCLIB_SVID_SOURCE 1 - #define _PDCLIB_BSD_SOURCE 1 - #undef _XOPEN_SOURCE - #define _XOPEN_SOURCE 700 - #else - #define _PDCLIB_GNU_SOURCE 0 - #endif - - #if defined(_PDCLIB_BSD_SOURCE) - // pass - #elif defined(_BSD_SOURCE) - #define _PDCLIB_BSD_SOURCE 1 - #else - #define _PDCLIB_BSD_SOURCE 0 - #endif - - #if defined(_PDCLIB_SVID_SOURCE) - // pass - #elif defined(_SVID_SOURCE) - #define _PDCLIB_SVID_SOURCE 1 - #else - #define _PDCLIB_SVID_SOURCE 0 - #endif - - #if _PDCLIB_XOPEN_MIN(700) && !_PDCLIB_POSIX_MIN(200809L) - #undef _POSIX_C_SOURCE - #define _POSIX_C_SOURCE 2008098L - #elif _PDCLIB_XOPEN_MIN(600) && !_PDCLIB_POSIX_MIN(200112L) - #undef _POSIX_C_SOURCE - #define _POSIX_C_SOURCE 200112L - #elif _PDCLIB_XOPEN_MIN(0) && !_PDCLIB_POSIX_MIN(2) - #undef _POSIX_C_SOURCE - #define _POSIX_C_SOURCE 2 - #endif - - #if defined(_POSIX_SOURCE) && !defined(_POSIX_C_SOURCE) - #define _POSIX_C_SOURCE 1 - #endif -#endif - -#endif diff --git a/waterbox/libc/internals/_PDCLIB_clocale.h b/waterbox/libc/internals/_PDCLIB_clocale.h deleted file mode 100644 index 09ccc4d2d1..0000000000 --- a/waterbox/libc/internals/_PDCLIB_clocale.h +++ /dev/null @@ -1,19 +0,0 @@ -/* "C" Locale Support - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#ifndef _PDCLIB_CLOCALE_H -#define _PDCLIB_CLOCALE_H _PDCLIB_CLOCALE_H -#include -#ifdef __cplusplus -extern "C" { -#endif - -void _PDCLIB_initclocale( locale_t l ); - -#ifdef __cplusplus -} -#endif -#endif // _PDCLIB_CLOCALE_H diff --git a/waterbox/libc/internals/_PDCLIB_config.h b/waterbox/libc/internals/_PDCLIB_config.h deleted file mode 100644 index 5aad2c6c07..0000000000 --- a/waterbox/libc/internals/_PDCLIB_config.h +++ /dev/null @@ -1,466 +0,0 @@ -#ifndef _PDCLIB_CONFIG_H -#define _PDCLIB_CONFIG_H - -/* Internal PDCLib configuration <_PDCLIB_config.h> - (Generic Template) - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -/* -------------------------------------------------------------------------- */ -/* Misc */ -/* -------------------------------------------------------------------------- */ - -/* The character (sequence) your platform uses as newline. */ -#define _PDCLIB_endl "\n" - -/* exit() can signal success to the host environment by the value of zero or */ -/* the constant EXIT_SUCCESS. Failure is signaled by EXIT_FAILURE. Note that */ -/* any other return value is "implementation-defined", i.e. your environment */ -/* is not required to handle it gracefully. Set your definitions here. */ -#define _PDCLIB_SUCCESS 0 -#define _PDCLIB_FAILURE -1 - -/* qsort() in requires a function that swaps two memory areas. */ -/* Below is a naive implementation that can be improved significantly for */ -/* specific platforms, e.g. by swapping int instead of char. */ -#define _PDCLIB_memswp( i, j, size ) char tmp; do { tmp = *i; *i++ = *j; *j++ = tmp; } while ( --size ); - -/* -------------------------------------------------------------------------- */ -/* Integers */ -/* -------------------------------------------------------------------------- */ -/* Assuming 8-bit char, two's-complement architecture here. 'short' being */ -/* 16 bit, 'int' being either 16, 32 or 64 bit, 'long' being either 32 or 64 */ -/* bit (but 64 bit only if 'int' is 32 bit), and 'long long' being 64 bit if */ -/* 'long' is not, 64 or 128 bit otherwise. */ -/* Author is quite willing to support other systems but would like to hear of */ -/* interest in such support and details on the to-be-supported architecture */ -/* first, before going to lengths about it. */ -/* -------------------------------------------------------------------------- */ - -/* Comment out (or delete) the line below if your 'char' type is unsigned. */ -#define _PDCLIB_CHAR_SIGNED 1 - -/* Width of the integer types short, int, long, and long long, in bytes. */ -/* SHRT == 2, INT >= SHRT, LONG >= INT >= 4, LLONG >= LONG - check your */ -/* compiler manuals. */ -#define _PDCLIB_SHRT_BYTES 2 -#define _PDCLIB_INT_BYTES 4 -#if defined(__LP64__) || defined(_LP64) -# define _PDCLIB_LONG_BYTES 8 -#else -# define _PDCLIB_LONG_BYTES 4 -#endif -#define _PDCLIB_LLONG_BYTES 8 - -/* defines the div() function family that allows taking quotient */ -/* and remainder of an integer division in one operation. Many platforms */ -/* support this in hardware / opcode, and the standard permits ordering of */ -/* the return structure in any way to fit the hardware. That is why those */ -/* structs can be configured here. */ - -struct _PDCLIB_div_t -{ - int quot; - int rem; -}; - -struct _PDCLIB_ldiv_t -{ - long int quot; - long int rem; -}; - -struct _PDCLIB_lldiv_t -{ - long long int quot; - long long int rem; -}; - -/* -------------------------------------------------------------------------- */ -/* defines a set of integer types that are of a minimum width, and */ -/* "usually fastest" on the system. (If, for example, accessing a single char */ -/* requires the CPU to access a complete int and then mask out the char, the */ -/* "usually fastest" type of at least 8 bits would be int, not char.) */ -/* If you do not have information on the relative performance of the types, */ -/* the standard allows you to define any type that meets minimum width and */ -/* signedness requirements. */ -/* The defines below are just configuration for the real typedefs and limit */ -/* definitions done in <_PDCLIB_int.h>. The uppercase define shall be either */ -/* SHRT, INT, LONG, or LLONG (telling which values to use for the *_MIN and */ -/* *_MAX limits); the lowercase define either short, int, long, or long long */ -/* (telling the actual type to use). */ -/* The third define is the length modifier used for the type in printf() and */ -/* scanf() functions (used in ). */ -/* If you require a non-standard datatype to define the "usually fastest" */ -/* types, PDCLib as-is doesn't support that. Please contact the author with */ -/* details on your platform in that case, so support can be added. */ -/* -------------------------------------------------------------------------- */ - -#define _PDCLIB_FAST8 INT -#define _PDCLIB_fast8 int -#define _PDCLIB_FAST8_CONV - -#define _PDCLIB_FAST16 INT -#define _PDCLIB_fast16 int -#define _PDCLIB_FAST16_CONV - -#define _PDCLIB_FAST32 INT -#define _PDCLIB_fast32 int -#define _PDCLIB_FAST32_CONV - -#define _PDCLIB_FAST64 LLONG -#define _PDCLIB_fast64 long long -#define _PDCLIB_FAST64_CONV ll - -/* -------------------------------------------------------------------------- */ -/* What follows are a couple of "special" typedefs and their limits. Again, */ -/* the actual definition of the limits is done in <_PDCLIB_int.h>, and the */ -/* defines here are merely "configuration". See above for details. */ -/* -------------------------------------------------------------------------- */ - -/* The result type of substracting two pointers */ -#define _PDCLIB_ptrdiff long -#define _PDCLIB_PTRDIFF LONG -#define _PDCLIB_PTR_CONV - -/* An integer type that can be accessed as atomic entity (think asynchronous - interrupts). The type itself is not defined in a freestanding environment, - but its limits are. (Don't ask.) -*/ -#define _PDCLIB_sig_atomic int -#define _PDCLIB_SIG_ATOMIC INT - -/* Result type of the 'sizeof' operator (must be unsigned) */ -#define _PDCLIB_size unsigned long -#define _PDCLIB_SIZE ULONG - -/* Large enough an integer to hold all character codes of the largest supported - locale. -*/ -#define _PDCLIB_wint signed int -#define _PDCLIB_wchar unsigned int -#define _PDCLIB_WCHAR UINT - -#define _PDCLIB_intptr long -#define _PDCLIB_INTPTR LONG - -/* Largest supported integer type. Implementation note: see _PDCLIB_atomax(). */ -#define _PDCLIB_intmax long long int -#define _PDCLIB_INTMAX LLONG -#define _PDCLIB_MAX_CONV ll -/* You are also required to state the literal suffix for the intmax type */ -#define _PDCLIB_INTMAX_LITERAL ll - -/* defines imaxdiv(), which is equivalent to the div() function */ -/* family (see further above) with intmax_t as basis. */ - -struct _PDCLIB_imaxdiv_t -{ - _PDCLIB_intmax quot; - _PDCLIB_intmax rem; -}; - -/* : time_t - * The C standard doesn't define what representation of time is stored in - * time_t when returned by time() , but POSIX defines it to be seconds since the - * UNIX epoch and most appplications expect that. - * - * time_t is also used as the tv_sec member of struct timespec, which *is* - * defined as a linear count of seconds. - * - * time_t is defined as a "real type", so may be a floating point type, but with - * the presence of the nanosecond accurate struct timespec, and with the lack of - * any functions for manipulating more accurate values of time_t, this is - * probably not useful. - */ -#define _PDCLIB_time unsigned long long - -/* : clock_t - * - * A count of "clock ticks", where the length of a clock tick is unspecified by - * the standard. The implementation is required to provide a macro, - * CLOCKS_PER_SEC, which is the number of "clock ticks" which corresponds to one - * second. - * - * clock_t may be any real type (i.e. integral or floating), and its type on - * various systems differs. - * - * On XSI systems, CLOCKS_PER_SEC must be defined to 1000000 - */ -#define _PDCLIB_clock double -#define _PDCLIB_CLOCKS_PER_SEC 1000000 - -/* : TIME_UTC - * - * The TIME_UTC parameter is passed to the timespec_get function in order to get - * the system time in UTC since an implementation defined epoch (not necessarily - * the same as that used for time_t). That said, on POSIX the obvious - * implementation of timespec_get for TIME_UTC is to wrap - * clock_gettime(CLOCK_REALTIME, ...), which is defined as time in UTC since the - * same epoch. - * - * This may be any non-zero integer value. - */ -#define _PDCLIB_TIME_UTC 1 - -/* -------------------------------------------------------------------------- */ -/* Floating Point */ -/* -------------------------------------------------------------------------- */ - -/* Whether the implementation rounds toward zero (0), to nearest (1), toward - positive infinity (2), or toward negative infinity (3). (-1) signifies - indeterminable rounding, any other value implementation-specific rounding. -*/ -#define _PDCLIB_FLT_ROUNDS -1 - -/* Whether the implementation uses exact-width precision (0), promotes float - to double (1), or promotes float and double to long double (2). (-1) - signifies indeterminable behaviour, any other value implementation-specific - behaviour. -*/ -#define _PDCLIB_FLT_EVAL_METHOD 0 - -/* "Number of the decimal digits (n), such that any floating-point number in the - widest supported floating type with p(max) radix (b) digits can be rounded to - a floating-point number with (n) decimal digits and back again without change - to the value p(max) log(10)b if (b) is a power of 10, [1 + p(max) log(10)b] - otherwise." - 64bit IEC 60559 double format (53bit mantissa) is DECIMAL_DIG 17. - 80bit IEC 60559 double-extended format (64bit mantissa) is DECIMAL_DIG 21. -*/ -#define _PDCLIB_DECIMAL_DIG 17 - -/* Floating point types - * - * PDCLib (at present) assumes IEEE 754 floating point formats - * The following names are used: - * SINGLE: IEEE 754 single precision (32-bit) - * DOUBLE: IEEE 754 double precision (64-bit) - * EXTENDED: IEEE 754 extended precision (80-bit, as x87) - */ -#define _PDCLIB_FLOAT_TYPE SINGLE -#define _PDCLIB_DOUBLE_TYPE DOUBLE -#if defined(__i386__) || defined(__amd64__) - #define _PDCLIB_LDOUBLE_TYPE EXTENDED -#else - #define _PDCLIB_LDOUBLE_TYPE DOUBLE -#endif - -/* -------------------------------------------------------------------------- */ -/* Platform-dependent macros defined by the standard headers. */ -/* -------------------------------------------------------------------------- */ - -/* The offsetof macro - Contract: Expand to an integer constant expression of type size_t, which - represents the offset in bytes to the structure member from the beginning - of the structure. If the specified member is a bitfield, behaviour is - undefined. - There is no standard-compliant way to do this. - This implementation casts an integer zero to 'pointer to type', and then - takes the address of member. This is undefined behaviour but should work on - most compilers. -*/ -#define _PDCLIB_offsetof( type, member ) ( (size_t) &( ( (type *) 0 )->member ) ) - -/* Variable Length Parameter List Handling () - The macros defined by are highly dependent on the calling - conventions used, and you probably have to replace them with builtins of - your compiler. The following generic implementation works only for pure - stack-based architectures, and only if arguments are aligned to pointer - type. Credits to Michael Moody, who contributed this to the Public Domain. -*/ - -/* Internal helper macro. va_round is not part of . */ -#define _PDCLIB_va_round( type ) ( (sizeof(type) + sizeof(void *) - 1) & ~(sizeof(void *) - 1) ) - -typedef char * _PDCLIB_va_list; -#define _PDCLIB_va_arg( ap, type ) ( (ap) += (_PDCLIB_va_round(type)), ( *(type*) ( (ap) - (_PDCLIB_va_round(type)) ) ) ) -#define _PDCLIB_va_copy( dest, src ) ( (dest) = (src), (void)0 ) -#define _PDCLIB_va_end( ap ) ( (ap) = (char *)0, (void)0 ) -#define _PDCLIB_va_start( ap, parmN ) ( (ap) = (char *) &parmN + ( _PDCLIB_va_round(parmN) ), (void)0 ) - -/* -------------------------------------------------------------------------- */ -/* OS "glue", part 1 */ -/* These are values and data type definitions that you would have to adapt to */ -/* the capabilities and requirements of your OS. */ -/* The actual *functions* of the OS interface are declared in _PDCLIB_glue.h. */ -/* -------------------------------------------------------------------------- */ - -/* Memory management -------------------------------------------------------- */ - -/* Set this to the page size of your OS. If your OS does not support paging, set - to an appropriate value. (Too small, and malloc() will call the kernel too - often. Too large, and you will waste memory.) -*/ -#define _PDCLIB_MALLOC_PAGESIZE 4096 -#define _PDCLIB_MALLOC_ALIGN 16 -#define _PDCLIB_MALLOC_GRANULARITY 64*1024 -#define _PDCLIB_MALLOC_TRIM_THRESHOLD 2*1024*1024 -#define _PDCLIB_MALLOC_MMAP_THRESHOLD 256*1024 -#define _PDCLIB_MALLOC_RELEASE_CHECK_RATE 4095 - -/* TODO: Better document these */ - -/* Locale --------------------------------------------------------------------*/ - -/* Locale method. See _PDCLIB_locale.h */ -#define _PDCLIB_LOCALE_METHOD _PDCLIB_LOCALE_METHOD_FAKE - -/* wchar_t encoding */ -#define _PDCLIB_WCHAR_ENCODING _PDCLIB_WCHAR_ENCODING_UCS4 - -/* I/O ---------------------------------------------------------------------- */ - -/* The default size for file buffers. Must be at least 256. */ -#define _PDCLIB_BUFSIZ 1024 - -/* The minimum number of files the implementation can open simultaneously. Must - be at least 8. Depends largely on how the bookkeeping is done by fopen() / - freopen() / fclose(). The example implementation limits the number of open - files only by available memory. -*/ -#define _PDCLIB_FOPEN_MAX 8 - -/* Length of the longest filename the implementation guarantees to support. */ -#define _PDCLIB_FILENAME_MAX 128 - -/* Maximum length of filenames generated by tmpnam(). (See tmpfile.c.) */ -#define _PDCLIB_L_tmpnam 46 - -/* Number of distinct file names that can be generated by tmpnam(). */ -#define _PDCLIB_TMP_MAX 50 - -/* The values of SEEK_SET, SEEK_CUR and SEEK_END, used by fseek(). - Since at least one platform (POSIX) uses the same symbols for its own "seek" - function, we use whatever the host defines (if it does define them). -*/ -#define _PDCLIB_SEEK_SET 0 -#define _PDCLIB_SEEK_CUR 1 -#define _PDCLIB_SEEK_END 2 - -/* The number of characters that can be buffered with ungetc(). The standard - guarantees only one (1); anything larger would make applications relying on - this capability dependent on implementation-defined behaviour (not good). -*/ -#define _PDCLIB_UNGETCBUFSIZE 1 - -/* errno -------------------------------------------------------------------- */ - -/* These are the values that _PDCLIB_errno can be set to by the library. - - By keeping PDCLib's errno in the _PDCLIB_* namespace, the library is capable - to "translate" between errno values used by the hosting operating system and - those used and passed out by the library. - - Example: In the example platform, the remove() function uses the unlink() - system call as backend. Linux sets its errno to EISDIR if you try to unlink() - a directory, but POSIX demands EPERM. Within the remove() function, you can - catch the 'errno == EISDIR', and set '_PDCLIB_errno = _PDCLIB_EPERM'. Anyone - using PDCLib's will "see" EPERM instead of EISDIR (the _PDCLIB_* - prefix removed by mechanics). - - If you do not want that kind of translation, you might want to "match" the - values used by PDCLib with those used by the host OS, to avoid confusion. - - The C standard only defines three distinct errno values: ERANGE, EDOM, and - EILSEQ. The standard leaves it up to "the implementation" whether there are - any more beyond those three. - - However, C++11 introduced the whole list of POSIX errno values into the - standard, so PDCLib might as well define those as well. - - Sometimes the standard says to set errno to indicate an error, but does not - prescribe a value. We will use a value from the following list. If POSIX - defines a value, we use that; otherwise, we use as seems suitable. -*/ - -/* These values were taken from Linux, gcc 4.8. */ -#define _PDCLIB_E2BIG 7 -#define _PDCLIB_EACCES 13 -#define _PDCLIB_EADDRINUSE 98 -#define _PDCLIB_EADDRNOTAVAIL 99 -#define _PDCLIB_EAFNOSUPPORT 97 -#define _PDCLIB_EAGAIN 11 -#define _PDCLIB_EALREADY 114 -#define _PDCLIB_EBADF 9 -#define _PDCLIB_EBADMSG 74 -#define _PDCLIB_EBUSY 16 -#define _PDCLIB_ECANCELED 125 -#define _PDCLIB_ECHILD 10 -#define _PDCLIB_ECONNABORTED 103 -#define _PDCLIB_ECONNREFUSED 111 -#define _PDCLIB_ECONNRESET 104 -#define _PDCLIB_EDEADLK 35 -#define _PDCLIB_EDESTADDRREQ 89 -#define _PDCLIB_EDOM 33 -#define _PDCLIB_EEXIST 17 -#define _PDCLIB_EFAULT 14 -#define _PDCLIB_EFBIG 27 -#define _PDCLIB_EHOSTUNREACH 113 -#define _PDCLIB_EIDRM 43 -#define _PDCLIB_EILSEQ 84 -#define _PDCLIB_EINPROGRESS 115 -#define _PDCLIB_EINTR 4 -#define _PDCLIB_EINVAL 22 -#define _PDCLIB_EIO 5 -#define _PDCLIB_EISCONN 106 -#define _PDCLIB_EISDIR 21 -#define _PDCLIB_ELOOP 40 -#define _PDCLIB_EMFILE 24 -#define _PDCLIB_EMLINK 31 -#define _PDCLIB_EMSGSIZE 90 -#define _PDCLIB_ENAMETOOLONG 36 -#define _PDCLIB_ENETDOWN 100 -#define _PDCLIB_ENETRESET 102 -#define _PDCLIB_ENETUNREACH 101 -#define _PDCLIB_ENFILE 23 -#define _PDCLIB_ENOBUFS 105 -#define _PDCLIB_ENODATA 61 -#define _PDCLIB_ENODEV 19 -#define _PDCLIB_ENOENT 2 -#define _PDCLIB_ENOEXEC 8 -#define _PDCLIB_ENOLCK 37 -#define _PDCLIB_ENOLINK 67 -#define _PDCLIB_ENOMEM 12 -#define _PDCLIB_ENOMSG 42 -#define _PDCLIB_ENOPROTOOPT 92 -#define _PDCLIB_ENOSPC 28 -#define _PDCLIB_ENOSR 63 -#define _PDCLIB_ENOSTR 60 -#define _PDCLIB_ENOSYS 38 -#define _PDCLIB_ENOTCONN 107 -#define _PDCLIB_ENOTDIR 20 -#define _PDCLIB_ENOTEMPTY 39 -#define _PDCLIB_ENOTRECOVERABLE 131 -#define _PDCLIB_ENOTSOCK 88 -#define _PDCLIB_ENOTSUP 95 -#define _PDCLIB_ENOTTY 25 -#define _PDCLIB_ENXIO 6 -#define _PDCLIB_EOPNOTSUPP 95 -#define _PDCLIB_EOVERFLOW 75 -#define _PDCLIB_EOWNERDEAD 130 -#define _PDCLIB_EPERM 1 -#define _PDCLIB_EPIPE 32 -#define _PDCLIB_EPROTO 71 -#define _PDCLIB_EPROTONOSUPPORT 93 -#define _PDCLIB_EPROTOTYPE 91 -#define _PDCLIB_ERANGE 34 -#define _PDCLIB_EROFS 30 -#define _PDCLIB_ESPIPE 29 -#define _PDCLIB_ESRCH 3 -#define _PDCLIB_ETIME 62 -#define _PDCLIB_ETIMEDOUT 110 -#define _PDCLIB_ETXTBSY 26 -#define _PDCLIB_EWOULDBLOCK 11 -#define _PDCLIB_EXDEV 18 - -/* This is used to set the size of the array in struct lconv () */ -/* holding the error messages for the strerror() and perror() fuctions. If */ -/* you change this value because you are using additional errno values, you */ -/* *HAVE* to provide appropriate error messages for *ALL* locales. */ -/* Needs to be one higher than the highest errno value above. */ -#define _PDCLIB_ERRNO_MAX 132 - -#endif diff --git a/waterbox/libc/internals/_PDCLIB_encoding.h b/waterbox/libc/internals/_PDCLIB_encoding.h deleted file mode 100644 index 7d893c2d55..0000000000 --- a/waterbox/libc/internals/_PDCLIB_encoding.h +++ /dev/null @@ -1,209 +0,0 @@ -/* Encoding support <_PDCLIB_encoding.h> - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#ifndef __PDCLIB_ENCODING_H -#define __PDCLIB_ENCODING_H __PDCLIB_ENCODING_H - -#include - -/* Must be cauued with bufsize >= 1, in != NULL, out != NULL, ps != NULL - * - * Converts a UTF-16 (char16_t) to a UCS4 (char32_t) value. Returns - * 1, 2 : Valid character (converted to UCS-4) - * -1 : Encoding error - * -2 : Partial character (only lead surrogate in buffer) - */ -static inline int _PDCLIB_c16rtoc32( - _PDCLIB_char32_t *_PDCLIB_restrict out, - const _PDCLIB_char16_t *_PDCLIB_restrict in, - _PDCLIB_size_t bufsize, - _PDCLIB_mbstate_t *_PDCLIB_restrict ps -) -{ - if(ps->_Surrogate) { - // We already have a lead surrogate - if((*in & ~0x3FF) != 0xDC00) { - // Encoding error - return -1; - } else { - // Decode and reset state - *out = (ps->_Surrogate & 0x3FF) << 10 | (*in & 0x3FF); - ps->_Surrogate = 0; - return 1; - } - } if((*in & ~0x3FF) == 0xD800) { - // Lead surrogate - if(bufsize >= 2) { - // Buffer big enough - if((in[1] & ~0x3FF) != 0xDC00) { - // Encoding error - return -1; - } else { - *out = (in[0] & 0x3FF) << 10 | (in[1] & 0x3FF); - return 2; - } - } else { - // Buffer too small - update state - ps->_Surrogate = *in; - return -2; - } - } else { - // BMP character - *out = *in; - return 1; - } -} - -static inline _PDCLIB_size_t _PDCLIB_c32rtoc16( - _PDCLIB_wchar_t *_PDCLIB_restrict out, - const _PDCLIB_char32_t *_PDCLIB_restrict in, - _PDCLIB_size_t bufsize, - _PDCLIB_mbstate_t *_PDCLIB_restrict ps -) -{ - if(ps->_Surrogate) { - *out = ps->_Surrogate; - ps->_Surrogate = 0; - return 0; - } - - if(*in <= 0xFFFF) { - // BMP character - *out = *in; - return 1; - } else { - // Supplementary plane character - *out = 0xD800 | (*in >> 10); - if(bufsize >= 2) { - out[1] = 0xDC00 | (*in & 0x3FF); - return 2; - } else { - ps->_Surrogate = 0xDC00 | (*in & 0x3FF); - return 1; - } - } -} - -struct _PDCLIB_charcodec_t { - /* Reads at most *_P_insz code units from *_P_inbuf and writes the result - * into *_P_outbuf, writing at most *_P_outsz code units. Updates - * *_P_outbuf, *_P_outsz, *_P_inbuf, *_P_outsz with the resulting state - * - * If _P_outbuf is NULL, then the input must be processed but no output - * generated. _P_outsz may be processed as normal. - * - * Returns true if the conversion completed successfully (i.e. one of - * _P_outsize or _P_insize reached zero and no coding errors were - * encountered), else return false. - */ - - /* mbsinit. Mandatory. */ - _PDCLIB_bool (*__mbsinit)(const _PDCLIB_mbstate_t *_P_ps); - - /* UCS-4 variants. Mandatory. */ - - _PDCLIB_bool (*__mbstoc32s)( - _PDCLIB_char32_t *_PDCLIB_restrict *_PDCLIB_restrict _P_outbuf, - _PDCLIB_size_t *_PDCLIB_restrict _P_outsz, - const char *_PDCLIB_restrict *_PDCLIB_restrict _P_inbuf, - _PDCLIB_size_t *_PDCLIB_restrict _P_insz, - _PDCLIB_mbstate_t *_PDCLIB_restrict _P_ps - ); - - _PDCLIB_bool (*__c32stombs)( - char *_PDCLIB_restrict *_PDCLIB_restrict _P_outbuf, - _PDCLIB_size_t *_PDCLIB_restrict _P_outsz, - const _PDCLIB_char32_t *_PDCLIB_restrict *_PDCLIB_restrict _P_inbuf, - _PDCLIB_size_t *_PDCLIB_restrict _P_insz, - _PDCLIB_mbstate_t *_PDCLIB_restrict _P_ps - ); - - /* UTF-16 variants; same as above except optional. - * - * If not provided, _PDCLib will internally synthesize on top of the UCS-4 - * variants above, albeit at a performance cost. - */ - - _PDCLIB_bool (*__mbstoc16s)( - _PDCLIB_char16_t *_PDCLIB_restrict *_PDCLIB_restrict _P_outbuf, - _PDCLIB_size_t *_PDCLIB_restrict _P_outsz, - const char *_PDCLIB_restrict *_PDCLIB_restrict _P_inbuf, - _PDCLIB_size_t *_PDCLIB_restrict _P_insz, - _PDCLIB_mbstate_t *_PDCLIB_restrict _P_ps - ); - - _PDCLIB_bool (*__c16stombs)( - char *_PDCLIB_restrict *_PDCLIB_restrict _P_outbuf, - _PDCLIB_size_t *_PDCLIB_restrict _P_outsz, - const _PDCLIB_char16_t *_PDCLIB_restrict *_PDCLIB_restrict _P_inbuf, - _PDCLIB_size_t *_PDCLIB_restrict _P_insz, - _PDCLIB_mbstate_t *_PDCLIB_restrict _P_ps - ); - - size_t __mb_max; -}; - -/* mbstate _PendState values */ -enum { - /* Nothing pending; _PendChar ignored */ - _PendClear = 0, - - /* Process the character stored in _PendChar before reading the buffer - * passed for the conversion - */ - _PendPrefix = 1, -}; - -/* XXX Defining these here is temporary - will move to xlocale in future */ -size_t mbrtoc16_l( - char16_t *_PDCLIB_restrict pc16, - const char *_PDCLIB_restrict s, - size_t n, - mbstate_t *_PDCLIB_restrict ps, -_PDCLIB_locale_t _PDCLIB_restrict l); - -size_t c16rtomb_l( - char *_PDCLIB_restrict s, - char16_t c16, - mbstate_t *_PDCLIB_restrict ps, -_PDCLIB_locale_t _PDCLIB_restrict l); - -size_t mbrtoc32_l( - char32_t *_PDCLIB_restrict pc32, - const char *_PDCLIB_restrict s, - size_t n, - mbstate_t *_PDCLIB_restrict ps, -_PDCLIB_locale_t _PDCLIB_restrict l); - -size_t c32rtomb_l( - char *_PDCLIB_restrict s, - char32_t c32, - mbstate_t *_PDCLIB_restrict ps, -_PDCLIB_locale_t _PDCLIB_restrict l); - -#define _PDCLIB_WCHAR_ENCODING_UTF16 16 -#define _PDCLIB_WCHAR_ENCODING_UCS4 32 - -#if !defined(_PDCLIB_WCHAR_ENCODING) - #define _PDCLIB_WCHAR_ENCODING 0 -#endif - -#if _PDCLIB_WCHAR_ENCODING == _PDCLIB_WCHAR_ENCODING_UTF16 - #define _PDCLIB_mbrtocwc_l mbrtoc16_l - #define _PDCLIB_mbrtocwc mbrtoc16 - #define _PDCLIB_cwcrtomb_l c16rtomb_l - #define _PDCLIB_cwcrtomb c16rtomb -#elif _PDCLIB_WCHAR_ENCODING == _PDCLIB_WCHAR_ENCODING_UCS4 - #define _PDCLIB_mbrtocwc_l mbrtoc32_l - #define _PDCLIB_mbrtocwc mbrtoc32 - #define _PDCLIB_cwcrtomb_l c32rtomb_l - #define _PDCLIB_cwcrtomb c32rtomb -#else - #error _PDCLIB_WCHAR_ENCODING not defined correctly - #error Define to one of _PDCLIB_WCHAR_ENCODING_UCS4 or _PDCLIB_WCHAR_ENCODING_UTF16 -#endif - -#endif diff --git a/waterbox/libc/internals/_PDCLIB_float.h b/waterbox/libc/internals/_PDCLIB_float.h deleted file mode 100644 index 483b54fe4b..0000000000 --- a/waterbox/libc/internals/_PDCLIB_float.h +++ /dev/null @@ -1,95 +0,0 @@ -/* PDCLib internal floating point logic <_PDCLIB_float.h> - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#ifndef __PDCLIB_PDCLIB_FLOAT_H -#define __PDCLIB_PDCLIB_FLOAT_H __PDCLIB_PDCLIB_FLOAT_H - -#include "_PDCLIB_aux.h" - -/* IEEE 754 single precision */ -#define _PDCLIB_FP_SINGLE_MIN 1.17549435082228750797e-38 -#define _PDCLIB_FP_SINGLE_EPSILON 1.19209289550781250000e-7 -#define _PDCLIB_FP_SINGLE_HAS_DENORM 1 -#define _PDCLIB_FP_SINGLE_MIN_EXP -125 -#define _PDCLIB_FP_SINGLE_MANT_DIG 24 -#define _PDCLIB_FP_SINGLE_RADIX 2 -#define _PDCLIB_FP_SINGLE_HAS_QUIET_NAN 1 -#define _PDCLIB_FP_SINGLE_MAX_10_EXP 38 -#define _PDCLIB_FP_SINGLE_HAS_INFINITY 1 -#define _PDCLIB_FP_SINGLE_DIG 6 -#define _PDCLIB_FP_SINGLE_MAX_EXP 128 -#define _PDCLIB_FP_SINGLE_DENORM_MIN 1.40129846432481707092e-45 -#define _PDCLIB_FP_SINGLE_MAX 3.40282346638528859812e+38 -#define _PDCLIB_FP_SINGLE_MIN_10_EXP -37 - -/* IEEE 754 double precision */ -#define _PDCLIB_FP_DOUBLE_MIN_EXP -1021 -#define _PDCLIB_FP_DOUBLE_DENORM_MIN 4.94065645841246544177e-324 -#define _PDCLIB_FP_DOUBLE_MIN_10_EXP -307 -#define _PDCLIB_FP_DOUBLE_DIG 15 -#define _PDCLIB_FP_DOUBLE_MAX 1.79769313486231570815e+308 -#define _PDCLIB_FP_DOUBLE_HAS_INFINITY 1 -#define _PDCLIB_FP_DOUBLE_MAX_EXP 1024 -#define _PDCLIB_FP_DOUBLE_MIN 2.22507385850720138309e-308 -#define _PDCLIB_FP_DOUBLE_HAS_DENORM 1 -#define _PDCLIB_FP_DOUBLE_HAS_QUIET_NAN 1 -#define _PDCLIB_FP_DOUBLE_MANT_DIG 53 -#define _PDCLIB_FP_DOUBLE_EPSILON 2.22044604925031308085e-16 -#define _PDCLIB_FP_DOUBLE_MAX_10_EXP 308 - -/* IEEE 754 80-bit extended precision */ -#define _PDCLIB_FP_EXTENDED_MAX 1.18973149535723176502e+4932 -#define _PDCLIB_FP_EXTENDED_MAX_EXP 16384 -#define _PDCLIB_FP_EXTENDED_HAS_INFINITY 1 -#define _PDCLIB_FP_EXTENDED_MIN 3.36210314311209350626e-4932 -#define _PDCLIB_FP_EXTENDED_HAS_QUIET_NAN 1 -#define _PDCLIB_FP_EXTENDED_HAS_DENORM 1 -#define _PDCLIB_FP_EXTENDED_EPSILON 1.08420217248550443401e-19 -#define _PDCLIB_FP_EXTENDED_MANT_DIG 64 -#define _PDCLIB_FP_EXTENDED_MIN_EXP (-16381) -#define _PDCLIB_FP_EXTENDED_MAX_10_EXP 4932 -#define _PDCLIB_FP_EXTENDED_DENORM_MIN 3.64519953188247460253e-4951 -#define _PDCLIB_FP_EXTENDED_MIN_10_EXP (-4931) -#define _PDCLIB_FP_EXTENDED_DIG 18 - -/* TODO: IEEE754 quadruple precision (_PDCLIB_FP_QUADRUPLE_*) and - "double-double" math - */ - -#define _PDCLIB_FLT_RADIX _PDCLIB_concat( _PDCLIB_concat3( _PDCLIB_FP_, _PDCLIB_FLOAT_TYPE, _RADIX ), f ) -#define _PDCLIB_FLT_MANT_DIG _PDCLIB_concat3( _PDCLIB_FP_, _PDCLIB_FLOAT_TYPE, _MANT_DIG ) -#define _PDCLIB_FLT_DIG _PDCLIB_concat3( _PDCLIB_FP_, _PDCLIB_FLOAT_TYPE, _DIG ) -#define _PDCLIB_FLT_EPSILON _PDCLIB_concat( _PDCLIB_concat3( _PDCLIB_FP_, _PDCLIB_FLOAT_TYPE, _EPSILON ), f ) -#define _PDCLIB_FLT_MIN_EXP _PDCLIB_concat3( _PDCLIB_FP_, _PDCLIB_FLOAT_TYPE, _MIN_EXP ) -#define _PDCLIB_FLT_MIN _PDCLIB_concat( _PDCLIB_concat3( _PDCLIB_FP_, _PDCLIB_FLOAT_TYPE, _MIN ), f ) -#define _PDCLIB_FLT_MIN_10_EXP _PDCLIB_concat3( _PDCLIB_FP_, _PDCLIB_FLOAT_TYPE, _MIN_10_EXP ) -#define _PDCLIB_FLT_MAX_EXP _PDCLIB_concat3( _PDCLIB_FP_, _PDCLIB_FLOAT_TYPE, _MAX_EXP ) -#define _PDCLIB_FLT_MAX _PDCLIB_concat( _PDCLIB_concat3( _PDCLIB_FP_, _PDCLIB_FLOAT_TYPE, _MAX ), f ) -#define _PDCLIB_FLT_MAX_10_EXP _PDCLIB_concat3( _PDCLIB_FP_, _PDCLIB_FLOAT_TYPE, _MAX_10_EXP ) - -#define _PDCLIB_DBL_RADIX _PDCLIB_concat3( _PDCLIB_FP_, _PDCLIB_DOUBLE_TYPE, _RADIX ) -#define _PDCLIB_DBL_MANT_DIG _PDCLIB_concat3( _PDCLIB_FP_, _PDCLIB_DOUBLE_TYPE, _MANT_DIG ) -#define _PDCLIB_DBL_DIG _PDCLIB_concat3( _PDCLIB_FP_, _PDCLIB_DOUBLE_TYPE, _DIG ) -#define _PDCLIB_DBL_EPSILON _PDCLIB_concat3( _PDCLIB_FP_, _PDCLIB_DOUBLE_TYPE, _EPSILON ) -#define _PDCLIB_DBL_MIN_EXP _PDCLIB_concat3( _PDCLIB_FP_, _PDCLIB_DOUBLE_TYPE, _MIN_EXP ) -#define _PDCLIB_DBL_MIN _PDCLIB_concat3( _PDCLIB_FP_, _PDCLIB_DOUBLE_TYPE, _MIN ) -#define _PDCLIB_DBL_MIN_10_EXP _PDCLIB_concat3( _PDCLIB_FP_, _PDCLIB_DOUBLE_TYPE, _MIN_10_EXP ) -#define _PDCLIB_DBL_MAX_EXP _PDCLIB_concat3( _PDCLIB_FP_, _PDCLIB_DOUBLE_TYPE, _MAX_EXP ) -#define _PDCLIB_DBL_MAX _PDCLIB_concat3( _PDCLIB_FP_, _PDCLIB_DOUBLE_TYPE, _MAX ) -#define _PDCLIB_DBL_MAX_10_EXP _PDCLIB_concat3( _PDCLIB_FP_, _PDCLIB_DOUBLE_TYPE, _MAX_10_EXP ) - -#define _PDCLIB_LDBL_RADIX _PDCLIB_concat( _PDCLIB_concat3( _PDCLIB_FP_, _PDCLIB_LDOUBLE_TYPE, _RADIX ), l ) -#define _PDCLIB_LDBL_MANT_DIG _PDCLIB_concat3( _PDCLIB_FP_, _PDCLIB_LDOUBLE_TYPE, _MANT_DIG ) -#define _PDCLIB_LDBL_DIG _PDCLIB_concat3( _PDCLIB_FP_, _PDCLIB_LDOUBLE_TYPE, _DIG ) -#define _PDCLIB_LDBL_EPSILON _PDCLIB_concat( _PDCLIB_concat3( _PDCLIB_FP_, _PDCLIB_LDOUBLE_TYPE, _EPSILON ), l ) -#define _PDCLIB_LDBL_MIN_EXP _PDCLIB_concat3( _PDCLIB_FP_, _PDCLIB_LDOUBLE_TYPE, _MIN_EXP ) -#define _PDCLIB_LDBL_MIN _PDCLIB_concat( _PDCLIB_concat3( _PDCLIB_FP_, _PDCLIB_LDOUBLE_TYPE, _MIN ), l ) -#define _PDCLIB_LDBL_MIN_10_EXP _PDCLIB_concat3( _PDCLIB_FP_, _PDCLIB_LDOUBLE_TYPE, _MIN_10_EXP ) -#define _PDCLIB_LDBL_MAX_EXP _PDCLIB_concat3( _PDCLIB_FP_, _PDCLIB_LDOUBLE_TYPE, _MAX_EXP ) -#define _PDCLIB_LDBL_MAX _PDCLIB_concat( _PDCLIB_concat3( _PDCLIB_FP_, _PDCLIB_LDOUBLE_TYPE, _MAX ), l ) -#define _PDCLIB_LDBL_MAX_10_EXP _PDCLIB_concat3( _PDCLIB_FP_, _PDCLIB_LDOUBLE_TYPE, _MAX_10_EXP ) - -#endif diff --git a/waterbox/libc/internals/_PDCLIB_glue.h b/waterbox/libc/internals/_PDCLIB_glue.h deleted file mode 100644 index c482ef6784..0000000000 --- a/waterbox/libc/internals/_PDCLIB_glue.h +++ /dev/null @@ -1,63 +0,0 @@ -/* OS glue functions declaration <_PDCLIB_glue.h> - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#ifndef __PDCLIB_GLUE_H -#define __PDCLIB_GLUE_H __PDCLIB_GLUE_H - -#include "_PDCLIB_int.h" -#include "_PDCLIB_io.h" - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* -------------------------------------------------------------------------- */ -/* OS "glue", part 2 */ -/* These are the functions you will have to touch, as they are where PDCLib */ -/* interfaces with the operating system. */ -/* They operate on data types partially defined by _PDCLIB_config.h. */ -/* -------------------------------------------------------------------------- */ - -/* stdlib.h */ - -/* A system call that terminates the calling process, returning a given status - to the environment. -*/ -_PDCLIB_noreturn void _PDCLIB_Exit( int status ); - -void *_PDCLIB_sbrk( size_t n ); - -/* stdio.h */ - -/* Open the file with the given name and mode. Return the file descriptor in - * *fd and a pointer to the operations structure in **ops on success. - * - * Return true on success and false on failure. - */ -bool _PDCLIB_open( - _PDCLIB_fd_t* fd, const _PDCLIB_fileops_t** ops, - char const * filename, unsigned int mode ); - -/* A system call that removes a file identified by name. Return zero on success, - non-zero otherwise. -*/ -int _PDCLIB_remove( const char * filename ); - -/* A system call that renames a file from given old name to given new name. - Return zero on success, non-zero otherwise. In case of failure, the file - must still be accessible by old name. Any handling of open files etc. is - done by standard rename() already. -*/ -int _PDCLIB_rename( const char * old, const char * newn); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/waterbox/libc/internals/_PDCLIB_int.h b/waterbox/libc/internals/_PDCLIB_int.h deleted file mode 100644 index 5024afcc32..0000000000 --- a/waterbox/libc/internals/_PDCLIB_int.h +++ /dev/null @@ -1,414 +0,0 @@ -/* PDCLib internal integer logic <_PDCLIB_int.h> - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#ifndef __PDCLIB_INT_H -#define __PDCLIB_INT_H __PDCLIB_INT_H - -/* -------------------------------------------------------------------------- */ -/* You should not have to edit anything in this file; if you DO have to, it */ -/* would be considered a bug / missing feature: notify the author(s). */ -/* -------------------------------------------------------------------------- */ - -#include "_PDCLIB_config.h" -#include "_PDCLIB_aux.h" - -/* null pointer constant */ -#define _PDCLIB_NULL 0 - -/* -------------------------------------------------------------------------- */ -/* Limits of native datatypes */ -/* -------------------------------------------------------------------------- */ -/* The definition of minimum limits for unsigned datatypes is done because */ -/* later on we will "construct" limits for other abstract types: */ -/* USHRT -> _PDCLIB_ + USHRT + _MIN -> _PDCLIB_USHRT_MIN -> 0 */ -/* INT -> _PDCLIB_ + INT + _MIN -> _PDCLIB_INT_MIN -> ... you get the idea. */ -/* -------------------------------------------------------------------------- */ - -/* Setting 'char' limits */ -#define _PDCLIB_CHAR_BIT 8 -#define _PDCLIB_UCHAR_MIN 0 -#define _PDCLIB_UCHAR_MAX 0xff -#define _PDCLIB_SCHAR_MIN (-0x7f - 1) -#define _PDCLIB_SCHAR_MAX 0x7f -#ifdef _PDCLIB_CHAR_SIGNED -#define _PDCLIB_CHAR_MIN _PDCLIB_SCHAR_MIN -#define _PDCLIB_CHAR_MAX _PDCLIB_SCHAR_MAX -#else -#define _PDCLIB_CHAR_MIN 0 -#define _PDCLIB_CHAR_MAX _PDCLIB_UCHAR_MAX -#endif - -/* Setting 'short' limits */ -#if _PDCLIB_SHRT_BYTES == 2 -#define _PDCLIB_SHRT_MAX 0x7fff -#define _PDCLIB_SHRT_MIN (-0x7fff - 1) -#define _PDCLIB_USHRT_MAX 0xffff -#else -#error Unsupported width of 'short' (not 16 bit). -#endif -#define _PDCLIB_USHRT_MIN 0 - -#if _PDCLIB_INT_BYTES < _PDCLIB_SHRT_BYTES -#error Bogus setting: short > int? Check _PDCLIB_config.h. -#endif - -/* Setting 'int' limits */ -#if _PDCLIB_INT_BYTES == 2 -#define _PDCLIB_INT_MAX 0x7fff -#define _PDCLIB_INT_MIN (-0x7fff - 1) -#define _PDCLIB_UINT_MAX 0xffffU -#elif _PDCLIB_INT_BYTES == 4 -#define _PDCLIB_INT_MAX 0x7fffffff -#define _PDCLIB_INT_MIN (-0x7fffffff - 1) -#define _PDCLIB_UINT_MAX 0xffffffffU -#elif _PDCLIB_INT_BYTES == 8 -#define _PDCLIB_INT_MAX 0x7fffffffffffffff -#define _PDCLIB_INT_MIN (-0x7fffffffffffffff - 1) -#define _PDCLIB_UINT_MAX 0xffffffffffffffff -#else -#error Unsupported width of 'int' (neither 16, 32, nor 64 bit). -#endif -#define _PDCLIB_UINT_MIN 0 - -/* Setting 'long' limits */ -#if _PDCLIB_LONG_BYTES == 4 -#define _PDCLIB_LONG_MAX 0x7fffffffL -#define _PDCLIB_LONG_MIN (-0x7fffffffL - 1L) -#define _PDCLIB_ULONG_MAX 0xffffffffUL -#elif _PDCLIB_LONG_BYTES == 8 -#define _PDCLIB_LONG_MAX 0x7fffffffffffffffL -#define _PDCLIB_LONG_MIN (-0x7fffffffffffffffL - 1L) -#define _PDCLIB_ULONG_MAX 0xffffffffffffffffUL -#else -#error Unsupported width of 'long' (neither 32 nor 64 bit). -#endif -#define _PDCLIB_ULONG_MIN 0 - -/* Setting 'long long' limits */ -#if _PDCLIB_LLONG_BYTES == 8 -#define _PDCLIB_LLONG_MAX 0x7fffffffffffffffLL -#define _PDCLIB_LLONG_MIN (-0x7fffffffffffffffLL - 1LL) -#define _PDCLIB_ULLONG_MAX 0xffffffffffffffffULL -#elif _PDCLIB_LLONG_BYTES == 16 -#define _PDCLIB_LLONG_MAX 0x7fffffffffffffffffffffffffffffffLL -#define _PDCLIB_LLONG_MIN (-0x7fffffffffffffffffffffffffffffffLL - 1LL) -#define _PDCLIB_ULLONG_MAX 0xffffffffffffffffffffffffffffffffULL -#else -#error Unsupported width of 'long long' (neither 64 nor 128 bit). -#endif -#define _PDCLIB_ULLONG_MIN 0 - -/* -------------------------------------------------------------------------- */ -/* exact-width types and their limits */ -/* -------------------------------------------------------------------------- */ -/* Note that, for the "standard" widths of 8, 16, 32 and 64 bit, the "LEAST" */ -/* types are identical to the "exact-width" types, by definition. */ - -/* Setting 'int8_t', its limits, its literal, and conversion macros. */ -#if _PDCLIB_CHAR_BIT == 8 -typedef signed char _PDCLIB_int8_t; -typedef unsigned char _PDCLIB_uint8_t; -typedef signed char _PDCLIB_int_least8_t; -typedef unsigned char _PDCLIB_uint_least8_t; -#define _PDCLIB_INT8_MAX _PDCLIB_CHAR_MAX -#define _PDCLIB_INT8_MIN _PDCLIB_CHAR_MIN -#define _PDCLIB_UINT8_MAX _PDCLIB_UCHAR_MAX -#define _PDCLIB_8_CONV hh -#else -#error Unsupported width of char (not 8 bits). -#endif - -/* Setting 'int16_t', its limits, its literal, and conversion macros. */ -#if _PDCLIB_INT_BYTES == 2 -typedef signed int _PDCLIB_int16_t; -typedef unsigned int _PDCLIB_uint16_t; -typedef signed int _PDCLIB_int_least16_t; -typedef unsigned int _PDCLIB_uint_least16_t; -#define _PDCLIB_INT16_MAX _PDCLIB_INT_MAX -#define _PDCLIB_INT16_MIN _PDCLIB_INT_MIN -#define _PDCLIB_UINT16_MAX _PDCLIB_UINT_MAX -#define _PDCLIB_16_CONV -#elif _PDCLIB_SHRT_BYTES == 2 -typedef signed short _PDCLIB_int16_t; -typedef unsigned short _PDCLIB_uint16_t; -typedef signed short _PDCLIB_int_least16_t; -typedef unsigned short _PDCLIB_uint_least16_t; -#define _PDCLIB_INT16_MAX _PDCLIB_SHRT_MAX -#define _PDCLIB_INT16_MIN _PDCLIB_SHRT_MIN -#define _PDCLIB_UINT16_MAX _PDCLIB_USHRT_MAX -#define _PDCLIB_16_CONV h -#else -#error Neither 'short' nor 'int' are 16-bit. -#endif - -/* Setting 'int32_t', its limits, its literal, and conversion macros. */ -#if _PDCLIB_INT_BYTES == 4 -typedef signed int _PDCLIB_int32_t; -typedef unsigned int _PDCLIB_uint32_t; -typedef signed int _PDCLIB_int_least32_t; -typedef unsigned int _PDCLIB_uint_least32_t; -#define _PDCLIB_INT32_MAX _PDCLIB_INT_MAX -#define _PDCLIB_INT32_MIN _PDCLIB_INT_MIN -#define _PDCLIB_UINT32_MAX _PDCLIB_UINT_MAX -#define _PDCLIB_INT32_LITERAL -#define _PDCLIB_UINT32_LITERAL -#define _PDCLIB_32_CONV -#elif _PDCLIB_LONG_BYTES == 4 -typedef signed long _PDCLIB_int32_t; -typedef unsigned long _PDCLIB_uint32_t; -typedef signed long _PDCLIB_int_least32_t; -typedef unsigned long _PDCLIB_uint_least32_t; -#define _PDCLIB_INT32_MAX _PDCLIB_LONG_MAX -#define _PDCLIB_INT32_MIN _PDCLIB_LONG_MIN -#define _PDCLIB_UINT32_MAX _PDCLIB_LONG_MAX -#define _PDCLIB_INT32_LITERAL l -#define _PDCLIB_UINT32_LITERAL ul -#define _PDCLIB_32_CONV l -#else -#error Neither 'int' nor 'long' are 32-bit. -#endif - -/* Setting 'int64_t', its limits, its literal, and conversion macros. */ -#if _PDCLIB_LONG_BYTES == 8 && !defined(_PDCLIB_INT64_IS_LLONG) -typedef signed long _PDCLIB_int64_t; -typedef unsigned long _PDCLIB_uint64_t; -typedef signed long _PDCLIB_int_least64_t; -typedef unsigned long _PDCLIB_uint_least64_t; -#define _PDCLIB_INT64_MAX _PDCLIB_LONG_MAX -#define _PDCLIB_INT64_MIN _PDCLIB_LONG_MIN -#define _PDCLIB_UINT64_MAX _PDCLIB_ULONG_MAX -#define _PDCLIB_INT64_LITERAL l -#define _PDCLIB_UINT64_LITERAL ul -#define _PDCLIB_64_CONV l -#elif _PDCLIB_LLONG_BYTES == 8 -typedef signed long long _PDCLIB_int64_t; -typedef unsigned long long _PDCLIB_uint64_t; -typedef signed long long _PDCLIB_int_least64_t; -typedef unsigned long long _PDCLIB_uint_least64_t; -#define _PDCLIB_INT64_MAX _PDCLIB_LLONG_MAX -#define _PDCLIB_INT64_MIN _PDCLIB_LLONG_MIN -#define _PDCLIB_UINT64_MAX _PDCLIB_ULLONG_MAX -#define _PDCLIB_INT64_LITERAL ll -#define _PDCLIB_UINT64_LITERAL ull -#define _PDCLIB_64_CONV ll -#else -#error Neither 'long' nor 'long long' are 64-bit. -#endif - -/* -------------------------------------------------------------------------- */ -/* "fastest" types and their limits */ -/* -------------------------------------------------------------------------- */ -/* This is, admittedly, butt-ugly. But at least it's ugly where the average */ -/* user of PDCLib will never see it, and makes <_PDCLIB_config.h> much */ -/* cleaner. */ -/* -------------------------------------------------------------------------- */ - -typedef _PDCLIB_fast8 _PDCLIB_int_fast8_t; -typedef unsigned _PDCLIB_fast8 _PDCLIB_uint_fast8_t; -#define _PDCLIB_INT_FAST8_MIN _PDCLIB_concat( _PDCLIB_concat( _PDCLIB_, _PDCLIB_FAST8 ), _MIN ) -#define _PDCLIB_INT_FAST8_MAX _PDCLIB_concat( _PDCLIB_concat( _PDCLIB_, _PDCLIB_FAST8 ), _MAX ) -#define _PDCLIB_UINT_FAST8_MAX _PDCLIB_concat( _PDCLIB_concat( _PDCLIB_U, _PDCLIB_FAST8 ), _MAX ) - -typedef _PDCLIB_fast16 _PDCLIB_int_fast16_t; -typedef unsigned _PDCLIB_fast16 _PDCLIB_uint_fast16_t; -#define _PDCLIB_INT_FAST16_MIN _PDCLIB_concat( _PDCLIB_concat( _PDCLIB_, _PDCLIB_FAST16 ), _MIN ) -#define _PDCLIB_INT_FAST16_MAX _PDCLIB_concat( _PDCLIB_concat( _PDCLIB_, _PDCLIB_FAST16 ), _MAX ) -#define _PDCLIB_UINT_FAST16_MAX _PDCLIB_concat( _PDCLIB_concat( _PDCLIB_U, _PDCLIB_FAST16 ), _MAX ) - -typedef _PDCLIB_fast32 _PDCLIB_int_fast32_t; -typedef unsigned _PDCLIB_fast32 _PDCLIB_uint_fast32_t; -#define _PDCLIB_INT_FAST32_MIN _PDCLIB_concat( _PDCLIB_concat( _PDCLIB_, _PDCLIB_FAST32 ), _MIN ) -#define _PDCLIB_INT_FAST32_MAX _PDCLIB_concat( _PDCLIB_concat( _PDCLIB_, _PDCLIB_FAST32 ), _MAX ) -#define _PDCLIB_UINT_FAST32_MAX _PDCLIB_concat( _PDCLIB_concat( _PDCLIB_U, _PDCLIB_FAST32 ), _MAX ) - -typedef _PDCLIB_fast64 _PDCLIB_int_fast64_t; -typedef unsigned _PDCLIB_fast64 _PDCLIB_uint_fast64_t; -#define _PDCLIB_INT_FAST64_MIN _PDCLIB_concat( _PDCLIB_concat( _PDCLIB_, _PDCLIB_FAST64 ), _MIN ) -#define _PDCLIB_INT_FAST64_MAX _PDCLIB_concat( _PDCLIB_concat( _PDCLIB_, _PDCLIB_FAST64 ), _MAX ) -#define _PDCLIB_UINT_FAST64_MAX _PDCLIB_concat( _PDCLIB_concat( _PDCLIB_U, _PDCLIB_FAST64 ), _MAX ) - -/* -------------------------------------------------------------------------- */ -/* Various typedefs and limits */ -/* -------------------------------------------------------------------------- */ - -typedef _PDCLIB_ptrdiff _PDCLIB_ptrdiff_t; -#define _PDCLIB_PTRDIFF_MIN _PDCLIB_concat( _PDCLIB_concat( _PDCLIB_, _PDCLIB_PTRDIFF ), _MIN ) -#define _PDCLIB_PTRDIFF_MAX _PDCLIB_concat( _PDCLIB_concat( _PDCLIB_, _PDCLIB_PTRDIFF ), _MAX ) - -typedef _PDCLIB_size _PDCLIB_size_t; -#define _PDCLIB_SIZE_MAX _PDCLIB_concat( _PDCLIB_concat( _PDCLIB_, _PDCLIB_SIZE ), _MAX ) - -typedef _PDCLIB_wint _PDCLIB_wint_t; - -#ifndef __cplusplus - typedef _PDCLIB_wchar _PDCLIB_wchar_t; -#else - typedef wchar_t _PDCLIB_wchar_t; -#endif -#define _PDCLIB_WCHAR_MIN _PDCLIB_concat( _PDCLIB_concat( _PDCLIB_, _PDCLIB_WCHAR ), _MIN ) -#define _PDCLIB_WCHAR_MAX _PDCLIB_concat( _PDCLIB_concat( _PDCLIB_, _PDCLIB_WCHAR ), _MAX ) - -#define _PDCLIB_SIG_ATOMIC_MIN _PDCLIB_concat( _PDCLIB_concat( _PDCLIB_, _PDCLIB_SIG_ATOMIC ), _MIN ) -#define _PDCLIB_SIG_ATOMIC_MAX _PDCLIB_concat( _PDCLIB_concat( _PDCLIB_, _PDCLIB_SIG_ATOMIC ), _MAX ) - -typedef _PDCLIB_intptr _PDCLIB_intptr_t; -typedef unsigned _PDCLIB_intptr _PDCLIB_uintptr_t; -#define _PDCLIB_INTPTR_MIN _PDCLIB_concat( _PDCLIB_concat( _PDCLIB_, _PDCLIB_INTPTR ), _MIN ) -#define _PDCLIB_INTPTR_MAX _PDCLIB_concat( _PDCLIB_concat( _PDCLIB_, _PDCLIB_INTPTR ), _MAX ) -#define _PDCLIB_UINTPTR_MAX _PDCLIB_concat( _PDCLIB_concat( _PDCLIB_U, _PDCLIB_INTPTR ), _MAX ) - -typedef _PDCLIB_intmax _PDCLIB_intmax_t; -typedef unsigned _PDCLIB_intmax _PDCLIB_uintmax_t; -#define _PDCLIB_INTMAX_MIN _PDCLIB_concat( _PDCLIB_concat( _PDCLIB_, _PDCLIB_INTMAX ), _MIN ) -#define _PDCLIB_INTMAX_MAX _PDCLIB_concat( _PDCLIB_concat( _PDCLIB_, _PDCLIB_INTMAX ), _MAX ) -#define _PDCLIB_UINTMAX_MAX _PDCLIB_concat( _PDCLIB_concat( _PDCLIB_U, _PDCLIB_INTMAX ), _MAX ) -#define _PDCLIB_INTMAX_C( value ) _PDCLIB_concat( value, _PDCLIB_INTMAX_LITERAL ) -#define _PDCLIB_UINTMAX_C( value ) _PDCLIB_concat( value, _PDCLIB_concat( u, _PDCLIB_INTMAX_LITERAL ) ) - -/* -------------------------------------------------------------------------- */ -/* Various internals */ -/* -------------------------------------------------------------------------- */ - -typedef _PDCLIB_time _PDCLIB_time_t; -typedef _PDCLIB_clock _PDCLIB_clock_t; - -/* -------------------------------------------------------------------------- */ -/* Internal data types */ -/* -------------------------------------------------------------------------- */ - -/* Structure required by both atexit() and exit() for handling atexit functions */ -struct _PDCLIB_exitfunc_t -{ - struct _PDCLIB_exitfunc_t * next; - void (*func)( void ); -}; - -/* -------------------------------------------------------------------------- */ -/* Declaration of helper functions (implemented in functions/_PDCLIB). */ -/* -------------------------------------------------------------------------- */ - -/* This is the main function called by atoi(), atol() and atoll(). */ -_PDCLIB_intmax_t _PDCLIB_atomax( const char * s ); - -/* Two helper functions used by strtol(), strtoul() and long long variants. */ -const char * _PDCLIB_strtox_prelim( const char * p, char * sign, int * base ); -_PDCLIB_uintmax_t _PDCLIB_strtox_main( const char ** p, unsigned int base, _PDCLIB_uintmax_t error, _PDCLIB_uintmax_t limval, int limdigit, char * sign ); - -/* Digits arrays used by various integer conversion functions */ -extern char _PDCLIB_digits[]; -extern char _PDCLIB_Xdigits[]; - -/* -------------------------------------------------------------------------- */ -/* Sanity checks */ -/* -------------------------------------------------------------------------- */ - -#if _PDCLIB_C_VERSION >= 2011 -#ifdef __cplusplus -#define _Static_assert static_assert -#endif -_Static_assert( sizeof( short ) == _PDCLIB_SHRT_BYTES, "_PDCLIB_SHRT_BYTES incorrectly defined, check _PDCLIB_config.h" ); -_Static_assert( sizeof( int ) == _PDCLIB_INT_BYTES, "_PDCLIB_INT_BYTES incorrectly defined, check _PDCLIB_config.h" ); -_Static_assert( sizeof( long ) == _PDCLIB_LONG_BYTES, "_PDCLIB_LONG_BYTES incorrectly defined, check _PDCLIB_config.h" ); -_Static_assert( sizeof( long long ) == _PDCLIB_LLONG_BYTES, "_PDCLIB_LLONG_BYTES incorrectly defined, check _PDCLIB_config.h" ); -_Static_assert( ( (char)-1 < 0 ) == _PDCLIB_CHAR_SIGNED, "_PDCLIB_CHAR_SIGNED incorrectly defined, check _PDCLIB_config.h" ); -_Static_assert( sizeof( _PDCLIB_wchar ) == sizeof( L'x' ), "_PDCLIB_wchar incorrectly defined, check _PDCLIB_config.h" ); -_Static_assert( sizeof( void * ) == sizeof( _PDCLIB_intptr ), "_PDCLIB_intptr incorrectly defined, check _PDCLIB_config.h" ); -_Static_assert( sizeof( sizeof( 1 ) ) == sizeof( _PDCLIB_size ), "_PDCLIB_size incorrectly defined, check _PDCLIB_config.h" ); -_Static_assert( sizeof( &_PDCLIB_digits[1] - &_PDCLIB_digits[0] ) == sizeof( _PDCLIB_ptrdiff ), "_PDCLIB_ptrdiff incorrectly defined, check _PDCLIB_config.h" ); -#endif - -/* -------------------------------------------------------------------------- */ -/* locale / wchar / uchar */ -/* -------------------------------------------------------------------------- */ - -#ifndef __cplusplus -typedef _PDCLIB_uint16_t _PDCLIB_char16_t; -typedef _PDCLIB_uint32_t _PDCLIB_char32_t; -#else -typedef char16_t _PDCLIB_char16_t; -typedef char32_t _PDCLIB_char32_t; -#endif - -typedef struct _PDCLIB_mbstate { - union { - /* Is this the best way to represent this? Is this big enough? */ - _PDCLIB_uint64_t _St64[15]; - _PDCLIB_uint32_t _St32[31]; - _PDCLIB_uint16_t _St16[62]; - unsigned char _StUC[124]; - signed char _StSC[124]; - char _StC [124]; - }; - - /* c16/related functions: Surrogate storage - * - * If zero, no surrogate pending. If nonzero, surrogate. - */ - _PDCLIB_uint16_t _Surrogate; - - /* In cases where the underlying codec is capable of regurgitating a - * character without consuming any extra input (e.g. a surrogate pair in a - * UCS-4 to UTF-16 conversion) then these fields are used to track that - * state. In particular, they are used to buffer/fake the input for mbrtowc - * and similar functions. - * - * See _PDCLIB_encoding.h for values of _PendState and the resultant value - * in _PendChar. - */ - unsigned char _PendState; - char _PendChar; -} _PDCLIB_mbstate_t; - -typedef struct _PDCLIB_locale *_PDCLIB_locale_t; -typedef struct lconv _PDCLIB_lconv_t; - -_PDCLIB_size_t _PDCLIB_mb_cur_max( void ); - -/* wide-character EOF */ -#define _PDCLIB_WEOF ((wint_t) -1) - -/* -------------------------------------------------------------------------- */ -/* stdio */ -/* -------------------------------------------------------------------------- */ - -/* Position / status structure for getpos() / fsetpos(). */ -typedef struct _PDCLIB_fpos -{ - _PDCLIB_int_fast64_t offset; /* File position offset */ - _PDCLIB_mbstate_t mbs; /* Multibyte parsing state */ -} _PDCLIB_fpos_t; - -typedef struct _PDCLIB_fileops _PDCLIB_fileops_t; -typedef union _PDCLIB_fd _PDCLIB_fd_t; -typedef struct _PDCLIB_file _PDCLIB_file_t; // Rename to _PDCLIB_FILE? - -/* Status structure required by _PDCLIB_print(). */ -struct _PDCLIB_status_t -{ - /* XXX This structure is horrible now. scanf needs its own */ - - int base; /* base to which the value shall be converted */ - _PDCLIB_int_fast32_t flags; /* flags and length modifiers */ - unsigned n; /* print: maximum characters to be written (snprintf) */ - /* scan: number matched conversion specifiers */ - unsigned i; /* number of characters read/written */ - unsigned current;/* chars read/written in the CURRENT conversion */ - unsigned width; /* specified field width */ - int prec; /* specified field precision */ - - union { - void * ctx; /* context for callback */ - const char * s; /* input string for scanf */ - }; - - union { - _PDCLIB_size_t ( *write ) ( void *p, const char *buf, _PDCLIB_size_t size ); - _PDCLIB_file_t *stream; /* for scanf */ - }; - _PDCLIB_va_list arg; /* argument stack */ -}; - -#endif diff --git a/waterbox/libc/internals/_PDCLIB_io.h b/waterbox/libc/internals/_PDCLIB_io.h deleted file mode 100644 index 11f351f797..0000000000 --- a/waterbox/libc/internals/_PDCLIB_io.h +++ /dev/null @@ -1,296 +0,0 @@ -/* PDCLib I/O support <_PDCLIB_io.h> - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#ifndef __PDCLIB_IO_H -#define __PDCLIB_IO_H __PDCLIB_IO_H - -#include "_PDCLIB_int.h" -#include "_PDCLIB_threadconfig.h" - -/* Flags for representing mode (see fopen()). Note these must fit the same - status field as the _IO?BF flags in and the internal flags below. -*/ -#define _PDCLIB_FREAD 8u -#define _PDCLIB_FWRITE 16u -#define _PDCLIB_FAPPEND 32u -#define _PDCLIB_FRW 64u -#define _PDCLIB_FBIN 128u - -/* Internal flags, made to fit the same status field as the flags above. */ -/* -------------------------------------------------------------------------- */ -/* free() the buffer memory on closing (false for user-supplied buffer) */ -#define _PDCLIB_FREEBUFFER 512u -/* stream has encountered error / EOF */ -#define _PDCLIB_ERRORFLAG 1024u -#define _PDCLIB_EOFFLAG 2048u -/* stream is wide-oriented */ -#define _PDCLIB_WIDESTREAM 4096u -/* stream is byte-oriented */ -#define _PDCLIB_BYTESTREAM 8192u -/* file associated with stream should be remove()d on closing (tmpfile()) */ -#define _PDCLIB_DELONCLOSE 16384u -/* stream handle should not be free()d on close (stdin, stdout, stderr) */ -#define _PDCLIB_STATIC 32768u - -union _PDCLIB_fd -{ -#if defined(_PDCLIB_OSFD_T) - _PDCLIB_OSFD_T osfd; -#endif - void * pointer; - _PDCLIB_uintptr_t uval; - _PDCLIB_intptr_t sval; -}; - -/******************************************************************************/ -/* Internal functions */ -/******************************************************************************/ - -/* The worker for all printf() type of functions. The pointer spec should point - to the introducing '%' of a conversion specifier. The status structure is to - be that of the current printf() function, of which the members n, s, stream - and arg will be preserved; i will be updated; and all others will be trashed - by the function. - Returns the number of characters parsed as a conversion specifier (0 if none - parsed); returns -1 if the underlying I/O callback returns failure. -*/ -int _PDCLIB_print( const char * spec, struct _PDCLIB_status_t * status ); - -/* The worker for all scanf() type of functions. The pointer spec should point - to the introducing '%' of a conversion specifier. The status structure is to - be that of the current scanf() function, of which the member stream will be - preserved; n, i, and s will be updated; and all others will be trashed by - the function. - Returns a pointer to the first character not parsed as conversion specifier, - or NULL in case of error. - FIXME: Should distinguish between matching and input error -*/ -const char * _PDCLIB_scan( const char * spec, struct _PDCLIB_status_t * status ); - -/* Parsing any fopen() style filemode string into a number of flags. */ -unsigned int _PDCLIB_filemode( const char * mode ); - -/* Sanity checking and preparing of read buffer, should be called first thing - by any stdio read-data function. - Returns 0 on success, EOF on error. - On error, EOF / error flags and errno are set appropriately. -*/ -int _PDCLIB_prepread( _PDCLIB_file_t * stream ); - -/* Sanity checking, should be called first thing by any stdio write-data - function. - Returns 0 on success, EOF on error. - On error, error flags and errno are set appropriately. -*/ -int _PDCLIB_prepwrite( _PDCLIB_file_t * stream ); - -/* Closing all streams on program exit */ -void _PDCLIB_closeall( void ); - -/* Writes a stream's buffer. - Returns 0 on success, EOF on write error. - Sets stream error flags and errno appropriately on error. -*/ -int _PDCLIB_flushbuffer( _PDCLIB_file_t * stream ); - -/* Fills a stream's buffer. - Returns 0 on success, EOF on read error / EOF. - Sets stream EOF / error flags and errno appropriately on error. -*/ -int _PDCLIB_fillbuffer( _PDCLIB_file_t * stream ); - -/* Repositions within a file. Returns new offset on success, - -1 / errno on error. -*/ -_PDCLIB_int_fast64_t _PDCLIB_seek( _PDCLIB_file_t * stream, - _PDCLIB_int_fast64_t offset, int whence ); - -/* File backend I/O operations - * - * PDCLib will call through to these methods as needed to implement the stdio - * functions. - */ -struct _PDCLIB_fileops -{ - /*! Read length bytes from the file into buf; returning the number of bytes - * actually read in *numBytesRead. - * - * Returns true if bytes were read successfully; on end of file, returns - * true with *numBytesRead == 0. - * - * On error, returns false and sets errno appropriately. *numBytesRead is - * ignored in this situation. - */ - _PDCLIB_bool (*read)( _PDCLIB_fd_t self, - void * buf, - _PDCLIB_size_t length, - _PDCLIB_size_t * numBytesRead ); - - /*! Write length bytes to the file from buf; returning the number of bytes - * actually written in *numBytesWritten - * - * Returns true if bytes were written successfully. On error, returns false - * and setss errno appropriately (as with read, *numBytesWritten is - * ignored) - */ - _PDCLIB_bool (*write)( _PDCLIB_fd_t self, const void * buf, - _PDCLIB_size_t length, _PDCLIB_size_t * numBytesWritten ); - - /* Seek to the file offset specified by offset, from location whence, which - * may be one of the standard constants SEEK_SET/SEEK_CUR/SEEK_END - */ - _PDCLIB_bool (*seek)( _PDCLIB_fd_t self, _PDCLIB_int_fast64_t offset, - int whence, _PDCLIB_int_fast64_t *newPos ); - - void (*close)( _PDCLIB_fd_t self ); - - /*! Behaves as read does, except for wide characters. Both length and - * *numCharsRead represent counts of characters, not bytes. - * - * This function is optional; if missing, PDCLib will buffer the character - * data as bytes and perform translation directly into the user's buffers. - * It is useful if your backend can directly take wide characters (for - * example, the Windows console) - */ - _PDCLIB_bool (*wread)( _PDCLIB_fd_t self, _PDCLIB_wchar_t * buf, - _PDCLIB_size_t length, _PDCLIB_size_t * numCharsRead ); - - /* Behaves as write does, except for wide characters. As with wread, both - * length and *numCharsWritten are character counts. - * - * This function is also optional; if missing, PDCLib will buffer the - * character data as bytes and do translation directly from the user's - * buffers. You only need to implement this if your backend can directly - * take wide characters (for example, the Windows console) - */ - _PDCLIB_bool (*wwrite)( _PDCLIB_fd_t self, const _PDCLIB_wchar_t * buf, - _PDCLIB_size_t length, _PDCLIB_size_t * numCharsWritten ); -}; - -/* struct _PDCLIB_file structure */ -struct _PDCLIB_file -{ - const _PDCLIB_fileops_t * ops; - _PDCLIB_fd_t handle; /* OS file handle */ - _PDCLIB_MTX_T lock; /* file lock */ - char * buffer; /* Pointer to buffer memory */ - _PDCLIB_size_t bufsize; /* Size of buffer */ - _PDCLIB_size_t bufidx; /* Index of current position in buffer */ - _PDCLIB_size_t bufend; /* Index of last pre-read character in buffer */ -#ifdef _PDCLIB_NEED_EOL_TRANSLATION - _PDCLIB_size_t bufnlexp; /* Current position of buffer newline expansion */ -#endif - _PDCLIB_size_t ungetidx; /* Number of ungetc()'ed characters */ - unsigned char * ungetbuf; /* ungetc() buffer */ - unsigned int status; /* Status flags; see above */ - /* multibyte parsing status to be added later */ - _PDCLIB_fpos_t pos; /* Offset and multibyte parsing state */ - char * filename; /* Name the current stream has been opened with */ - _PDCLIB_file_t * next; /* Pointer to next struct (internal) */ -}; - -static inline _PDCLIB_size_t _PDCLIB_getchars( char * out, _PDCLIB_size_t n, - int stopchar, - _PDCLIB_file_t * stream ) -{ - _PDCLIB_size_t i = 0; - int c; - while ( stream->ungetidx > 0 && i != n ) - { - c = (unsigned char) - ( out[ i++ ] = stream->ungetbuf[ --(stream->ungetidx) ] ); - if( c == stopchar ) - return i; - } - - while ( i != n ) - { - while ( stream->bufidx != stream->bufend && i != n) - { - c = (unsigned char) stream->buffer[ stream->bufidx++ ]; -#ifdef _PDCLIB_NEED_EOL_TRANSLATION - if ( !( stream->status & _PDCLIB_FBIN ) && c == '\r' ) - { - if ( stream->bufidx == stream->bufend ) - break; - - if ( stream->buffer[ stream->bufidx ] == '\n' ) - { - c = '\n'; - stream->bufidx++; - } - } -#endif - out[ i++ ] = c; - - if( c == stopchar ) - return i; - } - - if ( i != n ) - { - if( _PDCLIB_fillbuffer( stream ) == -1 ) - { - break; - } - } - } - -#ifdef _PDCLIB_NEED_EOL_TRANSLATION - if ( i != n && stream->bufidx != stream->bufend ) - { - // we must have EOF'd immediately after a \r - out[ i++ ] = stream->buffer[ stream->bufidx++ ]; - } -#endif - - return i; -} - -/* Unlocked functions - internal names - * - * We can't use the functions using their "normal" names internally because that - * would cause namespace leakage. Therefore, we use them by prefixed internal - * names - */ -void _PDCLIB_flockfile(struct _PDCLIB_file *file) _PDCLIB_nothrow; -int _PDCLIB_ftrylockfile(struct _PDCLIB_file *file) _PDCLIB_nothrow; -void _PDCLIB_funlockfile(struct _PDCLIB_file *file) _PDCLIB_nothrow; - -int _PDCLIB_getc_unlocked(struct _PDCLIB_file *stream) _PDCLIB_nothrow; -int _PDCLIB_getchar_unlocked(void) _PDCLIB_nothrow; -int _PDCLIB_putc_unlocked(int c, struct _PDCLIB_file *stream) _PDCLIB_nothrow; -int _PDCLIB_putchar_unlocked(int c) _PDCLIB_nothrow; -void _PDCLIB_clearerr_unlocked(struct _PDCLIB_file *stream) _PDCLIB_nothrow; -int _PDCLIB_feof_unlocked(struct _PDCLIB_file *stream) _PDCLIB_nothrow; -int _PDCLIB_ferror_unlocked(struct _PDCLIB_file *stream) _PDCLIB_nothrow; -int _PDCLIB_fflush_unlocked(struct _PDCLIB_file *stream) _PDCLIB_nothrow; -int _PDCLIB_fgetc_unlocked(struct _PDCLIB_file *stream) _PDCLIB_nothrow; -int _PDCLIB_fputc_unlocked(int c, struct _PDCLIB_file *stream) _PDCLIB_nothrow; -_PDCLIB_size_t _PDCLIB_fread_unlocked(void *ptr, _PDCLIB_size_t size, _PDCLIB_size_t n, struct _PDCLIB_file *stream) _PDCLIB_nothrow; -_PDCLIB_size_t _PDCLIB_fwrite_unlocked(const void *ptr, _PDCLIB_size_t size, _PDCLIB_size_t n, struct _PDCLIB_file *stream) _PDCLIB_nothrow; -char *_PDCLIB_fgets_unlocked(char *s, int n, struct _PDCLIB_file *stream) _PDCLIB_nothrow; -int _PDCLIB_fputs_unlocked(const char *s, struct _PDCLIB_file *stream) _PDCLIB_nothrow; -int _PDCLIB_fgetpos_unlocked( struct _PDCLIB_file * _PDCLIB_restrict stream, _PDCLIB_fpos_t * _PDCLIB_restrict pos ) _PDCLIB_nothrow; -int _PDCLIB_fsetpos_unlocked( struct _PDCLIB_file * stream, const _PDCLIB_fpos_t * pos ) _PDCLIB_nothrow; -long int _PDCLIB_ftell_unlocked( struct _PDCLIB_file * stream ) _PDCLIB_nothrow; -int _PDCLIB_fseek_unlocked( struct _PDCLIB_file * stream, long int offset, int whence ) _PDCLIB_nothrow; -void _PDCLIB_rewind_unlocked( struct _PDCLIB_file * stream ) _PDCLIB_nothrow; - -int _PDCLIB_puts_unlocked( const char * s ) _PDCLIB_nothrow; -int _PDCLIB_ungetc_unlocked( int c, struct _PDCLIB_file * stream ) _PDCLIB_nothrow; - - -int _PDCLIB_printf_unlocked( const char * _PDCLIB_restrict format, ... ) _PDCLIB_nothrow; -int _PDCLIB_vprintf_unlocked( const char * _PDCLIB_restrict format, _PDCLIB_va_list arg ) _PDCLIB_nothrow; -int _PDCLIB_fprintf_unlocked( struct _PDCLIB_file * _PDCLIB_restrict stream, const char * _PDCLIB_restrict format, ... ) _PDCLIB_nothrow; -int _PDCLIB_vfprintf_unlocked( struct _PDCLIB_file * _PDCLIB_restrict stream, const char * _PDCLIB_restrict format, _PDCLIB_va_list arg ) _PDCLIB_nothrow; -int _PDCLIB_scanf_unlocked( const char * _PDCLIB_restrict format, ... ) _PDCLIB_nothrow; -int _PDCLIB_vscanf_unlocked( const char * _PDCLIB_restrict format, _PDCLIB_va_list arg ) _PDCLIB_nothrow; -int _PDCLIB_fscanf_unlocked( struct _PDCLIB_file * _PDCLIB_restrict stream, const char * _PDCLIB_restrict format, ... ) _PDCLIB_nothrow; -int _PDCLIB_vfscanf_unlocked( struct _PDCLIB_file * _PDCLIB_restrict stream, const char * _PDCLIB_restrict format, _PDCLIB_va_list arg ) _PDCLIB_nothrow; - -#endif diff --git a/waterbox/libc/internals/_PDCLIB_locale.h b/waterbox/libc/internals/_PDCLIB_locale.h deleted file mode 100644 index 89ed011101..0000000000 --- a/waterbox/libc/internals/_PDCLIB_locale.h +++ /dev/null @@ -1,193 +0,0 @@ -/* PDCLib locale support <_PDCLIB_locale.h> - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#ifndef __PDCLIB_LOCALE_H -#define __PDCLIB_LOCALE_H __PDCLIB_LOCALE_H - -#include "_PDCLIB_int.h" - -#include -#include -#include -#include - -#define _PDCLIB_LOCALE_METHOD_TSS 't' -#define _PDCLIB_LOCALE_METHOD_THREAD_LOCAL 'T' -#define _PDCLIB_LOCALE_METHOD_FAKE 'F' - -#if !defined(_PDCLIB_LOCALE_METHOD) - /* If undefined, no POSIX per thread locales */ - #define _PDCLIB_threadlocale() (&_PDCLIB_global_locale) -#elif _PDCLIB_LOCALE_METHOD == _PDCLIB_LOCALE_METHOD_TSS - extern tss_t _PDCLIB_locale_tss; - static inline locale_t _PDCLIB_threadlocale( void ) - { - locale_t l = tss_get(_PDCLIB_locale_tss); - if ( l == NULL ) - l = &_PDCLIB_global_locale; - return l; - } - - static inline void _PDCLIB_setthreadlocale( locale_t l ) - { - if ( tss_set( _PDCLIB_locale_tss, l ) != thrd_success ) - abort(); - } -#elif _PDCLIB_LOCALE_METHOD == _PDCLIB_LOCALE_METHOD_THREAD_LOCAL - extern thread_local locale_t _PDCLIB_locale_tls; - #define _PDCLIB_threadlocale() ( _PDCLIB_locale_tls || &_PDCLIB_global_locale ) - static inline locale_t _PDCLIB_threadlocale( void ) - { - locale_t l = _PDCLIB_locale_tls; - if(l == NULL) - l = &_PDCLIB_global_locale; - return l; - } - - static inline void _PDCLIB_setthreadlocale( locale_t l ) - { - _PDCLIB_locale_tls = l; - } -#elif _PDCLIB_LOCALE_METHOD == _PDCLIB_LOCALE_METHOD_FAKE - extern locale_t _PDCLIB_locale_fake; - static inline locale_t _PDCLIB_threadlocale( void ) - { - locale_t l = _PDCLIB_locale_fake; - if(l == NULL) - l = &_PDCLIB_global_locale; - return l; - } - - static inline void _PDCLIB_setthreadlocale( locale_t l ) - { - _PDCLIB_locale_fake = l; - } -#else - #error Locale TSS method unspecified -#endif - -/* -------------------------------------------------------------------------- */ -/* lookup tables */ -/* -------------------------------------------------------------------------- */ - -#define _PDCLIB_CTYPE_ALPHA 1 -#define _PDCLIB_CTYPE_BLANK 2 -#define _PDCLIB_CTYPE_CNTRL 4 -#define _PDCLIB_CTYPE_GRAPH 8 -#define _PDCLIB_CTYPE_PUNCT 16 -#define _PDCLIB_CTYPE_SPACE 32 -#define _PDCLIB_CTYPE_LOWER 64 -#define _PDCLIB_CTYPE_UPPER 128 -#define _PDCLIB_CTYPE_DIGIT 256 -#define _PDCLIB_CTYPE_XDIGT 512 - -#define _PDCLIB_WCTRANS_TOLOWER 1 -#define _PDCLIB_WCTRANS_TOUPPER 2 - -typedef struct _PDCLIB_ctype -{ - _PDCLIB_uint16_t flags; - unsigned char upper; - unsigned char lower; - unsigned char collation; -} _PDCLIB_ctype_t; - -typedef struct _PDCLIB_wcinfo -{ - _PDCLIB_wint_t start; - _PDCLIB_uint16_t length; - _PDCLIB_uint16_t flags; - _PDCLIB_wint_t lower_delta; - _PDCLIB_wint_t upper_delta; -} _PDCLIB_wcinfo_t; - -struct _PDCLIB_locale { - const struct _PDCLIB_charcodec_t * _Codec; - struct lconv _Conv; - - /* ctype / wctype */ - /* XXX: Maybe re-evaluate constness of these later on? */ - const _PDCLIB_wcinfo_t *_WCType; - _PDCLIB_size_t _WCTypeSize; - const _PDCLIB_ctype_t *_CType; - - /* perror/strerror */ - const char * const _ErrnoStr[_PDCLIB_ERRNO_MAX]; -}; - -extern const _PDCLIB_wcinfo_t _PDCLIB_wcinfo[]; -extern const size_t _PDCLIB_wcinfo_size; - -static inline int _PDCLIB_wcinfo_cmp( const void * _key, const void * _obj ) -{ - _PDCLIB_int32_t * key = (_PDCLIB_int32_t *) _key; - _PDCLIB_wcinfo_t * obj = (_PDCLIB_wcinfo_t *) _obj; - if ( *key < obj->start ) - { - return -1; - } - else if ( *key >= obj->start + obj->length ) - { - return 1; - } - else - { - return 0; - } -} - -static inline _PDCLIB_wcinfo_t * _PDCLIB_wcgetinfo( locale_t l, _PDCLIB_int32_t num ) -{ - _PDCLIB_wcinfo_t *info = (_PDCLIB_wcinfo_t*) - bsearch( &num, l->_WCType, l->_WCTypeSize, - sizeof( l->_WCType[0] ), _PDCLIB_wcinfo_cmp ); - - return info; -} - -static inline wint_t _PDCLIB_unpackwint( wint_t wc ) -{ - if( sizeof(_PDCLIB_wchar_t) == 2 && sizeof(_PDCLIB_wint_t) == 4 ) { - /* On UTF-16 platforms, as an extension accept a "packed surrogate" - * encoding. We accept the surrogate pairs either way - */ - - wint_t c = (wc & 0xF800F800); - if(c == (_PDCLIB_wint_t) 0xD800DC00) { - // MSW: Lead, LSW: Trail - wint_t lead = wc >> 16 & 0x3FF; - wint_t trail = wc & 0x3FF; - wc = lead << 10 | trail; - } else if(c == (_PDCLIB_wint_t) 0xDC00D800) { - // MSW: Trail, LSW: Lead - wint_t trail = wc >> 16 & 0x3FF; - wint_t lead = wc & 0x3FF; - wc = lead << 10 | trail; - } - - } - return wc; -} - -/* Internal xlocale-style WCType API */ -int _PDCLIB_iswalnum_l( wint_t _Wc, locale_t l ); -int _PDCLIB_iswalpha_l( wint_t _Wc, locale_t l ); -int _PDCLIB_iswblank_l( wint_t _Wc, locale_t l ); -int _PDCLIB_iswcntrl_l( wint_t _Wc, locale_t l ); -int _PDCLIB_iswdigit_l( wint_t _Wc, locale_t l ); -int _PDCLIB_iswgraph_l( wint_t _Wc, locale_t l ); -int _PDCLIB_iswlower_l( wint_t _Wc, locale_t l ); -int _PDCLIB_iswprint_l( wint_t _Wc, locale_t l ); -int _PDCLIB_iswpunct_l( wint_t _Wc, locale_t l ); -int _PDCLIB_iswspace_l( wint_t _Wc, locale_t l ); -int _PDCLIB_iswupper_l( wint_t _Wc, locale_t l ); -int _PDCLIB_iswxdigit_l( wint_t _Wc, locale_t l ); -int _PDCLIB_iswctype_l( wint_t _Wc, wctype_t _Desc, locale_t l ); -wint_t _PDCLIB_towlower_l( wint_t _Wc, locale_t l ); -wint_t _PDCLIB_towupper_l( wint_t _Wc, locale_t l ); -wint_t _PDCLIB_towctrans_l( wint_t _Wc, wctrans_t _Desc, locale_t l ); - -#endif diff --git a/waterbox/libc/internals/_PDCLIB_threadconfig.h b/waterbox/libc/internals/_PDCLIB_threadconfig.h deleted file mode 100644 index fcc3d39907..0000000000 --- a/waterbox/libc/internals/_PDCLIB_threadconfig.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef _PDCLIB_THREADCONFIG_H -#define _PDCLIB_THREADCONFIG_H -#include "_PDCLIB_aux.h" -#include "_PDCLIB_config.h" - -#ifdef __cplusplus -extern "C" { -#endif -#define _PDCLIB_ONCE_FLAG_INIT 0 -#define _PDCLIB_ONCE_FLAG_IS_DONE(_f) (*(_f) == 1) -typedef char _PDCLIB_once_flag; - -void _PDCLIB_call_once(_PDCLIB_once_flag *flag, void (*func)(void)); - -#define _PDCLIB_THRD_HAVE_MISC -#define _PDCLIB_CND_T char -#define _PDCLIB_MTX_T char -#define _PDCLIB_TSS_T struct _PDCLIB_tss - -struct _PDCLIB_tss { - struct _PDCLIB_tss *self; - void *value; -}; - -#ifdef __cplusplus -} -#endif -#endif diff --git a/waterbox/libc/internals/_alias.h b/waterbox/libc/internals/_alias.h deleted file mode 100644 index 76836afeb0..0000000000 --- a/waterbox/libc/internals/_alias.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef __ALIAS_H -#define __ALIAS_H -#endif - -/* Define ALIASNAME as a weak alias for NAME. - If weak aliases are not available, this defines a strong alias. */ -# define weak_alias(name, aliasname) _weak_alias (name, aliasname) -# define _weak_alias(name, aliasname) \ - extern __typeof (name) aliasname __attribute__ ((weak, alias (#name)));